ちょっと昔のレトロな時計をニキシー管でさらにレトロにかつ最新のNTP時計に改造してみた

先日の実験で、ニキシー管をESP32で制御できることがわかったので、応用して時計を作ろうと思います。

ちょっと昔のレトロな時計

ニキシー管IN-12Bが収まるサイズの、いい感じの時計がないかと探していると、BRUNOブランドのLCDレトロアラームクロックが目にとまりました。

ちょっと昔のレトロな感じのデザインと、パタパタ時計のように液晶がアニメーションするところが特徴です。

パタパタっと変わるところが、可愛いですね。

で、この時計をケースとして利用して、数字の部分をニキシー管にしてよりレトロにしたいと思います。時刻はNTPから取得するようにして、レトロなのですが時間は正確な時計にしたいと思います。

まずは分解

時計が届いたので、早速分解します。この時計は電波時計となっていて、自動で時刻を合わせてくれます。中にバーアンテナが見えますね。

全ての基板を取り外しました。

電池ボックスが邪魔なので、リューターでカットしました。これで、この後作るニキシー管の基板が入るスペースができました。

ニキシー管のはんだ付け

前回はニキシー管2つを使った2桁の表示実験をしました。もう一組作って4桁に拡張します。

回路図

全体の回路図です。先日の回路に、ニキシー管とフォトカプラの回路を2つ追加しただけです。ダイナミック点灯なので、配線がシンプルです。

この図にはありませんが、この他にESP32のボードと、180Vの昇圧回路があります。ESP32のボードはこれを使っています。

ユニバーサル基板に配線

それほど複雑ではないので、ユニバーサル基板にポリウレタン線で配線していきます。

電源以外は電流がほとんど流れないので、ポリウレタン線の0.2mmで配線しています。細くて取り回しが良く、被覆もはんだごてですぐに溶けてむきやすいです。0.2mmのポリウレタン線は、配線が多い時にとても作業が捗ります。

配線完了。

組み立て

電池ボックスを取り外したLCDレトロアラームクロックの抜け殻に、先ほど作った回路を収めていきます。

こんな感じに、収まります。

いいんじゃないでしょうか。

試しに0000を表示してみます。

おおおぉぉぉ!テンション上がりますね。

時計のプログラム

Arduinoでプログラムを作っていきます。仕組みは簡単で

  1. 無線LANに接続する
  2. NTPサーバーに接続する
  3. NTPサーバーから時間を取得する
  4. 時間を表示する

これだけです。で、こちらが完成したプログラムです。

//ネットワーク関係
#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電源で動作します。

電子工作

関連記事

kohacraftのblog

コメント