サーボモータを使ってラジコンを操作したい。
モータを使った電子工作をしてみたい。
サーボモータのプログラム内容を理解したい。

こんな人達に、Arduinoのスタートキットを使って、初心者や子供にもわかる回路構成とプログラミング内容について紹介します。
ELEGOO社製のArduino互換品は非常に安価で製品も多数入っているため、初心者が最初に学ぶ際には非常におすすめです。

今回使用する部品

Arduino Uno
ブレッドボード
サーボモータ
ポテンショメータ
ジャンパ線
上記部品はArduinoのスタートキットに入っているので、それを使うのをお勧めします。
サーボモータ回路を製作してみる
ではサーボモータ回路を作ってみましょう。サーボモータは3本の線(信号線、電圧、GND)が接続されております。これらを接続しましょう。
今回信号線は9ピンに接続します。



以上で回路完成です!
超簡単です。

サーボモータプログラムを作成してみる
今回使用するプログラムはこちらになります。
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(9);
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
サーボモータを使用するために、最初にライブラリをインクルードしましょう!

ライブラリを管理で、Servo.hを検索してインストールすると完了です。

9ピンにサーボを接続するため、attach(9)でピン番号を設定します。

今回はfor文を使用しており、0~180°まで1°ずつ増加し、15ms保持するプログラムになっています。ですので、最初は初期値0°で15ms保持、1°で15ms保持、2°で15ms保持と1°ずつ角度が増加していきます。これを180°まで繰り返します。

1つ目のfor文が終わると、2つ目のfor文が来ます。ここでは、180°が初期値となり、-1°ずつ減少し、0°に戻ってくるプログラムになります。

これをLoop文で繰り返すため、0⇒180°⇒0°⇒180°・・・を繰り返すプログラムになります。また、この+<=1の数値を10等に変化することで、10°ずつ増加・減少するプログラムになりますので、そうすることで、このサーボモータの動く速度を変化することができます。
ではコンパイルしてマイコンボードに書き込んでみましょう。
動きましたか?最後に動画をのせているので、見てみてください。
ポテンショメータを使用してサーボモータを動かしてみる
次にポテンショメータを使ってサーボモータを動かしてみましょう。
ポテンショメータは可変抵抗器と呼ばれ、つまみを回すことで抵抗が変化し、出力値を調節することができます。今回はサーボモータをつまみを動かすことで、動かしていきたいと思います。
電圧をつなぐピンと、GNDとつなぐピン、アナログ出力するピンの3本の脚から構成されます。
ポテンショメータの電源とGNDを接続し、アナログ値をA0ピンに接続します。(A0ピンに接続し、つまみでコントロールしたアナログ値をanalogRead()で数値を検出します)

サーボモータも同様に信号線を9ピンに接続し、GND、5V電源を接続します。

ポテンショメータでサーボモータを駆動するプログラム作成
今回使用するプログラムはこちらになります。流れとしては、ポテンショメータを通った信号をanalogRead関数で読み取り、その数価をmap関数にて角度に換算し、サーボモータに出力している内容になります。
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9);
Serial.begin(9600);
}
void loop() {
int pos=analogRead(0);
int angle=map(pos,0,1023,0,180);
Serial.println(angle);
myservo.write(angle);
}
analogRead()
指定したアナログピンから値を読み取ります。これにより、0から5ボルトの入力電圧を0から1023の数値に変換することができます。分解能は1単位あたり4.9mVとなります。
map(value, fromLow, fromHigh, toLow, toHigh)
mapに入力したvalue(今回はpos)値を0~1023の数価を0~180(角度)に変換しています。
mapにて角度換算した値を、write()に記入することで、サーボモータの角度を変化させます。

実際に動かしてみましょう。
つまみを回すとサーボが動きました。
