M5Stack + ローテーションサーボ FS90R
ローテーションサーボという部品があるのを知ったので秋月電子で買ってみました。
普通のサーボモーターは可動範囲が+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個つけて車にする計画でしたが、のんびり走るものになりそうです。
360度連続回転 Feetech FS90R マイクロサーボ 6V 9G 5個入り
- 出版社/メーカー: RCmall
- メディア:
- この商品を含むブログを見る