はじめに:ニキシー管の魅力とESP32の融合
ニキシー管(Nixie Tube)は、1950年代から1970年代にかけて広く使われた冷陰極放電管です。現代のLEDやLCDとは異なり、ガラス管の中で数字型の陰極が橙色に発光する独特の美しさが、今も多くの電子工作愛好家を魅了しています。
ニキシー管IN-14の美しい橙色発光
今回製作するニキシー管時計は、レトロな表示デバイスと最新のIoT技術を組み合わせた、まさに**「時代を超えた融合」**です。
本プロジェクトの技術的特徴
-
ESP32-WROOM-32による高機能制御
- Wi-Fi接続でNTPサーバーから自動時刻取得
- DS3231高精度RTCモジュールとの連携
- 起動時のみネット接続で消費電力を最適化
-
MCP23017 I2C IOエキスパンダーによるピン拡張
- ESP32の限られたGPIOピンを16ピン拡張
- I2C通信(2ピンのみ)で4本のニキシー管を制御
-
効率的な180V昇圧回路設計
- NJM2374による30V一次昇圧
- 6段コッククロフトウォルトン回路で180V生成
- 従来のNJM2360単独回路より高効率
-
スタティック点灯方式の安定した表示
- ロシア製K155ID1 BCD-Decimalデコーダー使用
- ダイナミック点灯と比較した長寿命設計
必要な部品と推奨購入先
| 部品名 | 仕様 | 数量 | 備考 |
|---|---|---|---|
| ESP32開発ボード | ESP32-WROOM-32 | 1 | Wi-Fi/Bluetooth搭載 |
| ニキシー管 | IN-14 (ロシア製) | 4 | 時:分表示用 |
| BCD-Decimalデコーダー | K155ID1 | 4 | ニキシー管1本につき1個 |
| I2C IOエキスパンダー | MCP23017 | 1 | 16ピン拡張 |
| RTCモジュール | DS3231 | 1 | 高精度クロック |
| DC/DCコンバーター | NJM2374 | 1 | 30V昇圧用 |
| 高耐圧ダイオード | 1N4007 (1000V) | 12 | コッククロフトウォルトン用 |
| 高耐圧コンデンサ | 47μF 250V | 6 | 昇圧回路用 |
| トランジスタ | 2N2222A | 8 | ドライバ回路用 |
| カーボン抵抗 | 各種 | 適量 | 電流制限用 |
【重要】ニキシー管の入手について
ニキシー管は生産終了品のため、新品は非常に高価です。eBayやAliExpressでロシア製(特にIN-14、IN-8など)が入手可能ですが、偽物や不良品も多いため、評価の高い販売者から購入することをお勧めします。
1. ESP32-WROOM-32を選んだ理由
ニキシー管時計のマイコンとして、ESP32-WROOM-32開発ボードを採用しました。主な選定理由は以下の通りです:
ESP32の技術的メリット
【ネットワーク機能】
- Wi-Fi (802.11 b/g/n対応):NTPサーバーへの自動接続
- Bluetooth Classic + BLE:将来的なスマホアプリ連携も可能
【十分なGPIOピン数】
- I2C通信用:GPIO21 (SDA)、GPIO22 (SCL)
- RTC割り込み用、ボタン入力用など拡張余地あり
- 今回は主にI2C経由でMCP23017と通信
【低消費電力モード】
- Deep Sleep機能:起動時のみWi-Fi接続
- 通常時はRTCから時刻取得→Wi-Fi OFF
【豊富な開発環境】
- Arduino IDE、PlatformIO、ESP-IDF全て対応
- NTP、RTCライブラリが充実
NTP自動時刻同期の実装方針
#include <WiFi.h>
#include <time.h>
const char* ntpServer = "ntp.nict.jp"; // 日本標準時(NICT)
const long gmtOffset_sec = 9 * 3600; // JST = UTC+9
const int daylightOffset_sec = 0;
void setupNTP() {
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
struct tm timeinfo;
if (getLocalTime(&timeinfo)) {
// RTCへ時刻を書き込む処理(後述)
}
}
起動時に1度だけNTPサーバーと同期し、DS3231 RTCモジュールに正確な時刻を書き込みます。その後はWi-FiをOFFにし、RTCから時刻を読み取ることで、常時接続による消費電力を削減します。
今後の拡張構想
- Wi-Fi設定用WebUI:SmartConfigやWiFiManagerライブラリでスマホから設定
- 日付・曜日表示:ニキシー管を6本に増やして年月日表示
- 温湿度表示:BME280センサーと連携
- アニメーション効果:スロットマシン風のカウントアップ演出
2. ニキシー管の点灯方式:スタティック vs ダイナミック
ニキシー管のような多桁表示デバイスには、大きく分けて2つの駆動方式があります。
ダイナミック点灯方式(Dynamic Drive)
ダイナミック点灯の仕組み:高速スキャンで同時点灯を錯覚させる
原理:
- 各桁を時分割で順次点灯させる(例:1msごとに切替)
- 人間の目の残像効果により、全桁が同時点灯しているように見える
メリット:
- 必要ピン数が少ない:桁数が増えても制御ピン数の増加が緩やか
- 消費電力が低い:同時点灯数が1桁のみ
デメリット:
- ちらつきが発生しやすい:スキャン周波数が低いと目視で確認可能
- カメラ撮影時にローリングシャッター歪みが発生
- プログラムが複雑:タイマー割り込み処理が必須
スタティック点灯方式(Static Drive)
スタティック点灯の仕組み:全桁を常時独立制御
原理:
- 各桁に専用のドライバーICを配置
- 全ての桁が常時同時点灯
メリット:
- ちらつきゼロ:完全な常時点灯
- 長寿命:陰極への負荷が均等で安定
- プログラムがシンプル:表示したい数字を出力するだけ
デメリット:
- 必要ピン数が多い:桁数×4ピン必要(BCDコード用)
- 消費電力が大きい:全桁常時点灯のため
本プロジェクトの選択:スタティック点灯
今回はスタティック点灯方式を採用しました。理由は以下の通りです:
- 視覚的な美しさ優先:ニキシー管の橙色発光を最大限楽しむ
- 撮影時の見栄え:写真や動画でちらつきが写り込まない
- ピン不足はI2C拡張で解決:MCP23017で16ピン追加
3. スタティック点灯回路の実装:K155ID1 + MCP23017
K155ID1:ロシア製BCDデコーダーICの特性
K155ID1ピンアサインと真値表
主要スペック:
- 機能:4bit BCD入力 → 10出力(0-9のいずれか1つがLOW)
- 入力電圧:5V TTLレベル
- 出力電圧:最大200V耐圧(アノード側にHV接続)
- 出力電流:最大5mA(ニキシー管駆動に十分)
- 製造国:旧ソ連/ロシア(現在はデッドストック品)
真値表(一部):
| D3 | D2 | D1 | D0 | 出力 | 表示数字 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | Y0 | 0 |
| 0 | 0 | 0 | 1 | Y1 | 1 |
| 0 | 0 | 1 | 0 | Y2 | 2 |
| … | … | … | … | … | … |
| 1 | 0 | 0 | 1 | Y9 | 9 |
4本の入力線(D0-D3)に2進数で数字を指定すると、対応する出力ピン(Y0-Y9)がLOWになり、ニキシー管の該当陰極が発光します。
MCP23017:16ピンI2C IOエキスパンダー
MCP23017の使い方はこちらの記事で詳しく解説しています。
ピン配分(4桁時計の場合):
| MCP23017ピン | 接続先 | 機能 |
|---|---|---|
| GPA0-GPA3 | K155ID1 #1 (D0-D3) | 時(十の位) |
| GPA4-GPA7 | K155ID1 #2 (D0-D3) | 時(一の位) |
| GPB0-GPB3 | K155ID1 #3 (D0-D3) | 分(十の位) |
| GPB4-GPB7 | K155ID1 #4 (D0-D3) | 分(一の位) |
ESP32との接続:
- ESP32 GPIO21 (SDA) → MCP23017 SDA
- ESP32 GPIO22 (SCL) → MCP23017 SCL
サンプルコード:時刻「12:34」を表示
#include <Wire.h>
#include <Adafruit_MCP23X17.h>
Adafruit_MCP23X17 mcp;
void setup() {
Wire.begin(21, 22); // ESP32のI2Cピン指定
mcp.begin_I2C();
// 全ピンを出力に設定
for (int i = 0; i < 16; i++) {
mcp.pinMode(i, OUTPUT);
}
}
void displayTime(int hour, int minute) {
// 各桁を分解
int h_tens = hour / 10; // 時の十の位: 1
int h_ones = hour % 10; // 時の一の位: 2
int m_tens = minute / 10; // 分の十の位: 3
int m_ones = minute % 10; // 分の一の位: 4
// MCP23017へBCD出力(4bitずつ)
mcp.writeGPIOA((h_tens & 0x0F) | ((h_ones & 0x0F) << 4));
mcp.writeGPIOB((m_tens & 0x0F) | ((m_ones & 0x0F) << 4));
}
void loop() {
displayTime(12, 34); // 12:34を表示
delay(1000);
}
4. 昇圧回路の設計:効率的な180V生成
ニキシー管の動作には150V~200V程度の陽極電圧が必要です。通常の5V電源からこの高電圧を生成するため、2段階の昇圧回路を設計します。
従来方式の問題点
多くのニキシー管時計では、NJM2360ADというスイッチングレギュレータICで直接180Vまで昇圧する回路が一般的です。
NJM2360AD方式の課題:
- 変換効率が低い(約60-70%)↓ 大きな電圧比(5V→180V = 36倍)により損失が増大
- 発熱が大きい
- 外付けインダクタの選定が難しい(高耐圧品が必要)
本プロジェクトの2段階昇圧方式
NJM2374 + コッククロフトウォルトン昇圧回路図
【第1段】NJM2374による30V昇圧
- 入力:5V(USBまたはACアダプタ)
- 出力:30V
- 変換効率:約85%(電圧比6倍で効率良好)
【第2段】6段コッククロフトウォルトン倍電圧整流回路
- 入力:30V AC(NJM2374のPWM出力を利用)
- 出力:180V DC(理論値:30V × 6段 = 180V)
- 部品:ダイオード(1N4007)× 12個、コンデンサ(47μF 250V)× 6個
コッククロフトウォルトン回路の動作原理
コッククロフトウォルトン(Cockcroft-Walton)回路は、ダイオードとコンデンサのみで構成される「電荷ポンプ」です。
動作メカニズム:
- AC入力の正半波時:C1がV volts充電される
- 負半波時:C1の電荷がダイオードを通じてC2へ移動
- これを繰り返すことで、段数分だけ電圧が加算
理論出力電圧:
V_out = V_in × n
(n = 段数、理想条件下)
実測値との差異: 実際には以下の要因で理論値より低下します:
- ダイオードの順方向電圧降下(約0.7V × 段数)
- コンデンサのESR(等価直列抵抗)による損失
- 負荷電流による電圧降下
今回の設計では、30V × 6段 = 理論値180V に対し、実測200Vを確認しました。NJM2374の出力がやや高めだったためと考えられます。
回路の安全設計
【高電圧回路の安全対策】
⚠️ **感電注意**:200Vの直流電圧は人体に危険です。
* 基板裏面の高電圧パターンを絶縁処理
* 3Dプリンタ筐体で完全に覆う
* デバッグ時は片手作業を徹底(体を通じた閉回路形成を防止)
保護回路:
- 過電圧保護:ツェナーダイオード(200V)で電圧クランプ
- 過電流保護:各K155ID1出力に100kΩ抵抗を直列接続
部品の耐圧選定:
- コンデンサ:250V品(安全率約1.25倍)
- ダイオード:1N4007(1000V耐圧)
KiCadによる基板設計とJLCPCB発注
回路図設計
前述した仕様をもとに、KiCadで完全な回路図を作成しました。
ニキシー管時計完全回路図(クリックで拡大)
回路ブロック構成:
| ブロック | 主要部品 | 機能 |
|---|---|---|
| 電源部 | AMS1117-3.3V、レギュレータ | ESP32用3.3V生成 |
| マイコン部 | ESP32-WROOM-32 | メイン制御 |
| I2C拡張部 | MCP23017 | 16ピン出力拡張 |
| デコーダー部 | K155ID1 × 4 | BCD→10進変換 |
| 昇圧部 | NJM2374 + C-W回路 | 5V→180V昇圧 |
| RTC部 | DS3231 | 高精度時刻保持 |
| 表示部 | IN-14 × 4 | ニキシー管 |
PCBレイアウト設計
3D PCBビュー(KiCad)
設計のポイント:
【高電圧部の配慮】
- クリアランス確保:200V部は2mm以上の配線間隔
- 表裏分離:高電圧パターンは基板裏面に集約
- GNDプレーン:ノイズ対策でベタGND配置
【表面実装部品の配置最適化】
- 部品密度の調整:はんだ付け作業を考慮して、1608サイズ(0603)の抵抗・コンデンサは最小限に
- 方向統一:極性部品(ダイオード、電解コンデンサ)の向きを揃える
【ニキシー管ソケット】
- ピッチ:2.54mm(IC用丸ピンソケットを流用)
- 配置:筐体デザインを考慮して横一列
JLCPCBへの発注手順
発注仕様:
- 基板サイズ:100mm × 80mm
- 層数:2層(表裏)
- 基板色:マットブラック(シルクが映える)
- 表面処理:HASL(鉛フリーはんだ)
- 基板厚:1.6mm(標準)
- 銅箔厚:1oz(約35μm)
- 数量:5枚(最小ロット)
- 納期:発注から7日で到着(DHLエキスプレス)
費用内訳(参考):
- 基板代:約$2
- 送料(DHL):約$20
- 合計:約$22(約3,000円)
JLCPCBの推奨ポイント:
- 低コスト:少量でも格安
- 高品質:シルク印刷が綺麗
- 短納期:1週間で手元に届く
- オプション豊富:基板色、表面処理が選べる
基板の到着と部品実装
開封レビュー
JLCPCB到着基板:マットブラック仕上げ
マットブラックの基板は初めて製作しましたが、白色シルクのコントラストが非常に美しい仕上がりです。通常の緑色基板とは一線を画す高級感があります。
品質チェック結果:
- ✅ パターン欠損なし
- ✅ ビアホール導通OK
- ✅ シルク印刷鮮明
- ✅ ソルダーレジスト均一
はんだ付け作業
実装の難所
今回の基板で最も難易度が高かった部分は以下の2箇所です:
【昇圧回路部】
コッククロフトウォルトン部の密集実装
- ダイオード12個 + コンデンサ6個が狭いエリアに密集
- 部品間隔:わずか1.27mm(50mil)
- 対策:0.5mm径のはんだ、温度調整式はんだごて必須
【トランジスタアレイ部】
K155ID1周辺の抵抗・トランジスタ群
- 表面実装抵抗(1608サイズ):32個
- トランジスタ(SOT-23):8個
- 対策:ピンセット、拡大鏡、予備はんだ法
はんだ付けのコツ
【推奨工具】
- はんだごて:温度制御式(330℃設定)
- はんだ:0.5mm径(小型部品用)
- フラックス:ペーストタイプ(表面実装に必須)
- 拡大鏡:LED付き2.5倍ルーペ
【作業手順】
- 小型部品から実装:抵抗 → トランジスタ → IC
- 高さのある部品を最後に:電解コンデンサ → ニキシー管ソケット
- 導通テスト:各ブロックごとにマルチメーターで確認
完成基板
部品実装完了後の基板全景
実装所要時間:約3時間(休憩含む)
動作確認:昇圧電圧測定
ニキシー管は高価で貴重なため、まずは昇圧回路のみの動作確認を実施します。
高電圧測定:200Vを確認
測定結果:
- 出力電圧:200V DC
- 無負荷時リップル:約5V pp(許容範囲内)
- 負荷時(4本点灯):約190V(電圧降下約5%)
設計目標の180Vを上回る200Vが出力されました。これはNJM2374の出力が想定よりやや高かった(約33V)ためです。ニキシー管の仕様範囲内(150-200V)なので問題ありません。
⚠️ **高電圧注意**
昇圧回路には200Vの直流電圧が発生しています。
* 測定時は絶縁手袋を着用
* 片手での作業を徹底(感電時の閉回路形成防止)
* 電源OFF後もコンデンサに電荷が残留(放電抵抗で10秒待機)
ニキシー管の点灯試験とプログラム実装
初点灯の瞬間
昇圧回路の動作確認とデジタル信号の出力テストが完了したので、いよいよニキシー管を取り付けて点灯させます。
初点灯成功:各桁が正常に表示
点灯確認項目:
- ✅ 全桁(0-9)の表示確認
- ✅ 輝度の均一性チェック
- ✅ 異常発光(複数桁同時点灯)の有無
- ✅ クロストーク(隣接桁への影響)確認
すべてのニキシー管が美しい橙色の光を放ち、正常動作を確認できました。
Arduino IDE用サンプルコード
以下は、NTPで時刻を取得してニキシー管に表示する完全なコードです。
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_MCP23X17.h>
#include <RTClib.h>
#include <time.h>
// Wi-Fi設定
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
// NTP設定
const char* ntpServer = "ntp.nict.jp";
const long gmtOffset_sec = 9 * 3600; // JST (UTC+9)
const int daylightOffset_sec = 0;
// ハードウェアオブジェクト
Adafruit_MCP23X17 mcp;
RTC_DS3231 rtc;
void setup() {
Serial.begin(115200);
// I2C初期化(ESP32のGPIO21=SDA, GPIO22=SCL)
Wire.begin(21, 22);
// MCP23017初期化
if (!mcp.begin_I2C()) {
Serial.println("MCP23017 Error");
while (1);
}
// 全ピンを出力に設定
for (int i = 0; i < 16; i++) {
mcp.pinMode(i, OUTPUT);
}
// RTC初期化
if (!rtc.begin()) {
Serial.println("RTC Error");
while (1);
}
// Wi-Fi接続とNTP同期
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
// NTPから時刻取得
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
struct tm timeinfo;
if (getLocalTime(&timeinfo)) {
// RTCに時刻を設定
rtc.adjust(DateTime(
timeinfo.tm_year + 1900,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec
));
Serial.println("RTC synchronized with NTP");
}
// Wi-Fi切断(省電力化)
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop() {
DateTime now = rtc.now();
int hour = now.hour();
int minute = now.minute();
// 各桁を分解
int h_tens = hour / 10;
int h_ones = hour % 10;
int m_tens = minute / 10;
int m_ones = minute % 10;
// MCP23017経由でK155ID1にBCDコード出力
// GPIOA: 時の十の位(下位4bit)+ 時の一の位(上位4bit)
mcp.writeGPIOA((h_tens & 0x0F) | ((h_ones & 0x0F) << 4));
// GPIOB: 分の十の位(下位4bit)+ 分の一の位(上位4bit)
mcp.writeGPIOB((m_tens & 0x0F) | ((m_ones & 0x0F) << 4));
// デバッグ出力
Serial.printf("%02d:%02d\n", hour, minute);
delay(1000); // 1秒ごとに更新
}
コードのポイント解説:
【NTP同期】
configTime()で日本標準時(JST)を設定getLocalTime()で現在時刻を取得- RTCに一度だけ書き込み、以降はRTCから読み取り
【BCD変換とビットシフト】
// 例:時刻が12:34の場合
h_tens = 1, h_ones = 2, m_tens = 3, m_ones = 4
// GPIOAへの出力値
(1 & 0x0F) | ((2 & 0x0F) << 4)
= 0b00000001 | 0b00100000
= 0b00100001 // バイナリ: 0010 0001 → BCD: 2, 1
4bit × 4桁 = 16bitを、MCP23017の16ピン(GPIOA 8bit + GPIOB 8bit)に割り当てています。
3Dプリンタによる筐体製作
高電圧基板を露出したまま使用するのは危険なため、3Dプリンタで専用筐体を設計しました。
完成品:3Dプリンタ筐体に収納
筐体設計のポイント:
- 材質:PLA(黒色)
- ニキシー管窓:透明アクリル板を嵌め込み
- 通気口:側面にスリット(昇圧回路の放熱対策)
- 配線孔:背面にUSB給電用の開口部
- 脚部:4隅にゴム足を貼付(滑り止め)
STLファイルは後日GitHubで公開予定です。
動作動画
実際に時刻を刻んでいる様子をご覧ください。
ニキシー管特有の温かみのある橙色の光が、静かに時を刻む様子がお分かりいただけると思います。LEDやLCDとは全く異なる、レトロな美しさがあります。
まとめと今後の展望
本プロジェクトで習得できる技術
今回のニキシー管時計製作を通じて、以下の技術を実践できました:
【ハードウェア設計】
- ✅ ESP32のWi-Fi機能とNTP通信の実装
- ✅ I2C通信による周辺デバイス制御(MCP23017、DS3231)
- ✅ BCD(2進化10進)コードの理論と実装
- ✅ 高電圧回路(180V)の安全設計
- ✅ 効率的な昇圧回路(2段階方式)の設計
【ソフトウェア開発】
- ✅ RTCライブラリの使用方法
- ✅ WiFiManagerによる設定UI(今後実装予定)
- ✅ 時刻データのBCD変換アルゴリズム
【基板製作】
- ✅ KiCadによる回路図・PCB設計
- ✅ JLCPCBへの発注プロセス
- ✅ 表面実装部品のはんだ付け技術
【機構設計】
- ✅ 3Dプリンタによる筐体設計
- ✅ 放熱・配線を考慮したケース構造
今後の機能拡張アイデア
【ソフトウェア拡張】
-
Wi-Fi設定用WebUI
- スマホからSSID/パスワードを設定
- WiFiManagerライブラリを使用
-
日付・曜日表示モード
- ボタン押下で表示切替
- ニキシー管6本に拡張(年/月/日)
-
アニメーション効果
- スロットマシン風カウントアップ
- 毎正時にニキシー管全点灯演出
-
環境センサー連携
- BME280で温湿度測定
- ニキシー管で温度表示(例:23.5℃)
【ハードウェア拡張】
-
RGB LED追加
- 基板下部にアンビエントライト
- 時間帯で色変更(朝:白、夜:橙)
-
音声時報
- DFPlayer Miniで正時チャイム
- ニキシー管のカチカチ音を再現
-
バッテリー駆動化
- 18650リチウムイオン電池
- 昇圧回路の効率化で24時間駆動
リソース公開予定
以下のデータを、後日GitHubリポジトリで公開する予定です:
- KiCad設計ファイル(回路図 + PCB)
- Arduino IDEサンプルコード(完全版)
- 3Dプリンタ用STLファイル(筐体)
- 部品リスト(BOM)(購入リンク付き)
製作費用の目安
| 項目 | 費用 |
|---|---|
| ESP32開発ボード | 約800円 |
| ニキシー管 IN-14 × 4 | 約8,000円 |
| K155ID1 × 4 | 約2,000円 |
| MCP23017、RTC等 | 約1,000円 |
| 昇圧回路部品一式 | 約1,500円 |
| JLCPCB基板製作 | 約3,000円 |
| その他(抵抗、コンデンサ等) | 約1,000円 |
| 合計 | 約17,300円 |
(ニキシー管の価格は変動が大きいため、入手先により差があります)
関連記事
最後までお読みいただき、ありがとうございました!
ニキシー管時計は、レトロとモダンが融合した魅力的なプロジェクトです。ぜひ皆さんもチャレンジしてみてください。
質問やフィードバックは、コンタクトフォームまたはTwitter(@electwork_jp)までお気軽にどうぞ!