初心者歓迎!Arduinoで初めるC言語プログラミング(実践編2サーボモータ)‐サンプルプログラムあり!

サーボモータSG90 知識勉強
サーボモータSG90

今回で第4弾となります。
この回を終えれば、サーボモータが動かせるようになります。
モータが動かせるとぐーんと作れるものの幅が広がりますよ!

この記事は、こういった声をサポートしていきます!
Arduino初心者歓迎シリーズ:機器導入文法編実践①実践②(今ここ)、実践③実践④

・Arduinoやってみたいけど、よくわかんないや!

・順番に手取り足取り教えてほしい!

Arduino初めて使う方は、ぜひ導入編文法編
ご覧になると理解しやすいかと思います。

別の実践編もあります。 
実践編1(スイッチ、LED、温度センサ)

サンプルプログラムに、解説もふんだんに入れていきますので、初めての方にも理解しやすいように進めていきます。もう知ってるよって項目は、読み飛ばしちゃってください。

それでは、ゆっくりやっていきましょう。

サーボモーターを動かす前に

プログラムの前に知識的なことを。
そんなことより、動かしたい!という方は、次へ読み飛ばしてください。

サーボモーターを使用する方法を学び、サーボモーターを制御するプログラムを作成します。また、シリアル通信を使用してサーボモーターの動作状況を確認するプログラムも作成します。

『サーボモータ』聞いたことありますか?サーボがつかない『モータ』ならあるでしょうか。
モータには種類があります。

  • DCモータ(Direct Current 直流で作動)
  • ACモータ(Alternative Current 交流で作動)
  • ステッピングモータ

今回使うのは、DCモータを使ったサーボモータになります。『サーボ』は従属するという意味の英語からきているそう。指示した通りに『回る角度』を制御できるモータです。モータで『何か』を動かしたいときに、だいたいどれ位で動かしたいか希望があるはずです。

たとえば90度ひねってとか。2回巻き取って、など。
そんな時に便利なのがサーボモータです。

使用するサーボモータSG90

■主な仕様
・PWMサイクル:20mS
・制御パルス:0.5ms~2.4ms
・制御角:±約90°(180°)
・配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
・トルク:1.8kgf・cm
・動作速度:0.1秒/60度
・動作電圧:4.8V(~5V)
・温度範囲:0℃~55℃
・外形寸法:22.2×11.8x31mm
・重量:9g

DCモータは、モータ単品のことを指していますが、
サーボモータになると、下記で構成されます。

  • 制御回路
  • 位置検出センサ
  • モータ単体(今回のはDC。ACの場合もあるので製品次第です)

なぜ、こんな風になっているかというと
モータ単品だけだと、回す分にはいいのですが、どれくらい回ったのか?回転速度は?現在位置は?といったことが分からないです。1秒回すとか電源ONした時間で大まかに制御する場合もありますが。

電源を入れたらひたすら回り続けるといった場合ならサーボモータのような回転角度を制御することは不要です。例えばミニ四駆とか、速度調整はありますが換気扇とか扇風機とか。

ステッピングモータとの違いは?

サーボモータとステッピングモータも、任意の角度で動かすことができる点は、同じです。
違いは、モータ単品としての構造が違います。

サーボモータは、ただ回るだけのDCモータやACモータを、制御回路と位置検出センサがあるおかげで、任意の角度で動かすことができますが、

ステッピングモータは、モータ自体が、下記のパルスと呼ばれる電圧を加えると、一定の角度で回る、作りになっています。パルスの横幅は、角度に関係なく、何個のパルスを加えたかで、角度が決まります。また、制御回路も位置検出センサも別に用意する必要があります。

パルス
ステッピングモータ28BYJ-48

ステッピングモーター(Stepper motor)は、ドライバを介して直流のパルス電圧を印加して駆動するモーターである。したがってパルスモーター(Pulse motor)とも言われる。簡単な回路構成で、正確な位置決め制御を実現できるので、装置の位置決めを行う場合などによく使われる。

Wiki

プログラム(全体)

#include <Servo.h>
Servo servo;       // サーボモーターオブジェクト
int servoPin = 9;  // サーボモーターの接続ピン
void setup() {
  servo.attach(servoPin); // サーボモーターを接続するピンを設定
}
void loop() {
  // サーボモーターを0度から180度まで回転させる
  for (int angle = 0; angle <= 180; angle += 10) {
    servo.write(angle);      // サーボモーターを指定した角度に回転
    delay(200);               // 200ミリ秒待機
  }
  // サーボモーターを180度から0度まで回転させる
  for (int angle = 180; angle >= 0; angle -= 10) {
    servo.write(angle);      // サーボモーターを指定した角度に回転
    delay(200);               // 200ミリ秒待機
  }
}

では、サーボモータ動かしていきましょう。

解説(初期設定まで)

サーボモータを制御する関数も用意されています。
#include <Servo.h> で用意します。

2行目の
Servo servo; // サーボモーターオブジェクト
これは、これ以降、Servo関数を、servoという名前で使います。という宣言になります。
名前は任意なので、複数使いたいときに、『servo2』とか『servo_Left』とか分かりやすくしてあげます。

次は初期設定。
servo.attach(servoPin); // サーボモーターを接続するピンを設定
servoという名前のサーボモータは、ここ 『int servoPin = 9; // サーボモーターの接続ピン』
につながってますよ。と指定しています。

接続

SG90は、線が3本。赤:電源+、茶:GND、橙:制御信号
橙の制御信号を、今回は9ピンにつなぎます

サーボモータとUNO接続
サーボモータとUNO接続

制御信号は、今回は9を指定してますが、UNO表面の数字の横に『~』がついているところなら、その数字に変えれば変更可能です。『~』は簡単にパルスが出せる(PWM)ピンです。

なお、5VやGNDは、何か所か表記あります。どこでも一緒です。
おススメは、2個がとなりあっているイラストの接続例です。

ノイズってのがありまして・・・

というのも、今回はモータを直接Arduinoで動かしていますが、実運用ではおススメしません。
モータは、LEDとかに比べて、電気を使います。更に『コイル』というものが、モータの中には使われていて、『コイル』に電気をON/OFFすると、ノイズと呼ばれる意図しない電気が発生します。

ノイズ

ONやOFFした瞬間に、本来は角ばっていたはずの電圧の形が、にょきっとしたり、ギザギザしたりします。これらノイズのせいで、さっきのプログラムも、へんてこな動きをする時があるかもしれません。

ノイズは、線の長さや、線の沿い方、手で持っていたりとか、状況によって、影響の度合いが大小します。ランダムな感じで、誤動作するので、何が悪いのか、分かりにくいのが難点です。

ダメなときは、電源とGNDの間に電解コンデンサ、セラミックコンデンサをつけたり、
電源をArduinoからとらず、別電源にして、GNDと制御信号だけつないであげるとか、ちょっとしてあげる必要があります。

今回は、そんなに深いことはやりません。

解説(制御部分)

// サーボモーターを0度から180度まで回転させる
for (int angle = 0; angle <= 180; angle += 10) {
}

For文で一定回数、繰り返されます。
angleは0始まり。angleが180以下の間は。angleを+10する。となります。

それで、For文の{}に囲まれている中(下記の2行)を繰り返します。
servo.write(angle); // サーボモーターを指定した角度に回転
delay(200); // 200ミリ秒待機

サーボモータの角度を0度にして、10度、20度……180度まで回ったら、For文を抜けて次に行きます。

次は、180度から0度まで戻していきます。

// サーボモーターを180度から0度まで回転させる
for (int angle = 180; angle >= 0; angle -= 10) {
 servo.write(angle); // サーボモーターを指定した角度に回転
 delay(200); // 200ミリ秒待機
}

まとめ

標準に用意されている関数のおかげで、意外と簡単だったのではないでしょうか。

モータを動かそうとすると、途中であったノイズというのが、からんでくる場合があります。

ノイズは、やっかいですが
やっぱりモータを動かせると、作れるものの幅が、ぐーんと広がると思います。
物理的に動くと、制御してる感も感じれると思います。

またの機会に、ノイズ編もやりたいと思います。
投稿した際は、ぜひこちらにもリンクを張りたいと思います。

この記事を書いた人
ユカタキ

私、気になります!
自分でやってみたくなる性格の私は、電子工作、プログラム、3Dプリンター関連の事などの情報を発信しています。
社会人から電子工作を始め14年、電験3種一発合格、2021年から3DプリンタをDIYに活用。
そんな私が、まだまだ調べながらではありますが、ほかのDIYユーザー皆さんのためになるようなことを心がけています

ユカタキをフォローする
知識勉強
ユカタキをフォローする

コメント