Arduinoでアナログ入力回路を作る【ビジュアルプログラミングLesson4】
ArduinoプログラミングLESSON4は「明るさセンサ検出値によるLED点灯制御」です。
夜になって外が暗くなると、車のヘッドライトが自動で点灯する動作が身近な例になります。
例えば周りの明るさをセンサで検出するとして、その明るさを度合いを電圧値等に置き換えて入力することをアナログ入力といいます。
今回はアナログ入力機能を用いた、明るさセンサ検出値に応じたLEDの点灯制御プログラミングを学習します。
小学生も安心してプログラミングができるように、スクラッチでのプログラミング方法についても動画付きで紹介しています。
今回は明るさセンサを使ったアナログ入力機能を学習してみよう!
- Arduinoでアナログ入力を扱う方法
- 明るさセンサの機能と使い方
- Arduino IDEでのプログラミング方法
- スクラッチ(Scrattino3)を使ったプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
アナログ回路のおさらい
デジタル回路は「0」か「1」の信号のみで構成されるのに対して、アナログ回路は連続的な変化をする信号で構成されます。
今回取り扱う明るさセンサに例えると、その違いは以下のようになります。
デジタル回路:「暗い」と「明るい」の2つの状態のみ判別可能
アナログ回路:さまざまな明るさが数値(0~1023)として判別可能
明るさセンサ検出値に応じたLEDの点灯制御の説明
今回の説明する「押しボタンによる点灯LEDの明るさ切り替え回路動作」は、以下になります。
- 明るさセンサ検出値は数値が大きいほど明るく(0~1023)の範囲のアナログ入力値となる。
- 明るさセンサ検出値が100より大きいとき、赤色LEDを点灯させる。
- 明るさセンサ検出値が300より大きいとき、黄色LEDを点灯させる。
- 明るさセンサ検出値が500より大きいとき、緑色LEDを点灯させる。
- 明るさセンサ検出値が700より大きいとき、青色LEDを点灯させる。
- 明るさセンサ検出値に応じたLEDの点灯制御動作
- スクラッチを使ったプログラミング手順
まずは動画を見て、明るさセンサとはどういったものなのか確認してください。
また、スクラッチを使ったプログラミングをするためには準備作業が必要です。
動画にて準備作業に必要な手順をくわしく説明しています。
明るさセンサ検出値に応じたLEDの点灯制御回路の作り方
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
パソコンにスクラッチでプログラミングするためのソフトウェア「Scrattino3(スクラッチーノ3)」のインストールを行います。
以下の記事にて詳しく説明しています。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
文字列プログラミングを行う場合は、私が作成したプログラムをコピペして使ってください。
スクラッチプログラミングについては、動画または後述するプログラミング例を参考にしてください。
プログラムが完成したら動作確認を行います。
- 十分明るい部屋で明るさセンサのアナログ入力値が700より大きいとき、全LEDが点灯するか?
- 明るさセンサの検出部を少しずつ覆っていくとLEDが青⇒緑⇒黄⇒赤の順に消灯するか?
- キャップなどで明るさセンサを完全に覆ったときに、全LEDが消灯するか?
記載のプログラムは動作確認済です。
動作確認方法については、以下の記事にて詳しく説明しています。
明るさセンサ検出値に応じたLEDの点灯制御回路で使うもの
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- LED(青・緑・黄・赤)
- 明るさセンサ
- 抵抗(10kΩ)
- 抵抗(220Ω×4)
- ジャンパー線(オスーオス)×8本
今回はELEGOO社の初心者スターターキットに入っている部品のみで作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
LED(青・緑・黄・赤)【キット】
4色のLED(発行ダイオード)を各1本使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
明るさセンサ【キット】
今回のLESSON4では、明るさセンサ使用します。
今回使用する明るさセンサは、材料に硫化カドミウム(CdS)が使われていて、光が当たると内部の抵抗値が小さくなる特性を持ちます。
- 検出する明るさが明るいほど、内部抵抗が小さくなる
- 素子に極性がなくどちらの方向に接続しても問題なし
上記がセンサの検出明るさと抵抗値の関係性グラフになります。
抵抗(10kΩ)【キット】
10kΩの抵抗を1本使用し、明るさセンサーに直列接続します。
抵抗を接続するのは、Arduino本体に明るさセンサが検出した明るさを電圧をアナログ値として入力させるためです。
今回使用する明るさセンサー(CdSセル)は電気を発生しないため抵抗直列接続による分圧回路が必要となります。
この分圧回路を作るために、10kΩの抵抗を用います。
抵抗(220Ω)【キット】
220Ωの抵抗を4本使用し、各LEDに1本ずつ接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
ジャンパー線(オスーオス)【キット】
ジャンパー線を8本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
初心者キットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
- LEDをブレッドボードに差し込む
- 220Ω抵抗をブレッドボードに差し込む(LED用)
- 明るさセンサーをブレッドボードに差し込む
- 10kΩ抵抗をブレッドボードに差し込む(明るさセンサ用)
- ジャンパー線をブレッドボードとArduinoソケットに差し込む(計7本)
- ジャンパー線をブレッドボード「5Vライン」とブレッドボード「2C」に差し込む
LEDや抵抗、ジャンパー線はArduinoのソケットやブレッドボード穴に差し込むだけでOKです。
LEDはプラス・マイナスの極性があります。
明るさセンサーと抵抗は極性がありません。
上記説明図で「+」マークがある側(右側)をプラス側にしてください。
LED極性の見分け方については、こちらをご確認ください。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
明るさセンサによる明るさ度合い検出の考え方
アナログ入力機能
ArduinoUnoR3ではA0~A5のアナログ入力ソケットにかかる電圧「0V~5V」の範囲をアナログ入力値「0~1023」の値として識別することができます。
アナログ入力機能を使用するには、明るさセンサ検出値等の変化内容を0~5Vの電圧変化に変換してアナログ入力ソケットに取り込む必要があります。
明るさセンサの検出値をアナログ入力値に変換する
今回のレッスン4では、明るさセンサの明るさ検出値を電圧に変換しています。
明るさ検出値が大きい(明るい側)のときに、アナログ入力電圧値は5Vに近づきます。
アナログ入力値は電圧0V入力のとき0で、5V入力のとき最大値1023となります。
プログラミングのやり方
Arduino IDEとスクラッチの両方について、プログラミング方法とプログラムを説明します。
2つのプログラミングの特徴は以下の通り。
ArduinoIDE:文字列による命令語形式
スクラッチ:ブロックによるビジュアル形式
文字列を使わないスクラッチの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
スクラッチを使ってプログラミングをする方は、スクラッチの説明まで読み飛ばしてください。
Arduino IDE
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON4 */
/* 作成者:せでぃあ https://cediablog.com */
/* プログラムによるアナログ入力制御(明るさセンサーの明るさに応じてLED点灯色を増やす) */
int SENSOR_SOCKET = 0 ; //明るさセンサーの入力ソケット番号
int LED_R_SOCKET = 2 ; //赤色LEDの出力ソケット番号
int LED_Y_SOCKET = 3 ; //黄色LEDの出力ソケット番号
int LED_G_SOCKET = 4 ; //緑色LEDの出力ソケット番号
int LED_B_SOCKET = 5 ; //青色LEDの出力ソケット番号
void setup() {
// put your setup code here, to run once: プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(LED_R_SOCKET, OUTPUT) ; //2番ソケットは赤色LED点灯出力として使用
pinMode(LED_Y_SOCKET, OUTPUT) ; //3番ソケットは黄色LED点灯出力として使用
pinMode(LED_G_SOCKET, OUTPUT) ; //4番ソケットは緑色LED点灯出力として使用
pinMode(LED_B_SOCKET, OUTPUT) ; //5番ソケットは青色LED点灯出力として使用
}
void loop() {
// put your main code here, to run repeatedly: プログラム起動後ループ処理される回路
int analogin ;
analogin = analogRead(SENSOR_SOCKET);
if(analogin > 100){ //アナログ入力値が100より大きいとき
digitalWrite(LED_R_SOCKET , HIGH); //赤色LEDを点灯させる
}else{
digitalWrite(LED_R_SOCKET , LOW); //赤色LEDを消灯させる
}
if(analogin > 300){ //アナログ入力値が300より大きいとき
digitalWrite(LED_Y_SOCKET , HIGH); //黄色LEDを点灯させる
}else{
digitalWrite(LED_Y_SOCKET , LOW); //黄色LEDを消灯させる
}
if(analogin > 500){ //アナログ入力値が500より大きいとき
digitalWrite(LED_G_SOCKET , HIGH); //緑色LEDを点灯させる
}else{
digitalWrite(LED_G_SOCKET , LOW); //緑色LEDを消灯させる
}
if(analogin > 700){ //アナログ入力値が700より大きいとき
digitalWrite(LED_B_SOCKET , HIGH); //青色LEDを点灯させる
}else{
digitalWrite(LED_B_SOCKET , LOW); //青色LEDを消灯させる
}
delay(100); //0.1秒待つ
}
上記が明るさセンサ検出値に応じたLEDの点灯制御回路のプログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
慣れてきたらアレンジプログラミングにもチャレンジしてみよう!
命令語の解説
今回のプログラムで使用した命令文について、解説します。
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
またアナログ出力値は「0~255」の整数を扱いますので、同じく「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
pinMode(入出力ソケット番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
analogRead(入力ソケット番号)
指定したアナログ入力ソケット番号の状態を確認します。
状態は0V~5Vの範囲で、0~1023の値に変換されて返ってきます。
if else文
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
if( 条件 ){
条件成立時に実行する文 ;
} else {
条件不成立時に実行する文 ;
}
比較演算子
比較演算子 | 説明 |
---|---|
A == B | AとBが等しい場合に成立 |
A != B | AとBが等しくない場合に成立 |
A < B | AがBより小さい場合に成立 |
A <= B | AがB以下の場合に成立 |
A > B | AがBより大きい場合に成立 |
A >= B | AがB以上の場合に成立 |
digitalWrite(入出力ソケット番号,HIGHまたはLOW)
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
今回のプログラムでは明るさ検出センサの値によりLED点灯制御を行ってから、100msec=0.1sec待ったのちふたたび明るさ検出センサの値を確認するプログラムをループ実行しています。
マイクロ秒単位で指定したい場合は、delayMcroseconds(時間)を使います。
スクラッチ
Scrattino3(スクラッチーノ3)というソフトウェアを使って、プログラミングする方法です。
Scrattino3のインストール方法やプログラミング、動作確認方法については、以下の記事にて詳しく説明しています。
動画を参考にプログラミングしてみよう
スクラッチプログラム(Scrattino3|スクラッチーノ3)
上記がスクラッチのプログラミングとなります。
Scrattino3(スクラッチーノ3)でのスクラッチプログラミングの作り方について、本記事冒頭の動画にて詳しく説明していますのでぜひご覧ください。
Arduino専用ブロックについては、以下の記事にて詳しく説明しています。
動作確認方法
- 十分明るい部屋で明るさセンサのアナログ入力値が700より大きいとき、全LEDが点灯するか?
- 明るさセンサの検出部を少しずつ覆っていくとLEDが青⇒緑⇒黄⇒赤の順に消灯するか?
- キャップなどで明るさセンサを完全に覆ったときに、全LEDが消灯するか?
上記項目について確認していきましょう。
アナログ入力値の確認方法
スクラッチ「Scrattino3(スクラッチーノ3)」でのアナログ入力値確認方法について説明します。
Scrattino3でのアナログ出力値確認方法
センサのアナログ入力値が700より大きいとき、全LEDが点灯するか?
明るい部屋でセンサの検出値が700より大きくなるように、センサの向きや周りの明るさを調整してください。
赤色・黄色・緑色・青色の4色全てが点灯状態になることが確認できれば動作OKです。
明るさセンサの検出部を少しずつ覆っていくとLEDが青⇒緑⇒黄⇒赤の順に消灯するか?
ペンのキャップなどで明るさセンサをすこしずつ覆って、明るさセンサの明るさ検出値を徐々に小さくしていってください。
明るさセンサが検出する明るさ値が減少するにつれて、4色全てのLEDが点灯している状態から青⇒緑⇒黄⇒赤の順に消灯していけば動作OKです。
センサアナログ入力値が、指定した数値を下回ったらLEDが消灯しているかあわせて確認してください
キャップなどで明るさセンサを完全に覆ったときに、全LEDが消灯するか?
ペンのキャップなどで明るさセンサを完全に覆ってしまい、明るさセンサの検出値を0に近づけてください。
完全に遮光できれば、アナログ入力値は0になります。
この時すべてのLEDが消灯していることが確認できれば動作OKです。
LESSON4:アナログ入力回路のまとめ
- Arduinoには0から1023までの段階的なアナログ入力機能がある
- 明るさセンサ(CdSセル)は、光が当たると内部の抵抗値が小さくなる特性を持つ
- アナログ入力値は、画面に数値を出力させて確認する
小学生のお子様には断然、スクラッチでのプログラミングがおすすめです!
LEDへのアナログ入力プログラミングを学習したら、次のLESSON5(アナログ入出力回路応用編)にチャレンジしてください。
次はアナログ回路の応用編にチャレンジしよう
小学生のお子様には、プログラミング教室での基礎学習をおすすめしています!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
LESSON1:LED点灯プログラミングの学習についてはこちら!
LESSON2:押しボタンスイッチを使うプログラミングの学習についてはこちら!
LESSON3:アナログ出力機能を使うプログラミングの学習についてはこちら!
コメント