Plus電子デバイス・電子工作用語集モータドライバ博士のQ&A読者よりいただいたお問い合わせを元に、ロボット製作者、エンジニアのみなさんに役に立つ技術解説を発信していきます。Plus電子デバイス・電子工作用語集モータドライバ博士のQ&A読者よりいただいたお問い合わせを元に、ロボット製作者、エンジニアのみなさんに役に立つ技術解説を発信していきます。光センサーでArduinoへの入力を試してみる!前回までLEDを使った回路を利用してArduinoの基本的な流れをご紹介いたしました。今回から、LEDに加えて、他の電子部品の利用や、それを使ってどんなことができるのか、ということをやっていきたいと思います。センサーを使ってArduinoに入力信号を送ってみるこれまではArduinoから電流を流してLEDを光らせることをやってきました。これはArduinoからLEDに対して「出力」している状態となります。電流が出力されるピン番号を変えたり、強さを変えたり、タイミングを変えたりして、LEDを様々な光らせ方をしてきました。今度はその強さやタイミングをセンサーからの入力値を使って操作できるようにしてみましょう。ん、その前にセンサーって何でしょうか。耳慣れた言葉ではあるかと思いますが、センサーっていったいどういうものをセンサーと呼ぶのでしょうか?特に電子工作をしていると「○○センサー」という言葉をよく聞くようになります。)の代わりとなるものになります。Arduinoやコンピューターにおいてはこれらのセンサーが人間の五感の代わりとなって周りの状況を把握するのに利用されます。人間は五感(人によっては第六感も備えている人がいますが・・・)ですが、電子部品におけるセンサーは本当に色々な種類があります。その中でも今回は簡単に使える光センサーを利用してみましょう。光センサー(通称CdSセル)は、暗いところにおくとセンサー自体の抵抗値が大きくなり、明るいところに置くと抵抗値が低くなる性質を持っています。その性質を聞いて作品を作るとしてぱっと思い浮かぶのは、”朝明るくなったら何か動く”・”夜暗くなったら何か動く”という感じでしょうか。何はともあれ実際に触りながら動きを確認してみましょう。光センサーの性質の「明るさが変わると抵抗値が変わる」というのをチェックするのに下のような回路でLEDの明るさが変わるか試してみましょう。1秒待つ}光センサーは抵抗器と同じくプラスマイナスの向きはありませんのでそのまま接続できます。明るい場合抵抗値が限りなく低くなってLEDに過分な電流が流れてしまうのを防ぐため、1つ抵抗器を加えておきます。この状態で、最初に書いた点滅を繰り返すプログラムをArudinoで動かしてみましょう。LEDが点滅したら、手で光センサーを覆ったり離したりするとLEDの明るさが変わっているかと思います。これが基本的な光センサーの性質になります。この場合暗くなったらLEDを光るようにすればすぐ役に立つ道具が作ることができそうですよね!じゃあ、それをやってみましょう。Arudinoは一旦置いておいて、電子回路だけで組むとどうでしょうか?その場合、さらに部品を使うことや、回路を工夫させることで実現ができます。電流は基本的に流れやすいところ(抵抗値が低いところ)に流れていきます。下記の回路では明るい場所では抵抗値が弱い為、抵抗器側に電流が流れ、逆に暗くなった場合に光センサー側の抵抗値が高くなるのでLEDへの方へ電流が流れてLEDがつくようになります。この回路だと光センサーを暗くしてもLEDがそんなに強く光りません。Arduinoはただの電源出力装置だけになってしまうのでそれでは電池とほとんど変わらなくなってしまうので、Arduinoに光センサーを直接つなげて入力されている値を取り出してみましょう。Arduinoのアナログ入力Arduinoのアナログ入力を使って光センサーの値を実際に計測してみましょう。INとプリントされている箇所)になります。アナログ入力を受けとる為に下記のとおり回路を組み立ててみてください。これで、まず光センサーの数値を入力する入力回路はできました。次にArduinoのプログラムを確認していきましょう。//入力された値をモニターに出力delay(100);}ここで、また新しい関数が出て来ています。今回、光センサーからの入力値をPCのディスプレイ上で確認したいので、その場合、setup関数でSerila.begin(9800)を設定しておきます。それによって、loop内でSerial.println()を使って数値や文字列をディスプレイに表示することができます。この方法は今後入力した値を確認する他、Arduino上でデバッグをするのによく利用する方法となります。次に、アナログピンからの入力値を取得します。今回アナログ入力に関してはsetup関数でピンの指定は必要ありません。アナログ入力を受ける関数となっています。今回はanalogReadで取得した値をval変数に入れています。ここで「変数」という単語が出てきますが変数は今後もプログラムを作成する上でとても重要な役割を持っています。変数はプログラムで利用する数値や文字等を始めとした様々なデータを一時的に保管しておくことができる場所(領域)となります。変数:プログラムで利用する数値などのデータを一時的に保管する領域そして、val変数に保管したセンサーの数値をSerial.println()関数を使って単純にディスプレイ上に表示してみます。Arduinoではアナログピンで入力される値は0〜1023までの値が入力されます。そのため、プログラムで入力値を利用して何かをする場合は、この数値を考えながらプログラムを書いていきます実際の動作をディスプレイで確認するには「ツール」-「シリアルモニタ」を選択すると実際に光センサーからの入力値を確認することができます。正常にセンサの数字が変わっているでしょうか?光センサーの値でLEDの明るさを段階的に切り替える光センサーの入力が確認できたらそれをもとに、LEDを段階的に操作してみましょう。光センサーの入力値に対して、今度はアナログ出力でLEDに対して出力を行ってみます。//入力された値÷4の値をアナログ出力するdelay(100);}先ほどのプログラムに1行analogWrite()関数が増えました。アナログ出力をするアナログ出力も入力同様setup関数に設定は必要ありません。アナログ入力と異なる点を挙げると、入力は0〜1023だったのに対して、出力は0〜255までとなっています。ここでは光センサーからの入力値を4で割った値を出力に設定しています。※ここで、光センサーを覆ってもあまり明るさが変わらない場合、光センサーの明るい時と暗い時の範囲が狭い可能性があります。その場合は、抵抗器をさらに抵抗値の高いものに変えて試してみてください。これで、入力・出力の両方を備えたしくみが完成しました。これまでArduinoはUSBに接続しているので、USBから5Vの電源を取って動作していますが、プログラムの書き込みが終わった後にPCがなくても動作させたい場合は、ArduinoにACアダプタジャックがありますので、そこに6〜20V(推奨値は7〜12V)のACアダプタを接続してあげると単体で動かすこともできますので、このままケースにいれて照明等に使われる高輝度のLEDに変えるなどするだけで簡易ブックライトの出来上がりです。光センサーの入力段階に応じて明るさを段階的に変えたい場合は、if文を使って段階的に操作してみます。これで、明るい時に完全にLEDを消すことができました。//出力は255}delay(100);}例えば、このしくみを応用して考えてみましょう。これをLEDではなく圧電ブザーなどに変えると暗く(明るく)なるとブザーが鳴る作品や、一定の角度で回転を制御することができるサーボモーターを使うと暗くなったらモーターが動いてスイッチを押すなどといった作品ができたりしますね。ArduinoではLANのモジュールを利用してインターネットに繋ぐこともできるので明るさを常にインターネットを通してどこかに表示するなどなど、入力は同じ方法でも出力が違えば全然違う作品になります。覚えたことで何ができるか、ということを考えながら作るのもArduinoの楽しみの一つでもありますね。次回、さらに色々な部品を使いながら作品を作っていきたいと思います!赤川シホロ電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。Arduinoで作る簡易百葉箱(その2)。電光掲示板(7セグメントLED)を使って数値を表示。