\ 限定の返礼品あり! /
ArduinoでPWM出力(アナログ出力)を使ってLED明るさを変える【ビジュアルプログラミングLesson3】
ArduinoプログラミングLESSON3は「押しボタンによる点灯LEDの明るさ切り替え制御」です。
デスクライトのように、好みの明るさに調節できる機器が身近に多く存在していると思います。
LESSON1で取り扱ったLEDの点灯パターンは、デジタル出力を用いた「消灯」と「点灯」の2パターンでした。
今回はアナログ出力機能を用いた、段階的なLEDの明るさ変更プログラミングを学習します。
小学生も安心してプログラミングができるように、スクラッチでのプログラミング方法についても動画付きで紹介しています。
今回はアナログ出力機能を学習してみよう!
LESSON1:LED点灯プログラミングの学習についてはこちら!
LESSON2:押しボタンスイッチを使うプログラミングの学習についてはこちら!
- Arduinoでアナログ出力を扱う方法
- Arduino IDEでのプログラミング方法
- スクラッチ(Scrattino3)を使ったプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
遊びが勉強に変わる前に!小学生にこそおすすめしたいのがロボット教室です!
アナログ回路ってなに?
デジタル回路は「0」か「1」の信号のみで構成されるのに対して、アナログ回路は連続的な変化をする信号で構成されます。
今回取り扱うLEDに例えると、その違いは以下のようになります。
デジタル回路:消灯と点灯の2つの状態のみ制御可能
アナログ回路:消灯と様々な明るさの点灯が制御可能
押しボタンによる点灯LEDの明るさ切り替え動作の説明
今回の説明する「押しボタンによる点灯LEDの明るさ切り替え回路動作」は、以下になります。
- 「明るく」ボタンを押すと、LEDの明るさがより明るくなる。
- 「暗く」ボタンを押すと、LEDの明るさがより暗くなる。
- 2つの押しボタンを使った点灯LEDの明るさ変更動作
- スクラッチを使ったプログラミング手順
まずは動画を見て、アナログ回路とはどういったものなのか確認してください。
また、スクラッチを使ったプログラミングをするためには準備作業が必要です。
動画にて準備作業に必要な手順をくわしく説明しています。
押しボタンによる点灯LEDの明るさ切り替え回路の作り方
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
パソコンにスクラッチでプログラミングするためのソフトウェア「Scrattino3(スクラッチーノ3)」のインストールを行います。
以下の記事にて詳しく説明しています。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
スクラッチプログラミングについては、動画または後述するプログラミング例を参考にしてください。
プログラムが完成したら動作確認を行います。
- 「明るく」ボタンを押すごとにLEDが明るくなるか?
- 「暗く」ボタンを押すごとにLEDが暗くなるか?
- 「明るく」「暗く」ボタンを押すごとに明るさパラメータが「17」ずつ増減するか?
- 明るさパラメータは0~255の範囲から外れた値にならないか?
記載のプログラムは動作確認済です。
動作確認方法については、以下の記事にて詳しく説明しています。
押しボタンによるLED明るさ変更回路で使うもの
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- LED(青色)
- 押しボタン(「明るく」「暗く」)
- 抵抗(1kΩ×2)
- 抵抗(220Ω×1)
- ジャンパー線(オスーオス)×7本
今回はELEGOO社の初心者スターターキットに入っている部品のみで作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
【おすすめ】本ブログ記事LESSON9以降にも対応したキットはこちら!
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
LED(青)【キット】
青のLED(発行ダイオード)を使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
押しボタン【キット】
今回のLESSONでは、押しボタンを2つ使用します。
- 「明るく」ボタン:LEDの明るさを明るくします
- 「暗く」ボタン:LEDの明るさを暗くします
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
抵抗(1kΩ)【キット】
1kΩの抵抗を1本使用し、押しボタンに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
抵抗(220Ω)【キット】
220Ωの抵抗を4本使用し、各LEDに1本ずつ接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
ジャンパー線(オスーオス)【キット】
ジャンパー線を7本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
Arduinoキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
- LEDをブレッドボードに差し込む
- 押しボタンをブレッドボードに差し込む
- 220Ω抵抗をブレッドボードに差し込む(LED用)
- 1kΩ抵抗をブレッドボードに差し込む(押しボタン用)
- ジャンパー線をブレッドボードとArduinoソケットに差し込む(計5本)
- ジャンパー線をブレッドボード「5Vライン」とブレッドボード「5D」及び「14D」に差し込む(計2本)
LEDや抵抗、ジャンパー線はArduinoのソケットやブレッドボード穴に差し込むだけでOKです。
LEDはプラス・マイナスの極性があります。
押しボタンは端子が飛び出ている側が同じ側(今回の例だとE列側)になるように差し込みます。
抵抗は極性がありません。
上記説明図で「+」マークがある側(右側)をプラス側にしてください。
LED極性の見分け方については、こちらをご確認ください。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
LEDの明るさ変更プログラムの考え方
アナログ出力機能(PWM)
Arduinoでは0Vと5VのON時間の割合を調節することで、疑似的なアナログ出力ができる機能を持っています。
疑似的なアナログ出力方式をパルス変調といい、PWM(Pulse Width Modulation)出力といいます
アナログ出力の値は0~255までの256段階で出力します。
今回作成するプログラムではアナログ出力値を17ずつ切り替える16段階の明るさ変更プログラムになります。
プログラミングのやり方
Arduino IDEとスクラッチの両方について、プログラミング方法とプログラムを説明します。
2つのプログラミングの特徴は以下の通り。
ArduinoIDE:文字列による命令語形式
スクラッチ:ブロックによるビジュアル形式
文字列を使わないスクラッチの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
スクラッチを使ってプログラミングをする方は、スクラッチの説明まで読み飛ばしてください。
Arduino IDE
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON3 */
/* 作成者:せでぃあ https://cediablog.com */
/* プログラムによるアナログ出力制御(押しボタンを使ってLEDの明るさを替える) */
int LED_SOCKET = 5 ; //LEDの出力ソケット番号
int DARK_BTN_SOCKET = 8 ; //LEDの明るさDOWN入力ソケット番号
int LIGHT_BTN_SOCKET = 9 ; //LEDの明るさUP入力ソケット番号
int led_out = 0 ; //LEDの明るさ値
void setup() {
// put your setup code here, to run once: プログラム起動時1回だけ処理される回路
Serial.begin(9600); //シリアル接続(9600ビット/秒) アナログ出力値をシリアルモニタでモニタリングするために設定
//入出力の割り当て
pinMode(LED_SOCKET, OUTPUT); //5番ソケットはLED点灯出力として使用
pinMode(DARK_BTN_SOCKET, INPUT); //8番ソケットは「暗くボタン」入力として使用
pinMode(LIGHT_BTN_SOCKET, INPUT); //9番ソケットは「明るくボタン」入力として使用
}
void loop() {
// put your main code here, to run repeatedly: プログラム起動後ループ処理される回路
if(digitalRead(LIGHT_BTN_SOCKET) == 1){ //「暗くボタン」がONのとき
if(led_out < 255){ //かつLEDの明るさ値が最大値の255より小さいとき
led_out = led_out + 17; //LEDの明るさ値を+17した値にする
}
while(digitalRead(LIGHT_BTN_SOCKET) == 1){ //「暗くボタン」がONのとき
delay(100); //0.1秒ウェイト回路をループさせる
}
}
if(digitalRead(DARK_BTN_SOCKET) == 1){ //「明るくボタン」がONのとき
if(led_out > 0){ //かつLEDの明るさ値が最小値の0より大きいとき
led_out = led_out - 17; //LEDの明るさ値を-17した値にする
}
while(digitalRead(DARK_BTN_SOCKET) == 1){ //「明るくボタン」がONのとき
delay(100); //0.1秒ウェイト回路をループさせる
}
}
analogWrite(LED_SOCKET,led_out); //LEDの明るさ値でLED点灯電圧をアナログ出力させる
Serial.println(led_out); //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 |
Serial.begin(通信速度)
シリアル通信を初期化します。
通信速度は単位が「ビット/秒」で、300、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200から選択します。
Serial.println(書き込むデータ,データを変換する方法)
文字列をシリアル送信して改行します。
データを変換する方法は省略が可能です。
DEC:10進数、HEX:16進数、OCT:8進数、BIN:2進数
pinMode(入出力番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
digitalRead(入出力番号)
指定したデジタル入出力ソケット番号の状態がON、またはOFFであるか確認します。
ONのときは「HIGH」、OFFのときは「LOW」の値が返ってきます。
analogWrite(入出力番号,0~255の範囲のアナログ値)
指定したデジタル入出力ソケット番号の電圧を256段階での値で出力します。
5V出力の場合、0のとき0V、255の時5Vの出力となります。
0Vと5Vの状態を時間の割合で調整して作る、疑似的なアナログ出力になります。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
if 文
条件が成立しているときのみ、{ }内の文が実行されます。
条件が成立しなければ、{ }内の文は処理されず、次の処理に移ります。
if( 条件 ){
条件成立時に実行する文 ;
}
while 文
( )内の条件が成立している間は、{ }内の文を繰り返し実行します。
while( 条件 ){
繰り返し実行する文 ;
}
比較演算子
比較演算子 | 説明 |
---|---|
A == B | AとBが等しい場合に成立 |
A != B | AとBが等しくない場合に成立 |
A < B | AがBより小さい場合に成立 |
A <= B | AがB以下の場合に成立 |
A > B | AがBより大きい場合に成立 |
A >= B | AがB以上の場合に成立 |
スクラッチ
Scrattino3(スクラッチーノ3)というソフトウェアを使って、プログラミングする方法です。
Scrattino3のインストール方法やプログラミング、動作確認方法については、以下の記事にて詳しく説明しています。
動画を参考にプログラミングしてみよう
スクラッチプログラム(Scrattino3|スクラッチーノ3)
上記がスクラッチのプログラミングとなります。
右側の解説の()内はブロックの種類になります。
Scrattino3(スクラッチーノ3)でのスクラッチプログラミングの作り方について、本記事冒頭の動画にて詳しく説明しています。
Arduino専用ブロックについては、以下の記事にて詳しく説明しています。
動作確認方法
- 「明るく」ボタンを押すごとにLEDが明るくなるか?
- 「暗く」ボタンを押すごとにLEDが暗くなるか?
- 「明るく」「暗く」ボタンを押すごとに明るさパラメータが「17」ずつ増減するか?
- 明るさパラメータは0~255の範囲から外れた値にならないか?
上記項目について確認していきましょう。
アナログ出力値の確認方法
Arduino IDE、スクラッチ「Scrattino3(スクラッチーノ3)」それぞれ、アナログ出力値の確認方法があります。
Arduino IDEでのアナログ出力値確認方法
Scrattino3でのアナログ出力値確認方法
「明るく」ボタンを押すごとにLEDが明るくなるか?
「明るく」ボタンを押して、LEDの明るさが押すごとに明るくなっていくか?確認してください。
「暗く」ボタンを押すごとにLEDが暗くなるか?
「暗く」ボタンを押して、LEDの明るさが押すごとに暗くなっていくか?確認してください。
「明るく」「暗く」ボタンを押すごとに明るさパラメータが「17」ずつ増減するか?
以下について確認してください。
- 「明るく」ボタンを押すとアナログ出力値が「+17」の値になるか?
- 「暗く」ボタンを押すとアナログ出力値が「-17」の値になるか?
明るさパラメータは0~255の範囲から外れた値にならないか?
以下について確認してください。
- アナログ出力値が255のとき、「明るく」ボタンを押しても255から変化しないか?
- アナログ出力値が0のとき、「暗く」ボタンを押しても0から変化しないか?
今回0~255まで、0,17,34,51,…,221,238,255と17の倍数でアナログ出力値を刻んでいます
LESSON3:アナログ出力回路のまとめ
- Arduinoには0から255まで、256段階のアナログ出力機能がある
- アナログ出力機能により、LEDの明るさを変化させることができる
- アナログ出力値は、画面に数値を出力させて確認する
小学生のお子様には断然、スクラッチでのプログラミングがおすすめです!
LEDへのアナログ出力プログラミングを学習したら、次のLESSON4(アナログ入力回路)にチャレンジしてください。
次はアナログ入力回路にチャレンジしよう
小学生のお子様には、プログラミング教室での基礎学習をおすすめしています!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント