Groveのコネクタでサーボモータを動くようにしてくれているものがあります。
スイッチサイエンスなどで購入できます。
いつもSG90で試しててこれは触ったことなかったので試してみます。
このサーボモーターモジュールをNefry BTで使っていきます。ライブラリは1.4.1です。
ESP32系だとGroveのWikiにあるサンプルは動かない(はず)なので注意してください。
ESP32だとArduinoのServoが通常通り使えない
まず、#include <Servo.h>
がコンパイルが通らないです。
警告:ライブラリServoはアーキテクチャ(avr, sam, samd, nrf52, stm32f4)に対応したものであり、アーキテクチャ(esp32)で動作するこのボードとは互換性がないかもしれません。
In file included from /Users/n0bisuke/dotstudio/Arduino/nefrybt/servo/servo_arduino_test/servo_arduino_test.ino:1:0:
/Applications/Arduino.app/Contents/Java/libraries/Servo/src/Servo.h:73:2: error: #error "This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor."
#error "This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor."
^
exit status 1
ボードNefry BT R2 / R3に対するコンパイル時にエラーが発生しました。
などのエラーがでます。そういうものなので焦らずいきましょう。
PWM制御する
代わりにPWMで制御します。
@takudooonくんのPWM制御をマスターしよう!Node-REDでサーボモータを遠隔制御する方法&初ハンズオンレポートが分かりやすいです。
- D2のGroveピンに接続します。
servo.ino
//基本Iotは2.4GHz帯を使うこと
#include<Nefry.h>
#include"esp32-hal-ledc.h"
#define SERVO_PIN D2
//PWM信号の周波数をPWMをつくっているクロック周波数で割ったもの
//ledcSetupでPWMの範囲を8bitに設定したとき、0~255 10bitのときは0~1023となる、2進数の話
#define PWM_BITWIDTH 16
//角度 -> PWM
int deg2pw(int deg){
double ms = ((double) deg - 90.0) * 0.95 / 90.0 + 1.45;
return (int) (ms / 20.0 * pow(2, PWM_BITWIDTH));
}
void setup() {
Serial.begin(115200);
//ledcSetup(チャンネル数(0~),周波数(たとえばPWMサイクル20mHzなら50Hzになるという意味(SG90の場合))、分解能は任意(ただし限度はある))
ledcSetup(0,50,PWM_BITWIDTH);
ledcAttachPin(SERVO_PIN,0);//left_motor
}
void loop(){
ledcWrite(0,deg2pw(0));
delay(800);
ledcWrite(0,deg2pw(180));
delay(800);
}
deg2pw関数が便利で、角度指定してpwm出力に変えてくれます。たくどんさん神。
loopの中はシャフトが0~180度で回るプログラムになっています。
200度くらいまで動いた雰囲気ですがサンプルコードに180度までが書いてあったので180度くらいで試しています。
SG90もだけど、ハードウェア的に180度くらいまでしか回らないものが多いと思います。
試してみる
これで無事に動きましたね。