\ AmazonにてArduino UNO R4 発売中!! /

Arduino 入門 Lesson 09 【サーボモーター編】

Arduino-lesson09-05 Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 09
【サーボモーター編】

こんにちは、管理人のomoroyaです。

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

 

本記事はLesson 09 【サーボモーター編】です。
※サーボモータは信号に応じて0度~N度の範囲で回転するモーターです。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

サーボモーターは通常のモーターに回転角度を検出する機能がついています。

その機能をArduino UNOと通信することで、回転角度を制御することが可能です。

wikipedia サーボモーター

サーボモーター (Servomotor) とはサーボ機構において位置、速度等を制御する用途に使用するモーターである。モーターの種類としては、「電動機」、「油圧モーター」など、特定のモーター形式を示すものではない。しかし、現在は、ロボット用途などに使用される「検出器付の電動機」で、フィードバック制御するものが一般的である。

 

基本は回転角度を指定して回転させる使い方をします。

そのため、ロボットの関節の制御、ラジコンのステアリングを操作してタイヤの向きを変更するなどの使いかたに向いています。

 

モーターには、サーボモーターの他にも色々と種類があります。

下記に解説がわかりやすいかなと思うサイトのリンクを貼っておきます。

興味があるかたはどうぞ。

通常のモーター:電力をかけると回り続ける。
サーボモータ:今回使用(信号に応じて0度~N度の範囲で回転)
ステッピングモーター:回転量、速度を自在に制御できる。
ブラシレスモーター:安定した速度制御が可能

 

Lesson 09目標

サーボモーターの制御方法を理解します。

サーボモーターをラジコンのステアリングのように動かしてみます。

そのためポテンショメータの使い方も理解します。
※ポテンションメータとは可変抵抗器のことです。

ポテンショメーターでサーボモーターを動かすためにmap()関数を使用します。

map()関数の使い方も併せて理解しましょう。

 

ポテンショメータを使わなくてもサーボモーターはプログラムのみで動かせます。

しかし、子供と一緒に遊ぶなら断然ポテンショメータでサーボモーターを動かした方がおもしろいに決まってます。

子供にとっては、自分の手で動かすっておもしろいんですよね。

といっても、プログラムはそれほど難しいものではありません。

なぜなら、サーボモーターを簡単に操作できるようにライブラリが提供されているからです。

本Lessonも、遊ぶというところが一番大事なところです。

 

準備

Lessonの準備に取り掛かりましょう。

本Lessonの部品は多くないので、すぐに実践に移ることができます。

 

必要なもの

 

今回Servoライブラリを使用します。

ライブラリがインストールされていない場合はインストールお願いします。

スケッチ」⇒「ライブラリをインクルード」⇒「ライブラリを管理…

 

もしくは下記から直接入手することも可能です。

 

ライブラリのインストールに関してはLesson 01にて詳しく解説しています。

 

使用部品説明

新たに登場した部品について説明していきます。

本Lessonで新しく登場するのは、サーボモータポテンショメータです。

 

サーボモータ 実物写真

下の写真が、サーボモータです。

今回購入したELEGOO UNO キットに合わせて梱包されています。

 

サーボモータには端子が3つあります。

写真左から色ごとに下記となっています。

茶(GND)、赤(電源)、橙(信号線)

メーカーによっては下記色となっています。

黒(GND)、赤(電源)、白(信号線)

Arduino-lesson09-01

 

手持ちがない方は以下からどうぞ。

最近、電子部品の在庫切れが多く値段も上がっているような気がします・・・。

 

こちら同等品で在庫あり。

サーボモーター SG90同等品

 

サーボモータ 原理

下記にサーボモータの概略図を示します。

サーボモータは、「モータ」、「ポテンショメータ」、「制御回路」の3つから構成されています。

モータポテンショメータは繋がっていて制御回路でどの程度回転できたかを読み取る仕組みとなっています。

また、その読み取った状態から制御回路はモータを停止させたり、回転方向などをコントロールします。

Arduino-lesson09-02

 

サーボモータ制御方法

サーボモータは橙の信号線にPWM信号を送ることで制御します。

PWM信号についてはLesson 04にて詳細を解説しています。

 

サーボモーター SG90であれば、PWMの周期が20msとなっています。

1周期20msのPWM信号のHigh期間の時間によって動かす角度を制御することができます。

SG90のデータシートはこちらを確認してみてください。

周期20msの中で「Highのパルス幅」と角度の関係は以下のようになっていることがわかります。

パルス幅[ms] 角度[度]
0.5(パルス幅狭い) 0
1.45(パルス幅中間) 90
2.4(パルス幅広い) 180

 

実際は、ライブラリ「Servo.h」を利用します。

そのため、PWMの制御をプログラムに書くことはありませんが知っておいた方が良いです。

サーボモータは個体差により制御するパルス幅が多少前後します。
そのため、実際には動作させてみて調整する必要があります。
今回は精度を要求するようなことはないので気にしなくても大丈夫です。

 

ポテンショメータ 実物写真

下の写真が、ポテンショメータ(10kΩ)です。

今回購入したELEGOO UNO キットに合わせて梱包されています。

 

下記、端子の位置が違いますが使い方は一緒です。

 

ポテンショメータは可変抵抗器です。

ボリュームと呼ばれることもあります。

 

今回利用するのは回転式のポテンショメータです。

中には抵抗素子が入っており、端子は全部で3つ。

抵抗の両端の端子2つと、可変した抵抗値の電圧値を取り出す端子の1つです。

今回は下側2つの端子を電源とGNDに、上側中央の端子をアナログ入力端子につなぎます。

Arduino-lesson09-03

 

手持ちがない方は以下からどうぞ。

見た目は異なりますが使い方は同じです。

なかなか、単品で購入というのは難しいと思います。

そのため、色々な種類の抵抗が入ったセットのものを購入した方が使い勝手が良いです。

タイプは好みで、つまみあり、なし。

 

上記が在庫切れの場合は下記なども。

 

ポテンショメータ 原理

ポテンショメータ自体の原理は単純です。

内蔵されている抵抗の両端に電圧をかけた状態でツマミを回すことで抵抗値の比率が変わります。

それによって、端子から取り出せる電圧が変わりす。

取り出した電圧はアナログ入力端子に入れることによって、デジタル値に変換します。

その変換したデジタル値を制御信号として利用することができます。

 

詳しく知りたい方は下記が参考になります。

ボリュームの説明ですが同じです。

ボリューム | マルツオンライン

 

ポテンショメータ使い方

ポテンショメータの中央端子をアナログ入力に接続します。

つないだ端子の情報をanalogRead(pin)関数で読み取ります。

analogRead(pin)は読み取った電圧値を0~1023の整数値を戻り値として返します。

ようするに、読み取った0V~5Vの電圧値を0~1023のデジタル値に変換することができるわけです。

ポテンショメータのツマミを動かすことによって、電圧は変化します。
その変化をanalogRead(pin)関数によってデジタル値に変換するということです。

AD変換するということですね。
※analog-digital変換

 

実践1 サーボモータを使用した回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、サーボモーターを動かしていきましょう。

どんなふうに動くのか楽しみです。

 

回路図 サーボモータ  のみ使用

まずは、サーボモータのみ使用しサーボモータの動作を理解します。

回路図がこちら。

Arduino-lesson09-06

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

Arduino-lesson09-07

 

回路図は「fritzing」を利用しています。

「fritzing」に興味がある方は下記の記事を参照ください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品はサーボモータのみです。

M-M jumper wireを使用して直接UNOと接続しましょう。

使用するポートは、Digital IOの「9」、電源の「5V」、「GND」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

Arduino-lesson09-04

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

本記事のコードを参考に書いてみてください。
※コピペでもOKです。

実際書いてみた方が慣れるのに良いです。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

今回はライブラリ「Servo.h」を使用することを前提としています。

 

コマンド説明

新しく出てきたコマンドの説明をしていきます。

コマンド 説明
Servo Servo型の変数を作る。
例:Servo myservo;
myservoがServo型の変数になります。
myservo.attach(pin)
myservo.attach(pin,min,max)
※myservoはServoで定義した変数
pin:サーボを割り当てるピン番号
min:サーボの角度が0度のときのパルス幅単位(μ秒)
デフォルトは544
max:サーボの角度が180度のときのパルス幅単位(μ秒)
デフォルトは2400
※μ秒は1/1000000秒
myservo.write(angle)
※myservoはServoで定義した変数
angle:0~180、サーボに与える値。
例 サーボを90度にセット
myservo.write(90);

 

サンプルコード

サンプルコードを下記に示します。

コマンドを理解するために、単純にサーボモータを動かしてみます。

下記をUNOに書き込んで動作を確認してみてください。

//Lesson 09-01 単純にサーボモータを動かすスケッチ
//https://omoroya.com/

#include <Servo.h>
Servo myservo;       //Servo型変数の作成
 
void setup()         //初期設定
{
myservo.attach(9);   //9番ピンをサーボの信号として割り当て
}
 
void loop()          //ループ関数
{
myservo.write(90);   //90度へ動かす
delay(2000);         //サーボが動いている間次にいかないように2秒間待つ
myservo.write(20);   //20度へ動かす。
delay(2000);         //サーボが動いている間次にいかないように2秒間待つ
myservo.write(160);  //160度へ動かす。
delay(2000);         //サーボが動いている間次にいかないように2秒間待つ
}

 

※サーボモータへの過負荷を防ぐため、下限は20度、上限160度にしています。

 

動作確認

では、さっそく動作を確認していきます。

といっても、動画でないと動作を見せられません・・・。

上記コードで問題なく動きますので、コマンド確認のためにも動かしてみてください。
※もし動かなかった場合、コメントいただけると助かります・・・。

動画を埋め込むことができたら更新します。

YouTubeがいいんですかね。。。

 

実践2 サーボモータ ポテンショメータ を使用した回路作成とコード作成

まずは回路図を確認しましょう。

次に回路図に合わせて部品を接続します。

最後にコードを書いて、サーボモーターを動かしていきましょう。

どんなふうに動くのか楽しみです。

 

回路図 サーボモータとポテンショメータを使用

サーボモータとポテンショメータを使用した回路図がこちらです。

Arduino-lesson09-08

 

こちらがブレッドボード図。

Arduino-lesson09-09

 

回路図は「fritzing」を利用しています。

「fritzing」のに興味があるかたは、下記記事を併せてお読みください。

詳細を解説しています。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品はサーボモータとポテンショメータです。

ブレッドボードとM-M jumper wire使用してUNOと接続しましょう。

使用するポートは、Analog入力の「0」、Digital IOの「9」、電源の「5V」、「GND」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

Arduino-lesson09-05

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

本記事のコードを参考に書いてみてください。
※コピペでもOK!

実際書いてみた方が慣れるのに良いです。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で別名で保存しておきましょう。

今回もライブラリ「Servo.h」を使用することを前提としています。

 

コマンド説明

新しく出てきたコマンドを追加で説明します。

コマンド 説明
Servo Servo型の変数を作る。
例:Servo myservo;
myservoがServo型の変数になります。
myservo.attach(pin)
myservo.attach(pin,min,max)
pin:サーボを割り当てるピン番号
min:サーボの角度が0度のときのパルス幅単位(μ秒)
デフォルトは544
max:サーボの角度が180度のときのパルス幅単位(μ秒)
デフォルトは2400
※μ秒は1/1000000秒
myservo.write(angle)
※myservoはServoで定義した変数
angle:0~180、サーボに与える値。
例 サーボを90度にセット
myservo.write(90);
map(value,fromLow,fromHigh
,toLow,toHgih)
value:変換したい変数
fromLow: 現在の範囲の下限
fromHigh:現在の範囲の上限
toLow:変換後の範囲の下限
toHigh:変換後の範囲の上限
例 アナログ入力の0~1023をサーボの0~180に変換。
val = map(val,0,1023,0,180);

このサンプルコードの重要な関数はmap関数を使うことです。

これによってポテンショメータでサーボモータを動かせるようにしているのです。

 

サンプルコード

サンプルコードを下記に示します。

ポテンショメータでサーボモーターを動かすコードです。

このコードはサンプルスケッチとしてIDEにすでにあります。

「ファイル」⇒「スケッチ例」⇒「Servo」⇒「Knob」で読み込んでください。

/*
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob
*/

#include <Servo.h>

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

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

 

サンプルコードの重要箇所を説明します。

void loop() {
val = analogRead(potpin);        //アナログ入力0の値をval変数へ入れる。
val = map(val, 0, 1023, 0, 180); //アナログ入力の0~1023をサーボの0~180に変換。
myservo.write(val);              //サーボモーターにval値の角度をセット。
delay(15);                       //15ms待つ。
}

 

最後のdelay(15)の関数は何かとおもうかもしれませんので説明します。
サーボモータの動作周期は20msです。
そのため、20ms程度処理時間を空ける必要があります。

※補足、コード内にあるアナログ入力のピン番号は、「0」でも「A0」どちらでも良いです。

 

動作確認

では、さっそく動作を確認していきます。

といっても、動画でないと動作を確認できないので省略します。

上記コードで問題なく動きますので、コマンド確認のためにも動かしてみてください。

動画を埋め込むことができたら更新します。

 

まとめ

今回は以下の内容について理解してもらいました。

今回も項目4の遊ぶことが一番の目標でした。

1.サーボモーターの制御方法を理解する。
2.ポテンショメータの使い方を理解する。
3.map()関数の使い方も併せて理解する。
4.楽しんで遊ぶ。

 

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

Lesson 09 【サーボモーター編】はここまで。

ぜひ、子供と一緒にやられてみることをお勧めします。

プログラミングして動かすって面白い」と思ってもらえるはず。

多分・・・。

疑問点など、質問がありましたら気軽にコメントください。

 

次回、Lesson 10 【超音波距離センサ編です。

超音波で距離を測定します。

いよいよ、Arduinoらしくなってきました。

Arduino 入門 Lesson 10 【超音波距離センサ編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 10超音波距離センサ編です。超音波を飛ばして、帰ってくるまでの時間から距離を測定します。距離を測定することで人間には聞こえない「やまびこ」を体…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分) 一般 プライム会員
5,000円~19,999円 0.5% 1.0%
2,0000円~39,999円 1.0% 1.5%
40,000円~89,999円 1.5% 2.0%
90,000円~ 2.0% 2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. わたがし より:

    サーボモーターのみをサイト上のプログラミングで動かそうとすると、

    C:\Users\korew\Documents\Arduino\libraries\Servo/Servo.h:63:10: fatal error: avr/ServoTimers.h: No such file or directory
    #include “avr/ServoTimers.h”

    というエラーが出てしまいコンパイルできませんでした。
    ServoTimers.hというファイルが見つからないよーというニュアンスのエラーだと思うのですが、
    ServoTimers.hというファイルはServoフォルダの中にありました。

    エラーの解消法わかりますでしょうか、、?

  2. 匿名 より:

    分かりました。確認してみます。

    • omoroya omoroya より:

      Lesson 30にてリモコンと赤外線受信センサモジュールにてステッピングモーターを制御する解説をしています。ご参考までに。

  3. いっくん より:

    こんにちわ
    今私は学生をしています。
    赤外線センサーでサーボモーターを制御させたいと思っていて主な目的としては、赤外線センサーでライントレースをすることです。

    あるサイトでは、サーボモーターとポテンショメーターを使ったプログラムで、「ポテンショメーターをただ赤外線センサに変えればいいだけだよ」と言われ行ったのですが、スケッチの作り方が分からないまま手が動かずにいます。

    ぜひ、赤外線センサーでサーボモーターを制御させるスケッチを教えてくださいますでしょうか?

    良ければスケッチの一行一行の意味も教えて頂ければ幸いです。

    赤外線センサー:ELEGOO 赤外線センサー
    サーボモーター:SUPER ERG-ZR

    • omoroya omoroya より:

      こんにちは。
      ライントレースをしたいということですがフォトリフレクタを使われた方が良いのではと思います。
      それとも、赤外線センサを搭載してリモコンで操作したいということでしょうか?
      一度、フォトリフレクタを確認してみることをまずお勧めします。

タイトルとURLをコピーしました