Project 11 ライントラッキングスマートカー

eff7a15e697e8b78bde391f806ea024d

1.説明

ライントラッキングセンサーの動作原理に基づき、ライントラッキングスマートカーを作成します。

このプロジェクトでは、スマートカーの底部に黒い線があるかどうかをライントラッキングセンサーで検出し、その検出結果に応じて2つのモーターグループの回転を制御し、スマートカーが黒い線に沿って走行するように制御します。

2.フローチャート

img

Img

3.配線図

88422b5f1464ad447e28ccbb8c39a8d4

ライントラッキングセンサーのG、V、S1、S2、S3はセンサー拡張ボードのG(GND)、V(VCC)、D11、D7、D8に接続します。

電源はBATポートに接続します。

4.テストコード

//*************************************************************************
/*
 keyestudio 4wd BT Car
 lesson 11
 Tracking Car
 http://www.keyestudio.com
*/ 
//Data from the smile pattern obtained from the touch tool
unsigned char start01[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
#define SDA_Pin  A4  //データピンをA4に設定
#define SCL_Pin  A5  //クロックピンをA5に設定

int left_ctrl = 2;//グループBモーターの方向制御ピンを定義
int left_pwm = 5;//グループBモーターのPWM制御ピンを定義
int right_ctrl = 4;//グループAモーターの方向制御ピンを定義
int right_pwm = 6;//グループAモーターのPWM制御ピンを定義
int sensor_L = 11;//左ライントラッキングセンサーのピンを定義
int sensor_M = 7;//中央ライントラッキングセンサーのピンを定義
int sensor_R = 8;//右ライントラッキングセンサーのピンを定義
int L_val,M_val,R_val;//これらの変数を定義

void setup() {
  Serial.begin(9600);//シリアルモニターを開始し、ボーレートを9600に設定
  pinMode(left_ctrl,OUTPUT);//グループBモーターの方向制御ピンをOUTPUTに設定
  pinMode(left_pwm,OUTPUT);//グループBモーターのPWM制御ピンをOUTPUTに設定
  pinMode(right_ctrl,OUTPUT);//グループAモーターの方向制御ピンをOUTPUTに設定
  pinMode(right_pwm,OUTPUT);//グループAモーターのPWM制御ピンをOUTPUTに設定
  pinMode(sensor_L,INPUT);//左ライントラッキングセンサーのピンをINPUTに設定
  pinMode(sensor_M,INPUT);//中央ライントラッキングセンサーのピンをINPUTに設定
  pinMode(sensor_R,INPUT);//右ライントラッキングセンサーのピンをINPUTに設定
  //ピンを出力に設定
  pinMode(SCL_Pin, OUTPUT);
  pinMode(SDA_Pin, OUTPUT);
  matrix_display(start01);//スタートパターンを表示
}

void loop() 
{
  tracking(); //メインプログラムを実行
}

void tracking()
{
  L_val = digitalRead(sensor_L);//左ライントラッキングセンサーの値を読み取る
  M_val = digitalRead(sensor_M);//中央ライントラッキングセンサーの値を読み取る
  R_val = digitalRead(sensor_R);//右ライントラッキングセンサーの値を読み取る

  if(M_val == 1){//中央のセンサーの状態が1の場合、黒い線を検出していることを意味する

```cpp
     if (L_val == 1 && R_val == 0) { //左側に黒い線が検出され、右側には検出されていない場合、左に曲がる
        left();
    }
     else if (L_val == 0 && R_val == 1) { //それ以外で、右側に黒い線が検出され、左側には検出されていない場合、右に曲がる
      right();
    }
     else { //それ以外は前進
      front();
    }
  }
  else { //中央に黒い線が検出されていない場合
    if (L_val == 1 && R_val == 0) { //左側に黒い線が検出され、右側には検出されていない場合、左に曲がる
      left();
    }
    else if (L_val == 0 && R_val == 1) { //それ以外で、右側に黒い線が検出され、左側には検出されていない場合、右に曲がる
      right();
    }
    else { //それ以外は停止
      Stop();
    }
  }
}
void front()//前進状態を定義
{
  digitalWrite(left_ctrl,HIGH);
  analogWrite(left_pwm,155);
  digitalWrite(right_ctrl,HIGH);
  analogWrite(right_pwm,155);
}
void back()//後退状態を定義
{
  digitalWrite(left_ctrl,LOW);
  analogWrite(left_pwm,100);
  digitalWrite(right_ctrl,LOW);
  analogWrite(right_pwm,100);
}
void left()//左折状態を定義
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm, 100);  
  digitalWrite(right_ctrl, HIGH);
  analogWrite(right_pwm, 155);
}
void right()//右折状態を定義
{
  digitalWrite(left_ctrl, HIGH);
  analogWrite(left_pwm, 155);
  digitalWrite(right_ctrl, LOW);
  analogWrite(right_pwm, 100);
}
void Stop()//停止状態を定義
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm,0);
  digitalWrite(right_ctrl, LOW);
  analogWrite(right_pwm,0);
}

//この関数はドットマトリックス表示に使用される
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  //データ転送開始条件を呼び出す関数
  IIC_send(0xc0);  //アドレス選択

  for (int i = 0; i < 16; i++) //パターンデータは16バイト
  {
    IIC_send(matrix_value[i]); //パターンのデータを送信
  }
  IIC_end();   //パターンデータ送信終了
  IIC_start();
  IIC_send(0x8A);  //表示制御、4/16パルス幅を選択
  IIC_end();
}
//データ送信開始の条件
void IIC_start()
{
  digitalWrite(SDA_Pin, HIGH);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, LOW);
}
//データ送信終了を示す
void IIC_end()
{
  digitalWrite(SCL_Pin, LOW);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, HIGH);
  delayMicroseconds(3);
}
//データ送信
void IIC_send(unsigned char send_data)
{
  for (byte mask = 0x01; mask != 0; mask <<= 1) //各バイトは8ビットで、最下位からビットごとにチェック
  {
    if (send_data & mask) { //バイトの各ビットが1か0かに応じてSDA_Pinの高低レベルを設定
      digitalWrite(SDA_Pin, HIGH);
    } else {
      digitalWrite(SDA_Pin, LOW);
    }
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, HIGH); //クロックピンSCL_Pinを高レベルにしてデータ送信を停止
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); //クロックピンSCL_Pinを低レベルにしてSDAの信号を変化させる
  }
}
//*************************************************************************

5.テスト結果

コードをV4.0ボードに正常にアップロードした後、配線図に従って配線を接続し、外部電源をオンにしてからDIPスイッチをONにします。すると、スマートカーはラインに沿って走行します。