💭

Arduinoでサーボモーターを動かす

2023/08/23に公開

使ったもの

・LACC200610 動作電圧: 4.2V〜6V
https://osoyoo.store/products/micro-servo-sg90-blue-for-arduino-v2-0-robot-carmodel-lacc200610?variant=31648847560815

サーボモーターの仕組み説明

https://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf
(今回使ったものはSG90と仕様はほぼ同じらしいのでSG90の資料)

サーボモーターの角度はPWMで制御します。

PMW Period: パルス信号の周期(SG90の場合1秒間に50Hz)
この周期の中でHIGHにしている時間を見てサーボモータの角度を調整しています。

Duty Cycle: 周期的な現象において、"ある期間" に占める "その期間で現象が継続される期間" の割合(SG90の場合0.5~2.4ms)
つまり周期(20ms)の中でHIGHを0.5msにしているとサーボモーターの角度が-90度になり、2.4msにすると90度、そして真ん中にする場合は1.45msにすればいいということになります。

Arduino組み込み

これで仕様とどう制御すればいいのか分かったので、回路を組みコードを書いていこうと思います。
一応PWMの制御でもできるんですが、ArduinoにはServoライブラリというものがあるのでそれを使いました。

とりあえず動くようにしたコードは下記になります。

#include <Servo.h>

Servo myservo;
const int SV_PIN = 7;

void setup() {
  myservo.attach(SV_PIN, 500, 2400);
}

void loop() {
  myservo.write(0);  // サーボモーターを0度の位置まで動かす
  delay(4000);

  myservo.write(90);  // サーボモーターを90度の位置まで動かす
  delay(4000);

  myservo.write(180);  // サーボモーターを180度の位置まで動かす
  delay(4000);
}

myservo.attach(pin, min, max);
ここで出力するpin番号とパルス幅を割り当てます。
(↑で書いた通り、今回使用するサーボモーターのDuty Cycleは0.5ms~2.4msなので500と2400を設定)
ちなみにmin, maxを指定しない場合はそれぞれ、544, 2400がデフォルトになるようです。
ここの値は使用するパーツのデーターシートなどを参考すればOKです。

myservo.write();
0~180の値を入れれば、その角度の位置まで動かしてくれます。

実際に組んだ回路はこんな感じです。

最後にtinkercadというブラウザ上でArduinoのシュミレートができるサイトにサンプルを置いているので、よければこちらも参考にしていただければと思います。
https://www.tinkercad.com/things/glAaqDdoRbc

参考資料
https://burariweb.info/electronic-work/arduino-learning/aruduino-servomotor-control.html
https://nobita-rx7.hatenablog.com/entry/27537037

Arsaga Developers Blog

Discussion