できること

第57回 Arduinoでモータ再入門(その1)サーボモータの基本と使い方

※この記事は2017年3月16日に公開した記事を再編集し、2022年2月18日に再度公開しました。

DSC_0093

 

Arduinoで電子工作をするならやはりモータは外せない部品です。これまで、連載の中でもいくつかモータを扱ってデバイスなどを作成してきましたが、今回はおさらいの意味を込めて、特に利用頻度が高いと思われるサーボモータの基本から詳しい使い方までじっくりと腰を据えて取り組んでみたいと思います。

 

目次

  1. サーボモータってなに?
  2. サーボモータの種類と購入時のポイント
    1. 2.1. トルクの計算について
  3. 必要な電圧と電源
  4. Arduinoのプログラムでサーボ制御
  5. まとめ

 

 

 

1. サーボモータってなに?

写真1 サーボモータ

写真1 サーボモータ

サーボモータはモータの一種で、通常のモータと違い、主に回転角度を指定して回転させることを基本とします。さまざまな工場で利用されているほか、ホビー用途ではロボットの関節や、ラジコンのステアリングなどに利用されています。


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

出典:サーボモータ – wikipedia

 

wikipediaにもあるように、サーボモータは通常のモータに回転角度を検出する機能がついていて、その信号を通信することができるため、回転角度を制御することが可能です。また、サーボモータと第37回で出てきたステッピングモータなどとの違いをおさらいしてみると

  • モータ:電力をかけるとひたすら回る
  • サーボモータ:信号に応じて0度からN度の範囲で回転する
  • ステッピングモータ:信号に応じてモータを制限なく制御できる
  • ブラシレスモータ:安定した回転速度などの制御が可能(ドローンなどで利用されています)

となります。ですので、上記の用途に応じてモータを使い分けることが重要です。

写真2 色々なモータ(左からブラシレス、ステッピング、サーボ、通常のモータ)

写真2 色々なモータ(左からブラシレス、ステッピング、サーボ、通常のモータ)

 

2. サーボモータの種類と購入時のポイント

実際にサーボモータを使う場合、どのサーボモータを購入したら良いでしょうか?サーボモータを購入する際の基本ポイントとしては、

  • トルク:モータを動かす力、数値が大きければ大きいほど強い力になる(単位はkgf・cmなど)
  • 回転角度(制御角):モータを表示されている角度まで回すことが可能
  • 動作速度:モータを回転させるスピード
  • 動作電圧:動作させるための必要な電圧

基本、上記のポイントを抑えておけば、用途に応じたサーボモータを手に入れることができると思います。

 

2.1 トルクの計算について

サーボモータを扱う上で、もっとも大事なことはどれくらいの力で動かせるか(どれくらいのトルクが必要か)ということです。トルクは購入時にはkgf・cmやkgのみの単位で示されます。トルクの計算方法としてはkgf・cmの場合は1[cm]先でN[kg]のものを持ち上げられる力ということになります。

例として5kgのものを持ち上げたい場合、サーボモータの軸についている柄が2cmだと、5kgf × 2cm = 10kgf・cm以上のトルクが必要になります。

図1 トルクの計算方法

 

3. 必要な電圧と電源

サーボモータをArduinoで動かす場合、他のモータと同様にArduinoから取り出せる電圧や電流だと足りない場合がほとんどです。その場合は、外部に電源をとって、角度の制御信号のみArduinoから送信してサーボモータを制御してください。

本連載でよく利用しているArduino UNO R3ではI/Oピン(デジタル・アナログピン)は1つのピンから流せる電流が大体20mA(40mA以上流すと壊れる可能性)です。サーボモータの動作電圧が5Vでも、デジタル・アナログピンからの供給は電流が不足するためサーボモータやArduinoが壊れたり、サーボモータは動くが力が非常に弱いなどといった現象になりますので、利用する際には注意が必要です。ただし、5Vや3.3Vピンは絶対最大定格電流値(これ以上は流せない電流値)が200mAとなっているので、小さいサイズのサーボモータは利用することが可能となります。

例として、動作電圧が9Vのサーボモータの場合は、下記のような回路図でサーボモータにArduinoとは別の電源を供給する必要があります。

図2 Arduinoとサーボモータの回路

 

また、サーボモータの動作電圧が5Vなどの小さい場合で、Arduinoと電源を共用したい場合、下記のような回路で5Vから電流を引っ張ることが可能です。

図3 Arduinoとサーボモータの電源を一緒に供給

 

 

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)にしたものを利用します。

図4 サンプルスケッチの回路

 

写真4 サーボモータ制御回路

写真3 サーボモータ制御回路

 

 

図4 サーボモータのexample

図4 サーボモータのexample


/*
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. まとめ

今回、改めてサーボモータの基本をおさらいしました。次回は、実際にいろいろなサーボモータを使ってどんなことができるのかを考えてみたり、これまでの連載で未完成だったあのデバイス(!?)を完成に向けて取り組んでみたいと思います!

 

この連載の記事

cta_watering-machine
アバター画像

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。

NHK学生ロボコン2018