Nefry BTでGrove Servoを動かしてみる


Groveのコネクタでサーボモータを動くようにしてくれているものがあります。

スイッチサイエンスなどで購入できます。

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度くらいまでしか回らないものが多いと思います。

試してみる

これで無事に動きましたね。