Arduinoでサーボモータの制御・使い方を詳しく解説

Seeeduino XIAOとサーボモータ

この記事では、Arduinoでサーボモータを使う方法を解説してきます。サーボモータは、定番のSG90マイクロサーボ使用しますが、他のサーボモータでも基本動作は同じですので、この記事のやり方で動くと思います。ぜひご参考になさってみてください。なお、Arduino互換機のSeeeduino XIAOを使用しました。こちらもお好きなArduinoで構いません。

はじめに

SG90は1つ数百円で買える安めのサーボモータです。大きさは22.2x11.8x31mm、重量わずか9gと軽くて小ぶりなマイクロサーボです。動ける範囲は180°、動作速度は0.12s/60°です。また、トルクは1.8kgf・cmと小さいながらにもしっかり力強いです。動作電圧は3.3V〜6VPWMで角度を制御します。

ICQUANZX 5個SG90 9Gマイクロサーボモーターキット、RCロボットアーム/ハンド/ウォーキングヘリコプター飛行機カーボートコントロールケーブル付き
ICQUANZX 5個SG90 9Gマイクロサーボモーターキット、RCロボットアーム/ハンド/ウォーキングヘリコプター飛行機カーボートコントロールケーブル付き
Amazon

なお、サーボモータから伸びているケーブルは端子がメスですので、そのままではブレッドボードに挿せません。そこでピンヘッダーを使ってメスをオスに変換してあげます。

ピンヘッダーでメスをオスに変換
ピンヘッダーでメスをオスに変換

普通のピンヘッダーですと短すぎますので、ピンの長さが15mm以上ある長めのピンヘッダーをオススメします。Amazonですとここらへんが良さそうです。

uxcell 2.54mm ピッチ 40-ピン オス 単列 ピンヘッダー 17mm 長さ 20個
uxcell 2.54mm ピッチ 40-ピン オス 単列 ピンヘッダー 17mm 長さ 20個
Amazon

また、サーボモータの延長ケーブルがあるとロボットづくりなどに便利です。

10本 50cm JRオス -メスサーボコネクター延長ケーブルコード FUTABA延長リードケーブルラジコン用 (JR50cm)
10本 50cm JRオス -メスサーボコネクター延長ケーブルコード FUTABA延長リードケーブルラジコン用 (JR50cm)
Amazon

SG90の詳細はデータシートを御覧ください。

開発環境

開発環境はこちら。

項目バージョン
ArduinoボードSeeeduino XIAO
サーボモータSG90
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

Arduinoは他のArduinoでも構いません。サーボモータはPWM制御ですので、ほとんどのArduinoで動かせるはずです。

Seeed Studio Seeeduino XIAO Arduino IDE 互換ボード SAMD21 Cortex M0+搭載
Seeed Studio Seeeduino XIAO Arduino IDE 互換ボード SAMD21 Cortex M0+搭載
Amazon

Arduinoとサーボモータの配線

それではArduinoとサーボモータを配線していきましょう。今回はSeeduino XIAOを使いましたが、他のArduino場合はお好きなデジタルピンをご使用ください。

Arduinoサーボモータ
GNDGND
D1Signal
5V5V

Seeduino XIAOとサーボモータの配線図
Seeduino XIAOとサーボモータの配線図

Seeduino XIAOにおける各ピンの役割図
Seeduino XIAOにおける各ピンの役割図

サーボモータは消費電流が大きいので複数台を使用する場合は、マイコンとは別の電源から供給したほうが安全です。

サーボモータの制御信号

サーボモータの制御にはPWM(パルス幅変調)信号を使用します。PMWのパルス幅を0.5ミリ秒から2.4ミリ秒の間で与えることで、サーボモータの角度を0度から180度へと変化させることができます。また、パルスの1周期は20ミリ秒で、周波数で表すと50Hzとなります。

PWM信号によるサーボモータの角度の違いを解説
PWM信号によるサーボモータの角度の違いを解説

たとえば次のようにプログラミングして、サーボモータを90度の位置に固定してみましょう。

#define SIG_PIN 1 // D1

void setup() {
  Serial.begin(115200);
  pinMode(SIG_PIN, OUTPUT);
  digitalWrite(SIG_PIN, LOW);
  delay(2);
}

int duration_H = 1450; // (2.4ms - 0.5ms) / 2 + 0.5ms
int duration_L = 20000 - duration_H; // 20ms - 1.45ms

void loop() {
  Serial.println(duration_H);
  digitalWrite(SIG_PIN, HIGH);
  delayMicroseconds(duration_H);
  digitalWrite(SIG_PIN, LOW);
  delayMicroseconds(duration_L);
}

90°の角度するためには、 (2.4ms - 0.5ms) / 2 + 0.5msの計算で1.45msの間だけHIGHしてあげればよいことになります。それ以外の 20ms-1.45ms の間はLOWに設定します。しかし、この方法ですといちいち時間を計算しなければならず面倒です。

そこでもっと直感的にわかりやすく操作できるように、Servoライブラリを使用して角度を指定してサーボモータを動かせるようしましょう。ServoライブラリはArduino IDEにデフォルトで付属されているライブラリですので、インストール作業の必要はありません。

Servoライブラリを使ってサーボモータを動かしてみよう!

Arduinoでサーボモータの制御
Arduinoでサーボモータの制御

こちらがServoライブラリを使ったプログラムになります。プログラムでは、2秒おきに0度 → 90度 → 180度 → 90度 → 0度の動作になるように設定してます。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-servo.html
*/

#include <Servo.h>
#define SIG_PIN 1 // D1 pin

Servo myservo;
 
void setup() {
  int pulse_min = 544; // default 544us
  int pulse_max = 2400; // default 2400us
  myservo.attach(SIG_PIN, pulse_min, pulse_max);
}
 
void loop() {
  myservo.write(0);
  delay(2000);
  myservo.write(90);
  delay(2000);
  myservo.write(180);
  delay(2000);
  myservo.write(90);
  delay(2000);
}

プログラムの解説

プログラムの内容をカンタンに解説します。

attach関数は、PWM信号を出力するピンを指定する関数です。attach(pin, min, max)のような形で指定できます。minは、サーボの角度が0度のときのパルス幅を設定します。maxは、サーボの角度が180度のときのパルス幅を設定します。minのデフォルトは544マイクロ秒で、maxのデフォルトは2400マイクロ秒です。

サーボモータの種類によっては、デフォルトの値だと位置がズレる場合があります。その時は pulse_min pulse_maxを調整してください。

また、minmaxは省略することが可能で、servo.attach(pin)のような書き方もできます。

最後に、write(角度)で角度を指定してあげればサーボモータを自由に動かせます。

attach関数の詳細はこちら

ICQUANZX 5個SG90 9Gマイクロサーボモーターキット、RCロボットアーム/ハンド/ウォーキングヘリコプター飛行機カーボートコントロールケーブル付き
ICQUANZX 5個SG90 9Gマイクロサーボモーターキット、RCロボットアーム/ハンド/ウォーキングヘリコプター飛行機カーボートコントロールケーブル付き
Amazon
uxcell 2.54mm ピッチ 40-ピン オス 単列 ピンヘッダー 17mm 長さ 20個
uxcell 2.54mm ピッチ 40-ピン オス 単列 ピンヘッダー 17mm 長さ 20個
Amazon
10本 50cm JRオス -メスサーボコネクター延長ケーブルコード FUTABA延長リードケーブルラジコン用 (JR50cm)
10本 50cm JRオス -メスサーボコネクター延長ケーブルコード FUTABA延長リードケーブルラジコン用 (JR50cm)
Amazon
DiyStudio 6自由度ロボットアームDIYキットアルミメカニカルアームジョーArduinor MG995サーボドライブバルク
DiyStudio 6自由度ロボットアームDIYキットアルミメカニカルアームジョーArduinor MG995サーボドライブバルク
Amazon

Arduinoで人気の周辺パーツ

サインスマート(SainSmart) 8チャンネル 5V リレーモジュール for Arduino DSP AVR PIC ARM
サインスマート(SainSmart) 8チャンネル 5V リレーモジュール for Arduino DSP AVR PIC ARM
Amazon
KKHMF 10個 TTP223 静電容量式 タッチ スイッチ ボタン セルフロック モジュール 「国内配送」
KKHMF 10個 TTP223 静電容量式 タッチ スイッチ ボタン セルフロック モジュール 「国内配送」
Amazon
DSD TECH 2 PCS OLED 0.91インチディスプレイ  I2C
DSD TECH 2 PCS OLED 0.91インチディスプレイ I2C
Amazon
OSOYOO(オソヨー) DIY センサーモジュール キット
OSOYOO(オソヨー) DIY センサーモジュール キット
Amazon

人気のArduino互換機

ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P
Amazon
HiLetgo ESP32ワイヤレススティックLora + WiFi + BLE開発ボード LoRaWAN 868 / 915MHz、0.49インチOLEDディスプレイ
HiLetgo ESP32ワイヤレススティックLora + WiFi + BLE開発ボード LoRaWAN 868 / 915MHz、0.49インチOLEDディスプレイ
Amazon
M5Stack M5StickC Plus ESP32-PICO
M5Stack M5StickC Plus ESP32-PICO
Amazon
M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサー
M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサー
Amazon

Arduinoのオススメ参考書

電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
KindleAmazon
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Amazon
ESP32&Arduino 電子工作 プログラミング入門
ESP32&Arduino 電子工作 プログラミング入門
KindleAmazon
記事に関するご質問などがあれば、ぜひTwitterへお返事ください。