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

この記事では、Arduinoを使って、サーボモータの使い方と制御方法を詳しく解説していく。 なお、Arduinoは互換機のSeeeduino XIAO、サーボモータはSM-S2309Sを使用した。

開発環境

開発環境はこちら。

項目バージョン
ArduinoデバイスSeeeduino XIAO
サーボモータSM-S2309S
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

Seeeduino XIAOの使い方は、こちらの記事を参考に。

サーボモータの特徴(SM-S2309S)

今回使用するサーボモータは、SpringRC社のSM-S2309Sだ。下に特徴を上げておく。また、他のサーボモータでも動かし方は同じなので、動かし方を知りたい方は先へ進もう。

各端子の役割

ピン番号役割
1GND
2Signal
35V

トルク

電圧トルク
4.8V1.1kg-cm
6.0V1.3kg-cm

速度

電圧速度
4.8V0.11sec/60度
6.0V0.09sec/60度

SM-S2309Sのデータシートはこちら

Arduinoとサーボモータの配線

Arduinoとサーボモータを配線しよう。今回はArduinoの互換機であるSeeduino XIAOを使った。普通のArduinoでも同じように配線できるはず。

Arduinoサーボモータ
GNDGND
D1Signal
5V5V

fritzingで描いたSeeduino XIAOとサーボモータの配線図
fritzingで描いたSeeduino XIAOとサーボモータの配線図

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

サーボモータの電源

サーボモータの電源をマイコンの5Vから供給しているが、本来モータは消費電流が大きいため、マイコンとは別な5V電源を用意したほうが良い。

サーボモータの制御信号

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

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

よって、次のようにプログラミングすればサーボモータを90度の位置に固定できるはずだ。

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

#define SIG_PIN 1 // D1

void setup() {
  pinMode(SIG_PIN, OUTPUT);
  digitalWrite(SIG_PIN, LOW); 
  delay(2);
}

void loop() {
  float duration_H = 1.45;
  float duration_L = 20.0 - 1.45;
  
  digitalWrite(SIG_PIN, HIGH);
  delay(duration_H);
  digitalWrite(SIG_PIN, LOW); 
  delay(duration_L);
}

しかし実際は90度ピッタリにはならなかった。これはサーボモータによって、パルス幅に誤差があるからだ。また、上記プログラムの途中で角度を自由に変えるのは少し難しい。そこで、Arduinoでサーボモータを制御するのに便利な、Servoライブラリを使用する。

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

それではServoライブラリを使って、サーボモータを動かしてみよう。Arduino IDEならば標準で使えるはず。下のプログラムでは、0度 → 90度 → 180度 → 90度 → 0度と、2秒置きにサーボモータの角度を変えてみた。

/*
  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 = 500; // default 544us
  int pulse_max = 2240; // 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関数は、attach(pin, min, max)の形で指定できる。pinはサーボのSignalへ繋いでるArduinoのデジタルピン番号。minは、サーボの角度が0度のときのパルス幅(544マイクロ秒がデフォルト)。maxは、サーボの角度が180度のときのパルス幅(2400マイクロ秒がデフォルト)。

minmaxは省略でき、servo.attach(pin)の書き方もできる。今回使ったサーボモータSM-S2309Sでは、デフォルトのパルス幅だと角度がズレてしまったため、試行錯誤して秒数を決定しattach関数に指定している。

あとは、write(角度)で角度を指定してあげれば良い。

attach関数の説明はこちら

サーボモータと超音波センサを組み合わせた記事も参考に

今回の記事で使用した関連製品はこちら

Miuzei サーボモーター マイクロサーボ 9g 10個セット デジタル・サーボ
Miuzei サーボモーター マイクロサーボ 9g 10個セット デジタル・サーボ

電圧範囲:4.8V〜6.0V、制限角度:200°±1°、重量:9±1 g

Amazon
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)

Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。

Amazon

Arduinoの参考書

電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版

電子パーツを自由自在に組み合わせて電子工作ができるように、Arduinoによる電子部品ごとの制御方法を詳しく解説。初心者や電子工作に躓いた人でも安心して取り組めるよう、豊富な図・写真で徹底解説。2018年発刊の「Arduino 電子工作 実践講座」の改訂版です。

KindleAmazon
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)

本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。

Amazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ