前回に引き続き、ニキシー管時計の製作を行っていきます。今回は本番の基板を作って時刻を表示できるところまで製作しました。

記事の最後で全体回路図と基板のデータを公開します。また余った基板の頒布も行います。

完成形はこんな感じです

回路構成

前回製作した1桁表示回路の4bit部分を並列に、クロックを個別にマイコンに接続します。

4桁目以降は省略

この図は大まかな構成を示したものであり、実際にはこの他にもPWM調光用のフォトカプラやコロン表示用回路、電源回路なども搭載しています。ここからは回路をいくつかの部分に分けて解説を行います。

①電源部分

電源は3.3Vと5Vを用意しています。J18にACアダプタからの12Vを入力し、J19~J21は高電圧生成用のDC-DC2台とラズパイサイネージ用のDC-DCに出力するコネクタです。J22、J23は外部の拡張機能を搭載するかもしれないので一応つけておきました。

ダイオードはACアダプタを接続していない状態でプログラマを接続した時に、レギュレータの入力より出力の電位が高くなってレギュレータが壊れるのを防止するためです。コンデンサの充電状態や外部の拡張回路でも同じ状態になる可能性があるので、5V側も一応つけておきました。今どきの電源ICでは必要ない説ありますが…

電源ICはLibraryLoaderで検索・インクルードしました。シンボルエディターのピンテーブルでエレクトリカルタイプをVINとGNDは「電源入力」に、VOUTは「電源出力」に設定しないとエレクトリカルルールチェック(ERC)に引っかかると思います。

実際に動かすとレギュレータが熱々になるので放熱板を付けた方がいいかもしれません。というか表面実装ではなくスルーホールの7805と7833にするか、3端子レギュレータではなくDC-DCにすればよかったです

(3/30追記)3端子DC-DCコンバータM78AR033-1とM78AR05-1に置換しました。交換したら常温程度になりました。

この部分は2つの高圧DC-DCから帰ってきた170Vを入力する部分です。

基板は2枚をスタックするので、CADの都合で回路を完全に分離する必要があります。よってニキシー管側のアダプタ基板はGND、ドライバ基板側をGND1にしています。

②ニキシー管アダプタ基板

(クリックで別ウインドウで開きます)

回路図内にいくつか青色の破線がありますが、スタック基板のコネクタ同士がどのように接続されるかを示しています。ただしJ1~J12は基板設計時に180°回転したので、組み合わせが変わっています。しかしピンアサインは間違っていないので問題ありません。

前回書いた通り、今回使用するDC-DCコンバータの最大供給電流は10mAであるので、ニキシー管3本ずつに分け、PWM調光用のフォトカプラも2つあります。

7.5kΩの抵抗はB5870のデータシートに記載されていた170V時の電流制限抵抗です。フォトカプラのデューティー比を100%にしても過電流で壊れないようにしています。

470kと680kはプリバイアス電圧用の分圧抵抗です。データシートでは67Vと記載があったので、カソード電圧が60V程度になるようにしています。当初は470Ωと680Ωにしていましたが、許容電力を全く考えてなかったので普通に燃えました。

プリバイアス…ニキシー管は共通アノードに高電圧をかけ、光らせたい数字の電極を0Vに落とすとその数字が発光する。しかしドライバICに高電圧は供給していないのでカソード電圧が低くなる。すると光らせたくない数字もぼんやりと光ってしまう(ゴースト)。そのため全てのカソードに60V程度をかけて、アノード・カソード間の電位差を小さくしてゴーストを防ぐ手法。

分圧抵抗と1MΩの抵抗は数がかなり多いので、ゴーストが出ていなければ付ける必要はありません。B5870では電流が小さいためかゴーストは出ていませんでしたが、一応データシート通りつけておきました。

③コロン表示部

こちらについても電源を2系統用意して、2台のDC-DCコンバータに均等に負荷がかかるようにしています。

R72~R75は電流制限抵抗です。値は一応計算していますが割と適当です。

J13は数字とコロンのPWM用フォトカプラをまとめてドライバ基板に繋がっています。(青破線)

④駆動IC+ロジック部

(クリックで別ウインドウで開きます)

アダプタ基板からのコネクタは駆動IC(K155ID1)に繋がっています。駆動ICの4bit入力はDフリップフロップ出力Qに繋がっており、その入力Dは全桁で共通、CLKは個別でマイコンに接続し、CLRはデータシートに従いHIGHにしています。

B5870は右下・左下に小数点を出せますが、時計には必要ないので回路は作っていません。小数点を出したい場合でも、クロックは既存のもので4bitの線に右下・左下の小数点の2本の信号線を追加するだけで実現できます。

しかし、6回路入りでクロックが共通のフリップフロップはないですし、高電圧駆動用のフォトカプラが12個必要になるので、かなり大型化しそうです。

もし付けたいなら右下・左下のどちらかにする、小数点が出せる桁を限定するなどの工夫が要りそうです。

今回の回路でもマイコンのピン数ギリギリなので、6本のクロックもデコーダーICで3本にまとめられたなと今更思っています。他の方の製作物を見たら、シリアル・パラレル変換ICを使ってかなり本数を減らしていて頭いいなぁと思いました。

またJ15はうまく動作しなかったときにロジアナで見たり、手動で数字を動かすために用意しましたが、結果的にあまり使いませんでした。

また駆動ICの電源とロジックレベルは5Vですが、入力の閾値的には3.3Vでも動くのでレベルシフタは挟んでいません。

⑤マイコン部

(クリックで別ウインドウで開きます)

先ほどのDフリップフロップの入力4bitと各桁のクロック、数字とコロンのPWMコネクタJ14がマイコンに繋がっています。

また環境照度に合わせて自動調光するためにCdS接続用のJ26、拡張用のI2CコネクタJ24、GPIOコネクタJ27、プログラム書き込み用のJ25も設けています。

J25のピンアサインはマルツで買った書き込み器に合わせています。また自動書き込みをするために、RSTを微分回路を介してマイコンのENに接続していますが動作しませんでした。手動でBootを押しながらENを1回押せば書き込みモードになるので問題ありません。原因がわかる方がいらっしゃいましたらコメントお願いします。

あと4bitのAが不自然に配線を横断してIO15に繋がっていますが、これは設計最終段階でIO34が入力専用だと気付いて無理やり修正した為です。この変更は基板に反映されていますので、基板の改造は必要ありません。

C8はノイズ除けのお守りなので、ESP32の近傍に配置しています。

基板の製作

これまで示した回路をもとに基板を設計しJLCPCBに発注しました。2日で完成し、1週間で届きました。

早すぎィ…安すぎィ…

中国からの送料込みの5枚で2,300円でした。円安なのでいつもより高めですが、日本で作ると5万円、急いで作ると10万円を余裕で超えるのでありがたいです。

部品数がかなり多いので、製作に5時間ほどかかりました。

表面実装部品はんだ付けの図

ニキシー管は抜き差しできるように秋月の1ピンタイプの丸ソケットを90本ほど購入し、ニキシー管を治具代わりにしながらはんだ付けをを行いました。

背が低い順にはんだ付けしましょう

しかし、かなり頑丈に刺さっているため、はんだ付け後は抜くことができなくなりました。頑張れば抜けそうですが管が割れそうです。 (グリグリやったら普通に抜けました)

※基板の設計ミスによりこの画像ではIN-3の極性が逆になっています。逆でも光りますが、光が炎のように揺らいで安定しません。ある意味アナログ味が出ていいかもしれませんが、寿命は短くなるかもしれません。

一通りはんだ付けを行ったら、基板を切れ込みに沿って2分割します。スタック用のコネクタとしてドライバ基板表面にピンソケット、アダプタ基板裏面にピンヘッダを取り付け、基板を合体させます。

2つあるIN-3のスルーホールを利用して極性を修正しました
(クリックで拡大)

基板間には11mmのM3スペーサーが適しますが、手持ちが無かったため取り付けていません。コネクタが多いので、無くても結構強力に固定されます。

プログラム

まず前回のプログラムを複数桁バージョンにしたものを使用し、回路が正常に動作しているか確認しました。そのプログラムを以下に示します。参考元は前回の記事をご覧ください。

const int PIN_BIT[] = {15,33,32,27};
const int CLK[] = {26,25,23,19,18,17};
const int disp[] = {0,1,2,3,4,5,6,7,8,9};

void setup() {
  for(int i = 0; i < 4; i++){
   pinMode(PIN_BIT[i],OUTPUT);
  }

  for(int i = 0; i < 6; i++){
   pinMode(CLK[i],OUTPUT);
  }
  pinMode(12,OUTPUT);//brightness
  digitalWrite(12,HIGH);
}

void loop() {
  int cnt = 0;

  while(cnt < 10){
    for(int i = 0;i < 4; i++){
      digitalWrite(PIN_BIT[i],disp[cnt] & (0x01 << i));
    }
    for(int i = 0; i < 6; i++){
      digitalWrite(CLK[i],HIGH);
      delay(100);
      digitalWrite(CLK[i],LOW);
      delay(200);
    }
    cnt++;
  }
}

動作を確認したらNTP同期に対応させます。

以下のサイトを参考(というかほぼ丸パクリ)にさせて頂き、ピン番号を配列でまとめて扱うなどの改造を施しました。また参考元はダイナミック点灯だったためクロックの時間が長いですが、今回はフリップフロップが追いつけばいいので、10μsとしておきました。

プログラムは配布データに添付していますが、以下に示しておきます。

#include <WiFi.h>
#include "time.h"

#define bright 12
#define colon 16
const int PIN_BIT[] = {15,33,32,27};//4bit OUTPUT
const int CLK[] = {26,25,23,19,18,17};//hh:mm:ss pin

const char* ssid       = "Your-SSID";
const char* password   = "Your-Password";

const char* ntpServer = "time.google.com";
const long  gmtOffset_sec = 9 * 3600;
const int   daylightOffset_sec = 0;

void displayDigit(unsigned short digit, unsigned short pin){
  for(int i = 0; i < 4; i++){
    digitalWrite(PIN_BIT[i], (1 << i) & digit);
  }
  digitalWrite(pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(pin, LOW);
  delayMicroseconds(10); 
}

void printNixiesLocalTime(){
  struct tm timeinfo;
  getLocalTime(&timeinfo);

  displayDigit(timeinfo.tm_hour / 10, CLK[0]);
  displayDigit(timeinfo.tm_hour %% 10, CLK[1]);
  displayDigit(timeinfo.tm_min / 10, CLK[2]);
  displayDigit(timeinfo.tm_min %% 10, CLK[3]);
  displayDigit(timeinfo.tm_sec / 10, CLK[4]);
  displayDigit(timeinfo.tm_sec %% 10, CLK[5]);
}

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  for(int i = 0; i < 4; i++){
    pinMode(PIN_BIT[i],OUTPUT);
    digitalWrite(PIN_BIT[i],LOW);
  }
  for(int i = 0; i < 6; i++){
    pinMode(CLK[i],OUTPUT);
    digitalWrite(CLK[i],HIGH);
    delayMicroseconds(10);
    digitalWrite(CLK[i],LOW);
    delayMicroseconds(10);
  }

  pinMode(bright,OUTPUT);
  pinMode(colon,OUTPUT);
  digitalWrite(bright,HIGH);//max brightness
  digitalWrite(colon,HIGH);
}

void loop() {
  printNixiesLocalTime();
}

この時点ではまだ自動調光機能は実装されていません。次回以降の記事で記載する予定です。

動作確認・測定

1つめのプログラムで全桁全数字が表示できるかテストした様子がこちらです。

左から4桁目が1のまま動いていないことが分かります。そこでデバッグコネクタを活用したところ、クロックがフリップフロップと繋がっていないことが分かりました。よく調べると表面実装ICの足が基板から微妙に浮いていて、はんだ不良が原因でした。

正常に動くようになったので、2つ目のプログラムを実行します。

手振れェ…

きちんと時刻が表示されました。コロンが光ってませんが、まだプログラムに実装していなかっただけです。

というわけで(ほぼ)一発で動いてくれてよかったです。

次に各所の電流値などが規定内に収まっているか確認します。これをやらないと一見動いているように見えるけど、すぐに寿命が来てしまうという事態になりかねません。

まず高電圧電源のコネクタの片方を抜いて、間に電流計を挟んで動作させます。

電流値は4.5mAでした。DC-DCコンバータの供給可能電流10mAを下回っているのでOKです。(でもDC-DC熱々なんだが…)

次にIN-3の端子間電圧を測定します。こちらは56Vでした。つまり電流制限抵抗には170-56=114V掛かっており、オームの法則からIN-3には0.52mA流れていることが分かります。

海外の通販サイトでは0.8mA以下で使えと書いてあったので多分大丈夫です。

次に分圧抵抗に流れる電流値は170/(470k+680k)≒0.15mAであるため、ニキシー管3本に流れる電流は4.5-0.52-0.15=3.83mAで1本当たり1.27mAであるとわかります。

データシートでは4.0mA以下で使えと書いてあったので、こちらも大丈夫でしょう。

疑問なのが、データシートに電源170V、制限抵抗7.5kΩ、プリバイアス67Vの条件で3.0mA流れると書いてあり、今回の測定ではほとんど同じ条件で動かしているのに1.3mA程度しか流れていませんでした。

まぁ電流が小さい分には問題ありませんし、暗すぎることも無いので良しとします。

ドライバ基板上の電源ICについては、ESP32やその他のICのデータシート上の合計電流が供給可能電流を下回っているので、大丈夫だと信じます。(しかし入出力電位差が大きいためかなり発熱します…)

(3/30追記)入出力電位差が倍以上あるので、消費電力の半分以上が熱になります。電気代と寿命の観点からDC-DCコンバータに置換しました。M78AR033-1とM78AR05-1はフットプリント的にギリギリですが取り付けられました。

Before
After

というわけで、長期運用に耐えれそうだということが分かったので、回路や基板のデータ公開と基板の頒布を行うことにします。

データ公開(最終更新2023/03/30)

回路と基板のデータ公開と基板の頒布を行いますが、ご利用にあたっては前回の記事及び今回の記事、注意事項をすべてお読みになり、同意してからお使いください。

以下に注意事項を示します。(「続きを読む」ボタンを押して全文お読みください。


注意事項

①使用時の注意
回路及び基板の設計には細心の注意を払っておりますが、あくまで趣味の製作物であるため、回路や基板に重大な欠陥が存在する可能性がございます。

続きを読む

注意事項にすべて同意いただいたら、チェックを入れてダウンロードボタンを押してください。
(新しいウィンドウでNextcloudが開きます。)

consent.html

基板頒布につきましては、メルカリ・ラクマなどのフリマサービス上で税抜1,500円で販売します。欲しい方がいらっしゃいましたら上記注意事項に同意の上、TwitterのDMでご連絡ください。(TwitterのリンクはPCではページ右、スマホではページ最下部にあります)このページを見ていない方が購入しないように、連絡いただくまで出品いたしません。残り2枚ですが、需要があるようなら再生産します。

最後に

何とか設計したものが形になってよかったです。

次回はプログラムの完成、ラズパイサイネージと統合した筐体の製作などを行いたいと考えています。

今回公開したデータが皆さんのお役に立つことを願っています。

最後までお読みいただきありがとうございました。

(4/3追記)次回記事を公開しました。よろしければご覧ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


次の投稿

NTP+スタティック方式なニキシー管時計を作る (3)

日 4月 2 , 2023
前々回、前回に引き続きニキシー管時計の製作を行って […]