先日の実験で、ニキシー管をESP32で制御できることがわかったので、応用して時計を作ろうと思います。
ちょっと昔のレトロな時計
ニキシー管IN-12Bが収まるサイズの、いい感じの時計がないかと探していると、BRUNOブランドのLCDレトロアラームクロックが目にとまりました。
ちょっと昔のレトロな感じのデザインと、パタパタ時計のように液晶がアニメーションするところが特徴です。
パタパタっと変わるところが、可愛いですね。
で、この時計をケースとして利用して、数字の部分をニキシー管にしてよりレトロにしたいと思います。時刻はNTPから取得するようにして、レトロなのですが時間は正確な時計にしたいと思います。
まずは分解
時計が届いたので、早速分解します。この時計は電波時計となっていて、自動で時刻を合わせてくれます。中にバーアンテナが見えますね。
全ての基板を取り外しました。
電池ボックスが邪魔なので、リューターでカットしました。これで、この後作るニキシー管の基板が入るスペースができました。
ニキシー管のはんだ付け
前回はニキシー管2つを使った2桁の表示実験をしました。もう一組作って4桁に拡張します。
基板は専用に作りました。こちらよりご購入できます。
回路図
全体の回路図です。先日の回路に、ニキシー管とフォトカプラの回路を2つ追加しただけです。ダイナミック点灯なので、配線がシンプルです。
この図にはありませんが、この他にESP32のボードと、180Vの昇圧回路があります。ESP32のボードはこれを使っています。
昇圧回路はこちらより購入いただけます。
ユニバーサル基板に配線
それほど複雑ではないので、ユニバーサル基板にポリウレタン線で配線していきます。
電源以外は電流がほとんど流れないので、ポリウレタン線の0.2mmで配線しています。細くて取り回しが良く、被覆もはんだごてですぐに溶けてむきやすいです。0.2mmのポリウレタン線は、配線が多い時にとても作業が捗ります。
配線完了。
組み立て
電池ボックスを取り外したLCDレトロアラームクロックの抜け殻に、先ほど作った回路を収めていきます。
こんな感じに、収まります。
いいんじゃないでしょうか。
試しに0000を表示してみます。
おおおぉぉぉ!テンション上がりますね。
時計のプログラム
Arduinoでプログラムを作っていきます。仕組みは簡単で
- 無線LANに接続する
- NTPサーバーに接続する
- NTPサーバーから時間を取得する
- 時間を表示する
これだけです。で、こちらが完成したプログラムです。
//ネットワーク関係 #include <WiFi.h> const char* WifiSSID = "WIFISSID"; const char* WifiPassword = "WIFIPASSWORD"; //時刻 const long JST = 3600*9; //Japan Standard Time GMT+9 struct tm timeInfo;//時刻を格納する //ポート設定 const int D0 = 26; const int D1 = 25; const int D2 = 33; const int D3 = 32; const int NixieA1 = 13; const int NixieA2 = 12; const int NixieA3 = 14; const int NixieA4 = 27; void setup() { pinMode( NixieA1, OUTPUT ); digitalWrite( NixieA1, LOW ); pinMode( NixieA2, OUTPUT ); digitalWrite( NixieA2, LOW ); pinMode( NixieA3, OUTPUT ); digitalWrite( NixieA3, LOW ); pinMode( NixieA4, OUTPUT ); digitalWrite( NixieA4, LOW ); pinMode( D0, OUTPUT ); digitalWrite( D0, HIGH ); pinMode( D1, OUTPUT ); digitalWrite( D1, HIGH ); pinMode( D2, OUTPUT ); digitalWrite( D2, HIGH ); pinMode( D3, OUTPUT ); digitalWrite( D3, HIGH ); Serial.begin(115200); Serial.println("start"); //アクセスポイントに接続.できなかったらリスタート if(connectAP() == false) { Serial.println("Can not connect. Restert."); delay(1000); ESP.restart(); } Serial.print("WiFi connected\r\nIP address: "); Serial.println(WiFi.localIP()); //NTPサーバの設定と時刻の取得 configTime(JST, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");//NTPの設定 getLocalTime(&timeInfo); Serial.printf("%d:%d\n", timeInfo.tm_hour , timeInfo.tm_min ); } void loop() { //毎時アクセスポイントに接続していなかったら接続を試みる if(WiFi.status() != WL_CONNECTED && timeInfo.tm_min == 0) connectAP(); //時刻の取得 getLocalTime(&timeInfo); //時刻の表示 dispTime( timeInfo.tm_hour , timeInfo.tm_min ); } //アクセスポイントに接続する bool connectAP() { //アクセスポイントに接続 if(WiFi.status() != WL_CONNECTED) { Serial.printf("Connecting to %s.\n",WifiSSID); WiFi.mode(WIFI_STA); WiFi.begin(WifiSSID, WifiPassword); //60秒試行する.接続までステータスバーを表示 for( int j=0 ; j<600 ; j++ ) { if( j%10 == 0) { Serial.print("*"); dispStatusBar(); } delay(100); if(WiFi.status() == WL_CONNECTED) break; } } return WiFi.status(); } //ステータスバーをニキシー管で表示する //この関数が呼ばれる度に0の位置がずれていく void dispStatusBar() { static int count; digitalWrite( NixieA1, LOW ); digitalWrite( NixieA2, LOW ); digitalWrite( NixieA3, LOW ); digitalWrite( NixieA4, LOW ); numOut( 0 ); switch(count) { case 0 : digitalWrite( NixieA1, HIGH ); break; case 1 : digitalWrite( NixieA2, HIGH ); break; case 2 : digitalWrite( NixieA3, HIGH ); break; case 3 : digitalWrite( NixieA4, HIGH ); break; default : digitalWrite( NixieA1, HIGH ); break; } if( ++count >= 4 ) count = 0; } //時刻をニキシー管に表示 void dispTime( int hour , int minute ) { for( int j=0 ; j<10 ; j++ ) { //1桁目表示 numOut( minute%10 ); digitalWrite( NixieA1, HIGH ); delayMicroseconds(2400); digitalWrite( NixieA1, LOW ); delayMicroseconds(100); //2桁目表示 numOut( (minute/10)%10 ); digitalWrite( NixieA2, HIGH ); delayMicroseconds(2400); digitalWrite( NixieA2, LOW ); delayMicroseconds(100); //3桁目表示 numOut( hour%10 ); digitalWrite( NixieA3, HIGH ); delayMicroseconds(2400); digitalWrite( NixieA3, LOW ); delayMicroseconds(100); //4桁目表示 if( (hour/10)%10 != 0 ) //0だったら表示しない { numOut( (hour/10)%10 ); digitalWrite( NixieA4, HIGH ); delayMicroseconds(2400); digitalWrite( NixieA4, LOW ); delayMicroseconds(100); }else{ delayMicroseconds(2500); } } } //指定した数字のバイナリを出力 void numOut( int num ) { digitalWrite( D0, !( num & ( 1 << 0 ) ) != 0 ); digitalWrite( D1, !( num & ( 1 << 1 ) ) != 0 ); digitalWrite( D2, !( num & ( 1 << 2 ) ) != 0 ); digitalWrite( D3, !( num & ( 1 << 3 ) ) != 0 ); }
こんな感じです。
さてプログラムができたので、ESP32にプログラムを書き込みます。
完成!!
時計になりました!!
ニキシー管の構造のため、表示が凸凹してます。ニキシー管らしいですね。
暗いと、よりニキシー管らしさを感じますね。
レトロな外見の時計がよりレトロに最新になりました
レトロなニキシー管NTP時計が完成しました。
消費電流はESP32とニキシー管合わせて250mA程度でした。USB電源で動作します。
2020.4.17 追加 目覚まし時計風も作ってみました
追加終わり
コメント
コメント失礼します。
よろしければユニバーサル基盤の後ろの配線も見せていただきたいです
コメントありがとうございます。
知り合いに譲ってしまったので、お見せすることができないんです。
ごめんなさい。
はじめまして。
IN-12Bの2桁用の基板を購入出来ますか?
webを見てレトロな時計が欲しくなり、自分でも作ってみたいと思ったのです。ハードルは高そうですが。。。
正田様
興味を持っていただきありがとうございます。
基板はこちらよりご購入いただけるようになりました。
よろしければどうぞ。
https://shop.kohacraft.com/c-item-detail?ic=KC115
ニキシー管結構楽しいですよ。