※この記事は2017年3月16日に公開した記事を再編集し、2022年2月18日に再度公開しました。
Arduinoで電子工作をするならやはりモータは外せない部品です。これまで、連載の中でもいくつかモータを扱ってデバイスなどを作成してきましたが、今回はおさらいの意味を込めて、特に利用頻度が高いと思われるサーボモータの基本から詳しい使い方までじっくりと腰を据えて取り組んでみたいと思います。
目次
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
1. サーボモータってなに?
サーボモータはモータの一種で、通常のモータと違い、主に回転角度を指定して回転させることを基本とします。さまざまな工場で利用されているほか、ホビー用途ではロボットの関節や、ラジコンのステアリングなどに利用されています。
サーボモータ(Servomotor)とはサーボ機構において位置、速度等を制御する用途に使用するモーターである。モーターの種類としては、「電動機」、「油圧モーター」など、特定のモーター形式を示すものではない。しかし、現在は、ロボット用途などに使用される「検出器付の電動機」で、フィードバック制御するものが一般的である。
wikipediaにもあるように、サーボモータは通常のモータに回転角度を検出する機能がついていて、その信号を通信することができるため、回転角度を制御することが可能です。また、サーボモータと第37回で出てきたステッピングモータなどとの違いをおさらいしてみると
- モータ:電力をかけるとひたすら回る
- サーボモータ:信号に応じて0度からN度の範囲で回転する
- ステッピングモータ:信号に応じてモータを制限なく制御できる
- ブラシレスモータ:安定した回転速度などの制御が可能(ドローンなどで利用されています)
となります。ですので、上記の用途に応じてモータを使い分けることが重要です。
2. サーボモータの種類と購入時のポイント
実際にサーボモータを使う場合、どのサーボモータを購入したら良いでしょうか?サーボモータを購入する際の基本ポイントとしては、
- トルク:モータを動かす力、数値が大きければ大きいほど強い力になる(単位はkgf・cmなど)
- 回転角度(制御角):モータを表示されている角度まで回すことが可能
- 動作速度:モータを回転させるスピード
- 動作電圧:動作させるための必要な電圧
基本、上記のポイントを抑えておけば、用途に応じたサーボモータを手に入れることができると思います。
2.1 トルクの計算について
サーボモータを扱う上で、もっとも大事なことはどれくらいの力で動かせるか(どれくらいのトルクが必要か)ということです。トルクは購入時にはkgf・cmやkgのみの単位で示されます。トルクの計算方法としてはkgf・cmの場合は1[cm]先でN[kg]のものを持ち上げられる力ということになります。
例として5kgのものを持ち上げたい場合、サーボモータの軸についている柄が2cmだと、5kgf × 2cm = 10kgf・cm以上のトルクが必要になります。
3. 必要な電圧と電源
サーボモータをArduinoで動かす場合、他のモータと同様にArduinoから取り出せる電圧や電流だと足りない場合がほとんどです。その場合は、外部に電源をとって、角度の制御信号のみArduinoから送信してサーボモータを制御してください。
本連載でよく利用しているArduino UNO R3ではI/Oピン(デジタル・アナログピン)は1つのピンから流せる電流が大体20mA(40mA以上流すと壊れる可能性)です。サーボモータの動作電圧が5Vでも、デジタル・アナログピンからの供給は電流が不足するためサーボモータやArduinoが壊れたり、サーボモータは動くが力が非常に弱いなどといった現象になりますので、利用する際には注意が必要です。ただし、5Vや3.3Vピンは絶対最大定格電流値(これ以上は流せない電流値)が200mAとなっているので、小さいサイズのサーボモータは利用することが可能となります。
例として、動作電圧が9Vのサーボモータの場合は、下記のような回路図でサーボモータにArduinoとは別の電源を供給する必要があります。
また、サーボモータの動作電圧が5Vなどの小さい場合で、Arduinoと電源を共用したい場合、下記のような回路で5Vから電流を引っ張ることが可能です。
4. Arduinoのプログラムでサーボ制御
サーボモータの制御には、Arduinoの場合、ざっと2種類の方法があります。サーボモータは本来、PWMというパルス信号をオンオフしてモータを制御する方法です(ステッピングモータの回でも紹介)。PWMで直接サーボモータを制御すると細かな動作の表現なども可能になりますが、プログラムとしては少し難易度が高くなるため、Arduinoで用意されているサーボモータ用のライブラリを利用することをお勧めします。
Arduino IDE – [ファイル] – [スケッチの例] – [10.StarterKit BasicKit] – [p05_ServoMoodindicator]
このサンプルでは、アナログ0番ピン(A0)の入力値をもとにサーボモータの角度を変えることができるプログラムになっています。アナログピンにはボリュームスイッチなどの可変抵抗や光センサなどを利用することで、数値が変化した際にサーボモータも動くようにしてみてください。
サーボモータライブラリの関数
サーボモータのライブラリはサーボモータに送る制御信号のピン番号の指定と、サーボモータを動かす際の角度指定の2種類の命令が基本となります。
myServo.attach(9); //サーボモータの信号ピンを指定
myServo.write(angle); //サーボモータを指定の角度(angle)まで動かす
下記の回路はFEETECH FS90 マイクロサーボを使った例です。このサーボモータの動作電圧は6V、動作時の電流は200mAなのでサーボモータの電源は単3電池を4本直列(6V)にしたものを利用します。
/* Arduino Starter Kit example Project 5 - Servo Mood Indicator This sketch is written to accompany Project 5 in the Arduino Starter Kit Parts required: servo motor 10 kilohm potentiometer 2 100 uF electrolytic capacitors Created 13 September 2012 by Scott Fitzgerald http://www.arduino.cc/starterKit This example code is part of the public domain */ // include the servo library #include <Servo.h> Servo myServo; // create a servo object int const potPin = A0; // analog pin used to connect the potentiometer int potVal; // variable to read the value from the analog pin int angle; // variable to hold the angle for the servo motor void setup() { myServo.attach(9); // attaches the servo on pin 9 to the servo object Serial.begin(9600); // open a serial connection to your computer } void loop() { potVal = analogRead(potPin); // read the value of the potentiometer // print out the value to the serial monitor Serial.print("potVal: "); Serial.print(potVal); // scale the numbers from the pot angle = map(potVal, 0, 1023, 0, 179); // print out the angle for the servo motor Serial.print(", angle: "); Serial.println(angle); // set the servo position myServo.write(angle); // wait for the servo to get there delay(15); }
5. まとめ
今回、改めてサーボモータの基本をおさらいしました。次回は、実際にいろいろなサーボモータを使ってどんなことができるのかを考えてみたり、これまでの連載で未完成だったあのデバイス(!?)を完成に向けて取り組んでみたいと思います!
この連載の記事
- 第57回 Arduinoでモータ再入門(その1)サーボモータの基本(このページの記事)
- 第58回 Arduinoでモーター再入門(その2)サーボモーターを遠隔で制御する!
- 第59回 Arduinoでモーター再入門(その3)サーボモーターを使ったデバイスに再チャレンジ!