この記事は、Cocone Advent Calendar 2022の8日目の記事となります。
はじめに
今年ももう12月、12月といえばクリスマス、クリスマスといえばイルミネーションですね。
しかし残念なことに今年は政府からの節電要請で、中止するイルミネーションイベントも増えています。
というわけでいっそのことミニマムなイルミネーション(Lチカ)で楽しもうと思います。
ミニマムマイコンボード
せっかくミニマムなLチカにするんだからマイコンボードもミニマムを目指します。
秋月電子さんでいい感じのマイコンボード(?)が売ってます。
1cm立方に収まる大きさです。
ミニマム電源
マイコンボードが1cm四方となると電源も合わせてミニマムにしたくなります。
小さくかつ長時間使える、という前提でワイヤレス給電にします。
送信側
送信側はこちら。5Vを入れるだけでワイヤレス電力送信ができます。
送信モジュールの確認用としてワイヤレスLEDをコイルの中に置くと光ります。
受信用のコイルを送電ユニット内に置けば、誘導起電力が発生するわけですね。
光の強さでどこが磁場が強いかがわかって便利です。
受信側
コイルに発生した交流電圧をダイオードで整流、コンデンサで平滑化してやれば、マイコンに使える直流電圧が得られます。
本来ならダイオード四つで全波整流すると無駄がないですが、今回はダイオード一つで半波整流します。
後から気付きましたが、送電ユニットが60KHzという高周波なので、ダイオードの整流が間に合わず綺麗な半波はできません。
平滑化後も多少上下するリップルがほぼなくなるので結果オーライです。
受信コイルにはマイクロインダクターの100μHを使いました。
これをそのまま使っても2V程度しか出ませんが、並列にコンデンサを入れることで容量に応じて誘導起電力が大きく上下します。
共振周波数となる70nFが最も電圧が高くなりますが、降圧も昇圧も行わないように4.8V近辺となる47nFを使いました。
コンデンサの値だけで電圧が調整できるのはいいですね。
マイコンボード完成
受信ユニットのGNDをマイコンの2番ピン(GND)、VCCを5番ピンにつなげて完成です。
マイコンボードっぽくピンソケットをつけておきます。
プログラム書き込み
Arduinoを使ってATtiny10にプログラムを書き込む方法はこちらを参考にしました。
注意
Arduino IDEのバージョン1.8.10以上を使うとATtiny10への書き込みでエラーになります。
バージョン1.8.9を使うことで解決しました。
書き込みシールド
抵抗を毎回4本繋ぐのが面倒だったので書き込みシールドを作りました。
書き込み用に繋ぎつつ挙動確認もできます。
5Vをマイコンの電源に繋いでますが、整流用ダイオードのおかげでコイルに逆流はしません。
サンプルコード
温かみのある白熱球っぽく、というかホタルっぽい点滅になるようにしてみました。
パラメータ調整でいろんな点滅が試せます。
コード
#define LED_PIN1 1 // ATtiny10 3番ピン(A1)
const float T = 3.0; // 周期(秒)
const float WAIT_UP = 150; // 点くまでの時間ウエイト
const float WAIT_ON = 50; // 点いている時間ウエイト
const float WAIT_DOWN = 200; // 消えるまでの時間ウエイト
const float WAIT_OFF = 50; // 消えている時間ウエイト
int dt_up=0;
int dt_on=0;
int dt_down=0;
int dt_off=0;
void setup() {
pinMode(LED_PIN1, OUTPUT);
int waitSum = WAIT_UP + WAIT_ON + WAIT_DOWN + WAIT_OFF;
dt_up = (T*WAIT_UP/waitSum)/255 * 1000; // 点くまでの時間を255分割した時間(ms)
dt_on = T*WAIT_ON/waitSum * 1000; // 点いている時間(ms)
dt_down = (T*WAIT_DOWN/waitSum)/255 * 1000; // 消えるまでの時間を255分割した時間(ms)
dt_off = T*WAIT_OFF/waitSum * 1000; // 消えている時間(ms)
}
void loop(){
// 徐々に明るく
for(int i=0; i<255; i++){
analogWrite(LED_PIN1, i);
delay(dt_up);
}
// 点いている
delay(dt_on);
// 徐々に暗く
for(int i=0; i<255; i++){
analogWrite(LED_PIN1, 255-i);
delay(dt_down);
}
// 消えている
delay(dt_off);
}
書き込み結果
プログラムメモリも変数メモリもまだまだ余裕があります。
できあがり