### プロジェクト14:ライントラッキングタンク
#### **(1)概要:**
前のプロジェクトでは、スマートカーを特定のスペース内で移動させる方法を紹介しました。このプロジェクトでは、これまでに学んだ知識を活用して、ライントラッキングスマートカーを作成します。実験では、ライントラッキングセンサーを使用してスマートカーの周囲に黒線があるかどうかを検出し、その検出結果に基づいて2つのモーターの回転を制御することで、スマートカーが黒線に沿って移動できるようにします。
ライントラッキングスマートカーの具体的なロジックを以下の表に示します:
| センサー | 検出内容 |
| :--------------------------------: | :----------------------------------------------------------: |
| 中央のライントラッキングセンサー | 黒線を検出:ハイレベル
白線を検出:ローレベル |
| 左のライントラッキングセンサー | 黒線を検出:ハイレベル
白線を検出:ローレベル |
| 右のライントラッキングセンサー | 黒線を検出:ハイレベル
白線を検出:ローレベル |
| 条件1 | 条件2 | 動作 |
| :----------------------------------------------------------: | :----------------------------------------------------------: | :------------------------------: |
| 中央のライントラッキングセンサーが
黒線を検出 | 左のライントラッキングセンサーが黒線を検出
かつ
右のセンサーが白線を検出 | 左回転
PWMを200に設定 |
| 中央のライントラッキングセンサーが
黒線を検出 | 左のライントラッキングセンサーが白線を検出
かつ
右のセンサーが黒線を検出 | 右回転
PWMを200に設定 |
| 中央のライントラッキングセンサーが
黒線を検出 | 左右両方のライントラッキングセンサーが白線を検出
または
左右両方が黒線を検出 | 前進 |
| 中央のライントラッキングセンサーが
白線を検出 | 左のライントラッキングセンサーが黒線を検出
かつ
右のセンサーが白線を検出 | 左回転
PWMを200に設定 |
| 中央のライントラッキングセンサーが
白線を検出 | 左のライントラッキングセンサーが白線を検出
かつ
右のセンサーが黒線を検出 | 右回転
PWMを200に設定 |
| 中央のライントラッキングセンサーが
白線を検出 | 左右両方のライントラッキングセンサーが白線を検出
または
左右両方のライントラッキングセンサーが黒線を検出 | 停止 |
#### **(2)フローチャート:**

#### **(3)配線図:**

#### **(4)テストコード:**
(**注意:** コードをアップロードする前にBluetoothモジュールを接続しないでください。コードのアップロードもシリアル通信を使用するため、Bluetoothシリアル通信と競合が発生し、アップロードが失敗する可能性があります。)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 14
Line track tank
http://www.keyestudio.com
*/
//ライントラッキングセンサーの配線
#define L_pin 11 //左
#define M_pin 7 //中央
#define R_pin 8 //右
#define ML_Ctrl 4 //左モーターの方向制御ピンを定義
#define ML_PWM 6 //左モーターのPWM制御ピンを定義
#define MR_Ctrl 2 //右モーターの方向制御ピンを定義
#define MR_PWM 5 //右モーターのPWM制御ピンを定義
int L_val, M_val, R_val;
void setup()
{
Serial.begin(9600); //ボーレートを9600に設定
pinMode(L_pin, INPUT); //ライントラッキングセンサーの全ピンを入力モードに設定
pinMode(M_pin, INPUT);
pinMode(R_pin, INPUT);
pinMode(ML_Ctrl, OUTPUT);
pinMode(ML_PWM, OUTPUT);
pinMode(MR_Ctrl, OUTPUT);
pinMode(MR_PWM, OUTPUT);
}
void loop ()
{
L_val = digitalRead(L_pin); //左センサーの値を読み取る
M_val = digitalRead(M_pin); //中央センサーの値を読み取る
R_val = digitalRead(R_pin); //右センサーの値を読み取る
if (M_val == 1) { //中央センサーが黒線を検出
if (L_val == 1 && R_val == 0) //左で黒線を検出し、右では検出しない場合、左折
{
Car_left();
}
else if (L_val == 0 && R_val == 1) //右で黒線を検出し、左では検出しない場合、右折
{
Car_right();
}
else //それ以外の場合、前進
{
Car_front();
}
}
else //中央センサーが黒線を検出しない
{
if (L_val == 1 && R_val == 0) //左で黒線を検出し、右では検出しない場合、左折
{
Car_left();
}
else if (L_val == 0 && R_val == 1) //右で黒線を検出し、左では検出しない場合、右折
{
Car_right();
}
else //それ以外の場合、停止
{
Car_Stop();
}
}
}
//前進
void Car_front()
{
digitalWrite(MR_Ctrl, HIGH);
analogWrite(MR_PWM, 100);
digitalWrite(ML_Ctrl, HIGH);
analogWrite(ML_PWM, 100);
}
//後退
void Car_back()
{
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 150);
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 150);
}
//左折
void Car_left()
{
digitalWrite(MR_Ctrl, HIGH);
analogWrite(MR_PWM, 100);
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 150);
}
//右折
void Car_right()
{
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 150);
digitalWrite(ML_Ctrl, HIGH);
analogWrite(ML_PWM, 100);
}
//停止
void Car_Stop()
{
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 0);
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 0);
}
```
#### **(5)テスト結果:**
テストコードのアップロードが成功し、電源を入れると、スマートカーは黒線に沿って移動します。
