【Arduino Pro mini】LEDの光量をゆっくり変化させよう
Category : 工作過程
今まで、自分が製作してきた作品ではプラモデル用の電飾というと
「スイッチを入れると光る」という操作ができるものに留まっていました。
しかし今ではマイコンなどなど部品が充実し、安価で手軽にLEDの点滅タイミングや
光量の制御ができるようになっているようです。
自分も、「Arduino」というシリーズのボードを買って遊んでみることにしました。

ガチャのゾイドくらいのサイズ感の、小さいボードです!!
青い基盤にひし形のチップが乗っているのが「Arduino Pro mini」シリーズの上位互換ボード、AE-ATMEGA328-MINIです。その下にある青緑色で小さめの基盤は、書き込み用のUSB-シリアル変換器 (FT-232RQ)です。
こちらの記事を参考に環境構築。
http://curious4dev.mydns.jp/post-1392/

Mac環境にIDEをインストールしてボード、電圧、周波数、シリアルポートを指定。
USBケーブル経由のシリアルポートはこちらの記事を参考にシステム環境設定を変更したら出てきました。
そしてサンプルで用意されているスケッチ (プログラム)を流用していじって書き込み。

LEDを光らせることに成功しました。
プログラムを改修し、順番に光らせて、光が流れて行く感じにもできました!!
使ったソースコードはこちら。
【LED7つを順に光らせるプログラム (同時に2個ずつ点灯)】
そしたら次にやってみたいのが、LEDがゆっくり明るくなっていって、またゆっくり暗くなって行く、という動きの繰り返しです。
電圧値を段階的に変化させるプログラムはこの記事を参考に実装。
https://qiita.com/radi_bow/items/4f274aa1e441ee3bc186
とても参考になりました。
こんな感じにできました:
うん、いいんじゃないかな。
プログラムは泥臭くforループを並べただけの、こんなやつです:
【LED6つをゆっくり明るくさせ、またゆっくり暗くしていくプログラム】
タイミング(Delay()の引数)はセンスと経験の問題でしょうか
さて、上記のツイートには「ジオラマに組み込む」と書きましたが、どんなジオラマにどんなギミックを盛り込むかはお楽しみに!!
というかZAODまであと週末4回しかないじゃん!!
他の作品も塗装中だったりする中で作業しなくちゃいけない。いそげ〜(`・ω・´)
「スイッチを入れると光る」という操作ができるものに留まっていました。
しかし今ではマイコンなどなど部品が充実し、安価で手軽にLEDの点滅タイミングや
光量の制御ができるようになっているようです。
自分も、「Arduino」というシリーズのボードを買って遊んでみることにしました。

ガチャのゾイドくらいのサイズ感の、小さいボードです!!
青い基盤にひし形のチップが乗っているのが「Arduino Pro mini」シリーズの上位互換ボード、AE-ATMEGA328-MINIです。その下にある青緑色で小さめの基盤は、書き込み用のUSB-シリアル変換器 (FT-232RQ)です。
こちらの記事を参考に環境構築。
http://curious4dev.mydns.jp/post-1392/

Mac環境にIDEをインストールしてボード、電圧、周波数、シリアルポートを指定。
USBケーブル経由のシリアルポートはこちらの記事を参考にシステム環境設定を変更したら出てきました。
そしてサンプルで用意されているスケッチ (プログラム)を流用していじって書き込み。

LEDを光らせることに成功しました。
プログラムを改修し、順番に光らせて、光が流れて行く感じにもできました!!
LED7個を順番に光らせる、いける pic.twitter.com/nNGqewNvMf
— ユミヤシ (@yumiyashi_Iwk) 2018年9月30日
使ったソースコードはこちら。
【LED7つを順に光らせるプログラム (同時に2個ずつ点灯)】
int pin_03 = 3;
int pin_05 = 5;
int pin_06 = 6;
int pin_09 = 9;
int pin_10 = 10;
int pin_11 = 11;
int pin_13 = 13;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(pin_03, OUTPUT);
pinMode(pin_05, OUTPUT);
pinMode(pin_06, OUTPUT);
pinMode(pin_09, OUTPUT);
pinMode(pin_10, OUTPUT);
pinMode(pin_11, OUTPUT);
pinMode(pin_13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(pin_13, 0);
digitalWrite(pin_03, 1);
delay(50);
digitalWrite(pin_11, 0);
digitalWrite(pin_05, 1);
delay(50);
digitalWrite(pin_03, 0);
digitalWrite(pin_06, 1);
delay(50);
digitalWrite(pin_05, 0);
digitalWrite(pin_09, 1);
delay(50);
digitalWrite(pin_06, 0);
digitalWrite(pin_10, 1);
delay(50);
digitalWrite(pin_09, 0);
digitalWrite(pin_13, 1);
delay(50);
digitalWrite(pin_10, 0);
digitalWrite(pin_11, 1);
delay(50);
}
そしたら次にやってみたいのが、LEDがゆっくり明るくなっていって、またゆっくり暗くなって行く、という動きの繰り返しです。
電圧値を段階的に変化させるプログラムはこの記事を参考に実装。
https://qiita.com/radi_bow/items/4f274aa1e441ee3bc186
とても参考になりました。
こんな感じにできました:
ゆっくりと全体が明るくなっていって、またゆっくり暗くなっていくっていうのを繰り返せるようになった。よし!これをジオラマに組み込もう
— ユミヤシ (@yumiyashi_Iwk) 2018年9月30日
Arduino pro mini 使用。 pic.twitter.com/X8MjEaDJa6
うん、いいんじゃないかな。
プログラムは泥臭くforループを並べただけの、こんなやつです:
【LED6つをゆっくり明るくさせ、またゆっくり暗くしていくプログラム】
int pin_03 = 3;
int pin_05 = 5;
int pin_06 = 6;
int pin_09 = 9;
int pin_10 = 10;
int pin_11 = 11;
const double C = 255.0;
void setup() {
// put your setup code here, to run once:
pinMode(pin_03, OUTPUT);
pinMode(pin_05, OUTPUT);
pinMode(pin_06, OUTPUT);
pinMode(pin_09, OUTPUT);
pinMode(pin_10, OUTPUT);
pinMode(pin_11, OUTPUT);
}
void loop() {
analogWrite(pin_06, getDuty(1/255.0));
analogWrite(pin_09, getDuty(1/255.0));
delay(5);
analogWrite(pin_05, getDuty(1/255.0));
analogWrite(pin_10, getDuty(1/255.0));
delay(5);
analogWrite(pin_03, getDuty(1/255.0));
analogWrite(pin_11, getDuty(1/255.0));
for(int i=1;i <= 16;i++){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(15);
}
for(int i=17;i <= 50;i++){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
delay(15);
}
for(int i=17;i <= 50;i++){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(15);
}
for(int i=51;i <= 160;i++){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
delay(10);
}
for(int i=51;i <= 160;i++){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(10);
}
for(int i=161;i <= 255;i++){
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
delay(10);
}
for(int i=161;i <= 255;i++){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
delay(10);
}
for(int i=161;i <= 255;i++){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(10);
}
delay(200);
for(int i=255;i >= 161;i--){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(20);
}
for(int i=255;i >= 161;i--){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
delay(10);
}
for(int i=255;i >= 161;i--){
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
delay(10);
}
for(int i=160;i >= 51;i--){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(10);
}
for(int i=160;i >= 51;i--){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
delay(10);
}
for(int i=160;i >= 51;i--){
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
delay(10);
}
for(int i=51;i >= 17;i--){
analogWrite(pin_03, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(15);
}
for(int i=51;i >= 17;i--){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
delay(15);
}
for(int i=51;i >= 17;i--){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(15);
}
for(int i=16;i > 0;i--){
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_05, getDuty(i/255.0));
analogWrite(pin_06, getDuty(i/255.0));
analogWrite(pin_09, getDuty(i/255.0));
analogWrite(pin_10, getDuty(i/255.0));
analogWrite(pin_11, getDuty(i/255.0));
delay(20);
}
digitalWrite(pin_03, 0);
digitalWrite(pin_11, 0);
digitalWrite(pin_05, 0);
digitalWrite(pin_10, 0);
digitalWrite(pin_06, 0);
digitalWrite(pin_09, 0);
delay(1000);
}
int getDuty(double ratio){
return round(exp(log(255.0) - (1 -ratio)*log(C)));
}
タイミング(Delay()の引数)はセンスと経験の問題でしょうか
さて、上記のツイートには「ジオラマに組み込む」と書きましたが、どんなジオラマにどんなギミックを盛り込むかはお楽しみに!!
というかZAODまであと週末4回しかないじゃん!!
他の作品も塗装中だったりする中で作業しなくちゃいけない。いそげ〜(`・ω・´)
スポンサーサイト