Arduinoブロックプログラミングで可変抵抗器を使った回路を作る【Lesson10】
ArduinoプログラミングLESSON10は「可変抵抗器を使った、LED明るさ及びサーボモーター回転角度制御」です。
本LESSON記事は、スクラッチプログラミングとArduinoIDE文字列プログラミングどちらも対応しています。
小学生、中学生も安心してプログラミングができるように、スクラッチでのプログラミング方法について動画付きで紹介しています。
このLESSON記事で可変抵抗器の機能と使い方を覚えよう!
LESSON1:LED点灯プログラミングの学習についてはこちら!
- 可変抵抗器とはどんな機器なのか
- 可変抵抗器を使った制御回路の作り方
- Arduino IDEおよび、スクラッチ(Scrattino3)を使ったプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
遊びが勉強に変わる前に!小学生にこそおすすめしたいのがプログラミング教室です!
可変抵抗器について
可変抵抗器の説明
可変抵抗器とは、抵抗値を変化させることができる機器です。
今回は回転式の可変抵抗器を使います。
ボリューム、ポテンショメーターとも言います。
可変抵抗器の仕組み
可変抵抗器は抵抗素子両端の固定端子と、抵抗素子上をスライド可能な端子の3端子構造になっています。
ツマミを回すことで、スライド端子~固定端子A(固定端子B)間の抵抗が変化します。
ツマミを回す角度により、変化する抵抗値を調節することができます
可変抵抗器を使った制御回路の考え方
可変抵抗器の仕組みを回路図に落とし込むと、上記イメージになります。
ツマミを回すことで、アナログ入力ソケット~GND間の抵抗値「R2」が変動します。
R2の抵抗値が変化することで、アナログ入力電圧値が変化することを利用します。
抵抗値変化とアナログ入力電圧変化の考え方は、Cdsセンサーでの分圧回路構成例を参考にしてください。
詳しい配線方法については、このあと詳しく説明します
サーボモーターについて
サーボモーターとは、指定した角度まで回転させることができるモーターです。
指定角度まで移動後は、その角度を維持しようとする動作をします。
今回使用するサーボモーター「SG-90」は、0~180度の範囲で回転動作角度を制御することができます。
サーボモーターの回転角度制御方法に関しては、こちらの記事にて詳しく説明しています。
可変抵抗器を使った、LED明るさ及びモーター角度制御動作の説明
今回の説明する「可変抵抗器を使った、LED明るさ及びモーター角度制御動作」は、以下になります。
- 可変抵抗器のツマミを回転角度に応じて、LED点灯明るさが変化する
- 可変抵抗器のツマミを回転角度に応じて、サーボモーターの回転角度が変化する
- 可変抵抗器を使った、LED明るさ及びモーター角度制御動作
- スクラッチを使ったプログラミング手順
まずは動画を見て、今回のLESSON10でどのような動作をさせようとしているのか確認してください。
また、スクラッチを使ったプログラミングをするためにはファームウェア転送等の準備作業が必要です。
動画内にて、準備作業に必要な手順を詳しく説明しています。
サーボモーターの角度制御回路の作り方
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
パソコンにスクラッチでプログラミングするためのソフトウェア「Scrattino3(スクラッチーノ3)」のインストールを行います。
以下の記事にて詳しく説明しています。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
後述する配線図を参考にして配線を行ってください。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
スクラッチプログラミングについては、動画または後述するプログラミング例を参考にしてください。
プログラムが完成したら動作確認を行います。
- 可変抵抗器ツマミの回転角度に応じて、LED明るさが変化するか?
- 可変抵抗器ツマミの回転角度に応じて、サーボモーターの回転角度が変化するか?
記載のプログラムは動作確認済です。
動作確認方法については、以下の記事にて詳しく説明しています。
可変抵抗器を使った、LED明るさ及びモーター角度制御回路で使うもの
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- LED(赤色)
- 抵抗(220Ω)
- 可変抵抗器
- サーボモーター「SG-90」
- ジャンパー線(オスーオス)×9本
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
モーター固定用のLEGOブロックはキットに含まれませんので、ご注意ください
モーターは動画撮影用に自前のLEGOブロックで固定しましたが、LEGOブロックを使わなくても配線・動作確認は可能です。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能面は同じです
LED(赤)【キット】
青のLED(発行ダイオード)を使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
抵抗(220Ω)【キット】
220Ωの抵抗を使用し、LEDに接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
可変抵抗器【キット】
今回使用する可変抵抗器はツマミを回転させることで、10kΩまで変化させることができるものです。
極性はありませんが、ツマミを左右どちらに回転させたときにどういった動作をさせたいか?によって各固定端子への配線が変わります。
詳しくは後述する配線図を参照してください
サーボモーター「SG-90」【キット】
サーボモーター「SG-90」を使用します。
サーボモーターは指定した回転角度を指示して、回転させることができる機器です。
ジャンパー線(オスーオス)【キット】
ジャンパー線を9本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
サーボモーターからはコネクタ付きリード線が伸びてきていますので、写真のごとくジャンパー線を使って配線します。
今回サーボモーターは有り合わせのLEGOブロックで固定しましたが、必須内容ではありません。
- LEDをブレッドボードに差し込む
- 可変抵抗器をブレッドボードに差し込む
- 220Ω抵抗をブレッドボードに差し込む
- ジャンパー線をブレッドボードとArduinoソケットに差し込む
- ジャンパー線をブレッドボード内で配線する(可変抵抗器と5VおよびGND)
- ジャンパー線を使って、サーボモーターからのリードコネクタに差し込む
LEDや抵抗、ジャンパー線はArduinoのソケットやブレッドボード穴に差し込むだけでOKです。
LEDはプラス・マイナスの極性があります。
抵抗は極性がありません。
可変抵抗器は5V、GNDの接続端子に応じてツマミの回転角度に応じたアナログ入力値の増減方向が変わります。
LED極性の見分け方については、こちらをご確認ください。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
可変抵抗器を使ったLED明るさ、モーター角度制御の考え方
今回の回路設計構想は以下になります。
- 可変抵抗器の抵抗値変化をアナログ入力電圧値としてArduinoに取り込み、0~1023の値に変換する
- 変換されたアナログ入力値「0~1023」を、LED点灯用のアナログ出力値「0~255」に変換する
- 変換されたアナログ入力値「0~1023」を、サーボモーター回転角度指示値「0~180度」に変換する
ArduinoUnoR3のソケット機能説明
アナログ入力機能としてA0~A5ソケットが備わっています。
また、アナログ出力(PWM)機能として3、5、6、9~11ソケットが備わっています。
PWM出力機能が使えるソケットは基板上ソケット番号に「~」が印字されています
明るさセンサの検出値をアナログ入力値に変換する
今回のLESSON10では可変抵抗器の抵抗値を電圧に変換しています。
ArduinoUnoR3ではA0~A5のアナログ入力ソケットにかかる電圧「0V~5V」の範囲をアナログ入力値「0~1023」の値として識別することができます。
アナログ出力機能(PWM)を使ったLED明るさ制御
Arduinoでは0Vと5VのON時間の割合を調節することで、疑似的なアナログ出力ができる機能を持っています。
疑似的なアナログ出力方式をパルス変調といい、PWM(Pulse Width Modulation)出力といいます
アナログ出力の値は0~255までの256段階で出力、数値が大きいほどLEDが明るく点灯します。
アナログ入力値を各指示値に変換する方法
アナログ入力値が「0~1023」の1024段階であるのに対して、LED点灯アナログ出力値は「0~255」の256段階です。
サーボモーター回転角度は「0~180度」の181段階です。
上記段階の違いに応じて、アナログ入力値の1024段階のを各段階数変換することが可能です。
- アナログ出力値=アナログ入力値÷4
- モーター角度値=アナログ入力値÷5.7
あとはプログラムに落とし込むだけだね!
プログラミングのやり方
Arduino IDEとスクラッチの両方について、プログラミング方法とプログラムを説明します。
2つのプログラミングの特徴は以下の通り。
ArduinoIDE:文字列による命令語形式
スクラッチ:ブロックによるビジュアル形式
文字列を使わないスクラッチの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
スクラッチを使ってプログラミングをする方は、スクラッチの説明まで読み飛ばしてください。
スクラッチを使えば、ArduinoIDEによる文字列プログラミングを自作しなくても動作させることができます
Arduino IDE
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON10 */
/* 作成者:せでぃあ https://cediablog.com */
/* 可変抵抗器を使った制御回路 */
#include <Servo.h> //サーボモーター制御用ライブラリの読みだし
int potentio_SOCKET = 0; //可変抵抗器のアナログ入力ソケット番号
int R_LED_SOCKET = 5; //赤色LEDの出力ソケット番号
int SERVO_SOCKET = 9; //サーボモーターの出力ソケット番号
int servoangle = 0; //サーボモーター回転角度指示値
int ledvalue = 0; //LEDの明るさアナログ出力値
Servo servo; //Servo型変数の宣言
void setup() {
// put your setup code here, to run once: プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(R_LED_SOCKET, OUTPUT); //5番ピンは出力として使用
//Servoライブラリ
servo.attach(SERVO_SOCKET); //サーボモーターを接続するソケット番号を指定
servo.write(0); //サーボモーター回転角度の初期化
//シリアル通信設定
Serial.begin(9600); //シリアル通信速度設定
}
void loop() {
// put your main code here, to run repeatedly: プログラム起動後ループ処理される回路
int analogin; //アナログ入力値を代入する変数
analogin = analogRead(potentio_SOCKET); //アナログ入力ソケットA0入力値を変数に代入する
servoangle = map(analogin,0,1023,0,180); //アナログ入力レンジ(0~1023)⇒角度指示レンジ(0~180)に変換
ledvalue = map(analogin,0,1023,0,255); //アナログ入力レンジ(0~1023)⇒アナログ出力レンジ(0~255)に変換
Serial.print(servoangle); //回転角度指示値をシリアル出力
Serial.print("\t"); //Tabをシリアル出力
Serial.println(ledvalue); //LEDアナログ出力値をシリアル出力
servo.write(servoangle); //サーボモーターを変数に応じた角度に回転させる
analogWrite(R_LED_SOCKET,ledvalue); //LEDを変数に応じたアナログ出力で点灯させる
delay(50); //0.05秒ウェイト
}
上記が可変抵抗器を使った、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」を指定します。
analogRead(入出力番号)
指定したアナログ入力ソケット番号の状態を確認します。
状態は0V~5Vの範囲で、0~1023の値に変換されて返ってきます。
analogWrite(入出力番号,0~255の範囲のアナログ値)
指定したデジタル入出力ソケット番号の電圧を256階調での値で出力します。
5V出力の場合、0のとき0V、255の時5Vの出力となります。
0Vと5Vの状態を時間の割合で調整して作る、疑似的なアナログ電圧になります。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
map(変換したい数値、変換前の下限、変換前の上限、変換後の下限、変換後の上限)
アナログ入力値をアナログ出力やモーターの回転角度に変換するように、取り扱う数値の幅が異なる変数の変換処理をすることができます。
Servoライブラリの説明
標準で用意されているサーボモーター制御用ライブラリ「Servo」を利用すると便利です。
制御したい角度値を指定するだけで、簡単に回転角度制御することができます。
Servoライブラリの読み出し
プログラム冒頭の宣言部にてServoライブラリを読み出します。
#include <Servo.h>
servo型変数の指定
プログラム冒頭の宣言部にてServo型の変数を定義します。
Servo servo;
変数「servo」は例であり、任意の変数文字列を指定してください
attach(入出力ソケット番号,0度のときのパルス幅,180度のときのパルス幅)
宣言したServo型の変数に入出力ソケットピン番号を割りあてます。
パルス幅指定は任意で、指定しない場合はデフォルト値が適用されます。
<デフォルト値>
・0度:544msec
・180度:2400msec
servo型変数.attach(サーボモーターに接続するソケット番号、0度のパルス幅、180度のパルス幅)
今回のLESSONプログラムのパルス幅は、デフォルト値を適用しています。
write(回転角度)
動作させたいサーボモーターの回転角度を指示します。
servo型変数.write(回転させたい角度(0~180))
筆者おすすめのArduinoの参考書を紹介しています。
スクラッチ
Scrattino3(スクラッチーノ3)というソフトウェアを使って、プログラミングする方法です。
Scrattino3のインストール方法やプログラミング、動作確認方法については、以下の記事にて詳しく説明しています。
動画を参考にプログラミングしてみよう
スクラッチプログラム(Scrattino3|スクラッチーノ3)
上記がスクラッチのプログラミングとなります。
可変抵抗器のアナログ入力値をLED点灯明るさ・サーボモーター回転角度に変換する考え方については前述説明を参照してください。
Scrattino3(スクラッチーノ3)でのスクラッチプログラミングの作り方について、本記事冒頭の動画にて詳しく説明しています。
Arduino専用ブロックについては、以下の記事にて詳しく説明しています。
Scrattino3での変数指定方法
今回は「LED点灯明るさ」および「モーター回転角度」が「変数」となります。
上記説明手順に沿って、変数を作成してください。
動作確認方法
- 可変抵抗器ツマミの回転角度に応じて、LED明るさが変化するか?
- 可変抵抗器ツマミの回転角度に応じて、サーボモーターの回転角度が変化するか?
上記項目について確認していきましょう。
LED点灯アナログ出力、モータ角度指示値の確認方法
Arduino IDE、スクラッチ「Scrattino3(スクラッチーノ3)」それぞれ、変数の現在値を確認する方法があります。
Arduino IDEでのアナログ出力値確認方法
今回のプログラムは繰り返し演算プログラムに0.05秒delay命令を仕込んでいるので、0.05秒おきの値取得となります
シリアルモニタを表示させることで、現在のアナログ出力値を確認することができます。
Scrattino3でのアナログ出力値確認方法
画面右上のネコのキャラクターがいるウインドウに現在の変数値が表示されます。
可変抵抗器ツマミの回転角度に応じて、LED明るさが変化するか?
可変抵抗器のツマミを回転させて、明るさが変化するか確認してください。
めいっぱい回転させて、片側で消灯しもう片側で一番明るく点灯することを確認してください。
可変抵抗器ツマミの回転角度に応じて、サーボモーターの回転角度が変化するか?
可変抵抗器のツマミを回転させて、サーボモーターの回転角度が変化するか確認してください。
ツマミの回転に追従するようにモーターが回転しているか、見た目で確認してください。
170度程度までしか回転しませんがモーター個体差の影響であり、動作不良ではありません
異常な動作を避けるため、可変抵抗器のツマミを早く回転させすぎないように注意してください
LESSON10:可変抵抗器によるLED明るさ、モーター角度制御のまとめ
- 可変抵抗器は抵抗値を変化させることができる機器
- アナログ入力値は、アナログ出力値やモーター回転角度指示値に変換して制御する
- 可変抵抗器の固定端子のどちらに5V,GNDを配線するかで、ツマミの回転方向に対する動作が異なる
小学生のお子様には断然、スクラッチでのプログラミングがおすすめです!
スクラッチプログラミングを使って、いろいろな電子機器を使った制御を体験してみよう。
プログラム内容をアレンジして遊んでみよう
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
サーボモーターの回転速度変更にチャレンジしてみよう!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント