本記事ではArduinoを使ってサーボモータを動かす方法について紹介します。
- サーボモータSG92Rの仕様
 - ArduinoUNOとの繋げ方
 - コードの紹介
 
サーボモータSG92Rの仕様
今回は「SG92R」というサーボモータを動かしていきたいと思います。
SG92Rは橙色の配線に制御信号を入力することで角度を指定します。
各スペックは下記の通りです。
- PWMサイクル:20ms
 - 制御パルス:0.5ms~2.4ms
 - 制御角:±約90°(180°)
 - 配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
 - トルク:2.5kgf・cm
 - 動作速度:0.1秒/60度
 - 動作電圧:4.8V
 - 温度範囲:0℃~55℃
 - 外形寸法:23×12.2x27mm
 - 重量:9g
 
スペックに書いてあることから
20msに1サイクルのPWM波形(50Hz)を作り、HIGHとなる部分の長さを0.5ms~2.4msと変化させることにより -90°~+90° の合計 180°動く角度を変化させられることがわかります。
下記にHIGHとなる長さごとの角度表を添付します。
| ms | us | 角度(°) | 
| 0.5 | 500 | -90 | 
| 0.6 | 600 | -80.53 | 
| 0.7 | 700 | -71.05 | 
| 0.8 | 800 | -61.58 | 
| 0.9 | 900 | -52.11 | 
| 0.975 | 975 | -45 | 
| 1 | 1000 | -42.63 | 
| 1.1 | 1100 | -33.16 | 
| 1.2 | 1200 | -23.68 | 
| 1.3 | 1300 | -14.21 | 
| 1.4 | 1400 | -4.74 | 
| 1.45 | 1450 | 0 | 
| 1.5 | 1500 | 4.74 | 
| 1.6 | 1600 | 14.21 | 
| 1.7 | 1700 | 23.68 | 
| 1.8 | 1800 | 33.16 | 
| 1.9 | 1900 | 42.63 | 
| 1.925 | 1925 | 45 | 
| 2 | 2000 | 52.11 | 
| 2.1 | 2100 | 61.58 | 
| 2.2 | 2200 | 71.05 | 
| 2.3 | 2300 | 80.53 | 
| 2.4 | 2400 | 90 | 
ArduinoUNOとの繋げ方
配線したときの写真を下記に添付さいます。
サーボモータの配線をそれぞれ
- 茶:GND
 - 赤:5V
 - 橙:12ピン
 
に繋げるだけです。
コードの紹介
次にArduinoでサーボモータを動かすコードを紹介します。
3つ紹介しますが、一番実用的なのは3つ目に紹介するコードです。
すぐに使いたい方は1つ目と2つ目を飛ばして読むことをお勧めします。
20msに1サイクルのPWM波形を作るコード
下記コードで 0°↔ 90°を約1秒間隔で繰り返すことができます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32  | 
						int output_pin = 12; int Time = 1000; int PWM_cycle = 10000; //20000us(20ms)にしたいがdelayMicrosecondsは16383usまでしか動作しないため                        //delay(10):10000us(10ms) + delayMicroseconds(PWM_cycle):10000us(10ms)                        //として20000us(20ms)を表す。 int angle1 = 1450;   int angle2 = 2400;    //-90度: 500us(0.5ms)    //-45度: 975us(0.975ms)    //  0度:1450us(1.45ms)    // 45度:1925us(1.925ms)    // 90度:2400us(2.4ms) void setup() {   pinMode(output_pin,OUTPUT); } void loop() {   digitalWrite(output_pin,HIGH);   delayMicroseconds(angle1);   digitalWrite(output_pin,LOW);   delay(10);   delayMicroseconds(PWM_cycle-angle1);   delay(Time);   digitalWrite(output_pin,HIGH);   delayMicroseconds(angle2);   digitalWrite(output_pin,LOW);   delay(10);   delayMicroseconds(PWM_cycle-angle2);   delay(Time); }  | 
					
20msに1サイクルと制御用パルス(HIGHの長さ)を意識して作成したコードになります。HIGHの長さがμs単位なので「delayMicroseconds」を使います。
「delayMicroseconds」は16383usまでしか動作しないので、20msを表すのにdelay(10):10000us(10ms) + delayMicroseconds(PWM_cycle):10000us(10ms)としています。
しかし、使ってみると20msに1サイクルがズレたとしてもサーボモータはしっかり動くことがわかってきました。
上のコードでも1秒間隔で動かすためのコード「delay(Time);」があるためどちらかというと制御用パルスをワンショットパルスで出力している形になっています。
重要なのは制御用パルス(HIGHになっている時間の長さ)のようです。
制御用パルスを意識したコード
下記コードで 上記コードと同様に0°↔ 90°を約1秒間隔で繰り返すことができます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  | 
						int output_pin = 12; int Time = 1000; int angle1 = 1450;   int angle2 = 2400;    //-90度: 500us(0.5ms)    //-45度: 975us(0.975ms)    //  0度:1450us(1.45ms)    // 45度:1925us(1.925ms)    // 90度:2400us(2.4ms) void setup() {   pinMode(output_pin, OUTPUT); } void loop() {   digitalWrite(output_pin, HIGH);   delayMicroseconds(angle1);   digitalWrite(output_pin, LOW);   delay(Time);   digitalWrite(output_pin, HIGH);   delayMicroseconds(angle2);   digitalWrite(output_pin, LOW);   delay(Time); }  | 
					
このコードにより、わざわざ20msに1サイクルにするといった難しいことを考えなくてもサーボモータは動くことがわかりました。Lチカに近いコードでサーボモータを動かすことができました。
ライブラリ「Servo」を使ったコード
難しいことをやってきましたがArduinoにはサーボモータを動かすためのライブラリである「Servo」が用意されています。
下記コードでは -90°↔ 90°を約1秒間隔で繰り返すことができます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						#include <Servo.h> Servo servo; int output_pin = 12; int Time = 1000; void setup() {   servo.attach(output_pin); } void loop() {   servo.write(0);   delay(Time);   servo.write(180);   delay(Time); }  | 
					
ライブラリ「Servo」を使うことですっきりしたコードになったかと思います。
注意点としてはSG92Rの仕様表記では動く角度が±約90°となっていますが、ライブラリ「Servo」で角度指示する場合は、0°↔ 180°になっている点です。
											


						
						
						
												
						
						
						
												
						
						
						
												
						
						
						
												
						
						
						
												
						
						
						
												
									