07循跡車

// #include <SoftwareSerial.h>

// SoftwareSerial BT(0,1); // 接收腳(RX), 傳送腳(TX);接HC-06之TXD、RXD;先不要用0,1,因為USB用

const int SRight = 2; //右感測器輸入腳

const int SLeft = 3; //左感測器輸入腳

const int ena = 5;

const int enb = 6;

const int motorIn1 = 10;

const int motorIn2 = 11;

const int motorIn3 = 12;

const int motorIn4 = 13;

char val; // variable to receive data from the serial port(bluetooth)

int SRR; //右感測器狀態

int SLL; //左感測器狀態

//int power;

byte byteSensorStatus=0;

//#define SENSOR_L 2;

//#define SENSOR_R 1;

void setup()

{

// Serial.begin(9600);

// BT.begin(9600);

pinMode(SLeft, INPUT);

pinMode(SRight, INPUT);

pinMode(ena, OUTPUT);

pinMode(enb, OUTPUT);

pinMode(motorIn1, OUTPUT);

pinMode(motorIn2, OUTPUT);

pinMode(motorIn3, OUTPUT);

pinMode(motorIn4, OUTPUT);

// power=140;

}

void loop(){

byteSensorStatus = 0;

// 讀取感測器狀態值

SRR = digitalRead(SRight);

if(SRR == 1)

byteSensorStatus = (byteSensorStatus | (0x01 << 1));

SLL = digitalRead(SLeft);

if(SLL == 1)

byteSensorStatus = (byteSensorStatus | 0x01);

// Serial.println(byteSensorStatus, HEX);

switch(byteSensorStatus)

{ //   感測器黑色:0  白色:1

case 0: // SL:0 SR:0

forward() ;

break;

case 1: // SL:1 SR:0 //no used

right();

break;

case 2: // SL:0 SR:1 //no used

left();

break;

case 3: // SL:1 SR:1

motorstop();

break;

}

}

void motorstop()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW);

analogWrite(ena,0);//0停止;值介於40-255

analogWrite(enb,0);//0停止;值介於40-255

}

void forward()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

analogWrite(ena,80);//0停止;值介於40-255

analogWrite(enb,80);//0停止;值介於40-255

}

void backward()

{

digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, HIGH);

digitalWrite(motorIn4, LOW);

analogWrite(ena,100);//0停止;值介於40-255

analogWrite(enb,100);//0停止;值介於40-255

}

// Let right motor keep running, but stop left motor

void right()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

analogWrite(ena,80);//0停止;值介於40-255

analogWrite(enb,80);//0停止;值介於40-255

}

// Let left motor keep running, but stop right motor

void left()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW);

analogWrite(ena,80);//0停止;值介於40-255

analogWrite(enb,80);//0停止;值介於40-255

}

---------------------------------

利用藍牙手機遙控,增加一個「循跡車」的按鈕,2016/01/20成功

參考資料http://ir.lib.cyut.edu.tw:8080/retrieve/32292/001a.pdf P53頁

#include <SoftwareSerial.h>

SoftwareSerial BT(0,1); // 接收腳(RX), 傳送腳(TX);接HC-06之TXD、RXD;先不要用0,1,因為USB用

const int SRightRight = 2; //右紅外線感測器輸入腳

const int SLeftLeft = 3; //左紅外線感測器輸入腳

const int ena = 5; //控制馬達轉速(L298N)

const int enb = 6; //控制馬達轉速(L298N)

const int motorIn1 = 10; //控制馬達正反轉(L298N)

const int motorIn2 = 11; //控制馬達正反轉(L298N)

const int motorIn3 = 12; //控制馬達正反轉(L298N)

const int motorIn4 = 13; //控制馬達正反轉(L298N)

char val; // variable to receive data from the serial port(bluetooth)

int power; //馬達轉速 (0~255)

byte sw=1,flag=1;

byte byteSensorStatus=0;

void setup()

{

// Serial.begin(9600);

BT.begin(9600);

pinMode(SLeftLeft, INPUT);

pinMode(SRightRight, INPUT);

pinMode(ena, OUTPUT);

pinMode(enb, OUTPUT);

pinMode(motorIn1, OUTPUT);

pinMode(motorIn2, OUTPUT);

pinMode(motorIn3, OUTPUT);

pinMode(motorIn4, OUTPUT);

power=100;

}

void loop()

{

if(sw==0 && flag==0)

{

int nIRStatus;

byteSensorStatus = 0; //清除感測器狀態值

nIRStatus = digitalRead(SLeftLeft); // 讀取左感測器狀態值

if(nIRStatus == 1)

byteSensorStatus = (byteSensorStatus | (0x01 << 1));

nIRStatus = digitalRead(SRightRight); // 讀取右感測器狀態值

if(nIRStatus == 1)

byteSensorStatus = (byteSensorStatus | 0x01);

drivemotor(byteSensorStatus);

}

if(BT.available() ) {

val=BT.read();

switch(val)

{

case 'f': // car forward

forward();

break;

case 'b': // car backward

backward();

break;

case 'l': // car turn left

left();

break;

case 'r': // car turn right

right();

break;

case 's': // car stop

motorstop();

flag=1;

break;

case 'v' :

lowspeed();

break;

case 'w' :

lmspeed();

break;

case 'x' :

midspeed();

break;

case 'y' :

hmspeed();

break;

case 'z' :

highspeed();

break;

case 't' :

{

if(sw==0)

{

sw=1;

}

if(sw==1)

{

sw=0;

flag=0;

}

break;

}

}

}

}

void motorstop()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW);

analogWrite(ena,power);//0停止;值介於40-255

analogWrite(enb,power);//0停止;值介於40-255

}

void forward()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

analogWrite(ena,power);//0停止;值介於40-255

analogWrite(enb,power);//0停止;值介於40-255

}

void backward()

{

digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, HIGH);

digitalWrite(motorIn4, LOW);

analogWrite(ena,power);//0停止;值介於40-255

analogWrite(enb,power);//0停止;值介於40-255

}

// Let right motor keep running, but stop left motor

void right()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

analogWrite(ena,power);//0停止;值介於40-255

analogWrite(enb,power);//0停止;值介於40-255

}

// Let left motor keep running, but stop right motor

void left()

{

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW);

analogWrite(ena,power);//0停止;值介於40-255

analogWrite(enb,power);//0停止;值介於40-255

}

void lowspeed(){

power=70;

}

void lmspeed(){

power=85;

}

void midspeed(){

power=100;

}

void hmspeed(){

power=130;

}

void highspeed(){

power=180;

}

void drivemotor(byte nStatus){

switch(nStatus)

{ //   感測器黑色:1 (亮紅燈)  白色:0

case 0: // SL:0 SR:0 //白白

forward() ;

break;

case 1: // SL:0 SR:1 // 白黑

left();

break;

case 2: // SL:0 SR:1 //黑白

right();

break;

case 3: // SL:1 SR:1 // 黑黑

motorstop();

break;

}

}