Arduino実習編 その1 サーボモーターの使い方

宮崎県立都城工業高等学校 ロボット競技部はJLCPCBのスポンサーを受けています。

![JLCPCB-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881936/95c7a9ff-fa58-b4a1-79ed-3a482406b7c4.png)

PCB発注ならJLCPCB!!　最近需要が高まっている多層(6層など)PCB作成も出来ます。
現在たった**2ドル**で5枚、2層、サイズ 10cmx10cmどの色のPCBでもJLCPCBで発注できます！
**新規ユーザーは$60クーポンを獲得できるそうです**。この機会に発注してみてはいかがですか？

英語発注システム
https://jlcpcb.com/JPV/
日本語発注システム
https://jlcpcb.com/jp/

https://x.com/JLCPCB_Japan

# サーボモーターとは何か

サーボモーターとは、一般的なDCモーターとは違い、
- 任意の角度まで動作させることができる。
- 電圧をかけただけでは、動かない
- 0度から180度、又は360度までしか動かない

など色々とあります。

## 準備する物
- ArduinoUno or Mega2560
- サーボモーター(今回はGWS S03T 2BB)
- ピン メス to メス  

![IMG_20240918_212332.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881936/bdb89915-1d2a-301d-3831-005b6d57d71a.jpeg)


### 配線

黒 = GND
赤 = VCC +5V
黄 = デジタルピン(3)

![IMG_20240918_212358.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881936/27fe8f69-5b91-fcab-5e92-f89ea13065a0.jpeg)


![IMG_20240918_212443.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881936/c2a44c1b-794d-b2e5-c04f-486d68133715.jpeg)




#### ArduinoのPWM制御でサーボモーターを動かす方法

早速ですが、ArduinoのPWM制御を使って、サーボモーターを動作させて行きたいと思います。

動作させるには、Arduinoの標準ライブラリで入っているServo.hを使います。(のちに回転速度を変えられるライブラリ Var Spped Servoも紹介します)

``` Servo.h

#include <Servo.h>

Servo myServo;  // サーボモーターのオブジェクトを作成

void setup() {
  myServo.attach(3);  // サーボモーターをデジタルピン9に接続
}

void loop() {
  // 180度から0度に移動
    myServo.write(180);
  delay(1000);  // 1秒停止
  
  // 0度から180度に移動
    myServo.write(0);
  delay(1000);  // 1秒停止
}
```

```
#include <Servo.h>
```
Arduinoでサーボモーターを簡単に制御するために使用される「Servoライブラリ」をプログラムに読み込むためのコードです

サーボモーターを制御するための「道具箱」をプログラムに持ち込むようなものです。道具箱があれば、必要な道具（サーボモーターを動かす機能）を取り出して使える、というわけなのです。

```
Servo myServo;  // サーボモーターのオブジェクトを作成
```

**Servo myServo;** と書くことで、**myServo**というサーボモーターを操作するための変数が作られます。この変数を使って、サーボモーターに命令を送ります。たとえば、「特定の角度に動かす」や「サーボを初期化する」といった操作を、この**myServo**を通じて行います。

```
void setup() {
  myServo.attach(3);  // サーボモーターをデジタルピン9に接続
}
```

**myServo.attach(3);**は、先ほど作成したサーボモーターのオブジェクト **myServo** を、Arduinoのデジタルピン3に接続するための命令です。これによって、Arduinoのデジタルピン3に物理的に接続されたサーボモーターを制御できるようになります。

```
void loop() {
  // 180度から0度に移動
    myServo.write(180);
  delay(1000);  // 1秒停止
  
  // 0度から180度に移動
    myServo.write(0);
  delay(1000);  // 1秒停止
}
```

1. **void loop()** とは？
loop()関数は、Arduinoプログラムの「メインループ」にあたる部分です。プログラムがスタートした後、ここに書かれたコードがずっと繰り返し実行されます。
2. **myServo.write(180);**
この命令は、サーボモーターを180度の位置に移動させるものです。myServoは前に作成したサーボモーターのオブジェクトで、write(角度)で指定された角度にモーターを移動させます。
180度に設定することで、サーボモーターが最大の位置（180度）まで回転します。
3. **delay(1000);**
delay(1000)は、1000ミリ秒（1秒）だけ動作を一時停止する命令です。サーボモーターが180度まで移動した後、このdelay命令により1秒間停止します。
4. **myServo.write(0);**
ここでは、サーボモーターを0度の位置に移動させています。つまり、サーボモーターが180度から反対方向の0度まで回転します。
5. **delay(1000);**
サーボモーターが0度に到達した後、もう一度1秒間停止します。

**どう動くか**

最初に180度までサーボモーターを回転させ、1秒間停止します。
その後、0度まで反転し、再度1秒停止します。
この動作を永遠に繰り返します。

コードをArduinoに書き込ん、動作してる映像になります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/wrRIeNZa7nQ?si=Fbl1uoptPERIrZbn" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

**みやざきテクノフェア**(2024/11/8,11/9開催) という大会に向けて、機体の設計をしており、サーボモーターもたくさん使っているので、ロボットの動作などは**みやざきテクノフェア**で見ることができます。とてもロマンのある機体を皆さんに見せられたらと思っています。お楽しみに。ここまでご覧いただきありがとうございました。