先日、最近話題のArduino(アルドゥイーノ)のワークショップへ参加してきました。
10年前電子工作をしていた時よりもずっと簡単に動くことがわかり、早速購入して何か作ってみることにしました。
ちなみにArduinoとは・・・
Arduino はスタンドアロン型のインタラクティブデバイス開発だけでなく、ホストコンピュータ上のソフトウェア(例えば、Adobe Flash、Processing、Max/MSP、Pure Data、SuperCollider)で制御することもできるワンボードマイコンの一種。オープンソースハードウェアでありハードウェア設計情報のEAGLEファイルは無料で公開されており、組み立て済みの基板を購入することもできるほか、誰でも自分の手で Arduino を組み立てることができる。
要するに初心者でも簡単に電子工作ができてしまうマイコンボードです。
“オープンソースのハーウェア” というのがなんともワクワクする響きですね。
ブレッドボードを使えばハンダ付けも不要で、とても低い敷居で始めることが出来ます。
今回は「Arduinoをはじめようキット」を購入しました。
Arduino本体のほか、可変抵抗、LED、ジャンパワイヤ、ブレッドボードなどの付属品がひと通りついてきます。
このキットは、オライリーの「Arduinoをはじめよう 第2版」に書かれている内容にぴったり合う部品が揃っています。勉強するにあたって「これだけ買っとけば大丈夫!」という安心感がありますね。本と一緒に購入しました。
開発用ソフトウェアも無料です。Arduino – Software からIDEがダウンロードできます。
C言語+C++のいくつかの機能をサポートしているようです。C言語経験が無くても、何らかの他言語経験があれば全く問題なく理解できると思います。
これでハードとソフトの準備が整いました。
お決まりのLチカや基本的なプログラミングを進めていく中、オライリーのExample05で詰まりました。2時間近く奮闘していたのでメモしておきます。
(「図の通りに」って書いてあるのに、回路図が無いじゃないですか・・・)
下記のような仕様で組めという例です。(たぶん)
↑ 奮闘した結果の回路図
↑ 組んだ写真
本に載っているコードだと気持ちのよい動きではないため、Example05をアレンジしてみました。変更したのは下記の点です。
// ボタンを押すとLED点灯 // 離した後も点灯したまま // バウンシングを解消する処理も入れる // ボタンを押したままにすると明るさが変化 const int LED = 9; const int BUTTON = 7; int val = 0; // 入力ピンの状態 int old_val = LOW; // valの古い値を保持しておく変数 int state = 0; // LEDの状態を保持(0ならオフ、1ならオン) int brightness = 128; int reverseFlag = false; unsigned long startTime = 0; void setup() { pinMode(LED, OUTPUT); pinMode(BUTTON,INPUT); Serial.begin(9600); } void loop() { val = digitalRead(BUTTON); // ボタンが押されているかどうかの判定 // LED消灯時から点灯時の初回のみ通る分岐 if(val == HIGH && old_val == LOW) { state = 1 - state; startTime = millis(); // millisはArduinoの時計で、ボードがリセットされてからの時間をミリ秒で返す // 最後にボタンが押された時間を記憶 if(state == 1) { analogWrite(LED, brightness); } delay(60); } if(val == HIGH && old_val == HIGH) { if(state == 1) { if((millis() - startTime) > 500) { if(brightness == 255) { reverseFlag = true; } else if(brightness == 0 ) { reverseFlag = false; } if(reverseFlag) { // reverseFlag true でリバース brightness--; } else { brightness++; } delay(10); analogWrite(LED, brightness); state = 1; } } else { if((millis() - startTime) < 500) { analogWrite(LED, 0); } } } old_val = val; // Serial.print(state); }
雑なコードですが、思い通りの動きをするようになりました。
悩んで組んだコードや回路図で正常に動作した時、これまでやっていたWebのプログラミングとは一味違う感動があります。
次回はセンサーを利用した回路を試そうと思います。