Arduinoサーボモーターの回転速度制御【Lesson9.5】
サーボモーターの回転角度だけでなく、速度も変えてみたいです!
今回は前回のArduino(アルドゥイーノ)プログラミングLESSON9「サーボモーターの回転角度制御」の応用編です。
LESSON9.5「VarSpeedServoライブラリを使ったサーボモーターの回転速度制御」を紹介します。
今回もLESSON9と同様に、サーボモーター(SG-90)を使って学習をすすめます。
本LESSON記事は、Arduino IDEプログラミングの学習とサーボモーターの知識を習得するプログラムになっています。
今回取り扱う「VarSpeedServoライブラリ」は、スクラッチプログラミング非対応となります。
ArduinoIDEによる文字列プログラミングのみ対応となりますので、ご注意ください。
サンプルプログラムをコピペすれば、配線後すぐに動作確認できますよ!
LESSON9の内容については、こちらの記事を参照してください。
- 動作確認に使用する機器と配線方法
- VarSpeedServoライブラリのインストール方法
- Arduino IDEによる使ったプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
サーボモーターについて
サーボモーターとは、指定した角度まで回転させることができるモーターです。
指定角度まで移動後は、その角度を維持しようとする動作をします。
今回使用するサーボモーター「SG-90」は、0~180度の範囲で回転動作角度を制御することができます。
サーボモーターの回転角度制御方法に関しては、こちらの記事にて詳しく説明しています。
サーボモーターの回転速度制御動作の説明
今回の説明する「サーボモーターの回転速度制御動作」は、以下になります。
- プログラム動作中、サーボモーターは0度~180度の回転角度を往復動作する
- 押しボタンを押すごとに、サーボモーターの回転速度が低速⇒中速⇒高速と変化する
- 押しボタンスイッチはサーボモーター角度が0度のときのみ入力を受け付ける
- 押しボタンによる、サーボモーターの回転速度制御動作
まずは動画を見て、今回のLESSON内容「サーボモーターの回転角度制御動作」について確認してください。
どんな動作をさせたいのか、動画を見て理解しておこう
サーボモーターの速度制御回路の作り方
プログラミングするためには、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムを後述しますので、必要に応じてコピペして使ってください。
プログラムが完成したら動作確認を行います。
- プログラム動作中、サーボモーターは0度~180度の回転角度を往復動作するか?
- 押しボタンを押すごとに、サーボモーターの回転速度が低速⇒中速⇒高速と変化するか?
- 以降押しボタンを押すたびに繰り返し動作となるか?
記載のプログラムは動作確認済です。
動作確認方法については、以下の記事にて詳しく説明しています。
押しボタンによるサーボモーター速度制御回路で使うもの
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- LED(赤・黄・緑)
- 抵抗(220Ω)×3本
- 押しボタンスイッチ
- 抵抗(1kΩ)
- サーボモーター「SG-90」
- ジャンパー線(オスーオス)×10本
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
モーター固定用のLEGOブロックはキットに含まれませんので、ご注意ください
モーターは動画撮影用に自前のLEGOブロックで固定しましたが、LEGOブロックを使わなくても配線・動作確認は可能です。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能面は同じです
LED(赤・黄・緑)【キット】
赤色・黄色・緑色のLED(発行ダイオード)を1本ずつ使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
抵抗(220Ω)【キット】
220Ωの抵抗を使用し、各LEDに1本ずつ接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
押しボタン【キット】
今回のLESSONでは、押しボタンスイッチを使用します。
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
抵抗(1kΩ)【キット】
1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
サーボモーター「SG-90」【キット】
サーボモーター「SG-90」を使用します。
サーボモーターは指定した回転角度を指示して、回転させることができる機器です。
ジャンパー線(オスーオス)【キット】
ジャンパー線を10本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
サーボモーターからはコネクタ付きリード線が伸びてきていますので、写真のごとくジャンパー線を使って配線します。
今回サーボモーターは有り合わせのLEGOブロックで固定しましたが、必須内容ではありません。
- 各色LEDをブレッドボードに差し込む
- 押しボタンをブレッドボードに差し込む
- 220Ω抵抗をブレッドボードに差し込む(各LED用)
- 1kΩ抵抗をブレッドボードに差し込む(押しボタン用)
- ジャンパー線をブレッドボードとArduinoソケットに差し込む
- ジャンパー線をブレッドボード内で配線する(押しボタンスイッチと+5V)
- ジャンパー線を使って、サーボモーターからのリードコネクタに差し込む
LEDや抵抗、ジャンパー線はArduinoのソケットやブレッドボード穴に差し込むだけでOKです。
LEDはプラス・マイナスの極性があります。
押しボタンは端子が飛び出ている側がブレッドボード長手側になるように差し込みます。
抵抗は極性がありません。
LED極性の見分け方については、こちらをご確認ください。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
VarSpeedServoライブラリによるサーボモーター速度制御方法
VarSpeedServoライブラリを使った、サーボモーター速度制御方法について説明します。
VarSpeedServoライブラリとは
VarSpeedServoライブラリは、Arduino標準のServoライブラリのモーターの回転角度制御に回転速度制御も可能とするライブラリです。
こちらのサイトからライブラリをダウンロードして、Arduinoにインストールすることで使用することが可能です。
VarSpeedServoライブラリのインストール方法
VarSpeedServoライブラリのインストール方法について説明します。
- ライブラリのダウンロードサイトに移動する
- ライブラリをダウンロードする
- ArduinoIDEにライブラリをインストールする
ライブラリをダウンロード可能なGitHubサイトに移動します。
ダウンロードしたZIPファイルは解凍しないでください
「スケッチ⇒ライブラリをインクルード⇒.ZIP形式のライブラリをインストール」の順に選択します。
先ほどダウンロードしたライブラリZIPファイルを選択して、インストール完了です。
ArduinoIDEプログラムでのライブラリ使用方法
VarSpeedServoライブラリの読み出し
プログラム冒頭の宣言部にてVarSpeedServoライブラリを読み出します。
スケッチ⇒ライブラリをインクルード⇒VarSpeedServo-masterを選択することで、スケッチ内に下記宣言文が表示されます。
#include <VarSpeedServo.h>
直接キーボード入力してもOKです
VarSpeedServo型変数の指定
プログラム冒頭の宣言部にてVarSpeedServo型の変数を定義します。
VarSpeedServo servo;
変数「servo」は例であり、任意の変数文字列を指定可能です
attach(入出力ソケット番号,0度のときのパルス幅,180度のときのパルス幅)
宣言したServo型の変数に入出力ソケットピン番号を割りあてます。
パルス幅指定は任意で、指定しない場合はデフォルト値が適用されます。
<デフォルト値>
・0度:544msec
・180度:2400msec
servo型変数.attach(サーボモーターに接続するソケット番号、0度のパルス幅、180度のパルス幅)
今回のLESSONプログラムのパルス幅は、デフォルト値を適用しています。
write(回転角度,回転速度,動作完了待ち設定)
サーボモーター動作に関する指示をします。
VarSpeedServo型変数.write(回転角度(0~180°),回転速度(1~255),動作完了待ち設定)
回転速度は1のときに最小速度、255のときに最大速度になります。
動作完了待ち設定は省略可能ですが、Trueを選択することで動作完了後に次のプログラムに進みます。
動作を安定させるために、Trueは指定した方がよさそう!
プログラミングのやり方
Arduino IDEについて、プログラミング方法とプログラムを説明します。
Arduino IDE
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEサンプルプログラム
/* 作品名:LESSON9.5 */
/* 作成者:せでぃあ https://cediablog.com */
/* サーボモーター速度制御 */
#include <VarSpeedServo.h> //サーボモーター制御用ライブラリの読みだし
int BUTTON_SOCKET = 2; //押しボタンスイッチの入力ソケット番号
int R_LED_SOCKET = 5; //赤色LEDの出力ソケット番号
int Y_LED_SOCKET = 6; //黄色LEDの出力ソケット番号
int G_LED_SOCKET = 7; //緑色LEDの出力ソケット番号
int SERVO_SOCKET = 9; //サーボモーターの出力ソケット番号
int servospeed = 0; //サーボモーター回転速度指示値
VarSpeedServo servo; //VarSpeedServo型変数の宣言
void setup() {
// put your setup code here, to run once: プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(BUTTON_SOCKET, INPUT); //2番ピンは入力として使用
pinMode(R_LED_SOCKET, OUTPUT); //5番ピンは出力として使用
pinMode(Y_LED_SOCKET, OUTPUT); //6番ピンは出力として使用
pinMode(G_LED_SOCKET, OUTPUT); //7番ピンは出力として使用
pinMode(SERVO_SOCKET, OUTPUT); //9番ピンは出力として使用
//Servoライブラリ
servo.attach(SERVO_SOCKET); //サーボモーターを接続するソケット番号を指定
servospeed = 40; //サーボモーター回転速度の初期化
servo.write(0,servospeed,true); //サーボモーター回転角度の初期化
//シリアル通信設定
Serial.begin(9600); //シリアル通信速度設定
}
void loop() {
// put your main code here, to run repeatedly: プログラム起動後ループ処理される回路
Serial.println(servospeed); //回転速度値をシリアル出力
if(digitalRead(BUTTON_SOCKET) == HIGH){ //押しボタンスイッチがONのとき
if(servospeed < 240){ //回転速度指示値が240未満のとき
servospeed = servospeed + 100; //回転速度指示値を+100する
}else{
servospeed = 40 ; //回転速度指示値を40にする
}
while(digitalRead(BUTTON_SOCKET) == HIGH){ //押しボタンスイッチが押されたままのときに待機させる
}
}
if(servospeed == 40){ //回転速度が40のとき(低速)
digitalWrite(R_LED_SOCKET,HIGH); //赤色LEDを点灯させる
digitalWrite(Y_LED_SOCKET,LOW); //黄色LEDを消灯させる
digitalWrite(G_LED_SOCKET,LOW); //緑色LEDを消灯させる
}else if(servospeed == 140){ //回転速度が140のとき(中速)
digitalWrite(R_LED_SOCKET,LOW); //赤色LEDを消灯させる
digitalWrite(Y_LED_SOCKET,HIGH); //黄色LEDを点灯させる
digitalWrite(G_LED_SOCKET,LOW); //緑色LEDを消灯させる
}else{ //回転速度が240のとき(高速)
digitalWrite(R_LED_SOCKET,LOW); //赤色LEDを消灯させる
digitalWrite(Y_LED_SOCKET,LOW); //黄色LEDを消灯させる
digitalWrite(G_LED_SOCKET,HIGH); //緑色LEDを点灯させる
}
servo.write(180,servospeed,true); //サーボモーターを180度まで回転させ、動作完了まで待つ
delay(500); //0.5秒ウェイト
servo.write(0,servospeed,true); //サーボモーターを0度まで回転させ、動作完了まで待つ
delay(500); //0.5秒ウェイト
}
上記が押しボタンによるサーボモーター回転速度制御のプログラムになります。
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」の値が返ってきます。
digitalWrite(入出力ソケット番号,HIGHまたはLOW)
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
if 文
条件が成立しているときのみ、{ }内の文が実行されます。
条件が成立しなければ、{ }内の文は処理されず、次の処理に移ります。
if( 条件 ){
条件成立時に実行する文 ;
}
if else文
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
if( 条件 ){
条件成立時に実行する文 ;
} else {
条件不成立時に実行する文 ;
}
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以上の場合に成立 |
VarSpeedServoライブラリについては、記事内ライブラリ説明を参照してください
筆者おすすめのArduinoの参考書を紹介しています。
動作確認方法
- プログラム動作中、サーボモーターは0度~180度の回転角度を往復動作するか?
- 押しボタンを押すごとに、サーボモーターの回転速度が低速⇒中速⇒高速と変化するか?
- 以降押しボタンを押すたびに繰り返し動作となるか?
上記項目について確認していきましょう。
プログラム動作中、サーボモーターは0度~180度の回転角度を往復動作するか?
プログラムを転送すると、サーボモーターは0度位置に復帰動作を行います。
その後、180度位置まで回転し、再び0度位置に戻ってきます。
0度位置⇔180度位置の往復運動を永久に続ける動作を行います。
プログラム実行開始後のサーボモーター動作速度は「低速」となります。
USBケーブルを抜く等して、電源供給をOFFすれば動を停止します
押しボタンを押すごとに、サーボモーターの回転速度が低速⇒中速⇒高速と変化するか?
押しボタンスイッチを押すごとに、サーボモーター速度が「低速」⇒「中速」⇒「高速」になるか目視で確認してください。
また、LEDの点灯が速度とあっているかも確認してください。
今回のプログラムはモーター回転角度が0度のときに、速度変更が可能です。
あらかじめ押しボタンを押しっぱなしにして、モーターの回転動作が停止してから手を離してください。
- 赤色LED点灯:低速
- 黄色LED点灯:中速
- 緑色LED点灯:高速
動作速度が変化することを確認してください
以降押しボタンを押すたびに繰り返し動作となるか?
ボタンスイッチを押すたびに低速⇒中速⇒高速⇒低速・・・と繰り返し動作となることを確認してください。
LESSON9.5:サーボモーター速度制御のまとめ
- VarSpeedServoライブラリ使用により、モーターの回転速度変更が可能
- ライブラリはZIP形式のままダウンロードしてインストール行うう
- 1~255の範囲でモーターの回転速度指定が可能
モーター制御を学習することで、工作の幅も広がると思います。
ぜひサーボモーターを使った電子工作を考えてみてください。
見た目で動作がわかる機器は、動作を見ていて楽しいよね!
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント