Arduinoを始めよう!(1)シリアル通信編

2013年2月18日(月)
藤原 敬弘

センサを使った入力

続いて、センサを使って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)」を参考にしてください。また、キットのセット内容にも記載されています。

光センサとArduinoを接続する(クリックで拡大)

センサに手をかざし、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);
  }

ここまでわかれば、先ほどのプログラムを理解できるはずです。色々と自分なりに改良してみてください。

[tips] ブレッドボード

プロトタイプを作る上で必須なボードです。何かアイデアが思い浮かんだら、まずはこの上で回路を組みます。想定通りの挙動になったら、実際に基盤にパーツをハンダ付けして回路を完成させます。ソフトウェア開発には必須なサンドボックス環境みたいなものです。

ブレッドボード(クリックで拡大)

全ての穴が独立しているように見えますが、実は中でつながっています。これを頭に入れておくと回路がスムーズに組めます。

(クリックで拡大)
[tips] センサのデバッグ

センサをデバッグするには、前回購入したテスタを使用する方法と、シリアル通信を使う方法の二種類があります。テスタを使ってデバッグするには、前回のデバッグ方法と同じく、テスタのつまみを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のコンソールに読み取った値が出力されます。

シリアル通信で読み取った値がコンソールに表示される(クリックで拡大)

このように、テスタとシリアル入力を活用して、センサの入力をデバッグしていきます。

FULLER株式会社

1986年生まれ。北海道苫小牧市出身。苫小牧工業高等専門学校卒業。
Fuller, Inc. CTO
Webプログラマ、よく利用する言語はPython。Pythonコミュニティによく出没する。
趣味でArduinoやRaspberry Piなどを使って、便利なものを自作する。

twitter: @wutali / github: https://github.com/wutali

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています