マイクロサーボを使ってみる(Arduino)
サーボ機構で位置や速度等を制御するのに使用される
ものですが、ロボット産業をはじめとするいろいろな分野で
利用されており、種類もたくさんあります。
今回は、ホビー用のマイクロサーボを使ってみます。
今回使用するマイクロサーボ(SG92R)とタクトスイッチモジュールです。
マイクロサーボ SG92R
¥500- [SG92R]
・制御角:±約90°(180°)
・トルク:2.5kgf・cm
・動作電圧:4.8V
秋月電子通商
http://akizukidenshi.com/catalog/g/gM-08914/
マイクロサーボ9g SG-90
¥400- [SG-90]
・制御角:±約90°(180°)
・トルク:1.8kgf・cm
・動作電圧:4.8V
秋月電子通商
http://akizukidenshi.com/catalog/g/gM-08761/
タクトスイッチ(黒色)
¥10- [TS-0606-F-N-BLK]
秋月電子通商
http://akizukidenshi.com/catalog/g/gP-03647/
KY-004 タクトスイッチモジュール
(Arduino プルアップ回路用抵抗付)
¥50- [KY-004]
AliExpress
https://ja.aliexpress.com/
ブレッドボード電源モジュール
¥100- [MB102]
AliExpress
https://ja.aliexpress.com/
マイクロサーボの選択は、
私のようにお試しレベルであれば何でも構いません。
ですが、実際には、
・制御角
・トルク
・動作電圧
など仕様に合ったものを選ぶことになります。
トルクは、次の図を参考にして下さい。
早速使ってみます。
私が用意した、マイクロサーボ SG92Rは、
制御角が±約90°( 180度 ) なので、
0度から180度まで30度刻みで動作させてみます。
180度まで動作したら0度へ戻し、
また同じ動作を繰り返します。
回路は図の通りです。
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
(※注意:見づらいですが黄色線の配線があります)
マイクロサーボ SG92Rの駆動(稼働)用の5V電源ですが、
大きな電流を必要とするため、Arduino の本体からの電源供給は、
避けた方が良いと思います。
そこで、ブレッドボードへ5Vを別電源で供給します。
電源供には、9Vの角電子を使用します。
この場合、5Vへの変換が必要になります。
そこで、
MB102ブレッドボード電源モジュールを使用します。
この電源モジュールは、Arduino UNOと同じく、
7V~12V電源用の電源ジャックと、USBケーブルによる
電源供給が可能です。
また、モジュール上のピン設定により、
供給する電圧を、5V、3.3Vのいずれかに設定が可能な便利ものです。
スケッチします。
// インクルード宣言(Servoライブラリ利用宣言)
#include <Servo.h>
// オブジェクト生成
Servo servo;
void setup() {
// put your setup code here, to run once:
// サーボモーター回転信号( PWM )出力ピン設定
servo.attach( 5 );
}
void loop() {
// put your main code here, to run repeatedly:
// 変数宣言
int angle;
for ( angle = 0; angle <= 180; angle += 30 ){
servo.write( angle ); // 指定角度を出力
delay(1000); // 1000ms停止
}
}
サーボ制御には、Servoライブラリを利用します。
このライブラリは、既定でインストール済みだと思います。
1.オブジェクト生成
Servo servo;
2.サーボ信号出力用、デジタルピン設定
servo.attach( 5 ); // 5番ピンを指定
2.サーボへ指定角度を出力
servo.write( 30 ); // 30度を指定
Arduino に書き込んで実行してみます。
30度毎、アームが回転すると思います。
続いて、タクトスイッチを押すと、サーボが動作する
スケッチを書いてみます。
まずは、タクトスイッチを使用した回路のテストです。
タクトスイッチの使用には注意が必要です。
タクトスイッチを、デジタル端子とGNDに接続して使用する場合、
スイッチが押されれば、「HIGH」 となります。
もちろん回路も成り立っています。
しかし、
スイッチが押されていないとき、
デジタル端子には回路が接続されていない状態となり、
温度センサモジュールで説明した、開いた回路であり、
端子の電圧が不安定状態となり易く誤動作の原因になります。
このため、
温度センサモジュールで説明したプルアップ回路を接続します。
回路は図の通りです。
10KΩの抵抗を使い、プルアップ回路を形成しています。
スイッチ類を利用する場合には、
このように回路が、開いた状態にならないよう、
プルアップ回路や、プルダウン回路を接続します。
スケッチです。
// 大域変数宣言
int val = 0; // タクトスイッチ状態用
void setup() {
// put your setup code here, to run once:
Serial.begin( 9600 ); // シリアルポートを初期化(9600 bpsで通信)
// タクトスイッチ入力ピン設定(内蔵するプルアップ仕様)
pinMode( 8, INPUT );
}
void loop() {
// put your main code here, to run repeatedly:
// タクトスイッチ情報取得
val = digitalRead( 8 ); // データ取得
Serial.println( val ); // シリアルモニタに表示
delay(200); // 200ms停止
}
Arduino に書き込んで実行してみます。
シリアルモニターには、
タクトスイッチが押されていない時は、1 「HIGH」、
タクトスイッチが押されると、0 「LOW」、
が表示されます。
また、こんな方法も。
Arduino Uno は、デジタル端子に、プルアップ機能が
搭載されています。これを、プログラムで有効化することで、
プルアップ用の抵抗を接続する必要がなく、
タクトスイッチだけを接続すれば利用できます。
内蔵するプルアップを使用する場合、
pinMode( )関数で、
pinMode( ピン番号, INPUT_PULLUP )
と設定します。
今回は、
pinMode( 8, INPUT_PULLUP );
と設定することになります。
では、試してみます。
回路は図の通りです。
スケッチです。
// 大域変数宣言
int val = 0; // タクトスイッチ状態用
void setup() {
// put your setup code here, to run once:
Serial.begin( 9600 ); // シリアルポートを初期化(9600 bpsで通信)
// タクトスイッチ入力ピン設定(内蔵するプルアップ仕様)
pinMode( 8, INPUT_PULLUP );
}
void loop() {
// put your main code here, to run repeatedly:
// タクトスイッチ情報取得
val = digitalRead( 8 ); // データ取得
Serial.println( val ); // シリアルモニタに表示
delay(200); // 200ms停止
}
Arduino に書き込んで実行してみます。
続いて、タクトスイッチを押すと、サーボが動作する
スケッチを考えてみます。
条件は、タクトスイッチを押すと、
0度から180度まで30度刻みで動作させます。
180度まで動作したら0度へ戻し、
また同じ動作を繰り返すものとします。
動きは、前のスケッチと同じですが、
動作のタイミング(イベント)がタクトスイッチとなります。
タクトスイッチを押すと、サーボが動作するスケッチをします。
条件は、タクトスイッチを押すと、
0度から180度まで30度刻みで動作させます。
180度まで動作したら0度へ戻し、
また同じ動作を繰り返すものとします。
動きは、前のスケッチと同じですが、
動作のタイミング(イベント)がタクトスイッチとなります。
回路は図の通りです。
スケッチです。
// インクルード宣言(Servoライブラリ利用宣言)
#include <Servo.h>
// オブジェクト生成
Servo servo;
// 大域変数宣言
int val = 0; // タクトスイッチ状態用
int angle = 0; // サーボ角度情報格納用
void setup() {
// put your setup code here, to run once:
pinMode( 8, INPUT ); // タクトスイッチ入力ピン設定
// サーボモーター回転信号( PWM )出力ピン設定
servo.attach( 5 );
}
void loop() {
// put your main code here, to run repeatedly:
// タクトスイッチ情報取得
val = digitalRead( 8 ); // データ取得
// タクトスイッチが押されていれば30度進める
if ( val == LOW ){
angle += 30;
if( angle > 180 ){ // 180度位置以上で0度へ戻す
angle = 0;
}
servo.write( angle ); // 指定角度を出力
}
delay(200); // 200ms停止
}
Arduino に書き込んで実行してみます。
タクトスイッチを押している時だけサーボが回転します。