### プロジェクト5: サーボ制御
#### **(1)概要:**
サーボモーターは位置制御型の回転アクチュエーターです。主にハウジング、回路基板、コアレスモーター、ギア、および位置センサーで構成されています。動作原理は、サーボがMCUまたは受信機から送られた信号を受け取り、周期20ms、幅1.5msの基準信号を生成します。次に、取得したDCバイアス電圧をポテンショメーターの電圧と比較し、電圧差の出力を得ます。
モーター速度が一定のとき、ポテンショメーターはカスケード減速ギアを通じて回転駆動され、電圧差が0になり、モーターは停止します。一般的に、サーボの回転角度範囲は0°~180°です。
サーボモーターの回転角度は、PWM(パルス幅変調)信号のデューティサイクルを調整することで制御されます。PWM信号の標準周期は20ms(50Hz)です。理論的には幅は1ms~2msの間で分布していますが、実際には0.5ms~2.5msの間です。この幅は0°から180°の回転角度に対応しています。なお、ブランドが異なるモーターでは、同じ信号でも異なる回転角度になる場合があります。

一般的に、サーボには茶色、赤色、オレンジ色の3本の線があります。茶色の線はGND、赤色の線はプラス極、オレンジ色の線は信号線です。

サーボの角度:

#### **(2)パラメーター:**
- 動作電圧: DC 4.8V \~ 6V
- 動作角度範囲: 約180°(500 → 2500 μsec)
- パルス幅範囲: 500 → 2500 μsec
- 無負荷速度: 0.12 ± 0.01 sec / 60(DC 4.8V) 0.1 ± 0.01 sec / 60(DC 6V)
- 無負荷電流: 200 ± 20mA(DC 4.8V) 220 ± 20mA(DC 6V)
- 停止トルク: 1.3 ± 0.01kg · cm(DC 4.8V) 1.5 ± 0.1kg · cm(DC 6V)
- 停止電流: ≦ 850mA(DC 4.8V) ≦ 1000mA(DC 6V)
- 待機電流: 3 ± 1mA(DC 4.8V) 4 ± 1mA(DC 6V)
#### **(3)接続図:**

注意: サーボの茶色、赤色、オレンジ色の線は、それぞれシールドのGnd(G)、5v(V)、10に接続します。サーボの電流が大きいため、外部電源を必ず接続してください。接続しない場合、開発ボードが焼損する可能性があります。
#### **(4)テストコード1:**
(**注意:** コードのアップロード前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用するため、Bluetoothのシリアル通信と競合し、アップロードが失敗する場合があります。)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 5.1
Servo
http://www.keyestudio.com
*/
#define servoPin 10 //サーボのピン
int pos; //サーボの角度の変数
int pulsewidth; //サーボのパルス幅の変数
void setup()
{
pinMode(servoPin, OUTPUT); //サーボのピンを出力に設定
procedure(0); //サーボの角度を0°に設定
}
void loop()
{
for (pos = 0; pos <= 180; pos += 1) // 1°から180°へ
{
// 1度ずつ増加
procedure(pos); // 'pos'の角度に回転
delay(15); //回転速度を制御
}
for (pos = 180; pos >= 0; pos -= 1) // 180°から1°へ
{
procedure(pos); // 'pos'の角度に回転
delay(15);
}
}
//サーボを制御する関数
void procedure(int myangle)
{
pulsewidth = myangle * 11 + 500; //パルス幅の値を計算
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulsewidth); //Highレベルの時間がパルス幅を表す
digitalWrite(servoPin, LOW);
delay((20 - pulsewidth / 1000)); //周期が20msのため、残りの時間はLowレベル
}
```
コードをアップロードすると、サーボが0°から180°へ動くのが確認できます。以降の章では、サーボの駆動方法について説明します。また、ArduinoのServoライブラリを使用してサーボを制御することもできます。
注意: このServoライブラリファイルはタイマー1を使用しており、IOポート9および10のPWM出力もタイマー1を使用しています。そのため、後でD9およびD10のPWM出力を使用する場合は、このServoライブラリを使用できません。
#### **(5)テストコード2:**
(注意: コードのアップロード前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用するため、BluetoothのシリアL通信と競合し、コードのアップロードが失敗する場合があります。)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 5.2
Servo
*/
#include
Servo myservo; // サーボを作成
int pos = 0; // 角度の変数を保存
void setup()
{
myservo.attach(10); //サーボをデジタルポート10に接続
}
void loop()
{
for (pos = 0; pos <= 180; pos += 1) //0°から180°へ
{
//ステップ長は1
myservo.write(pos); // 'pos'の角度に回転
delay(15); // 速度制御のため15ms待機
}
for (pos = 180; pos >= 0; pos -= 1) //180°から0°へ
{
myservo.write(pos); // 'pos'の角度に回転
delay(15); // 速度制御のため15ms待機
}
}
```
#### **(6)テスト結果:**
コードをアップロードし、電源を接続すると、サーボが0°から180°の範囲で動作します。

#### **(7)コードの説明:**
Arduinoには **\#include \**(サーボ関数と命令)が標準搭載されています。
以下はサーボ関数の一般的な命令の一部です:
1\. **attach(インターフェース)**——サーボのインターフェースを設定します。ポート9と10が使用可能です。
2\. **write(角度)**——サーボの回転角度を設定する命令で、角度範囲は0°から180°です。
3\. **read()**——サーボの角度を読み取る命令で、"write()"のコマンド値を読み取ります。
4\. **attached()**——サーボのパラメーターがそのインターフェースに送信されているかどうかを判定します。
注意: 上記の書式は「サーボ変数名.具体的な命令()」です。例: myservo.attach(10)