UNO R4でサーボモータがカクカクする問題とライブラリの更新
Arduino UNO R4 ユーザーの皆さん、サーボモータ用ライブラリ が 2024年6月23日 に更新されたのって、知ってました? 私はつい最近まで知りませんでした。
この記事 で「なんかカクカクするな?」とは思っていましたが、調べてみるとライブラリの UNO R4 用のコードに バグがあり、2024年1月9日 に 修正された ものの、2024年6月3日の IDE 2.3.2 リリース時に IDE 本体には取り込まれず、ライブラリ単独での更新となりました。
サーボモータ用ライブラリの更新
ということで、とっととライブラリマネージャから最新の 1.2.2 に更新しましょう!


修正前後の比較
サーボモータ用ライブラリのバージョンは、修正前が 1.2.1、修正後が 1.2.2 で、次の映像は修正前後の比較です。
明らかに修正前はカクカクしてますよね。参考までに比較に用いたコードを載せておきます。
サーボモータのテスト用コード
#include <Servo.h>
Servo myservo; // create Servo object to control a servo
// twelve Servo objects can be created on most boards
int usec = 500; // variable to store the servo position
void setup() {
myservo.attach(9, 500, 2500); // attaches the servo on pin 9 to the Servo object
}
void loop() {
myservo.writeMicroseconds(usec);
usec += 5;
if (usec > 2500) {
usec = 500;
delay(500);
myservo.writeMicroseconds(usec);
delay(100);
}
delay(15);
}
バグの概要
2023年9月に出された プルリク によると、RA4M1 マイコンのタイマの使い方がバグっていて、Servo.write()
または Servo.writeMicroseconds()
からの PWM 出力が 100μs ごとの階段状にしか変化せず、カクカクしていたのでした。
先に挙げた映像は、分かり易いよう PWM 出力の ON 時間を 5μs ごとに上げているのですが、修正前は20回に1回しか変化していないことになります。
ところで…

手持ちのサーボモータは SG90 というマイクロサーボですが、0°〜 180°に対応する1サイクル 20ms 当たりの ON 時間が 500μs 〜 2400μs というよくある仕様ではなく、500μs 〜 2500μs という謎仕様!のモノです。コピー品なのかもしれません。


まぁそれは良いとして、サンプルスケッチ の Servo.attach()
は 544μs 〜 2400μs がデフォルトのデューティ仕様となっているので、ちゃんと仕様に合った設定をしましょう。
void setup() {
myservo.attach(9); //第2引数(デフォルト 544)、第3引数(デフォルト 2400)が省略されている
}