皆さんが電子工作を始めたきっかけは何ですか? 多くの方が「ロボットを制御したい」と夢見ているはずです。
ロボットを構成する主要な部品はサーボモータです。
そこで本記事では、ロボット制御の基本となる、Arduinoからサーボモータを制御する方法について学習します。
市販のロボットアーム(キット)を使えば、初めての方でも簡単にサーボモータを使えるようになりますよ。
ロボットへの動作の指示は、超音波センサを使います。以前の記事、「Arduinoで距離計を自作しよう! スピーカーをつなげば楽器にも早変わり」も合わせて参照してください。
目次
- 準備 初心者はキットを利用しよう!
- サーボモータが動く仕組みを理解しよう
- スケッチ作成のポイント
- スケッチ全体
- スケッチ解説 超音波センサで測定した距離をサーボモータへ
- 仕上げ まずはサーボモータ1個から
- まとめ
1. 準備 初心者はキットを利用しよう!
本記事では次のものを使用します。
Arduino Uno
超音波センサモジュール
本記事ではHC-SR05を使用します。他製品を使用する場合は、ピンの配置に注意してください。
Arduino IDE
ロボットアーム
サーボモータを組み合わせて自作します。MeArmなどのキットも使用できます。
上記に加えて、USBケーブルも用意してください。
本記事では、サーボモータの位置決めに、超音波センサを使用します。センサの前に置かれた物体に向かって、ロボットアームが伸びていくイメージです。
もし超音波センサが入手できない場合は、半固定抵抗器でも代用が可能です。
この場合、半固定抵抗器の回転に合わせて、サーボモータに回転角を指定してください。
ロボットアームは、サーボモータ数個からでも作れるので、自分だけのオリジナルロボットアームも作ることができます。ですが、ロボットアームやサーボモータに初めて触るような方は、市販のキットから始めてアームの制御や構造の確認など少しずつ進めていくのがおすすめです。
ちなみに、ロボットアームのキットは、サーボモータが別売りの場合もあるので、付属品に注意してください。
2. サーボモータが動く仕組みを理解しよう
最初は、ロボットアームを動かす基本となる、サーボモータについて学びましょう。
電子工作や模型に使用されるホビー向けの小型サーボモータは、四角い形状の筐体に、動力を伝えるシャフトと3本の電線が出ている構造が一般的です。
筐体の内部では、小型のモータがギアを通してシャフトを回しています。
3本の電線は、サーボモータ内部の電子基板につながります。基板は外部からの信号に応じてモータを回転させる制御を行っています。この制御は、シャフトの回転角度を計測してモータの回転量をフィードバックする機能が搭載されており、この機能のことを「サーボ」と呼びます。
3本の電線は、それぞれ電源(Vcc)・信号・グランド(GND)です。電源線とグランド線はArduinoボードの「5V」ピンと「GND」ピンに、信号線はデジタル入出力ピンに接続してください。
サーボモータの中には「高トルク」と呼ばれる、回転する力の強いものがあります。こういったタイプのサーボモータは、多くの電流を必要とするので、電源を別途用意します。複数のサーボモータを同時に制御する場合も、電源には注意してください。
ホビー用のサーボモータには、2種類の動作方法があり、制御する方法がそれぞれ異なります。
標準的なサーボモータは、「0度から180度」のように、シャフトの回転角で制御するタイプです。
詳しくは、シャフトの回転角を指定するタイプで、スケッチに角度を指定するとその位置までシャフトが回転します。向いている用途は、本記事で使用するロボットアームのような、短距離での正確な位置決めです。
もう一つは、シャフトの回転角に制限がない、「連続回転サーボモータ」です。「無限回転サーボモータ」とも呼ばれます。
一般的に、このタイプのサーボモータは、正確な回転角の制御には向きませんが、タイヤの回転など、正確な位置決めが必要のない用途に向いています。スケッチでは、シャフトの回転角の代わりに、回転スピードを指定してください。
どちらのタイプも、向き不向きがあるので、ロボットを設計する際は、それぞれの特徴を考慮して選択しましょう。
3. スケッチ作成のポイント
ロボットアームは複数のサーボモータを使用します。いきなり全てのサーボモータを制御するのは難しいので、1つずつ増やしていきましょう。
本記事では、サーボモータの最初の1個を制御するスケッチを作成します。サーボモータを駆動するコードは、1つでも複数でも大きな違いはありません。まずは制御の基本を押さえるところから始めましょう。
アームに接続されたサーボモータを、「どれくらい移動するか?」の判定には、超音波センサの距離測定を利用します。
超音波センサは、物体までの距離を計測できるので、距離測定の結果をもとにサーボモータの回転角の算出を行います。
スケッチは、以前の記事、「Arduinoで距離計を自作しよう! スピーカーをつなげば楽器にも早変わり」で作成したものをベースに、サーボモータの制御を加えていきましょう。
4. スケッチ全体
Arduino Unoに転送するスケッチは以下の通りです。
#include <Servo.h> Servo myservo; // Create servo control object void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object pinMode (6,OUTPUT); // Insert HC-SR-05 with VCC in pin 6 pinMode (5, INPUT); // Assign pin 5 to Echo pinMode (4,OUTPUT); // Assign pin 4 to Trig pinMode (2,OUTPUT); // Assign pin 2 to GND. Serial.begin(9600); // This will allow you to read how far away your sensor is later } void loop() { long duration, cm; // Initialize variables for duration and cm digitalWrite(6, HIGH); // Power the sensor digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping, delayMicroseconds(2); digitalWrite(4, HIGH); delayMicroseconds(10); digitalWrite(4, LOW); duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable int servorotate = 2*(constrain(cm, 2, 30))+30; // Assign servo position based on distance Serial.print(cm); // Print distance in cm to serial monitor Serial.print("cm "); Serial.print(servorotate);// Print rotate position Serial.print("position"); Serial.println(); myservo.write(servorotate); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there }
上記のソースコードをArduino IDEにコピー&ペーストしてください。
5. スケッチ解説 超音波センサで測定した距離をサーボモータへ
以前の記事、「Arduinoで距離計を自作しよう! スピーカーをつなげば楽器にも早変わり」で作成したスケッチから変更した部分、特にサーボモータの制御方法と、調整のポイントを中心に解説していきます。
Arduinoボードに転送する前に確認しましょう。
最初にスケッチの先頭部分、setup()関数の前に数行追加しました。
#include <Servo.h> Servo myservo; // Create servo control object
最初の行はインクルードファイルの読み込みです。
Arduinoには、サーボモータを制御するための関数があり、Servoライブラリとして提供されています。
それらの関数を、スケッチで利用できるようにするのが、インクルードファイルです。利用したいライブラリごとに、インクルードファイルが用意されているので、必要なものを読み込みます。
次の行は、Servoオブジェクトの作成です。スケッチは、このServoオブジェクトを通して、Arduinoボードに接続されたサーボモータの制御を行います。
1つのServoオブジェクトで、1つのサーボモータを制御します。もし、複数を同時に制御したい場合は、サーボモータの数だけServoオブジェクトが必要です。
作成したServoオブジェクトと、接続されたサーボモータを関連付けるには次のようにします。
myservo.attach(9); // Attaches servo to pin 9
attach()関数の引数には、サーボモータが接続されたデジタル入出力ピンの番号を指定してください。
この1行は、使用するサーボモータの信号線が、デジタル入出力ピンの「9番」に接続されていることを意味します。
次の行は、サーボモータの動作する量(回転角)を決めています。
cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable int servorotate = 2*(constrain(cm, 2, 30))+30; // Assign servo position based on distance
1行目の、変数cmに代入する数値は、超音波センサで計測した物体までの距離(cm: センチメートル)です。
本記事で使用した超音波センサ、HC-SR05は、超音波の発信器と受信器を持っています。
発信器から送出された超音波は、物体に反射して返ってきます。それを受信器がキャッチするまでの時間を、超音波が1cm進むのに必要な時間(29.155)で割ると、物体までの距離(cm)が算出できますよ。
計測される時間は超音波が物体まで往復する時間なので、2分の1にして片道の時間にしておきましょう。
詳細な説明は「Arduinoで距離計を自作しよう! スピーカーをつなげば楽器にも早変わり」を参照してください。
2行目は、算出された物体までの距離(cm)を、サーボモータの回転角に変換しています。
constrain()関数は、第一引数に渡された数が、既定の数値に収まるように調整しましょう。
ここでは、物体までの距離を、最小値2から最大値30の間に収め、センサの誤作動などでサーボモータに異常な数値が反映されないようにします。
そのほかの「2倍(2*)」や「加算(+30)」は、使用するサーボモータや、ロボットアームの構成に大きく依存します。
本記事で使用したロボットアームでは、34度〜90度が最適な動作角度だったため、この数値にしました。
皆さんも、実際にロボットアームを動作させながら、この数値を調整してください。
続くSerial.で始まる行は、算出した距離(cm)などを、シリアルポートを通して送信。このデータはArduino IDEのシリアルモニタで確認できます。
最後に、算出したサーボモータの回転角を、Servoオブジェクトに指定します。
myservo.write(servorotate); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there
角度はwrite()関数で指定します。
myservo.write()を実行すると、サーボモータのシャフトが指定された角度まで、回転を始めます。
次のdelay()で15ミリ秒間、スケッチの動作を停止してください。実際のサーボモータの動作は、プログラムの処理速度より遅いため、プログラムを止めて、動作が完了するのを待つ必要があります。
プログラムを停止する時間が短いと、サーボモータの動作が完了する前に、次の指示を送ってしまい、ロボットアームは思ったように動作しません。
また、停止時間が長いと、ロボットアームの反応が遅くなります。delay()関数に指定する数値は、実際の動作を見ながら調整します。
6. 仕上げ まずはサーボモータ1個から
ソースコードの実装が終わり、スケッチが完成したらArduinoボードに転送しましょう。
その後、一旦、パソコンにつながるUSBケーブルを取り外して、超音波センサ、サーボモータなどを次の手順で配線してください。
- 超音波センサ(HC-SR05)をデジタル入出力ピンの「2番」から「6番」に接続します。センサの「Vcc」が「6番」、「GND」が「2番」です。HC-SR05は、直接Arduinoボードのコネクタに接続でき、正しく取り付けられると、センサのオモテ面がArduinoボードの外側に向くはずです。
- サーボモータの「電源線」をArduinoボードの「5V」ピンに、「グランド線」を「GND」ピンに接続します。
- サーボモータの「信号線」を、デジタル入出力ピンの「9番」に接続します。
配線が終わったら、Arduinoボードを再びパソコンに接続してください。
いよいよ本番です。
手を超音波センサのすぐ前にかざしてみましょう。その手を遠ざけていくと、サーボモータのシャフトが回転し、ロボットアームが手を追いかけるはずです。
スケッチを調整して、思い通りにアームが動くようになったら、二つ目、三つ目と、制御するサーボモータを増やしていきましょう。
7. まとめ
ホビー用のサーボモータは、モータだけでなく、ギアや制御用の電子基板を内蔵し、信号線1本で思い通りに制御できるよう設計されています。
とはいえ、一昔前までマイコンボードからサーボモータを扱うのは、手間のかかる作業でした。
Arduinoでは、サーボモータを手軽に制御できるようにライブラリがあらかじめ用意されています。そのおかげで、複数のサーボモータを同時に制御するのも簡単になりました。
今回はロボットアームですが、サーボモータを十個以上使うような二足歩行ロボットの制御を行うのも夢ではありません。
なかなか手が出せなかったロボット製作も、今ではArduinoを使って簡単に作れるようになっています。Arduinoを使ったロボット制作を一緒に挑戦してみませんか?