日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

M5Stack + ローテーションサーボ FS90R

ローテーションサーボという部品があるのを知ったので秋月電子で買ってみました。

f:id:WindVoice:20190922090422j:plain

普通のサーボモーターは可動範囲が+90度~-90度などと決まっていますが、ローテーションサーボは可動域に制限がなくどちらの方向にも回り続けることができます。ただ、通常のサーボモーターと違って角度を決めて止まることはできません。動作としては、回る方向(時計回り、反時計回り)と速度をPWMを使って制御することになります。

データシートをみると、700~2300マイクロ秒のPulse Widthで操作するとあります。700~1500マイクロ秒で時計回り(1500で停止)、1500~2300マイクロ秒で反時計回りとなります。

ただこれ、何秒のうち、この時間をONにするのか、周期が良くわからないですね…… この資料はどう読んだらいいのでしょうか。0~700マイクロ秒を制御に使っていないことを考えると2300~3000も使っていない、つまり1周期は3000マイクロ秒と考えるのが自然ですか?

良くわからないので、実物で実験しました。プロの人からは怒られるかもしれませんがしかたないので。

ソースコード

Arduino IDEで書いています。結論から言うと、16bit、50Hzでポートを設定してある場合に、3000 - 5000、5000 - 7000のあたりで制御ができました。また、5000付近で停止ができるはずですが、実際にはどちらかにゆっくり回ってしまう状態になりがち(止まることもある)ので、停止をしたい場合にはledcWrite()で0を指定するほうが確実でした。

#include <M5Stack.h>

int FS90R = 16;

//PWMの設定
const double PWM_Hz = 50;     //PWM周波数
const uint8_t PWM_level = 16; //PWM 16bit(0~65535)

void setup() {
  Serial.begin(115200);

  M5.begin();
  M5.Lcd.setBrightness(100);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(WHITE, BLACK);

  pinMode(FS90R, OUTPUT);
  
  //モータのPWMのチャンネル、周波数の設定
  ledcSetup((uint8_t)1, PWM_Hz, PWM_level);

  //モータのピンとチャンネルの設定
  ledcAttachPin(FS90R, 1);
}
void loop() {
  //[FS90R]
  //1500~ 700usecで時計回り(CW)
  //1500~2300usecで反時計回り(CCW)
  //1500(±45)usecのときに停止。とはいうものの良くわからない(Hz?)ので実機で確認。

  // 4950 - 5050 を停止として、3000 - 7000 で稼働するようだ。
  // 3000 - 5000 で 時計回り、
  // 5000 - 7000 で反時計回り。
  
  for (int i = 3000; i <= 7000; i+=50) {
    ledcWrite(1, i);
    delay(100);
    M5.Lcd.setCursor(0, 20);
    M5.Lcd.printf("PWM: %4d\n", i);
  }
  for (int i = 7000; i >= 3000; i-=50) {
    ledcWrite(1, i);
    delay(100);
    M5.Lcd.setCursor(0, 20);
    M5.Lcd.printf("PWM: %4d\n", i);
  }
}

動作の様子

いつものとおり、動画で動作の様子を残しておきます。ローテーションサーボがひとつだけであれば、外部電源はいりません。USBケーブルを外した状態でも動作可能でした。しかし、あまりスピードは出ませんね。4個つけて車にする計画でしたが、のんびり走るものになりそうです。

youtu.be