(モーターのノイズについて、補足しました)
(抵抗の考え方を完全に間違えてました。直しました。2016/10/1)
データシートを見ると、標準値として「33μA 標準 条件:白色LED, 100Lux 」とあります。100Luxの白色LEDがどのぐらい明るいか分かりませんが、とりあえずこの33μAという値を基準に考えれば良さそうです。
Arduinoの回路に流して良いのは20mA以下ですが、仕様書の絶対最大定格を見ると10mAなので、どんなに明るくても電流の心配はなさそうです。
利用する抵抗値を検討します。根拠はありませんが、標準値の3倍ぐらいの値がアナログ入力の半分の512になるなら安心ではないだろうか、ということで、100μAの時に、2.5Vを発生する抵抗値を計算してみます。
「抵抗値(Ω) = 電圧(V) / 電流(A)」ですから、
2.5(V) / 0.0001(A) = 25000Ω
つまり、25KΩ程度の抵抗が良さそうです。
手元にあった中で一番近い10KΩを使って室内で試したところ、CdSセルよりは小さい値でしたが、最大で70程度の値が得られました。脇にLEDを光源としておくことで、フォトトランジスタの前に白いものを置くと100程度の数値が得られました。実際に使う場所の明るさにもよりますが、この環境であれば、事前に計算した25KΩから、50KΩ程度の抵抗が良さそうです。
こういう時に、可変抵抗器があると便利そうです。では、今回試した配線とスケッチを以下に示します。
以上、全部誤りです。電圧はコレクターにかかっているものなので、上記の計算は全く意味がありませんでした。後日、改めて整理します。
LED用配線
- デジタルピン13番 - LED(+)
- 1KΩ抵抗 - LED(-)
- 1KΩ抵抗 - グランド
モーターのノイズ対策
上記のままだと、時々モーターが変な音を発生して、Arduinoのランプが不意についたりします。これはモーターのノイズのようです。Netduino: サーボモーターをコントロールしよう - Build Insiderを参考にして、5VとGNDの間に、0.1μFのセラミックコンデンサーを入れた方が良さそうです。(モーターやLEDの誤動作は、電源からの電圧の変化によって、フォトトランジスタの値が変化してしまうのが原因でした。電圧をアナログ入力で監視して、1000以下になる場合はセンサーの値を無視して対応しました。2016/9/28追記)
スケッチ
const int SENSOR = 0; int val = 0; const int LED = 13; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); } void loop() { // put your main code here, to run repeatedly: val = analogRead(SENSOR); Serial.println(val); delay(50); }