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° 回転を繰り返すコードのリンクは以下。

ServoMotorTest
Made with ❤️ in Microsoft MakeCode for micro:bit.

[ずっと] 処理の最後の [基本->一時停止] は 特に入れなくても問題なく動きそうだが、何となく遅い気がする。0~180°の往復時間は約7秒。

[サーボ機能] が遅い可能性がありそうなので、[高度なブロック->入出力端子->アナログ出力] を使ったコードのリンクは以下。

ServoMotorUsingAnalogWriteTest
Made with ❤️ in Microsoft MakeCode for micro:bit.

少し回転が速くなった気がするが、やはり何となく遅い。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°ずれた処理を行っても往復時間に変わりはなかった。と言うことは、[サーボ出力]や[アナログ出力]の機能を実現する(出力数に依存しない?)為のルーチンに何らかの大きなオーバーヘッドが存在する??

コメント

タイトルとURLをコピーしました