サーボモータモジュール
私が購入したGROVEスターターキットV3に入っていたサーボモータモジュールには、型番や定格が記載されていませんでした。しかし、形状や付属品はスイッチサイエンスさんの単体販売ページに掲載されているものと同じに見えます。
サーボモータの動作
サーボモーターはPWMで指定された値に応じて軸の角度が変わる特殊なモーターです。通常180度程度の可動域があります。PWMについては別記事に解説を記載しているので参照してください。
サーボモータのPWMパラメータは、一般的には、周期は10〜20msでパルス幅は0.5ms〜2.5msぐらいのようですが、機種による差が大きく、また個体による差もあるようです。
筆者が持っているサーボモーターでは、次のようなパラメーターで動作するようです。
プログラム
Nefry BTに装備されているスイッチを押す度に、0°、90°、180°の位置へ移動を繰り返すプログラムです。
//Groveケーブルを接続するGroveコネクターを1つ選んで#define文に記載してください。 // Nefry BT無印の場合: D2, A0, A2 (注:D0は使えません) // Nefry BT R2の場合: D0, D2, D5, A1 (注:A0を使うときはA1を記載します) #define PIN D2 // LEDCのパラメータ設定 // LEDC_CHANNEL : チャンネル : 0 // LEDC_RESOLUTION_BITS: 目盛数 : 10bit (0〜1023) // LEDC_FREQUENCY : 周波数 : 50Hz (= 20ms周期) #define LEDC_CHANNEL 0 #define LEDC_RESOLUTION_BITS 10 #define LEDC_FREQUENCY 50 // 30/1024*20ms = 0.59ms // 77/1024*20ms = 1.50ms // 122/1024*20ms = 2.38ms uint32_t pulse[3] = {30, 77, 122}; int n = 0; void setup() { ledcSetup(LEDC_CHANNEL, LEDC_FREQUENCY, LEDC_RESOLUTION_BITS); ledcAttachPin(PIN, LEDC_CHANNEL); Serial.println(pulse[n]); ledcWrite(0, pulse[n]); Nefry.enableSW(); } void loop() { if (Nefry.readSW()) { n = (n+1) % 3; Serial.println(pulse[n]); ledcWrite(0, pulse[n]); } }
配列宣言 pulse[3]で、0°、90°、180°のパルス幅を覚える配列を定義しています。
setup( )ルーチン内で ledcSetup(…) を実行して、チャンネル、周波数、目盛数を設定し、ledcAttachPin( )でGPIOピンとチャンネルを結びつけます。ledcWrite( )で0°のパルス幅をサーボモーターに設定しています。
次に、loop( )}ルーチン内では、スイッチが押される度に90°、180°、0°のパルス幅を順に設定しています。
諸元
名称 | Servo サーボモータ |
バージョン | 不明 |
Seeed社 Wiki | http://wiki.seeedstudio.com/Grove-Servo/ |
スイッチサイエンス商品ページ | https://www.switch-science.com/catalog/1858/ |
Nefry BT無印 動作ソケット | D2, A0, A2 |
Nefry BT R2 動作ソケット | D0, D2, D5, A0(プログラム上はA1) |
「Nefry BTとGroveモジュール接続実験」 トップページ