Time is color. You can see the time.
はじめに
著作権と免責事項
- 個人利用に限定され、著作権者の許可なく商用利用できません。
- 直接間接に関わらず、使用によって生じたいかなる損害も筆者は責任を負いません。
- (C)2015-2024 All rights reserved by Y.Onodera.
カラー時計とは
最新型の時計
- 電子工作をしていれば、時刻がみえます。
- 一般の方にはわからないかもしれません。
- 周りに時間を気にさせたくないけど、自分だけ時間を知ることができます。
- デパートの「雨に唄えば」のようです。店員だけが天気を知ることができます。
- さりげなく、そして部屋のインテリアにもなります。
- PIC版のカラー時計を発表したのは2015年でした。
- Pico W版のカラー時計を発表したのは2024年です。
カラー時計の種類
- ラズベリー・パイ上で動く(ソフトウェアの)カラー時計
- PICを使ったカラー時計
- Pico Wを使ったカラー時計
コンセプト
- コンセプトはきれいで見ていて楽しいです。
- できるだけ簡単な仕組みで実現します。
- カラーLEDを何かに利用できないかと考えていました。
- 芸術性と遊びを取り入れました。
基本仕様
ラズベリー・パイのカラー時計
開発環境 | GTK4 |
RGB階調 | 0.0から1.0までの浮動小数点 |
時刻精度 | システム時刻と同じ(timesyncd同期) |
PICのカラー時計
開発環境 | xc8 |
RGB階調 | 0から255 |
時刻精度 | 32.768kHzの水晶発振精度に依存 |
Pico Wのカラー時計
開発環境 | MicroPython |
RGB階調 | 0から65535 |
時刻精度 | NTP同期 |
- 仕様は予告なく変更する場合があります。
- 将来にわたり動作保証しません。Raspberry Pi側の仕様変更があるためです。
カラー時計の仕組み
- 様々な技術をつぎ込んでいます。
- 科学が根底にあります。
- 簡単なように見えますが簡単ではありません。
(1)明るさ制御
- 光の三原色であるRGBをそれぞれ明るさ制御します。
- RGBの光の混ざり度合いで色が決まります。
- RGBが同じ比率なら白になります。
- LEDの明るさをPWM(Pulse Width Modulation)制御します。
- 明るさを256あるいは65536階調で制御します。
- 明るさの違うRGBの違いで微妙な色を表現します。
- ※PICは256階調でハードウェア制御します。
- ※Picoは65536階調でハードウェア制御します。
(2)光度調整
- 20mA流した時のRGBの光度[カンデラ]が異なります。RGBの光度がそろっていません。
- 緑の光度が著しく高いです。このままでは緑がかった白になります。
- そこでPWM制御前に基本的なRGBの光度を揃えます。
- 明るさは電流に比例します。
- 電流制御抵抗を適切に選択することにより、基本的なRGBの光度を揃えます。
| R | G | B | |
Voltage | 2 | 3.6 | 3.6 | V |
Current | 20 | 20 | 20 | mA |
Intensity | 2000 | 7000 | 2500 | mcd |
modifing intensity | 1000 | 1000 | 1000 | mcd |
modifing current | 10 | 2.86 | 8 | mA |
R at 4.5V | 250 | 315 | 113 | ohm |
- LEDの仕様から光度がわかっているので、1000mcdに揃えます。
- その時の電流を計算します。
- 信号制御電圧4.5Vのときの電流制限抵抗を計算します。
- 電源電圧5Vのときgpio出力電圧はやや低下するため、4.5Vと仮定します。
- 近い値の抵抗を選択します。
- LEDの個体差もあるので厳密な調整はできません。
- 微調整はPWMで行います。
- 3.3Vロジック電圧のときは計算不可能になりますが、大きなずれはないものとします。
- ※PICは5Vロジック
- ※Picoは3.3Vロジック
(3)ダイナミック点灯
- 6個のLEDの制御線を減らすためダイナミック点灯します。
- ダイナミック点灯とは目の残像効果を利用した方法です。
- 残像効果とは20Hz以上の点滅は連続点灯に見える現象です。
- 蛍光灯やLED信号機は点滅していますが、連続点灯しているように見えます。
- アニメーションでは1秒間に24コマの静止画で構成されています。静止画なのに動画に見えます。
- 強い光を見ると目を閉じてもしばらく光ったままの状態も残像効果です。
- 残像効果を利用すると6個のLEDが連続点灯しているように見えます。
- 表示をHH:MM:SSとします。
- H->H->M->M->S->Sと順次LED点灯制御します。1つのLEDあたり20Hz以上の速さで繰り返します。
- 一つしかLEDを点灯していないにも関わらず、あたかも6個同時に点灯しているように見えます。
- スタティック(静的)点灯に比べダイナミック(動的)点灯は制御線を大幅に減らせます。
- PWM制御をさらにダイナミック制御します。
(4)NTP
- Pico Wのネットワークを使い時刻同期します。
- NTP(Network Time Protocol)を使い標準時刻を取得します。
- 毎時同期するので電波時計のように時刻は正確です。
- 時刻合わせをする必要がありません。
- 何らかのネットワーク障害のときは同期しません。
(5)RTC
- Pico WのRTC(Real Time Clock)を使い時刻を管理します。
- RTCは設定するとハードウェアで動作します。
- 通常はRTCの時刻を読みだして表示します。
- NTPによる時刻同期ができなくても動作を継続します。
(6)マルチスレッド
- Pico Wはデュアルコアのため2スレッド同時実行できます。
- そこで2つの割り込みを分担処理します。
- core0で1秒割込み処理(時刻管理)
- core1でダイナミック点灯の割り込み処理(表示管理)
- 2つの処理は別々に行われます。相互干渉しません。
(7)gpioの電流拡張
- PICのgpio出力電流は20mA制限のため、LEDを十分制御できます。
- Picoのgpio出力電流は4mAのため、LED電流不足になります。
- 光度調整で計算したLED電流を流せません。
- そこでPicoのgpio出力電流を12mAに拡張します。
(8)PWMの同期
- RGBは3つのPWM制御をします。
- 3つの制御が同期していないと、色むらを起こします。
- PicoではPWM制御を同期します。
(9)茶色から水色への変更
- RGBで茶色を表現するのは難しく、灰色との見分けも微妙です。
- そこで茶色の代わりに水色で代用します。
- 明確に違う色を使うことで視認性を向上します。
(10)光の拡散
- LEDキャップをつけることで光を拡散します。
- RGBが混ざり合い、鮮やかな色を演出します。
(11)水晶発振精度
- PICのカラー時計は水晶発振精度に依存します。温度に依存します。
- 精度を追い込む方法です。
- 進むときはC1とC2を少し大きくします(24pF)。
- 遅れるときはC1とC2を少し小さくします(18pF)。
回路図、部品表
PICカラー時計
型番 | 数 | 部品番号 | 備考 |
PIC16F1827 | 1 | U1 | microchip |
OSTA5131A | 6 | LED1-6 | フルカラーLED(カソードコモン) |
240 | 1 | R1 | カーボン被膜抵抗,1/6W |
300 | 1 | R2 | カーボン被膜抵抗,1/6W |
120 | 1 | R3 | カーボン被膜抵抗,1/6W |
22k | 1 | R4 | カーボン被膜抵抗,1/6W |
VT-200-F | 1 | X1 | 水晶発振子(32.768kHz) |
22pF | 2 | C1,C2 | 積層セラミック,2.5mm |
P-03646 | 1 | SW1 | タクトスイッチ赤 |
P-03651 | 1 | SW2 | タクトスイッチ緑 |
P-03649 | 1 | SW3 | タクトスイッチ青 |
miniUSB | 1 | USB | miniUSBコネクタ |
9x2 | 1 | J1 | 18ピンソケット |
I-01120 | 6 | | LED光拡散キャップ |
Picoカラー時計
型番 | 数 | 部品番号 | 備考 |
Pico W | 1 | U1 | Raspberry Pi |
OSTA5131A | 6 | LED1-6 | フルカラーLED(カソードコモン) |
240 | 1 | R1 | カーボン被膜抵抗,1/6W |
300 | 1 | R2 | カーボン被膜抵抗,1/6W |
120 | 1 | R3 | カーボン被膜抵抗,1/6W |
20x1 | 2 | J1 | 20ピンソケット |
I-01120 | 6 | | LED光拡散キャップ |
操作方法
ラズベリー・パイのカラー時計
- コンパイルして起動するだけです。
- $ ./compile.sh
- $ ./color
PICのカラー時計
- モードボタン(SW1)で時修正、分修正を選択します。
- 通常->時修正->分修正
- 増(SW2)減(SW3)ボタンで調整します。
- 秒は増減ボタンを押した瞬間にゼロ設定します。
- モードボタン(SW1)を押しながら起動すると1の色を茶色から水色に代替します。
Picoのカラー時計
- Pico のRTCを同期します。
- $ mpremote rtc --set
- ssidとpasswordを書き換えて実行します。
- $ mpremote run colorw.py
- 自動起動するにはmain.pyに名前を変更してMicroPythonにコピーします。
- $ mpremote fs cp colorw.py :main.py
あとがき
- 写真以上に美しい発光です。
- 要望が多ければ基板提供するかもしれません。
©2015-2024 All rights reserved by Y.Onodera.