analogReadによって読み取るデジタル信号
ArduinoにおいてHIGH(5V)かLOW(0V)かという読み取り以外に、例えばHIGH(5V)からLOW(0V)までの間の値を読み込める方法として、anlogRead(アナログリード)があります。
具体的な例としては、温度計や光の明るさ、風の強さなど、…いわゆるセンサー類…要するにHIGHかLOWかだけでは判定できないような数値を返すセンサー類からのデータの取り込みに利用します。
マイコンなどに接続できるこれらのセンサーのほとんどは、『読み取った実際の値を0~5Vまでの電圧で返します。』というような仕様になっています。
その値を一つのピン(ポート)で読み込むのが analogReadの役目です。
Cdsセンサーの例
Cdsセンサーとは光量を読み取るセンサーです。
インターネットパーツ販売の秋月のページはこちら….
つまり、このセンサーは光の強さに応じて抵抗値が変わるということです。
これは、先の説明に書いた『読み取った実際の値を0~5Vまでの電圧で返します。』とは明らかに違いますので、これをArduinoのアナログピンに直接入れて抵抗値が読み取れるのでしょうか?
その答えはNGです。
analogReadで読み取れるのは電圧の値ですから、このままピンに突っ込んだのでは全く数値を読み取ることができません。
変化する抵抗値を変化する電圧値に変えてやる
Cdsセンサーの片足を5Vと接続し、もう片足をGNDへ接続してやります。
光量に合わせて抵抗値が変化するということですから、今の光量(抵抗)によって、このCdsにどれだけの電圧がかかっているのかをArduinoのanalogピンで見てあげれば解決します。
◆接続
※抵抗は(茶)(黒)(橙)→ 10KΩを使用します・
◆回路
プログラム
[c]
void setup() {
}
void loop() {
int val = analogRead(0);
}
[/c]
基本はたったのこれだけです。
読み込まれるデータ val は0~1023の値….つまり0~5Vを1024段階で割った数値が返されます。
ボードの現在値をボードからIDEへリターンバックさせる
しかし、これだけではこのvalの値がいったい何なのかわかりません。
そのために、Arduinoでは、このArduinoの現在の動作している変数の値などを、ボードからUSBケーブルを通してIDEにリターンバックしてくれる方法があります。
つまり、このリターンバックしてきたデータをIDEで見てみればいいわけです。
ボードからUSBケーブルを通してリターンバックさせるためには、シリアル通信を使用します。
[c]
void setup() {
Serial.begin(9600) ;//リターンバックのためにシリアルポートオープン
}
void loop() {
int val = analogRead(0);
Serial.println(val) ;valの値をシリアルでIDEにリターンバックさせる
}
[/c]
IDEでリターンバックしたデータを表示するシリアルモニター
IDEの右端(下の画像で赤枠)部分をクリックするとシリアルモニターという画面がオープンし、ボードによってSerial.printlnなどでリターンバックされた値を読み取ることが可能です。
コメント
質問です。
Serial.begin(9600);で9600に指定されていますが、2400や38400を指定すると0~1023の数字ではなく文字化けのような値が出力されます。
調べる9600は9600bpsで毎秒9600ビット分のデータを送ることができる速度でシリアルポートの通信速度とありました。
リターンバックさせるルールとして9600を利用するという決まりがあるのでしょうか?
それとも何かしらの変換によって2400や38400でも0~1023の数字で表示させる方法はありますか?
それとLEDを間に挟んで明るさが変わるか実験してみました。
センサーにライトを当てるとLEDが明るくなったのですが、これは明るいほどセンサーの抵抗が弱まりLEDが明るくなったという解釈はあっていますか?
また、光センサーの値によってロボットなどを動かす場合、環境によってvalの値が異なると思いますが、最初に取得した値から相対的に判断して動作させるのでしょうか?
例えば何もない状態でセンターで取得した値が900の場合、それ以下の値であれば動かすといったようなことです。
家の外や中、ライトが強いスタジオなど環境によって標準の値が異なると思っていますが、単に「500以下の場合は~」などの条件分岐では難しいように思えます。
見解はいかがでしょうか?
1.SerialPortのボーレートを変えた場合、IDEのシリアルモニターのボーレートもちゃんと替えられたでしょうか?ここがちゃんと設定できていれば問題なく表示できると思われます。
2.Cdsセンサーは、ここで紹介しました方法はあくまで実験レベルでのもので、実用には、環境によってどのように反応させるか?例えば物理的なカバーや、また、オペアンプを使用した信号の持ち上げ、さらにソフトによるスレッシュホールドレベルなど多くの考慮が必要です。
もう1つ質問です。
Cdsセンサーは、明るくなると抵抗が小さくなるようですが、逆に明るくなると抵抗が大きくなるようなことはできますか?
物理的に部品でそういったものがあるのか
回路をうまく組み合わせてできるのか
プログラムでそういうことができるのか、
それぞれ方法がありましたら、ご教授お願いします。
これはセンサーの物理的仕様です。
Cdsセンサーからの値は抵抗と考えずに、明るくなっているのか暗くなっているのかを数値として取得している!と考えれば、その数値をどのように使い処理するのか?という風に考えてみてはいかがでしょうか?
その考えであれば、回路を追加する必要もなく、単にプログラムで簡単に処理できると思われますが、いかがでしょうか?