電装講座 #4(最終回?) サーボモーター使ってみた

##はじめに
今回はサーボモーターを使ってみましょう。

##サーボモーターとは?
ただ、そもそもサーボモーターとは一体何者なのかわからない方も多いかと思います。まずはここから話していこうかと思います。
###どういうモーター?
そもそも「サーボモーター」とは一体何者でしょうか? 風貌からしてなんか強そうなイメージはありますが…

サーボモーターとは、「要求された角度を出すことに特化したモーター」です。

ミニ四駆とかのモーターは見たことはありますか?

電気を入れれば「ｳｲｰﾝ」と軽快な音を鳴らしながら、永遠に先端の棒が回り続けるモーターです。あのようなDCモーターと呼ばれるものは電気が流れていればずっと回り続けます。

一方で、サーボモーターは通信線から与えられた角度を基に出力する角度を決めていきます。もし90°なら完全に90°、45°なら45°といったモーターのことです。
###動作原理
サーボモーターには3つの線が伸びています。+極と-極、そして信号線です。サーボモータは基本的に信号線に送られてきた信号を使って角度を決めています。

では、どのように角度を決めているのかと言うと、パルス波を用いて角度を決めています。
<img width="579" alt="スクリーンショット 2019-10-30 9.27.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/72fd3628-93d0-81f5-a7f9-19232850c311.png">
だいたい20ms程度の時間の中に0.5~2msのパルス波が送られて、角度はこのパルス波の幅によって指定します。これを永遠と信号線に送り続けることで角度を変化させたり、一定に保ったりしています。

もちろん信号で角度を指定しているので、電源に繋ぐだけでは機能しません。
###バックラッシュ
実は、サーボモータは角度を正確に出してくれると言いましたが、半分あっていて半分間違っているんです。その理由はバックラッシュという現象があるからで、0°から90°にするのと180°から90°にするのでは少しだけ実際に出す角度にずれが生じます。

コントローラーの操舵に関してはこの違いというのが大きく出てしまうので、これを事前に測っておいて、どの方向でもきちんとした角度を出せるように修正を掛ける必要があります。

ただ、今回に関しては動かすだけなので無視します。(無慈悲)
##サーボモータを使ってみよう
###配線図
5V対応のものであれば、通信ピンを9番に、+と-に関しては5VとGNDに入れましょう。
もし、5V以上の電源が必要なものであれば配線図はこんな感じでいきましょう。

<img width="986" alt="スクリーンショット 2019-10-30 9.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/072acd61-64dd-a265-dcd0-f9e4f8aa2816.png">
5V以上が必要なサーボはArduinoの供給電源を用いると電圧不足で動作しません。なので、他の電源を用います。

ただ、ここで注意してもらいたいのは**絶対にArduinoに電源を通電させない**ことです。最悪の場合、ショート回路が見事に完成してパソコンが壊れます。

というか、壊しました。
###プログラム
プログラムは下のような感じで作成します。

```C:Arduino
#include<Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);

}

void loop() {
  myservo.write(120);
  delay(1000);
  
  myservo.write(90);
  delay(1000);
  
  myservo.write(60);
  delay(1000);
}
```

では、どのようなものか詳しく見てみましょう。

###クラス

最初にこのようなプログラムが存在します。

```C:Arduino
Servo myservo;
```

ここではクラスの設計を行っています。これは、1つのサーボについての定義をここで行っているという感じです。

実はサーボは12個まで付けることができます。これは、それぞれを指定して操作するためのチャンネルのようなものです。

今回はクラス名をmyservoというものにしています。

###.attach
setup内に以下のような文が存在します。

```C:Arduino
void setup() {
  myservo.attach(9);
}
```

これは[pinMode](https://qiita.com/GoshBird/items/078b19db33424d098b53#pinmode)の時のような感じで、ピンの割当を行っています。今回は9番ピンを指定しています。

###.write

ループ文に以下の文言もあります。

```C:Arduino
myservo.write(120);
```

これはサーボに120°の角度を出すというものです。 
結構カンタンに角度自体は出すことができます。

##可変抵抗器でサーボを操作してみよう
ここからは、今までの技術の融合になってきます。

###可変抵抗器とは?
![RV24YN20SB100K.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/8f74ecd5-6bbc-d79b-7a51-48e7b08b4978.jpeg)
可変抵抗器とは、上のような抵抗器のことを言います。これが何なのかと言うと、先端のつまみを回すことで抵抗値を変化させることができる抵抗器です。
これの使い方は、下の3つの導線が付けられそうなところの両端に5V、GNDを接続して、真ん中をアナログピンにつなぐことによって出力電圧をつまみによって変化させれるようになります。今回は正確に言うと、この電圧の変化を用いてサーボを動かしていきます。

###接続方法
接続方法は以下のようにしてみましょう。
<img width="1156" alt="スクリーンショット 2019-11-08 13.21.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/646798ab-c70f-0594-7562-81b32739dbda.png">
(可変抵抗器これしか見つからんかった。)

###ヒント
ただ、もう4回目でもあるのである程度考えて作ってもらおうかと考えています。実は今までに教えているもので、今回意図しているものは作成できます。だから、ちょっと自分で作ってみてください。答えは下に隠しておきますので、完成してから、どうしてもわからない時に見てみてください。

<details><summary>サンプルコード(答え)</summary><div>

```C:Arduino
#include <Servo.h>
#define R 0

Servo myservo;

int input = 90;
int deg =0;

void setup() {
  Serial.begin(9600);
  myservo.attach(9);
}

void loop() {
  deg = analogRead(R);
  deg /= 5.689;
  Serial.println(deg);
  myservo.write(deg);
}
```
もちろん、これは一例であって書き方はいくらでも存在します。
</div></details>

##おわりに
なんだか投げやりにはなっていますが、とりあえずはこれだけわかっていればArduinoを基本的に使うことには困らないかと思っています。
もし、これよりもハイレベルなものが作りたいといった考えがあるなら、ネットで調べてみてください。これはただただ投げやりな考えなのではなくて、Arduinoを使って初心者向けの教育ブログを書いている人はたくさん存在します。例えば、9軸ジャイロセンサーの作り方や、今話題のAIを織り交ぜたものなど、何かしら作りたいものの名前とArduinoを検索欄に書けば大抵出てきます。
ただ、そういった記事はわかりやすいようでわかりにくいことが多いです。でも、最低でもこの4回分のものができているのであれば、考えれば作れるようなものばかりです。
あとはあなたの考えた、あなたが作りたいものを作るだけです。

##参考文献
[サーボモータの制御](http://mitt.la.coocan.jp/pic/pic5_23.html)