Arduinoでサーボモータの制御・使い方を詳しく解説
この記事では、Arduinoを使って、サーボモータの使い方と制御方法を詳しく解説していく。 なお、Arduinoは互換機のSeeeduino XIAO、サーボモータはSM-S2309Sを使用した。
開発環境
開発環境はこちら。
項目 | バージョン |
---|---|
Arduinoデバイス | Seeeduino XIAO |
サーボモータ | SM-S2309S |
Arduino IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
Seeeduino XIAOの使い方は、こちらの記事を参考に。
サーボモータの特徴(SM-S2309S)
今回使用するサーボモータは、SpringRC社のSM-S2309Sだ。下に特徴を上げておく。また、他のサーボモータでも動かし方は同じなので、動かし方を知りたい方は先へ進もう。
各端子の役割
ピン番号 | 役割 |
---|---|
1 | GND |
2 | Signal |
3 | 5V |
トルク
電圧 | トルク |
---|---|
4.8V | 1.1kg-cm |
6.0V | 1.3kg-cm |
速度
電圧 | 速度 |
---|---|
4.8V | 0.11sec/60度 |
6.0V | 0.09sec/60度 |
SM-S2309Sのデータシートはこちら
Arduinoとサーボモータの配線
Arduinoとサーボモータを配線しよう。今回はArduinoの互換機であるSeeduino XIAOを使った。普通のArduinoでも同じように配線できるはず。
Arduino | サーボモータ |
---|---|
GND | GND |
D1 | Signal |
5V | 5V |
fritzingで描いたSeeduino XIAOとサーボモータの配線図
サーボモータの電源
サーボモータの電源をマイコンの5Vから供給しているが、本来モータは消費電流が大きいため、マイコンとは別な5V電源を用意したほうが良い。
サーボモータの制御信号
サーボモータの制御信号にはPWM(パルス幅変調)を使用する。具体的にはパルスの幅を0.5ミリ秒から0.24ミリ秒に変化させることで、サーボモータの角度を0度から180度へ変化させることができる。また、パルスの1周期は20ミリ秒で、周波数で表すと50Hzである。
よって、次のようにプログラミングすればサーボモータを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マイクロ秒がデフォルト)。
minとmaxは省略でき、servo.attach(pin)の書き方もできる。今回使ったサーボモータSM-S2309Sでは、デフォルトのパルス幅だと角度がズレてしまったため、試行錯誤して秒数を決定しattach関数に指定している。
あとは、write(角度)で角度を指定してあげれば良い。
attach関数の説明はこちら
サーボモータと超音波センサを組み合わせた記事も参考に
今回の記事で使用した関連製品はこちら
Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。
AmazonArduinoの参考書
本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。
Amazon最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓