Arduinoと戯れてみる!

Arduino 入門 Lesson 23 【フォトレジスタ編】 其の2

Arduino-lesson23-00 Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 23
【フォトレジスタ編】 其の2

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

 

本日はLesson 23 【フォトレジスタ編】 其の2です。

フォトレジスタは別名で下記と呼ばれることもあります。
1.光依存性抵抗 (light-dependent resistor, LDR)
2.光導電体 (photoconductor)
3.フォトセル(photocell)

 

Lesson 22でも説明しましたが、要は「光センサー」です!

本Lesson「其の2」は「其の1」に回路を追加して遊びます。

 

「其の1」では、基本的なコードを理解しました。

「其の2」ではフォトレジスタ(光センサ)、Lesson 20Lesson 21で使用した、8bitシフトレジスタとLEDの回路を利用して遊びます。

 

本Lesson解説で使用しているのはArduino互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

スポンサーリンク

はじめに

「フォトレジスタ」の原理やスケッチ(コード、プログラム)の基本的な事はLesson 22で説明しています。

まずは、基本からという方はそちらを参照お願いします。

「其の2」では、基本的な説明は省略します。

 

フォトレジスタ(Cdsセル)の手持ちがない方は以下からどうぞ。

 

Lsson 23 目標

光の明るさ(照度)をLEDの点灯数を使って認識できるスケッチを作成する。

今回も遊ぶことを最大の目標に楽しみましょう!

 

【フォトレジスタ編】 其の2ではフォトレジスタとLEDで遊びます。

 

準備

ではLessonの準備に取り掛かりましょう。

今回は部品が多いです。

Lesson 20、Lesson 21で使用した部品を使います。

下記を、一読しておくと本Lessonの実践に取り組みやすいです。

 

必要なもの

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

使用部品説明

使用部品である、フォトレジスタ(Cdsセル)についてはLesson 22で説明しています。

本Lessonでは省略します。

仕様、原理など詳細は以下で確認お願いします。

 

念のため写真のみ掲載しておきます。

下図がフォトレジスタ(Cdsセル)です。

Cds-cell

 

フォトレジスタは抵抗器と同じく極性がありません。
向きを気にすることなく使用することができます。

 

※Cdsセルと一緒に使用する抵抗について

Lesson 22と同様にフォトレジスタ(Cdsセル)と直列につなぐ抵抗は10kΩを使用します。

フォトレジスタ(Cdsセル)と直列につないで分圧した電圧を読み取るために使用します。

本Lessonにて、10kΩを使用した場合に、LED点灯数が思ったように変化しない場合は、抵抗値を変えて読み取り値の範囲の調整をしてください。

 

実践 回路作成とコード作成

今回は回路が多いですが、頑張って接続しましょう!

Lesson 20で使用した、8bitシフトレジスタとLED:8個がポイントです!

 

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、フォトレジスタ(Cdsセル)で受け取る光の強さをLEDの光る数で体感しましょう!

 

前回も言いましたが・・・
フォトレジスタは使い勝手が良いので、遊ぶには持って来いの電子部品です

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

フォトレジスタ(Cdsセル)と抵抗が直列に接続されアナログ入力のA0から値を読み取るようになっています。

その読み取った値にて、搭載した8個のLEDの点灯する数を制御する回路です。

 

Lesson 22の解説をもう一度します。

抵抗値は10kΩで一定なのに対して、フォトレジスタ(Cdsセル)は抵抗値が変化します。

そのため、分圧比がかわることによって読み取る値も変わるという仕組みです。

 

Lesson 22と異なり抵抗とCdsセルが逆になっていることに注意してください。
Lesson 22:明るくなると、Voutの電圧値が低くなる ⇒ LEDが消灯する方向
Lesson 23:明るくなると、Voutの電圧値が高くなる ⇒ LEDが点灯する方向
としているためです。

 

式に表すと下記となります。

VoutがA0に入力される電圧。
Vout = R10/(R9+R10)×5V
R9:Cdsセル R10:10kΩ

 

回路図がこちら。

Arduino-lesson23-circuit-diagram

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

Arduino-lesson23-breadboard

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

照度の読み取り部分の部品は、「フォトレジスタ(Cdsセル)」と「10kΩの抵抗」。

読み取った値によってLEDを点灯させている部分の部品は、「LED」と「8bitシフトレジスタ」です。

M-M jumper wireを使用してUNOと接続しましょう。

Arduino-lesson23-03

使用するポートは以下となります。

アナログ入力の「0」、デジタル入出力の「9」「11」「12」。

電源の「5V」、「GND」。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

コマンド説明

あたらしくでてきたコマンドは特にありません。

サンプルコードの以下の部分について補足説明します。
※このコードの中で一番わかりづらい?かなと思いましたので・・・。

for (int i = 0; i < 8; i++)
  {
    leds = leds + (B00000001 << i);  // 1を"i"bit分左へシフトして足していく
  }

上記の 「<<」 について動作の詳細を解説していきます。

これは、ビット演算子の1つでビットシフト演算子と言われるものです。

 

for文にてi=0 ~7まで繰り返します。

ledsの初期値はB00000000とします。

i = 0
B00000000 + B00000001 = B0000001
i=1
B00000001 + B00000010 = B0000011
i=2
B00000011 + B00000100 = B0000111

・・・

i=7
B01111111 + B10000000 = B11111111

というような構文となっています。

スケッチの中で、for文「i < 8」の8の部分は変数としています。

そうすることで、1になる数が変わりLEDの点灯数も変わる仕組みです。

 

2進数表記で記載しましたが、10進数表記で記載しても問題ありません。

 

コマンド説明
<<値 << ビット数
ビット数で指定した数だけ、値を左へシフト。
値は、byte型、int型、long型などの整数。
ビット数は32以下の整数。
>>値 >> ビット数
ビット数で指定した数だけ、値を右へシフト。
値は、byte型、int型、long型などの整数。
ビット数は32以下の整数。

 

サンプルコード

サンプルコードを下記に示します。

//Lesson 23 Cdsセルの照度をLED点灯数に変換するスケッチ
//https://omoroya.com/

//スケッチ内のbyte型はわかりやすいようにBxxxxxxxxで表現していますが
//10進数で記述してもかまいません。

int cds_out = 0;       // cdsと抵抗の分圧値を読み取るピン番号A0
int rclkPin = 11;      // (11) ST_CP [RCLK] on 74HC595
int srclkPin = 9;      // (9)  SH_CP [SRCLK] on 74HC595
int dsPin = 12;        // (12) DS [SER] on 74HC595
byte leds = B00000000; // ledsをbyte型としてb00000000で定義 "0"と書いても同じ

//シフトレジスタ動作の関数化
void funcShiftReg(byte x)
{
    digitalWrite(rclkPin, LOW);             // 送信中のRCLKをLowにする
    shiftOut(dsPin, srclkPin, LSBFIRST, x); // シフト演算を使って点灯するLEDを選択
    digitalWrite(rclkPin, HIGH);            // 送信終了後RCLKをHighにする
}

void setup() 
{
  pinMode(rclkPin, OUTPUT);   // 11番ピンをOUTPUTとして定義
  pinMode(dsPin, OUTPUT);     // 12番ピンをOUTPUTとして定義
  pinMode(srclkPin, OUTPUT);  // 9番ピンをOUTPUTとして定義
  funcShiftReg(leds);         // led選択なし状態でsetup
  Serial.begin(9600);         // シリアル通信のデータ転送レート設定しポート開放
}

void loop() 
{
  int val  = analogRead(cds_out);   // A0の読み取り値をvalに格納
  
  //cdsに抵抗は0にはならない。
  //そのため、その分を考慮して8ではなく9にしている。
  //シリアルモニタの値を利用して抵抗値なと調整してください。
  int set_led = val / ( 1023 / 9 ); // 読み取り値を1-9に変換
  
  Serial.println(val);              // A0に入力された値をモニターに出力
  Serial.println(set_led);          // 計算結果をモニターに出力

  //シリアルモニタで値を確認して調整したい場合下記のコメントをはすしてください。
  //delay(500);

  // 読み取り値が8,9の場合は8とする。LEDは8個のため。
  if (set_led > 8) 
  {
    set_led = 8;
  }
  
  leds = B00000000;          // LED全てOFF状態からスタート"0"と書いても同じ

  //照度に応じてLEDを必要数ぶん点灯させる(点灯させる数は"set_led"で決まる)
  for (int i = 0; i < set_led; i++)
  {
    leds = leds + (B00000001 << i);  // 1を"i"bit分左へシフトして足していく
  }
  funcShiftReg(leds);        // シフトレジスタ関数の呼び出し
}

 

動作確認

では、さっそく動作を確認していきます。

変化を確認するために、フォトレジスタ(Cdsセル)に光をあてたり、手で光をさえぎったりしてください。

 

結果はこちら。

フォトレジスタ
測定環境
LEDの点灯数
部屋の灯りArduino-lesson23-04
手で遮るArduino-lesson23-05
ライトを当てるArduino-lesson23-06

 

照度によってLEDの点灯する数がかわれば成功です。

 

まとめ

今回は以下の内容について理解してもらいました。

1.光の明るさ(照度)をLEDの点灯数で認識できるスケッチを作成する。
2.楽しんで遊ぶ。

 

いかがだったでしょうか。

Lesson 23 【フォトレジスタ編】 其の2はここまで。

 

結構、おもしろかったと個人的には思います。

 

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 24は、まだ思案中です。

お楽しみに。

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

コメント

  1. omoroya omoroya より:

    Arduino 入門 Lesson 23 【フォトレジスタ編】 其の2の記事をアップしました。
    其の2は、電子部品がちょっと多めですが楽しく遊べる内容となっています!

タイトルとURLをコピーしました