Arduino 入門
Lesson 23
【フォトレジスタ編】 其の2
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本日はLesson 23 【フォトレジスタ編】 其の2です。
Lesson 22でも説明しましたが、要は「光センサー」です!
本Lesson「其の2」は「其の1」に回路を追加して遊びます。
「其の1」では、基本的なコードを理解しました。
「其の2」ではフォトレジスタ(光センサ)、Lesson 20、Lesson 21で使用した、8bitシフトレジスタとLEDの回路を利用して遊びます。
本Lesson解説で使用しているのはArduino互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
はじめに
「フォトレジスタ」の原理やスケッチ(コード、プログラム)の基本的な事はLesson 22で説明しています。
まずは、基本からという方はそちらを参照お願いします。
「其の2」では、基本的な説明は省略します。
Lsson 23 目標
今回も遊ぶことを最大の目標に楽しみましょう!
【フォトレジスタ編】 其の2ではフォトレジスタとLEDで遊びます。
準備
ではLessonの準備に取り掛かりましょう。
今回は部品が多いです。
Lesson 20、Lesson 21で使用した部品を使います。
下記を、一読しておくと本Lessonの実践に取り組みやすいです。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - フォトレジスタ(Cdsセル)
- SN74HC595N IC 8bitシフトレジスタ
- 抵抗 10kΩ 1本
- 抵抗 220Ω 8本
- LED 8個
- M-M Jumper wire(UNOと部品をつなぐための配線)
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
使用部品である、フォトレジスタ(Cdsセル)についてはLesson 22で説明しています。
本Lessonでは省略します。
仕様、原理など詳細は以下で確認お願いします。
念のため写真のみ掲載しておきます。
下図がフォトレジスタ(Cdsセル)です。
※Cdsセルと一緒に使用する抵抗について
Lesson 22と同様にフォトレジスタ(Cdsセル)と直列につなぐ抵抗は10kΩを使用します。
フォトレジスタ(Cdsセル)と直列につないで分圧した電圧を読み取るために使用します。
実践 回路作成とコード作成
今回は回路が多いですが、頑張って接続しましょう!
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、フォトレジスタ(Cdsセル)で受け取る光の強さをLEDの光る数で体感しましょう!
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
フォトレジスタ(Cdsセル)と抵抗が直列に接続されアナログ入力のA0から値を読み取るようになっています。
その読み取った値にて、搭載した8個のLEDの点灯する数を制御する回路です。
Lesson 22の解説をもう一度します。
抵抗値は10kΩで一定なのに対して、フォトレジスタ(Cdsセル)は抵抗値が変化します。
そのため、分圧比がかわることによって読み取る値も変わるという仕組みです。
式に表すと下記となります。
Vout = R10/(R9+R10)×5V
R9:Cdsセル R10:10kΩ
回路図がこちら。
こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
照度の読み取り部分の部品は、「フォトレジスタ(Cdsセル)」と「10kΩの抵抗」。
読み取った値によってLEDを点灯させている部分の部品は、「LED」と「8bitシフトレジスタ」です。
M-M jumper wireを使用してUNOと接続しましょう。
使用するポートは以下となります。
アナログ入力の「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とします。
B00000000 + B00000001 = B0000001
B00000001 + B00000010 = B0000011
B00000011 + B00000100 = B0000111
・・・
B01111111 + B10000000 = B11111111
というような構文となっています。
スケッチの中で、for文「i < 8」の8の部分は変数としています。
そうすることで、1になる数が変わりLEDの点灯数も変わる仕組みです。
コマンド | 説明 |
---|---|
<< | 値 << ビット数 ビット数で指定した数だけ、値を左へシフト。 値は、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の点灯数 |
---|---|
部屋の灯り | |
手で遮る | |
ライトを当てる |
まとめ
今回は以下の内容について理解してもらいました。
2.楽しんで遊ぶ。
いかがだったでしょうか。
Lesson 23 【フォトレジスタ編】 其の2はここまで。
結構、おもしろかったと個人的には思います。
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson 24は、【7セグメントLED編】です。
電光掲示板などに使われている、「数字を表示する電子機器」です。
こちらも、使いこなせるようになれば遊ぶにはもってこいの電子部品です。
原理は単純です!
お楽しみに。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
Arduino UNOでもプログラムを作って下さい。
お願いします
コメントありがとうございます。
正規品のArduino UNOということですか?
Arduino 入門 Lesson 23 【フォトレジスタ編】 其の2の記事をアップしました。
其の2は、電子部品がちょっと多めですが楽しく遊べる内容となっています!