先日シフトレジスタとArduinoを組み合わせてLED×8個を点滅させました。それを今回、フォトレジスタによる受光で点灯を制御します。
目次:
今回の目的
ELEGOOのチュートリアル「Photocell」(日本語版では「光電池」との表記)をチュートリアル通りに動かします。
※チュートリアルの文章(PDF日本語版含む)もスケッチもELEGOOのサイトから無料でダウンロードできました。
フォトレジスタ(フォトセル)
以前構成したシフトレジスタ74HC595と8つのLED。ここにフォトレジスタを追加します。
↓↓↓以前の記事↓↓↓
「シフトレジスタ74HC595と8つのLED①チュートリアル通りに動かす」
ArduinoからシフトレジスタにLED個数分の点灯・消灯を順繰り(シリアル)に送り、そのシフトレジスタからLEDを同時(パラレル)に点灯させる構成(「シリアル-パラレル変換」)です。
今回はここにフォトレジスタを追加して受光した光の強さに応じてLEDが点灯する制御にします。
「フォトレジスタ」の方が通りが良さそうなのでそのように呼称しますが、英語版チュートリアルの「photocell」、「LDR(Light-Dependent Resistor)」とも呼びます。日本語版チュートリアルの「光電池」という呼び方はなかなか聞きません。
↓↓↓「CdSセル」の方が検索でのヒット数が多そうです。仕様はまちまちですのでその点は要確認です。
フォトレジスタは半導体素子の一種であり、光が当たることで自由電子によって抵抗値が下がります。
抵抗の変化の範囲をテスタで測りました。指を押し当てて光を遮って30kΩ、手持ちの懐中電灯の光を当てて500Ωといったところです。
器材接続
フォトレジスタと1kΩ抵抗、VCC(5V)をこの二つで分圧してArduinoのA0に入力します。
スケッチ
以前のスケッチを改編。
↓↓↓「以前」のスケッチ↓↓↓
「シフトレジスタ74HC595と8つのLED①チュートリアル通りに動かす」-「スケッチ」
byte leds = 0; // 1バイト(8ビット)変数「leds」に「00000000」代入
void setup() {
pinMode(11,OUTPUT); // D11(ST_CPに接続)を出力設定
pinMode(12,OUTPUT); // D12(DSに接続)を出力設定
pinMode(9,OUTPUT); // D9(SH_CPに接続)を出力設定
}
void updateSR() {
digitalWrite(11,LOW); // ST_CPにLOWを入力
shiftOut(12,9,LSBFIRST,leds); // DS,SH_CP指定。LSB側から変数「leds」をシフトアウト
digitalWrite(11,HIGH); // ST_CPにHIGHを入力
}
void loop() {
int readval = analogRead(0); // A0入力を変数「readval」に代入
int numLEDS = readval / 57; // 変数「numLEDS」に「readval」÷57(≒1023÷9÷2)代入
if(numLEDS > 8) numLEDSLit = 8; // 変数「numLEDS」が8超なら8代入
leds = 0; // 変数「leds」に「00000000」代入
for(int i = 0; i < numLEDS; i++) { // 変数「numLEDS」まで1ずつ増加させつつ以下ループ
leds = leds + (1 << i); // 変数「leds」の「i」番目のビットを「1」にする
}
updateSR();
}
analogReadでの電圧読み取り値1023~0。それをLED点灯9段階(8~0個)で分割。読み取る対象はVCC5Vの分圧(半分)として÷2。それでanalogReadの値を÷57(≒1023÷9÷2)してます。
動作
動かしました。
フォトレジスタに当たる光の強さに応じて、リアルタイムでLEDの点灯数が増減します。
所感
ここまで8つのLEDをスケッチで動かし、シリアルモニタからのキー入力で動かし、光入力で動かしました。全部一から新しくするのでもなく、こうしてカスタマイズしていける構成も面白いものです。
0 件のコメント:
コメントを投稿