子供と一緒に始める マイコンプログラム Arduino 入門 サーボモーター編 Lesson 09

Arduino-lesson09-05 Arduino入門編
スポンサーリンク
「子供と一緒に始める マイコンプログラム Arduino 入門 サーボモーター編 Lesson 09」

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

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

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

 

本Lesson解説で使用しているのはArduino互換品です。

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

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

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

 

スポンサーリンク

はじめに

サーボモーターは通常のモーターに回転角度を検出する機能がついていて、その信号をUNOと通信することで、回転角度を制御することが可能です。

wikipedia サーボモーター

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

 

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

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

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

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

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

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

 

Lesson 09目標

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

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

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

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

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

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

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

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

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

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

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

 

準備

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

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

 

必要なもの

  • USB接続用のPC(IDE統合環境がインストールされたPC)
  • UNO R3(以下UNO)
  • PCとUNOを接続するUSBケーブル
  • ブレッドボード
  • サーボモーター(SG-90)
  • ポテンショメータ(10kΩ)
  • M-M Jumper wire(UNOと部品をつなぐための配線)

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

もしインストールされていない場合は

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

にてインストールしてください。

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

 

ライブラリに関してはLesson 01を参照してください。

 

使用部品説明

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

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

 

サーボモータ 実物写真

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

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

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

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

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

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

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

Arduino-lesson09-01

 

 

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

 

サーボモータ 原理

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

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

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

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

Arduino-lesson09-02

 

サーボモータ制御方法

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

PWMについては下記のLessonを参照ください。

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

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

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

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

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

実際は、ライブラリ「Servo.h」を利用するためPWMの制御をプログラムに書くことはありませんが知っておいた方が良いです。

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

 

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

下の写真が、ポテンショメータです。

今回購入した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にプログラムを書き込んで行きましょう。

本記事のコードを参考に書いてみてください。

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

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

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

 

コマンド説明

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

コマンド説明
ServoServo型の変数を作る。
例: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に書き込んで動作を確認してみてください。

//単純にサーボモータを動かすスケッチ

#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度にしています。

 

動作確認

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

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

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

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

 

実践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にプログラムを書き込んで行きましょう。

本記事のコードを参考に書いてみてください。

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

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

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

 

コマンド説明

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

コマンド説明
ServoServo型の変数を作る。
例: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超音波距離センサ編です。超音波を飛ばして、帰ってくるまでの時間から距離を測定します。距離を測定することで人間には聞こえない「やまびこ」を体感してください。

 

本Lessonで使用しているUNOはAmazonにて購入可能です。

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

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

コメント

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