### プロジェクト8: モーター駆動と速度制御
#### **(1)説明:**
モーターを駆動する方法はたくさんあります。このスマートカーは、L298Pと呼ばれる最も一般的なソリューションを使用しています。STMicroelectronicsが製造するL298Pは、高出力モーターを駆動するために特別に設計された優れた駆動チップです。
DCモーター、2相および4相モーターを直接駆動でき、駆動電流は2Aに達します。また、モーターの出力端子には保護として8つの高速ショットキーダイオードが採用されています。
L298P回路をベースにした拡張ボードを設計しており、積層設計によりUNO R3ボードに直接差し込んで使用することができ、ユーザーがモーターを使用・駆動する際の技術的な困難を軽減します。
拡張ボードをボードに重ね、BATに電源を入れ、DIPスイッチをON側に切り替えると、外部電源を介して拡張ボードとUNO R3ボードに同時に電源が供給されます。
配線を容易にするため、拡張ボードには逆接防止インターフェース(PH2.0 -2P -3P -4P -5P)が装備されており、モーター、電源、センサー/モジュールを直接接続することができます。
駆動拡張ボードのBluetoothインターフェースは、Keyestudio HM-10 Bluetoothモジュールと完全に互換性があります。そのため、接続時にHM-10 Bluetoothモジュールを対応するインターフェースに挿入するだけです。
同時に、駆動拡張ボードは2.54ピンヘッダーを使用して、利用可能なデジタルポートとアナログポートを拡張しているため、他のセンサーを追加して拡張実験を続けることができます。
拡張ボードには4つのDCモーターを接続できます。デフォルトのジャンパーキャップ接続モードでは、AとA1、BとB1インターフェースのモーターは並列接続されており、動作パターンは同じです。8つのジャンパーキャップを使用して、4つのモーターインターフェースの回転方向を制御できます。
例えば、モーターAインターフェース前面の2つのジャンパーキャップを横接続から縦接続に変更すると、モーターAの回転方向が元の方向と逆になります。


#### **(2)パラメーター:**
- ロジック部入力電圧: DC 5V
- 駆動部入力電圧: DC 7-12V
- ロジック部動作電流: ≤36mA
- 駆動部動作電流: ≤ 2A
- 最大消費電力: 25W (T=75℃)
- 制御信号入力レベル:
ハイレベル: 2.3V ≤ Vin ≤ 5V
ローレベル: 0V ≤ Vin ≤ 1.5V
- 動作温度: -25℃~+130℃
#### **(3)ロボットを動かす**
モーターAの方向ピンはD2、速度制御ピンはD5です。モーターBの方向ピンはD4、速度制御ピンはD6です。
以下の表から、デジタルポートとPWMポートを通じて2つのモーターの回転を制御することにより、ロボットの動きを制御する方法がわかります。PWM値の範囲は0〜255で、値が大きいほどモーターの回転が速くなります。
| 機能 | D4 | D6(PWM) | モーター(左)B | D2 | D5(PWM) | モーター(右)A |
| :------: | :--: | :-------: | :-------------: | :--: | :-------: | :-------------: |
| 前進 | HIGH | 255-200 | 左回転 | HIGH | 255-200 | 左回転 |
| 後退 | LOW | 200 | 右回転 | LOW | 200 | 右回転 |
| 左折 | LOW | 200 | 右回転 | HIGH | 255-200 | 左回転 |
| 右折 | HIGH | 255-200 | 左回転 | LOW | 200 | 右回転 |
| 停止 | LOW | 0 | 停止 | LOW | 0 | 停止 |
#### **(4)接続図:**

注意:
4ピンコネクタにはA、A1、B1、Bと表示されています。右後部モーターは8833ボードのBに接続され、左前部モーターはAポートに接続されています。
#### **(5)テストコード:**
(**注意:** コードをアップロードする前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用しており、Bluetoothシリアル通信と競合が発生し、アップロードが失敗する可能性があります。)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 8.1
motor driver
http://www.keyestudio.com
*/
#define ML_Ctrl 4 // 左モーターの方向制御ピンを定義する
#define ML_PWM 6 // 左モーターのPWM制御ピンを定義する
#define MR_Ctrl 2 // 右モーターの方向制御ピンを定義する
#define MR_PWM 5 // 右モーターのPWM制御ピンを定義する
void setup()
{
pinMode(ML_Ctrl, OUTPUT);// 左モーターの方向制御ピンをOUTPUTとして定義する
pinMode(ML_PWM, OUTPUT);// 左モーターのPWM制御ピンをOUTPUTとして定義する
pinMode(MR_Ctrl, OUTPUT);// 右モーターの方向制御ピンをOUTPUTとして定義する
pinMode(MR_PWM, OUTPUT);// 右モーターのPWM制御ピンをOUTPUTとして定義する
}
void loop()
{
// 前進
digitalWrite(ML_Ctrl, HIGH); // 左モーターの方向制御速度をHIGHに設定する
analogWrite(ML_PWM, 55); // 左モーターのPWM制御速度は55
digitalWrite(MR_Ctrl, HIGH); // 右モーターの方向制御速度をHIGHに設定する
analogWrite(MR_PWM, 55); // 右モーターのPWM制御速度は55
delay(2000);// 2秒間待機
// 後退
digitalWrite(ML_Ctrl, LOW); // 左モーターの方向制御速度をLOWに設定する
analogWrite(ML_PWM, 200); // 左モーターのPWM制御速度は200
digitalWrite(MR_Ctrl, LOW); // 右モーターの方向制御速度をLOWに設定する
analogWrite(MR_PWM, 200); // 右モーターのPWM制御速度は200
delay(2000);// 2秒間待機
// 左折
digitalWrite(ML_Ctrl, LOW); // 左モーターの方向制御速度をLOWに設定する
analogWrite(ML_PWM, 200); // 左モーターのPWM制御速度は200
digitalWrite(MR_Ctrl, HIGH); // 右モーターの方向制御速度をHIGHに設定する
analogWrite(MR_PWM, 55); // 右モーターのPWM制御速度は55
delay(2000);// 2秒間待機
// 右折
digitalWrite(ML_Ctrl, HIGH); // 左モーターの方向制御速度をHIGHに設定する
analogWrite(ML_PWM, 55); // 左モーターのPWM制御速度は55
digitalWrite(MR_Ctrl, LOW); // 右モーターの方向制御速度をLOWに設定する
analogWrite(MR_PWM, 200); // 右モーターのPWM制御速度は200
delay(2000);// 2秒間待機
// 停止
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 0); // 左モーターのPWM制御速度は0
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 0); // 右モーターのPWM制御速度は0
delay(2000);// 2秒間待機
}
```
#### **(6)テスト結果:**
図に従って配線し、テストコードをアップロードして電源を入れると、

スマートカーは2秒間前進し、2秒間後退し、2秒間左折し、2秒間右折し、2秒間停止し、この動作を繰り返します。
#### **(7)コード説明:**
**digitalWrite(ML_Ctrl,LOW);**
ハイレベルとローレベルの切り替えにより、モーターを時計回りまたは反時計回りに回転させることができます。これらの動作を制御するには、一般的なデジタルピンを使用できます。
**analogWrite(ML_PWM,200);**
モーターの速度調整はPWMによって実現されており、モーターの速度を制御するピンはArduinoのPWMピンである必要があります。
#### **(8)応用プロジェクト:**
PWMを制御することでモーターの速度を調整します。配線は同じです。
**テストコード**
(**注意:** コードをアップロードする前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用しており、Bluetoothシリアル通信と競合が発生し、アップロードが失敗する可能性があります。)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 8.2
motor driver pwm
http://www.keyestudio.com
*/
#define ML_Ctrl 4 // 左モーターの方向制御ピンを定義する
#define ML_PWM 6 // 左モーターのPWM制御ピンを定義する
#define MR_Ctrl 2 // 右モーターの方向制御ピンを定義する
#define MR_PWM 5 // 右モーターのPWM制御ピンを定義する
void setup()
{
pinMode(ML_Ctrl, OUTPUT);// 左モーターの方向制御ピンをOUTPUTとして定義する
pinMode(ML_PWM, OUTPUT);// 左モーターのPWM制御ピンをOUTPUTとして定義する
pinMode(MR_Ctrl, OUTPUT);// 右モーターの方向制御ピンをOUTPUTとして定義する
pinMode(MR_PWM, OUTPUT);// 右モーターのPWM制御ピンをOUTPUTとして定義する
}
void loop()
{
// 前進
digitalWrite(ML_Ctrl, HIGH); // 左モーターの方向制御速度をHIGHに設定する
analogWrite(ML_PWM, 155); // 左モーターのPWM制御速度は155
digitalWrite(MR_Ctrl, HIGH); // 右モーターの方向制御速度をHIGHに設定する
analogWrite(MR_PWM, 155); // 右モーターのPWM制御速度は155
delay(2000);// 2秒間待機
// 後退
digitalWrite(ML_Ctrl, LOW); // 左モーターの方向制御速度をLOWに設定する
analogWrite(ML_PWM, 100); // 左モーターのPWM制御速度は100
digitalWrite(MR_Ctrl, LOW); // 右モーターの方向制御速度をLOWに設定する
analogWrite(MR_PWM, 100); // 右モーターのPWM制御速度は100
delay(2000);// 2秒間待機
// 左折
digitalWrite(ML_Ctrl, LOW); // 左モーターの方向制御速度をLOWに設定する
analogWrite(ML_PWM, 100); // 左モーターのPWM制御速度は100
digitalWrite(MR_Ctrl, HIGH); // 右モーターの方向制御速度をHIGHに設定する
analogWrite(MR_PWM, 155); // 右モーターのPWM制御速度は155
delay(2000);// 2秒間待機
// 右折
digitalWrite(ML_Ctrl, HIGH); // 左モーターの方向制御速度をHIGHに設定する
analogWrite(ML_PWM, 155); // 左モーターのPWM制御速度は155
digitalWrite(MR_Ctrl, LOW); // 右モーターの方向制御速度をLOWに設定する
analogWrite(MR_PWM, 100); // 右モーターのPWM制御速度は100
delay(2000);// 2秒間待機
// 停止
digitalWrite(ML_Ctrl, LOW); // 左モーターの方向制御速度をLOWに設定する
analogWrite(ML_PWM, 0); // 左モーターのPWM制御速度は0
digitalWrite(MR_Ctrl, LOW); // 右モーターの方向制御速度をLOWに設定する
analogWrite(MR_PWM, 0); // 右モーターのPWM制御速度は0
delay(2000);// 2秒間待機
}
```
コードをアップロードすると、モーターの速度が遅くなります。
電流が低いとモーターの回転が遅くなります。