google-site-verification: google3bd66dd162ef54c7.html
fc2ブログ

Arduinoを使った72LEDクリスマスツリー(操作解説編)

◆まえがき
クリスマスツリー作りの最終回。前回はハードを作りましたが、今回はソフトを入れて完成状態に持って行きます。

・外観
72LEDクリスマスツリー
回路をケースに入れた方が家族からの受けが良くなるのですが、とりあえずこれで様子を見ることにしました。

◆明るさの調整回路
このツリーは出来るだけ簡単に作ることが目標で、余分な回路は付けなくても動くようになっています。でも下記の回路を追加することで少し便利になります。

・回路図
追加回路
1) 光量調節機能
D12をGNDに落とすと手動でツリーの明るさが変えられるようになります。明るさの調整はA0ピンのアナログ電圧で行う方式で、0Vから5Vで明るさが0-100%まで変化します。上の回路図のように可変抵抗で電圧を調整するのが良いでしょう。

2) 表示タイマーリセット機能
このツリーは6時間で消灯するようにタイマーを設けています。(朝になってもツリーが点灯しているのって、嫌じゃないですか?)消灯していたら電源を入れ直せば再度点灯しますが、あまりスマートな方法ではありません。そこで、D11をGNDに落とすことで表示タイマーをリセット出来るようにしました。
追記:ResetをGNDに落とせば同じことが出来るので、D11ではなくRSTピンに押しボタンを接続した方が簡単でした。
・ブレッドボード
追加回路を入れたブレッドボード
上記の機能を追加した状態のブレッドボードです。なお、前の記事に書いたように、ツリーはD2からD10に差し込みます。

◆プログラム
去年作ったプログラムをベースにLEDの数を増やし、表示パターンを増やしたものです。二つありますがエンコードが違うだけで中身は同じです。
20211022_72LED_XmasTreeV110B-sjis.txt Shift JIS エンコード
20211022_72LED_XmasTreeV110B-utf8.txt UTF8エンコード(BOM付き)
1サイクル実行するのに3分くらいかかります。

・プログラム解説
1) 配線テスト機能
回路を最初に動かす時は、setup() の中の ledTest() のコメントアウトを外して配線のテストを行った方が良いでしょう。実行すると下から時計回りに順番に一つづつLEDを点灯します。

2) ツリーの表示パターン
loop() の中で呼び出している関数で順番に表示を行っています。お好みで修正すれば良いと思います。ほとんどの関数は引数で実行回数や実行時間の指定が可能です。

下記はLoopの内容です。好みに応じ順番を入れ替えたり実行時間や速度を変える、あるいはコメントアウトして消したり出来ます。ちなみにデフォルトのプログラムは動きがあわただしいので、もう少し遅くした方が雰囲気が出ると思います。
個別のプログラムの表示速度を変えたい時は関数内で呼び出している、show(t)の引数を変更します。t の値がms単位の表示時間です。

【loopの内容】021021/10/25追記
void loop() {                   // 表示のデモ 引数で実行回数などを指定
starSpiralUp(3); // 下から上にスパイラルに点灯
fallingRing(3); // 落下するリング
stackUpDown(2); // UP/DOWN
swing(2); // スイング
verticalCut(3); // 縦切り
rotateAndClimb(2); // 回転しながら登る
dialLock(1); // ダイヤル錠(V160で追加)
randomStar(3); // ランダム点灯 引数1で3秒間
dimming(1); // 調光
fallingSnow(2); // 降雪、積雪
dimming(2); // 調光
// lampTest();
// varticalSeparate();
show(1000);
Serial.println(timeElapsed);
if (timeElapsed > OFF_TIMER) { // 表示時間が設定値を超えていたら
while (digitalRead(TIMER_RESETPIN) == HIGH) { // リスタートボタンが押されるまで停止
}
timeElapsed = 0; // リスタートが押されたので経過時間をリセットして再開
}
}
3) LEDの点灯
・チャーリープレクシングでダイナミック点灯させていて、タイミングはタイマー2の割り込み処理の、ISR(TIMER2_COMPA_vect) とISR(TIMER2_COMPB_vect) で行っています。
・LEDの明るさはダイナミック点灯のディユーティ調整で行っています。
・点灯させるLEDは、プログラムの最後にある d2Highからd10High でドライブ条件を指定しています。
・マニュアルでLEDの明るさ調整を行わない場合の明るさは #define BRIGHT 50 の値で指定します。
・自動消灯するまでに時間は #define OFF_TIMER 21600 で設定しているので好みで変更してください。

◆動画

動画のデモ用に短縮したプログラムで実行しています。

◆まとめ
大量のLEDを点灯させる方法はいろいろありますが、チャーリープレクシングは追加のハードウエアを必要とせず、比較的少ないピン数で実装出来るのでお勧めです。特にクリスマスツリーにはこの記事のツリープレクシングの回路が適していると思います。

もっと面白い点灯パターンを作るのも楽しそうです。あと、LEDの数が結構多いので頑張ればドット文字が表示出来るかも知れません。ただ、マトリックスが直交していないので厳しそうではあります。

この記事ではIOポートの間にLEDを直接接続して点灯させています。ダイナミック点灯なのでデューティ比が小さいとは言え電流制限抵抗無しでLEDを接続することを心配されるかも知れません。しかし、ポートのVI特性を調べてみると、適度に電流制限が掛かっているので、大丈夫だと判断しています。
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
08 | 2023/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。
記事の内容のご利用は読者の自己責任でお願いします。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード