株式会社LIFULLのファブリケーションスペースLIFULL Fabで半蔵門.ino 第1回 手ぶらで入門!Arduino初心者向け電子工作ワークショップというイベントが開催され、私も電子工作に少し興味があったので参加してきました。
3Dプリンタで整形した鮫くんに、Arduinoで「音に合わせて点灯する」機能を付けるというワークショップです。詳しくは動画を見てください。
キットを作ってみる
はんだ付けするのかと思ってわくわくしたのですが、今回はお手軽に「ブレッドボードに各モジュールを差し込んでいく」形で実装しました。
配線が出ていてサイバーな感じがするサメです。ちなみにこのサメのボディは、講師の太田さんが自宅の3Dプリンタで作成したものらしいです。(電子工作ファンって自宅に3Dプリンタ持ってるものなんですか?)
Arduino言語による実装
元々は「音がしたときに目が光る」仕様だったのですが、勝手に「通常時に目が光ってる。音がしたときにビックリして目を閉じる(光を消す)」ような仕様に改造しました。
今回Arduinoでビックリしたのが、公式サイトに簡易的なIDEなどが用意され、自分でコンパイラや開発ツールを用意する必要がないということです。
class LedController {
public:
LedController();
void high();
void middle();
void low();
};
void LedController::LedController() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
void LedController::high() {
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
void LedController::middle() {
// オンオフを繰り返して擬似的に暗くする
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void LedController::low() {
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
double sound = 0;
int t = 0;
int count = 0;
LedController ledCont = LedController();
void setup() {
Serial.begin(9600);
}
void loop() {
// 音を検知する
sound = analogRead(0);
if (sound > 365) {
// 音が消灯する
ledCont.low();
delay(100);
t = 0;
} else {
// 最初はやや暗く、一定時間以上経つと強く光らせる
if (t <= 200) {
ledCont.middle();
} else {
ledCont.high();
}
if(t <= 1000) t++;
}
}
ArduinoではC/C++風のArduino言語と呼ばれるものを使って実装していきます。
main
関数が無いのが不思議だったのですが、こちらの記事にもある通り、「for文で永久に loop
関数を呼び出し続ける」形になっています。大抵の組み込み系プログラミングではこの形で実装されると思うので、うまくプログラミングの敷居を低くしていますね。
「オンオフを繰り返して明るさを調節する」のはPWMと呼ばれるやり方だそうです。
本当は「LEDの状態をグローバル変数に持って、それに応じてメインのループでLEDの点灯処理をさせる。一定以上の音量の場合に割り込み処理を発生させてLEDの状態変数を書き換える」ような実装にしたかったのですが、そこまで手が回りませんでした(実際できるか分かりません…)。そうすれば、各メソッドの中でduty比を変えるために delay
を行っても音を検知する処理に即時に反応できると思ったので。
※実は私は電子工作は初めてですが、偶然ファミコンの自作ソフトを作ろうとしていたことがあるので、組み込み系のプログラミングっぽいものは多少やったことがあります。
まとめと宣伝
電子工作の経験があまり無い私でも、簡単にサメくんを作ることができました。Arduinoを使えば簡単にいろいろ作れちゃいそうですね。
LIFULL Fabではこのようなイベントを今後も行っていくつもりだそうです。ぜひPeatixやFacebookでチェックしてみてください。