アマゾンでVFDを売っていたので、時計にしてみた。
日本語取説付き 蛍光表示管 4桁 時計用 VFD IVL2-7/5 ソビエト ロシア ビンテージパーツ USSR
ヒータは2.5V、点灯電圧は24Vです。実験途中で電源がおかしくなりました。24Vは高めの電圧ですから慎重に扱ってください。
###マイコン・ボード
Arduino UNO Wifi Rev.2のモデルは、Arduino UNOと同じくAVRマイコンを使っていますが、世代が新しいATMega4809を搭載しています。Arduino UNO用シールドにWi-Fiが利用できる製品がリリースされなくなって数年が経過しています。
このモデルでは、Wi-FiデバイスにU-bloxのNINA-W102が搭載され、従来のEthernet とWiFiのライブラリと同じように使えるWiFiNINA libraryが用意されました。NINA-W102は2018年6月15日に技適(204-810001)に登録されています。
最初のプログラムはUNOで動かしました。2番目の時計はArduino UNO Wifi Rev.2を利用しました。
###回路
電圧レベルの変換は東芝のTBD62783を2個使いました。秋月電子通商で購入しました。Vihは2Vなので、3.3V系のマイコンボードでも駆動できるでしょう。
1個目でアノードを制御します。2個目はグリッドで、桁の制御です。3番目はコロン(二つのドット)です。
入力はArduinoのディジタル端子0~12をつなぎました。
###プログラム
表示のプログラムです。どうやって点灯するのか最初はわからなかったので、確認しながら作ったので、べたなセグメント・データの記述になっています。
#define Grid1 8
#define Grid2 9
#define Grid3 10
#define Grid4 11
#define Grid5 12
#define anodeA 0
#define anodeB 1
#define anodeC 2
#define anodeD 3
#define anodeE 4
#define anodeF 5
#define anodeG 6
#define anodeDot 7
void digit1(){ // 1 .. 5
digitalWrite(Grid1, HIGH);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void digit2(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, HIGH);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void digit3(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, HIGH);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void digit4(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, HIGH);
digitalWrite(Grid5, LOW);
}
void digit5(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, HIGH);
}
void _1(){ //
digitalWrite(anodeA, LOW);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, LOW);
}
void _2(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, LOW);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, HIGH);
}
void _3(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, HIGH);
}
void _4(){ //
digitalWrite(anodeA, LOW);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _5(){ //
digitalWrite(anodeA, LOW);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _6(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, LOW);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _7(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, LOW);
}
void _8(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _9(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _0(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, LOW);
}
void setup() {
for (int i=0; i<14; i++) pinMode(i, OUTPUT);
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void disp(int _1,int _2,int _3,int _4){
VFD(_1);
digit1(); delay(5);
VFD(_2);
digit2(); delay(5);
digitalWrite(anodeDot, HIGH);
digit3(); delay(5);
VFD(_3);
digit4(); delay(5);
VFD(_4);
digit5(); delay(5);
}
void VFD(int dispFig){
switch (dispFig){
case 0: //?
_0() ;break;
case 1:
_1();break;
case 2:
_2();break;
case 3:
_3();break;
case 4:
_4();break;
case 5:
_5();break;
case 6:
_6();break;
case 7:
_7();break;
case 8:
_8();break;
case 9:
_9();break;
}
}
void loop() {
disp(2,3,8,0);
}
ntpライブラリを追加して、時計にしました。
Wi-Fiの部分はArduino.ccのWiFiNINAライブラリです。ここのntpは複雑だったので、M5Stamp C3で時計 で使ったNTPClientライブラリを利用しました。
Wi-Fiルータへの接続に必要なSSIDとパスワードはarduino_secrets.h(別ファイル、同じディレクトリ)に記述しています。記述方法はWiFiNINAライブラリのサンプルを参照してください。
#include <WiFiNINA.h>
#include <NTPClient.h>
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.nict.jp", 3600*9, 60000);
#define Grid1 8
#define Grid2 9
#define Grid3 10
#define Grid4 11
#define Grid5 12
#define anodeA 0
#define anodeB 1
#define anodeC 2
#define anodeD 3
#define anodeE 4
#define anodeF 5
#define anodeG 6
#define anodeDot 7
void digit1(){ // 1 .. 5
digitalWrite(Grid1, HIGH);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void digit2(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, HIGH);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void digit3(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, HIGH);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
}
void digit4(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, HIGH);
digitalWrite(Grid5, LOW);
}
void digit5(){ // 1 .. 5
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, HIGH);
}
void _1(){ //
digitalWrite(anodeA, LOW);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, LOW);
}
void _2(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, LOW);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, HIGH);
}
void _3(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, HIGH);
}
void _4(){ //
digitalWrite(anodeA, LOW);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _5(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, LOW);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _6(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, LOW);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _7(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, LOW);
}
void _8(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _9(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, HIGH);
}
void _0(){ //
digitalWrite(anodeA, HIGH);
digitalWrite(anodeB, HIGH);
digitalWrite(anodeC, HIGH);
digitalWrite(anodeD, HIGH);
digitalWrite(anodeE, HIGH);
digitalWrite(anodeF, HIGH);
digitalWrite(anodeG, LOW);
}
void _111(){ // blank
digitalWrite(anodeA, LOW);
digitalWrite(anodeB, LOW);
digitalWrite(anodeC, LOW);
digitalWrite(anodeD, LOW);
digitalWrite(anodeE, LOW);
digitalWrite(anodeF, LOW);
digitalWrite(anodeG, LOW);
}
void disp(int _1,int _2,int _3,int _4){
VFD(_1);
digit1(); delay(4);
VFD(_2);
digit2(); delay(4);
digitalWrite(anodeDot, HIGH);
digit3(); delay(4);
VFD(_3);
digit4(); delay(4);
VFD(_4);
digit5(); delay(4);
}
void VFD(int dispFig){
switch (dispFig){
case 0: //?
_0() ;break;
case 1:
_1();break;
case 2:
_2();break;
case 3:
_3();break;
case 4:
_4();break;
case 5:
_5();break;
case 6:
_6();break;
case 7:
_7();break;
case 8:
_8();break;
case 9:
_9();break;
case 111:
_111();break;
}
}
void setup() {
for (int i=0; i<14; i++) pinMode(i, OUTPUT);
digitalWrite(Grid1, LOW);
digitalWrite(Grid2, LOW);
digitalWrite(Grid3, LOW);
digitalWrite(Grid4, LOW);
digitalWrite(Grid5, LOW);
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to WiFi");
Serial.println("\nStarting connection to server...");
timeClient.begin();
delay(500);
}
void loop(){
//delay(1000);
timeClient.update();
String TIME = timeClient.getFormattedTime();
// Serial.println(TIME);
String Hr_high = TIME.substring(0, 1);
String Hr_low = TIME.substring(1, 2);
String Mini_high = TIME.substring(3, 4);
String Mini_low = TIME.substring(4, 5);
if (Hr_high=="0") {
disp(111,Hr_low.toInt(),Mini_high.toInt(),Mini_low.toInt());
} else {
disp(Hr_high.toInt(),Hr_low.toInt(),Mini_high.toInt(),Mini_low.toInt());
}
}
###製作中の様子
プリント基板もアマゾンで入手しました。
KEYESTUDIO 10個 プロトタイプ プリント 回路基板 ブレイクアウトPCBボード シールド スターターキット for Arduino UNO R3 アルドゥイーノ アルデュイーノ アルディーノ ブレッドボード セット 電子工作
部品を置いただけ