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;
}
}