LoginSignup
12
1

More than 1 year has passed since last update.

ワイヤレス給電でATtiny10をLチカさせてみた

Last updated at Posted at 2022-12-07

この記事は、Cocone Advent Calendar 2022の8日目の記事となります。

はじめに

今年ももう12月、12月といえばクリスマス、クリスマスといえばイルミネーションですね。
しかし残念なことに今年は政府からの節電要請で、中止するイルミネーションイベントも増えています。

というわけでいっそのことミニマムなイルミネーション(Lチカ)で楽しもうと思います。

スクリーンショット 2022-12-07 20.27.09.png

ミニマムマイコンボード

せっかくミニマムなLチカにするんだからマイコンボードもミニマムを目指します。
秋月電子さんでいい感じのマイコンボード(?)が売ってます。

スクリーンショット 2022-12-07 20.33.11.png

1cm立方に収まる大きさです。

ミニマム電源

マイコンボードが1cm四方となると電源も合わせてミニマムにしたくなります。
小さくかつ長時間使える、という前提でワイヤレス給電にします。

送信側

送信側はこちら。5Vを入れるだけでワイヤレス電力送信ができます。

送信モジュールの確認用としてワイヤレスLEDをコイルの中に置くと光ります。
受信用のコイルを送電ユニット内に置けば、誘導起電力が発生するわけですね。
光の強さでどこが磁場が強いかがわかって便利です。

PXL_20221205_152157415.jpg

受信側

コイルに発生した交流電圧をダイオードで整流、コンデンサで平滑化してやれば、マイコンに使える直流電圧が得られます。
本来ならダイオード四つで全波整流すると無駄がないですが、今回はダイオード一つで半波整流します。
後から気付きましたが、送電ユニットが60KHzという高周波なので、ダイオードの整流が間に合わず綺麗な半波はできません。
平滑化後も多少上下するリップルがほぼなくなるので結果オーライです。
image.png

受信コイルにはマイクロインダクターの100μHを使いました。

これをそのまま使っても2V程度しか出ませんが、並列にコンデンサを入れることで容量に応じて誘導起電力が大きく上下します。
共振周波数となる70nFが最も電圧が高くなりますが、降圧も昇圧も行わないように4.8V近辺となる47nFを使いました。
コンデンサの値だけで電圧が調整できるのはいいですね。

image.png

マイコンボード完成

受信ユニットのGNDをマイコンの2番ピン(GND)、VCCを5番ピンにつなげて完成です。
マイコンボードっぽくピンソケットをつけておきます。

スクリーンショット 2022-12-06 23.52.52.png

スクリーンショット 2022-12-07 0.01.59.png

プログラム書き込み

Arduinoを使ってATtiny10にプログラムを書き込む方法はこちらを参考にしました。

注意
Arduino IDEのバージョン1.8.10以上を使うとATtiny10への書き込みでエラーになります。
バージョン1.8.9を使うことで解決しました。

書き込みシールド

image.png
抵抗を毎回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);
}

書き込み結果

プログラムメモリも変数メモリもまだまだ余裕があります。

result.png

できあがり

それでは皆様、メリークリスマス!
スクリーンショット 2022-12-07 21.06.25.png

12
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1