マイクロサーボを使ってみる(Arduino)

サーボ機構で位置や速度等を制御するのに使用される
ものですが、ロボット産業をはじめとするいろいろな分野で
利用されており、種類もたくさんあります。
今回は、ホビー用のマイクロサーボを使ってみます。

今回使用するマイクロサーボ(SG92R)とタクトスイッチモジュールです。

 マイクロサーボ とタクトスイッチモジュール
マイクロサーボ とタクトスイッチモジュール

マイクロサーボ SG92R
 ¥500- [SG92R]
 ・制御角:±約90°(180°)
 ・トルク:2.5kgf・cm
 ・動作電圧:4.8V
 秋月電子通商
  http://akizukidenshi.com/catalog/g/gM-08914/

マイクロサーボ SG92R
マイクロサーボ SG92R

マイクロサーボ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/

ブレッドボード電源モジュール1
ブレッドボード電源モジュール 1
ブレッドボード電源モジュール2
ブレッドボード電源モジュール 2

マイクロサーボの選択は、
私のようにお試しレベルであれば何でも構いません。
ですが、実際には、
 ・制御角
 ・トルク
 ・動作電圧
など仕様に合ったものを選ぶことになります。
トルクは、次の図を参考にして下さい。

マイクロサーボのトルク図
マイクロサーボのトルク図

早速使ってみます。
私が用意した、マイクロサーボ SG92Rは、
制御角が±約90°( 180度 ) なので、
0度から180度まで30度刻みで動作させてみます。
180度まで動作したら0度へ戻し、
また同じ動作を繰り返します。

回路は図の通りです。
   この回路図の作図には fritzing を利用させて頂いております。
   https://fritzing.org/home/
   (※注意:見づらいですが黄色線の配線があります)

回路図1
回路図1

マイクロサーボ 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停止
  }
}
Arduino  IDE画面1
Arduino IDE画面1

サーボ制御には、Servoライブラリを利用します。
このライブラリは、既定でインストール済みだと思います。
1.オブジェクト生成
  Servo servo;
2.サーボ信号出力用、デジタルピン設定
  servo.attach( 5 );   // 5番ピンを指定  
2.サーボへ指定角度を出力
servo.write( 30 ); // 30度を指定

Arduino に書き込んで実行してみます。
30度毎、アームが回転すると思います。

実際の配線と実行1
実際の配線と実行1

続いて、タクトスイッチを押すと、サーボが動作する
スケッチを書いてみます。

まずは、タクトスイッチを使用した回路のテストです。

タクトスイッチの使用には注意が必要です。
タクトスイッチを、デジタル端子と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 に書き込んで実行してみます。

Arduino  IDE画面2
Arduino IDE画面2

シリアルモニターには、
タクトスイッチが押されていない時は、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 に書き込んで実行してみます。

Arduino  IDE画面3
Arduino IDE画面3

続いて、タクトスイッチを押すと、サーボが動作する
スケッチを考えてみます。

条件は、タクトスイッチを押すと、
0度から180度まで30度刻みで動作させます。
180度まで動作したら0度へ戻し、
また同じ動作を繰り返すものとします。
動きは、前のスケッチと同じですが、
動作のタイミング(イベント)がタクトスイッチとなります。

タクトスイッチを押すと、サーボが動作するスケッチをします。

条件は、タクトスイッチを押すと、
0度から180度まで30度刻みで動作させます。
180度まで動作したら0度へ戻し、
また同じ動作を繰り返すものとします。
動きは、前のスケッチと同じですが、
動作のタイミング(イベント)がタクトスイッチとなります。

回路は図の通りです。

回路図2
回路図2

スケッチです。

// インクルード宣言(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 に書き込んで実行してみます。

実際の配線と実行2
実際の配線と実行2

タクトスイッチを押している時だけサーボが回転します。