Arduino 入門
Lesson 09
【サーボモーター編】
こんにちは、管理人のomoroyaです。
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本記事はLesson 09 【サーボモーター編】です。
※サーボモータは信号に応じて0度~N度の範囲で回転するモーターです。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
サーボモーターは通常のモーターに回転角度を検出する機能がついています。
その機能をArduino UNOと通信することで、回転角度を制御することが可能です。
サーボモーター (Servomotor) とはサーボ機構において位置、速度等を制御する用途に使用するモーターである。モーターの種類としては、「電動機」、「油圧モーター」など、特定のモーター形式を示すものではない。しかし、現在は、ロボット用途などに使用される「検出器付の電動機」で、フィードバック制御するものが一般的である。
基本は回転角度を指定して回転させる使い方をします。
そのため、ロボットの関節の制御、ラジコンのステアリングを操作してタイヤの向きを変更するなどの使いかたに向いています。
モーターには、サーボモーターの他にも色々と種類があります。
下記に解説がわかりやすいかなと思うサイトのリンクを貼っておきます。
興味があるかたはどうぞ。
通常のモーター:電力をかけると回り続ける。
サーボモータ:今回使用(信号に応じて0度~N度の範囲で回転)
ステッピングモーター:回転量、速度を自在に制御できる。
ブラシレスモーター:安定した速度制御が可能
Lesson 09目標
サーボモーターの制御方法を理解します。
サーボモーターをラジコンのステアリングのように動かしてみます。
そのためポテンショメータの使い方も理解します。
※ポテンションメータとは可変抵抗器のことです。
ポテンショメーターでサーボモーターを動かすためにmap()関数を使用します。
map()関数の使い方も併せて理解しましょう。
ポテンショメータを使わなくてもサーボモーターはプログラムのみで動かせます。
しかし、子供と一緒に遊ぶなら断然ポテンショメータでサーボモーターを動かした方がおもしろいに決まってます。
子供にとっては、自分の手で動かすっておもしろいんですよね。
といっても、プログラムはそれほど難しいものではありません。
なぜなら、サーボモーターを簡単に操作できるようにライブラリが提供されているからです。
本Lessonも、遊ぶというところが一番大事なところです。
準備
Lessonの準備に取り掛かりましょう。
本Lessonの部品は多くないので、すぐに実践に移ることができます。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - サーボモーター SG90同等品
- ポテンショメータ(10kΩ)
- M-M Jumper wire(UNOと部品をつなぐための配線)
今回Servoライブラリを使用します。
ライブラリがインストールされていない場合はインストールお願いします。
「スケッチ」⇒「ライブラリをインクルード」⇒「ライブラリを管理…」
もしくは下記から直接入手することも可能です。
ライブラリのインストールに関してはLesson 01にて詳しく解説しています。
使用部品説明
新たに登場した部品について説明していきます。
本Lessonで新しく登場するのは、サーボモータとポテンショメータです。
サーボモータ 実物写真
下の写真が、サーボモータです。
今回購入したELEGOO UNO キットに合わせて梱包されています。
サーボモータには端子が3つあります。
写真左から色ごとに下記となっています。
茶(GND)、赤(電源)、橙(信号線)
メーカーによっては下記色となっています。
黒(GND)、赤(電源)、白(信号線)
手持ちがない方は以下からどうぞ。
最近、電子部品の在庫切れが多く値段も上がっているような気がします・・・。
こちら同等品で在庫あり。
サーボモーター SG90同等品
サーボモータ 原理
下記にサーボモータの概略図を示します。
サーボモータは、「モータ」、「ポテンショメータ」、「制御回路」の3つから構成されています。
モータとポテンショメータは繋がっていて制御回路でどの程度回転できたかを読み取る仕組みとなっています。
また、その読み取った状態から制御回路はモータを停止させたり、回転方向などをコントロールします。
サーボモータ制御方法
サーボモータは橙の信号線に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に、上側中央の端子をアナログ入力端子につなぎます。
手持ちがない方は以下からどうぞ。
見た目は異なりますが使い方は同じです。
なかなか、単品で購入というのは難しいと思います。
そのため、色々な種類の抵抗が入ったセットのものを購入した方が使い勝手が良いです。
タイプは好みで、つまみあり、なし。
上記が在庫切れの場合は下記なども。
ポテンショメータ 原理
ポテンショメータ自体の原理は単純です。
内蔵されている抵抗の両端に電圧をかけた状態でツマミを回すことで抵抗値の比率が変わります。
それによって、端子から取り出せる電圧が変わりす。
取り出した電圧はアナログ入力端子に入れることによって、デジタル値に変換します。
その変換したデジタル値を制御信号として利用することができます。
詳しく知りたい方は下記が参考になります。
ボリュームの説明ですが同じです。
ポテンショメータ使い方
ポテンショメータの中央端子をアナログ入力に接続します。
つないだ端子の情報をanalogRead(pin)関数で読み取ります。
analogRead(pin)は読み取った電圧値を0~1023の整数値を戻り値として返します。
ようするに、読み取った0V~5Vの電圧値を0~1023のデジタル値に変換することができるわけです。
その変化をanalogRead(pin)関数によってデジタル値に変換するということです。
AD変換するということですね。
※analog-digital変換
実践1 サーボモータを使用した回路作成とコード作成
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、サーボモーターを動かしていきましょう。
どんなふうに動くのか楽しみです。
回路図 サーボモータ のみ使用
まずは、サーボモータのみ使用しサーボモータの動作を理解します。
回路図がこちら。
こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。
回路図は「fritzing」を利用しています。
「fritzing」に興味がある方は下記の記事を参照ください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品はサーボモータのみです。
M-M jumper wireを使用して直接UNOと接続しましょう。
使用するポートは、Digital IOの「9」、電源の「5V」、「GND」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、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秒間待つ }
動作確認
では、さっそく動作を確認していきます。
といっても、動画でないと動作を見せられません・・・。
上記コードで問題なく動きますので、コマンド確認のためにも動かしてみてください。
※もし動かなかった場合、コメントいただけると助かります・・・。
動画を埋め込むことができたら更新します。
YouTubeがいいんですかね。。。
実践2 サーボモータ ポテンショメータ を使用した回路作成とコード作成
まずは回路図を確認しましょう。
次に回路図に合わせて部品を接続します。
最後にコードを書いて、サーボモーターを動かしていきましょう。
どんなふうに動くのか楽しみです。
回路図 サーボモータとポテンショメータを使用
サーボモータとポテンショメータを使用した回路図がこちらです。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」のに興味があるかたは、下記記事を併せてお読みください。
詳細を解説しています。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品はサーボモータとポテンショメータです。
ブレッドボードとM-M jumper wire使用してUNOと接続しましょう。
使用するポートは、Analog入力の「0」、Digital IOの「9」、電源の「5V」、「GND」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、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待つ。 }
サーボモータの動作周期は20msです。
そのため、20ms程度処理時間を空ける必要があります。
※補足、コード内にあるアナログ入力のピン番号は、「0」でも「A0」どちらでも良いです。
動作確認
では、さっそく動作を確認していきます。
といっても、動画でないと動作を確認できないので省略します。
上記コードで問題なく動きますので、コマンド確認のためにも動かしてみてください。
動画を埋め込むことができたら更新します。
まとめ
今回は以下の内容について理解してもらいました。
今回も項目4の遊ぶことが一番の目標でした。
2.ポテンショメータの使い方を理解する。
3.map()関数の使い方も併せて理解する。
4.楽しんで遊ぶ。
いかがだったでしょうか。
Lesson 09 【サーボモーター編】はここまで。
ぜひ、子供と一緒にやられてみることをお勧めします。
「プログラミングして動かすって面白い」と思ってもらえるはず。
多分・・・。
疑問点など、質問がありましたら気軽にコメントください。
次回、Lesson 10 【超音波距離センサ編】です。
超音波で距離を測定します。
いよいよ、Arduinoらしくなってきました。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
サーボモーターのみをサイト上のプログラミングで動かそうとすると、
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フォルダの中にありました。
エラーの解消法わかりますでしょうか、、?
IDE上にスケッチ -> ライブラリをインクルード -> Servo
ありますでしょうか?
なければ、
【ライブラリインストールおよびPCとの接続編】を参考にインストールしてください。
https://omoroya.com/arduino-lesson01/
分かりました。確認してみます。
Lesson 30にてリモコンと赤外線受信センサモジュールにてステッピングモーターを制御する解説をしています。ご参考までに。
こんにちわ
今私は学生をしています。
赤外線センサーでサーボモーターを制御させたいと思っていて主な目的としては、赤外線センサーでライントレースをすることです。
あるサイトでは、サーボモーターとポテンショメーターを使ったプログラムで、「ポテンショメーターをただ赤外線センサに変えればいいだけだよ」と言われ行ったのですが、スケッチの作り方が分からないまま手が動かずにいます。
ぜひ、赤外線センサーでサーボモーターを制御させるスケッチを教えてくださいますでしょうか?
良ければスケッチの一行一行の意味も教えて頂ければ幸いです。
赤外線センサー:ELEGOO 赤外線センサー
サーボモーター:SUPER ERG-ZR
こんにちは。
ライントレースをしたいということですがフォトリフレクタを使われた方が良いのではと思います。
それとも、赤外線センサを搭載してリモコンで操作したいということでしょうか?
一度、フォトリフレクタを確認してみることをまずお勧めします。