Arduino UNO R4 ユーザーの皆さん、サーボモータ用ライブラリ が 2024年6月23日 に更新されたのって、知ってました? 私はつい最近まで知りませんでした。

この記事 で「なんかカクカクするな?」とは思っていましたが、調べてみるとライブラリの UNO R4 用のコードに バグがあり、2024年1月9日 に 修正された ものの、2024年6月3日の IDE 2.3.2 リリース時に IDE 本体には取り込まれず、ライブラリ単独での更新となりました。

サーボモータ用ライブラリの更新

ということで、とっととライブラリマネージャから最新の 1.2.2 に更新しましょう!

ライブラリマネージャ
ライブラリマネージャで検索
バージョン 1.2.2 インストール
バージョン 1.2.2 をインストール

修正前後の比較

サーボモータ用ライブラリのバージョンは、修正前が 1.2.1、修正後が 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
SG90 外観

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

SG90 デューティ仕様
よくある SG90 デューティ仕様
手持ちの SG90 謎仕様
手持ちの SG90 謎仕様

まぁそれは良いとして、サンプルスケッチServo.attach() は 544μs 〜 2400μs がデフォルトのデューティ仕様となっているので、ちゃんと仕様に合った設定をしましょう。

void setup() {
  myservo.attach(9); //第2引数(デフォルト 544)、第3引数(デフォルト 2400)が省略されている
}

参考情報