

NTP+スタティック方式なニキシー管時計を作る (2)
本番基板の設計・製作と、NTP同期まで動くところを確認する
前回に引き続き、ニキシー管時計の製作を行っていきます。今回は本番の基板を作って、時刻を表示できるところまで製作しました。
記事の最後で全体回路図と基板のデータを公開します。また余った基板の頒布も行います。
回路構成#
前回製作した1桁表示回路の4bit部分を並列に、クロックを個別にマイコンへ接続します。
この図は大まかな構成を示したものであり、実際にはこの他にもPWM調光用のフォトカプラやコロン表示用回路、電源回路なども搭載しています。ここからは回路をいくつかの部分に分けて解説していきます。
電源は3.3Vと5Vを用意しています。J18にACアダプタからの12Vを入力し、J19〜J21は高電圧生成用のDC-DC2台とラズパイサイネージ用のDC-DCに出力するコネクタです。J22、J23は拡張機能を載せるかもしれないので一応つけてあります。
電源ICはLibraryLoaderで検索・インクルードしました。シンボルエディターのピンテーブルで VIN と GND は「電源入力」、VOUT は「電源出力」に設定しないとERCに引っかかると思います。
(3/30追記)3端子DC-DCコンバータ M78AR033-1 と M78AR05-1 に置換しました。交換したら常温程度になりました。
ニキシー管アダプタ基板側では、DC-DCの最大供給電流10mAを踏まえ、ニキシー管を3本ずつに分けています。
プリバイアス…ニキシー管は共通アノードに高電圧をかけ、光らせたい数字の電極を0Vに落とすとその数字が発光する。 しかしドライバICに高電圧は供給していないのでカソード電圧が低くなる。すると光らせたくない数字もぼんやりと光ってしまう(ゴースト)。 そのため全てのカソードに60V程度をかけて、アノード・カソード間の電位差を小さくしてゴーストを防ぐ手法。
コロン表示部と駆動IC+ロジック部、マイコン部もそれぞれ分けて設計しました。
基板の製作#
これまで示した回路をもとに基板を設計し、JLCPCBに発注しました。2日で完成し、1週間で届きました。
中国からの送料込み5枚で2,300円でした。部品数がかなり多いので、製作には5時間ほどかかりました。
ニキシー管は抜き差しできるように秋月の1ピンタイプ丸ソケットを大量に使いましたが、かなり頑丈に刺さるため、はんだ付け後は抜けなくなるかと思いました。実際にはグリグリやったら普通に抜けました。
一通りはんだ付けを行ったら、基板を切れ込みに沿って2分割し、スタック用のコネクタで合体させます。
プログラム#
まず前回のプログラムを複数桁版にしたものを使用し、回路が正常に動作しているか確認しました。
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++;
}
}cpp動作を確認したら、NTP同期に対応させます。以下のサイトを参考にしつつ、ピン番号を配列で扱うなどの改造を施しました。
#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();
}cppこの時点ではまだ自動調光機能は実装されていません。次回の記事で記載する予定です。
動作確認・測定#
まず1つめのプログラムで、全桁全数字が表示できるかテストします。
最初は左から4桁目が1のまま動いていませんでしたが、デバッグコネクタを使って原因を追うと、表面実装ICの足がわずかに浮いていて、はんだ不良が起きていたことが分かりました。
正常に動くようになったので、2つ目のプログラムを実行します。
きちんと時刻が表示されました。コロンが光っていないのは、この時点ではまだ実装していなかっただけです。
次に各所の電流値などが規定内に収まっているか確認します。高電圧電源の片側を切り離して電流計を挟んだところ4.5mAでした。DC-DCの供給可能電流10mAを下回っているので問題ありません。
IN-3の端子間電圧は56Vでした。そこから制限抵抗や分圧抵抗に流れる電流も見積もり、データシート記載の上限内で使えていることを確認しました。
データ公開#
回路と基板のデータ公開、そして基板の頒布を行います。利用にあたっては前回の記事と今回の記事、そして以下の注意事項をお読みください。
基板頒布については、フリマサービス上で税抜1,500円で販売する予定とされていました。必要な方は、上記注意事項に同意の上で連絡してほしい、という運用でした。
最後に#
何とか設計したものが形になってよかったです。
次回はプログラムの完成、ラズパイサイネージと統合した筐体の製作などを行う予定です。
今回公開したデータが皆さんのお役に立つことを願っています。
最後までお読みいただきありがとうございました。
