#020 【49歳から始めるArduino -黒帯を目指す】黄帯編7 アナログ入力の挙動を学び光センサーを理解する

 p92では同じ抵抗値の抵抗を2つ用いてVを測っています。ここ最初に読んだときは「ははー」ということで素通りしましたが、なんとなく気になっていました。様々な回路を組んでいくときに、単純な疑問がいつもあります。「どうしてここでこの部品を使うの?」ということで今日はここを深掘りします。数値の異なる抵抗を2つ用意して、テスターでVとAを計測しました。


 510Ωの片方は触らずに、もう片方を変えてるということです。またシリアルモニーターに表示された値をVにも変換しました。その結果分かったことが、いつでも両方の抵抗に流れる電流は一緒であること、抵抗値の高い方に高い電圧が掛かること、双方の電圧を足すといつも一定の数値になること(ここでは5VでArduinoの定圧値と同じ)でした。これは大きな発見でした(大げさかな)

#20_Arduino_Fig1.png

A
B
シリアル表示
510Ω
0.2V
0.5mA
10kΩ
4.7V
0.5mA
4.7V
510Ω
1.7V
3.3mA
1kΩ
3.3V
3.3mA
3.3V
510Ω
2.5V
4.8mA
510Ω
2.5V
4.8mA
2.5V
510Ω
3V
5.9mA
330Ω
2V
5.9mA
2V

 ではこのままCdsセルを利用してp95の「明るさを調べてみる」をしてみましょう。ここではセンサーから読み取った数値(アナログ値)を読み、その結果あるアクションを起こすという流れになります。まずはp95にある回路を作って見て、早速スケッチを書き出して見ましょう。ちなみにCdsセルをアマゾンで探すと、10個で600円と出ています。キットについてきたCdsの抵抗値は1.7kオームでした。この章は簡単で、内容は簡単ですのでどんどん行きましょう。スケッチは教科書通りですが、色付きの部分を変えました。Serial.printliにすると改行をしてくるので”\n”を省くことができます。それとiの標準はDECらしいので、それを省きました。結果は、先生のスケッチと全く一緒です。唯一気になるのがなぜここでは10kオームを利用するのでしょうか?それも調べてみます。


void setup() {
Serial.begin(9600);
}

void loop() {
 int i;
 i = analogRead(0);
 Serial.println(i);
 delay(1000);
 // put your main code here, to run repeatedly:
}



 気になる抵抗値を10K、1k、510そして330オームにしてシリアルモニーター値をみると、それぞれ150、680、800そして870でした。抵抗値を変えることで、反応値を変えることができるようです。今はこのままで、p102のスケッチまでやってしまいましょう。

 最後は半固定抵抗 10kΩをつけ、しきい値の設定方法を学びます。このしきい値の設定が出来たスケッチを見せると「お主やるなー」という声が聞こえそうな気がします。下記の図のようにすると分かりやすいですね。教科書のLEDの部分は簡単なので省いています。
スクリーンショット 2017-05-03 17.36.58.png

 10KΩですと、LED点灯のタイミングが半固定抵抗器の左ほぼ一杯でした。そこで抵抗を先ほどの実験結果を踏まえて、10Kから1Kに変更すると、半固定抵抗器のつまみのほぼ中央部でした。これなら調整範囲が広がりましたので、実験環境では対応が十分に可能です。先生のコードを順番を変え、さらにシリアルモニーターで数値が見れるように、スケッチを変更しました。またスケッチ内コメントは省いています。

p103.png


#define LED 11
#define CDS_IN 0
#define SET_POT 1

void setup() {
 pinMode(LED, OUTPUT);
 Serial.begin(9600);
}

void loop() {
 int brightness, set_val;
 int upper,lower;

 brightness = analogRead(0);
 set_val = analogRead(1);

 upper = set_val + 10;
 lower = set_val - 10;

 if (upper>1023) upper = 1023;
 if (lower<0) lower = 0;
 
 Serial.print("Brightness: ");
 Serial.print(brightness);
 Serial.print(" Set Value: ");
 Serial.println(set_val);

 if (brightness<lower){
   digitalWrite(LED,HIGH);
     delay(1000);
 }

 if (brightness<upper){
   digitalWrite(LED,LOW);
  delay(1000);
 }
}

p103 arduino.jpg

 それとここがとても参考になりました。Arduinoを使っていませんが、計算を丁寧に教えてくれています。

コメント