### プロジェクト5: サーボ制御 #### **(1)概要:** サーボモーターは位置制御型の回転アクチュエーターです。主にハウジング、回路基板、コアレスモーター、ギア、および位置センサーで構成されています。動作原理は、サーボがMCUまたは受信機から送られた信号を受け取り、周期20ms、幅1.5msの基準信号を生成します。次に、取得したDCバイアス電圧をポテンショメーターの電圧と比較し、電圧差の出力を得ます。 モーター速度が一定のとき、ポテンショメーターはカスケード減速ギアを通じて回転駆動され、電圧差が0になり、モーターは停止します。一般的に、サーボの回転角度範囲は0°~180°です。 サーボモーターの回転角度は、PWM(パルス幅変調)信号のデューティサイクルを調整することで制御されます。PWM信号の標準周期は20ms(50Hz)です。理論的には幅は1ms~2msの間で分布していますが、実際には0.5ms~2.5msの間です。この幅は0°から180°の回転角度に対応しています。なお、ブランドが異なるモーターでは、同じ信号でも異なる回転角度になる場合があります。 ![](media/69be958142b773acdae33eeef12afed7.png) 一般的に、サーボには茶色、赤色、オレンジ色の3本の線があります。茶色の線はGND、赤色の線はプラス極、オレンジ色の線は信号線です。 ![](media/49467dfa70799401a5a5acc691014aee.png) サーボの角度: ![](media/ddc74f62dc936c925d28d70a1a9c2214.png) #### **(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)接続図:** ![](media/5120d0b422a1d0b1f1ba075aa5911c25.png) 注意: サーボの茶色、赤色、オレンジ色の線は、それぞれシールドの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°の範囲で動作します。 ![](./media/img-20240117090810.png) #### **(7)コードの説明:** Arduinoには **\#include \**(サーボ関数と命令)が標準搭載されています。 以下はサーボ関数の一般的な命令の一部です: 1\. **attach(インターフェース)**——サーボのインターフェースを設定します。ポート9と10が使用可能です。 2\. **write(角度)**——サーボの回転角度を設定する命令で、角度範囲は0°から180°です。 3\. **read()**——サーボの角度を読み取る命令で、"write()"のコマンド値を読み取ります。 4\. **attached()**——サーボのパラメーターがそのインターフェースに送信されているかどうかを判定します。 注意: 上記の書式は「サーボ変数名.具体的な命令()」です。例: myservo.attach(10)