【Raspberry Pi Pico入門 – 22】サーボモーターを動かしてみる

Raspberry Pi Pico入門,基本編Arduino,Raspberry Pi Pico

概要

今回はサーボモーターを動かしてみます。サーボモーターとは制御用の回路が既に付いていて、通信で指示をするだけで回転速度を変えたり指定の位置で止めたりすることが出来るモーターです。この解説ではラジコン等によく使われている指定された位置で止めるタイプのサーボモーターを動かしてみます。

実行環境

IDE:Arduino IDE 2.3.2
MCU:Raspberry Pi Pico

サーボモーター:SG-90
電子工作でサーボモーターと言えばこれ!というくらいよく使われています。使いやすくてAmazonも安く手に入るのでお勧めです。
また使い方は同じで性能が異なるサードパーティ品が大量にあるので、これを覚えておけば応用の幅も広いです。
またSG-90は色々なメーカーが製造していますが、TOWER PRO製は秋月電子でも扱っていて品質がいいです。その他の安いものだと位置が安定せずにプルプル震えたりする等、当たり外れがあります。(不良率を考慮してもTOWER PRO製より安いです)

Amazon購入リンクより引用

回路

以下のように配線します。モーターから出ている線の色に注意してください。配線を間違えるとマイコンやモーターが破損することがあります。
サーボホーン(モーターのアタッチメント)は好きな形のものを付属のネジで取り付けてください。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。

#include <Servo.h>

const int PIN_SERVO = 16;

// インスタンス生成
Servo myservo;

void setup() {
  // 初期設定(信号線を繋いだピンを指定する)
  myservo.attach(PIN_SERVO);
}

void loop() {
  // 0°位置に移動
  myservo.write(0);
  delay(1000);

  // 90°位置に移動
  myservo.write(90);
  delay(1000);

  // 180°位置に移動
  myservo.write(180);
  delay(1000);
}

動作確認

モータの位置が1秒ごとに0°位置 → 90°位置 → 180°位置 → 0°位置…と変われば成功です。

解説

基本的にはattach()で初期設定をして、write()で移動するだけの簡単操作です。

0°位置、180°位置の微調整

動作確認をするとサーボモーターによって個体差があり、モーターによっては移動する角度が小さいものがあります。その時は以下のようにattach()に引数を追加して個体差を調整します。
下の例はデフォルト値の0°位置=544、180°位置=2400です。10ずつくらい数値を変えてみると位置が変わります。

myservo.attach(PIN_SERVO, 544, 2400);

複数のサーボモーターを制御する

複数のサーボモーターを動かしたいときは、以下のようにインスタンスを複数生成し、それぞれattach()で初期設定すれば使用できます。ただし、サーボモータは何も付けていないときで約0.4[A]、最大だと1.3[A]も電流が流れます。重いものを動かしたい時や、軽いものでも3個以上動かしたいときは5VをRaspberry Pi Picoに繋ぐのではなく、乾電池に繋いでください。

// インスタンス生成
Servo myservo1;
Servo myservo2;

// 初期設定(信号線を繋いだピンを指定する)
myservo1.attach(16);
myservo2.attach(15);

// 90°位置に移動
myservo1.write(90);
myservo2.write(90);

スピードを遅くする

Servoライブラリには速度を遅くする機能はないため、delay()を挟みつつ少しずつ動かすとスピードが変わります。

#include <Servo.h>

const int PIN_SERVO = 16;

// インスタンス生成
Servo myservo;

void setup() {
  // 初期設定(信号線を繋いだピンを指定する)
  myservo.attach(PIN_SERVO);
}

void loop() {
  int pos;
  for (pos = 0; pos <= 180; pos++) {
    // 1°ずつ足していく
    myservo.write(pos);
    delay(15);
  }
  for (pos = 180; pos >= 0; pos--) {
    // 1°ずつ引いていく
    myservo.write(pos);
    delay(15);
  }
}