
先日、最近話題の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のプログラミングとは一味違う感動があります。
次回はセンサーを利用した回路を試そうと思います。