Arduinoを始めよう!(1)シリアル通信編
センサを使った入力
続いて、センサを使ってLEDの光を制御してみましょう。次のプログラムを打ち込みます。
void setup() { pinMode(13, OUTPUT); } void loop() { int val = analogRead(0); if (val < 255) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
このプログラムを走らせるには先ほどのLEDに加えて、光センサが必要です。光センサは前回購入したキットに付属しています。
これを次の図のように取り付け、プログラムを走らせます。1kΩの抵抗は茶・黒・赤・金の帯のものです。抵抗の読み方は「抵抗器(Wikipedia)」を参考にしてください。また、キットのセット内容にも記載されています。
センサに手をかざし、LEDが光れば、プログラムが期待通りに動いています。
このプログラムには、先ほどのプログラムよりも直感的でない点があるので、簡単に解説をします。このプログラムのポイントはセンサが出力する電圧値の読み取りです。光センサは光の強さを読み取り、電圧値を変化させます。Arduinoはこの電圧値を読み取り、数値に変換します。Arduinoでは電圧値を読み取るために、デジタル入力とアナログ入力が使えます。今回使用しているのはアナログ入力で、Arduinoが電圧を読み取り、0から1023の値に変換して、プログラムに伝えてくれます。それが6行目のanalogRead関数です。
analogRead([ピン番号]);
今回組んだ光センサの回路は、明るい場合に電圧が高くなり、暗い場合に電圧が低くなります。つまり、この電圧をanalogRead()を読み取ると、最も明るい場合には1023に、最も暗い場合には0が返ります。あとは、この値を使って、Arduinoに好きなことをさせます。今回は暗い場合にLEDを光らせています。
// しきい値を255に設定、LEDを光らせたい明るさによって調整する、大きくすれば少し暗くしただけで、LEDが光るようになる if (val < 255) { // LED点灯 digitalWrite(13, HIGH); } else { // LED消灯 digitalWrite(13, LOW); }
ここまでわかれば、先ほどのプログラムを理解できるはずです。色々と自分なりに改良してみてください。
プロトタイプを作る上で必須なボードです。何かアイデアが思い浮かんだら、まずはこの上で回路を組みます。想定通りの挙動になったら、実際に基盤にパーツをハンダ付けして回路を完成させます。ソフトウェア開発には必須なサンドボックス環境みたいなものです。
全ての穴が独立しているように見えますが、実は中でつながっています。これを頭に入れておくと回路がスムーズに組めます。
センサをデバッグするには、前回購入したテスタを使用する方法と、シリアル通信を使う方法の二種類があります。テスタを使ってデバッグするには、前回のデバッグ方法と同じく、テスタのつまみを20Vにセットし、赤いコードを5Vのピンに、黒いコードを電圧を読み取っているピンに接続します。そうすると、光の強さによって電圧が変化するのが確認できるはずです。もし、電圧が変化しない場合は、回路が間違っているか、テスタを接続する箇所が間違っています。
シリアル通信を使う場合は、次のようにプログラムを変更します。
void setup() { Serial.begin(9800); // シリアル通信の設定 pinMode(13, OUTPUT); } void loop() { int val = analogRead(0); Serial.println(val); // 読み取った値をシリアル通信でPCに転送する。 if (val < 255) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(500); // コンソールの出力を読みやすくするために、次の読み取りまで500ms待つ。 }
そうすると、Arduinoのコンソールに読み取った値が出力されます。
このように、テスタとシリアル入力を活用して、センサの入力をデバッグしていきます。