購入品
- SG90 9gマイクロサーボモーター
- Micro:bit拡張ボード
サーボモーターの仕様
- サーボモーター[SG90]にはワイヤーが3本あり、赤線はVCC、茶線はGND、オレンジ線が制御信号入力
- 制御信号入力からのパルス(PWM信号)を受け取りモーターを回転させる
- 制御信号により回転角度を制御している間は、その角度を保持しようとするので、無理な力を加えると、ギヤボックスやモーターを破損する可能性あり
- SG90のPWMサイクルは20ms(50Hz)
- 周期の中でHIGHの時間を0.5msとする最低角度(0°)
- 2.4mとすると最大角度(180°)
- 中間の1.45msとすると中間(90°)

micro:bitとの接続
- サーボモーター[SG90]のコネクタをGPIO0(P0)に接続する(挿入方向注意)
- Micro USBコネクタにUSBケーブル(ACアダプタ)接続
- V1コネクタの供給元を5Vに切り替える

サーボモーターのテスト用ブロックコード
[高度なブロック->入出力端子->サーボ] を使用した 0°~180° 回転を繰り返すコードのリンクは以下。
[ずっと] 処理の最後の [基本->一時停止] は 特に入れなくても問題なく動きそうだが、何となく遅い気がする。0~180°の往復時間は約7秒。
[サーボ機能] が遅い可能性がありそうなので、[高度なブロック->入出力端子->アナログ出力] を使ったコードのリンクは以下。
少し回転が速くなった気がするが、やはり何となく遅い。0~180°の往復時間は約4秒。
そこで良く使われるArduino Unoと比較すべく、以下のコードで動かしてみる。
#include <Servo.h>
Servo myservo;
const int SERVO_PIN = 7;
int servoInc;
int angle;
void setup() {
myservo.attach(SERVO_PIN, 500, 2400);
servoInc = 1;
angle = 0;
}
void loop() {
if (angle > 0) {
if (angle >= 180) {
servoInc = -1;
}
}
else {
servoInc = 1;
}
angle += servoInc; // 回転角更新
myservo.write(angle); // サーボモーターをangleに回転
delay(20); // 20ms 遅延 micro:bit microcode サーボ 出力使用とほぼ同じ
//delay(11); // 11ms 遅延 micro:bit microcode アナログ 出力使用とほぼ同じ
}最後のdelay()の部分だけmicro:bitが遅いことが判明(因みにdelay()を無くすと超高速で回転する)。なので、micro:bit & makecodeでサーボモーターを制御すると1回分のループ = 約11ms / 20ms程遅い事が判る。
SOC(マイコン)自体は、micro:bitの方が性能が良い筈なので、おそらく通常ハードウェア(カウンターなど)で処理している部分(PWM)をソフトウェアで実装している為ではないかと推測される。
実行スピードを改善すべく、makecode以外の開発を探していると、Arduino IDEでも開発できそうなページを見つけて試したが、どうもServoライブラリやanalog write機能が未サポートのようで断念。
取り合えず、サーボモーターのレスポンスを良くする為、makecodeブロックのサーボ出力ループを極力軽くするよう心掛けるしか無さそう。
因みに、makecodeでサーボモータを2台に増やして180°ずれた処理を行っても往復時間に変わりはなかった。と言うことは、[サーボ出力]や[アナログ出力]の機能を実現する(出力数に依存しない?)為のルーチンに何らかの大きなオーバーヘッドが存在する??


コメント