見出し画像

サーボモーターの制御方法とは? #11 【Arduino】

今回は、Arduino UNO R4を使ったサーボモーターの制御方法についてご紹介します。

サーボモーターは一般的な直流モーターと違って、指定した角度まで回るモーターです。

公式でサンプルプログラムが用意されていますので、まずはそちらを使って一緒に遊んでみましょう!


はじめに

この記事では、Arduinoを使ったサーボモーターの制御方法について簡単にご紹介しています。

下記の注意事項をお読みいただいた上で、ぜひお楽しみください。

【 注意 】
当Webサイトに掲載された内容によって生じた損害等の一切の責任を負いません。また生じた問題についてはご自身の責任において解決いただくことをあらかじめご承知おきください。詳しくは下記URLの免責事項をご確認願います。当サイトの免責事項に同意いただける場合に限り、当サイトの内容をご利用いただけます

https://note.com/shingo_shirogane/n/n3d5686bf512b

Youtube動画

YouTubeでサーボモーターの制御方法を分かりやすく解説しています。
3分ほどの動画なので、サクッとご覧いただけます。

必要なもの

1. マイコンボード

本記事では、Arduino UNO R4 Wi-Fiを使います。

画像

2. 電子部品

以下の電子部品を使います。

  • サーボモーター(SG92R) × 1

  • ジャンパーワイヤー* 適量

サーボモーターとは?

サーボモーターとは、指定した角度まで回るモーターです。

90度まで回転させてみた。

マイコンからPWM信号を送り、そのパルス幅によって回転角度が決まり、回転します。

回転できる角度の上限・下限が決まっているので、使う前に必ずデータシートを確認しましょう。

サーボモーターを制御する回路の作り方

回路図

一度はデータシートを確認してくださいね。これ約束。

図のようにArduino UNO R4とサーボモーターを繋ぎます。

サーボモーターの種類によって配線の順番が異なりますので、必ずご自身でデータシートを確認してください。

配線の様子

信号線を9ピンにつないでいるのは、後で紹介するサンプルプログラムに合わせるためです。

補足

サーボモーターの電流はデータシートやインターネットを探しても明記されていませんが、大きい電流が流れているはずです。

今回は電源(+5V)から直接引いているので、電源ICのデータシートをみると1.2Aまでは大丈夫かとは思います。しかし、サーボモーターを複数つなげたい場合は別の電源を用意して、そちらにつなぐ方が安全でしょう。

▼Arduino UNO R4 Wi-fiの回路図

▼電源ICのデーターシート

サンプルプログラム

「ファイル」→「スケッチ例」→「Servo」→「Sweep」の順にクリックすると、サンプルプログラムが立ち上がります。

上手くできない場合は、公式HPにあるソースコードをお使いください。

プログラムの解説

サンプルプログラムの全体像を、簡単にですがご説明します。

ライブラリ「Servo.h」

サンプルプログラムの冒頭、

#include <Servo.h>

という命令で、<Servo.h> というライブラリを読み込みます。

これにより、サーボモーターを制御するための便利なプログラムが使えるようになります。

ライブラリの中身については大変高度な内容になるため、ここでは割愛します。詳しく知りたい方は下記をご確認ください。

Servo型のオブジェクト生成

Servo myservo;  // create servo object to control a servo

この一文は、Servo型(クラス)のオブジェクトを生成する命令です。

イメージとしては「プログラム上にmyservoという名前のモーターを作った」と考えてください。

Servoクラスの定義を知りたい方は、下記URLからリポジトリに移動し、Servo.hの中身をご確認ください。

myservoとサーボモーターの対応付け

myservo.attach(9);  // attaches the servo on pin 9 to the servo object

この一文で、生成したmyservoオブジェクトとサーボモーターを対応付けます。

( )内には、サーボモーターを繋いだArduinoのピン番号を書きます。

これによりArduinoに繋いだサーボモーターは、プログラム上ではmyservoというオブジェクトで扱えるようになりました。

サーボモーターを回転させる

int pos = 0;    // variable to store the servo position

(中略)

myservo.write(pos);   // tell servo to go to position in variable 'pos'

作ったmyservoオブジェクトに.write()を付けると、myservoに紐づいたサーボモーターが回転します。

今回はattach( )で9番ピンを対応付けたので、9番ピンにつながれたサーボモーターが回転します。

.write( )の()内には角度が入り、基準となる位置から指定された角度まで回転します。

今いる位置から指定した角度の分だけ回転するのではないことに注意しましょう。

また仕様に記載された上限・下限以上の角度を書き込んではいけません。(SG92Rは±90度の180度まで)

プログラムの書き込み

プログラムが完成したらArduinoをパソコンとつなぎ、Arduino IDEの画面左上の検証(✓マーク)をクリックします。

問題がなければ書き込み(→マーク)を行います。

書き込みが終わり、上手く回路とプログラムが作れていれば、サーボモーターが0度と180度をスイープする動きをします。

ここまでお疲れさまでした!

応用例

YouTubeの1コマより。

YouTubeに投稿した動画の最後に、スイッチを使ったサーボモーターの応用例をチラっと紹介しました。

そのプログラムをこちらで公開します。注意事項をよくお読みいただき、ご使用ください。

サーボモーターのピンを変えてありますので、プログラムをよ~く見てくださいね。

//当Webサイトに掲載された内容によって生じた損害等の一切の責任を負いません。
//当webサイトの免責事項に同意いただける場合に限り、プログラムをご利用いただけます。

#include <Servo.h>
#define SW_PIN 13     //スイッチの接続ピン
#define SERVO_PIN 3   //サーボモーターの接続ピン

Servo myservo;  //サーボオブジェクトの生成

int pos = 0;    //角度を指定する変数

void setup() {
  pinMode(SW_PIN, INPUT_PULLUP);  //入力ピンに設定
  myservo.attach(SERVO_PIN);      //myservoとサーボモーターの対応付け
  myservo.write(0);               //原点復帰
  delay(1000);
}

void loop() {
  //スイッチが押されたらposを10度増やす
  //それ以外はposを10度減らす
  //0から180の範囲を超えないように条件付け。

  if(digitalRead(SW_PIN)==LOW){
    if(pos < 180){
      pos+=10;
    }
    delay(5); 
  }else{
    if(pos > 0){
      pos-=10;
    }
    delay(5); 
  }

  myservo.write(pos);
}

おわりに

いかがだったでしょうか。

今回は、Arduino UNO R4を使ったサーボモーターの制御方法についてご紹介しました。

もしこの記事がお役に立てたら、"スキ"や"サポート"をいただけると励みになります!

最後まで読んでいただき、ありがとうございました。


今後ともお役に立てるような記事を発信していきます!よろしければサポートいただけると嬉しいです!