google-site-verification: google3bd66dd162ef54c7.html

Arduinoで簡単だけど豪華なLチカ

 以前記事にした、Arduinoで簡単にLチカをやるやつの規模を最大限に大きくしてみました。

▼回路図
17LEDでLチカの回路図
 LEDに電流制限抵抗が入っていないので、こんなことしたらLEDかCPUが過電流で壊れそうです。でも大丈夫です。ポートのプルアップ抵抗を使うことで電流制限した状態でLEDを光らせます。

 なお、D0、D1はシリアルポートとして使われています。また、D13はリセット後にブートローダーが短時間ですがHIGHを出力してくるので、これらは今回は使わないことにします。ということでLEDの数は17個です。

▼配線
LEDの接続
 とりあえず実験なので空中配線です。LEDのアノード側の足はArduinoのポートへ挿し込みます。LEDのカソード側は裸線でパラにハンダ付けしてArduinoのGNDへ繋ぎます。

▼スケッチ
 loopの中に書いてある4種類のLチカを順番に実行します。
/* 簡単で豪華なLチカのデモ
* CPUのプルアップ抵抗を使って17個のLEDを使ってLチカ
* 2015/11/09 ラジオペンチ http://radiopench.blog96.fc2.com/
*/

unsigned long data = 0;
int n;

void setup() {
} // pinModeを指定していないので全部inputになる

void loop() { // メインループ
rotate(3); // 順送り点灯
x_rotate(3); // 順逆同時送り点灯
wave(3); // 波のように表示
parapara(50); // ランダム点灯
}

void rotate( int count) { // 順送り点灯
for (int i = 1; i <= count; i++) {
data = 0x01; // タネを仕込む
for (n = 0; n <= 17; n++) {
led(data); // ビットパターンを表示
data = data << 1; // 左にシフト
delay(50);
}
}
}

void x_rotate( int count) { // 順・逆送り表示
unsigned long a, b;
for (int i = 1; i <= count; i++) {
a = 0x00001; // 下側のタネ
b = 0x10000; // 上側のタネ
for (n = 0; n <= 17; n++) {
data = a | b; // 上下のタネを合成して、
led(data); // 表示
a = a << 1;
b = b >> 1;
delay(50);
}
}
}

void wave(int count) { // 波のように表示
for (int i = 1; i <= count; i++) {
for (n = 0; n <= 16; n++) {
data = data | 0x01; // 右端に1ビット追加
led(data);
data = data << 1; // 左にシフト
delay(50);
}
for (n = 0; n <= 16; n++) {
data = data & 0x1FFFE; // 右端のビットを消す
led(data);
data = data << 1; // 左にシフト
delay(50);
}
}
}

void parapara( int count) { // ランダム点灯
for (int i = 1; i <= count; i++) {
data = random(0, 0x20000); // 0から0x1FFFFまでの乱数発生
led(data);
delay(100);
}
}

void led(unsigned long x) { // LED点灯ルーチン
/* 引数に対応するビットのLEDを点灯。(プルアップ抵抗で点灯させる)
* データーは17ビット、ポートとの対応は下記
* data x xxxx xxxx xxxx xxxx
* PORTD 76 5432
* PORTB 432 10
* PORTC 5 4321 0
* digital 0, 1, 13はブートローダーと干渉するので使わない。
*/
byte d;
x = x & 0x1FFFF; // 変な値を排除

// 下位6ビットを digital 2-7 に出力 (0,1はTX,RXなので使わない)
d = (x << 2) & B11111100;
PORTD = d;

// 6ビット目から5ビットを digital 8-12に出力(13は使わない)
d = (x >> 6) & B00011111;
PORTB = d;

// 11ビット目から6ビットを analog0-5(digital 14-19)に出力
d = (x >> 11) & B00111111;
PORTC = d;
}
 led()の関数に17ビットのパターンを引数で渡すことで、LEDを光らせている所がミソです。

 タイマーをウォッチドッグタイマー割込みで作れば、とても省エネなLチカが出来ると思います。但しUNOの状態ではUSBインターフェイス部が大食いのまま残るのでダメで、CPUのATmega328Pを単独動作させる必要があります。

▼プログラムが動く様子

 なかなかにぎやかに光ります。クリスマスの飾りに使うと良さそうです。

 17個のLEDを独立して光らせることが出来るので、もっと面白いパターンを表示することが出来るはずです。プログラムの勉強にちょうど良いので、私のスケッチをベースにいろいろなアイディアを試すといいと思います。
関連記事

コメントの投稿

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

これは良い!

17個のLEDを好きなように光らせるのは楽しそうです。

チップ型LEDとガラケーから取り出した平型Li-ion電池でなるべく小さく作ってみたいです。

単なるLチカでは試す気になれませんでしたが、これだけ数が増えると試してみたくなります。

re:これは良い!

mytoshiさん、今晩は。

流している電流が小さいので効率が良いLEDを選ばないといけません。
でもそうですね、実装を工夫すると面白いものが付けれそうです。
カレンダー
07 | 2017/08 | 09
- - 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 31 - -
プロフィール

ラジオペンチ

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

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