我想做一個WiFi遙控小車,現在可以實現WiFi遙控了,但是在前方加了一個紅外,做避障,如何做到讓小車檢測到障礙物就停止呢。
/*前進 按下發出 ONA 松開ONF
后退:按下發出 ONB 松開ONF
左轉:按下發出 ONC 松開ONF
右轉:按下發出 OND 松開ONF
停止:按下發出 ONE 松開ONF
WIFI程序功能是按下對應的按鍵執行操,松開按鍵就停止
*/
int Left_motor=8; //左電機(IN3) 輸出0 前進 輸出1 后退
int Left_motor_pwm=9; //左電機PWM調速
int Right_motor_pwm=10; // 右電機PWM調速
int Right_motor=11; // 右電機后退(IN1) 輸出0 前進 輸出1 后退
int servopin7=7;//設置左右舵機驅動腳到數字口7
int servopin12=12;//設置上下舵機驅動腳到數字口12
int myangle;//定義角度變量
int pulsewidth;//定義脈寬變量
const int sensorPin = 5; //定義人體紅外傳感器的引腳、、、
int sensorValue; //聲明傳感器數據變量、、、
int val;
char buffer[18]; //串口緩沖區的字符數組
void setup() //設定串口和引腳模式
{
Serial.begin(9600);
Serial.flush(); //清空串口緩存
pinMode(Left_motor,OUTPUT); // PIN 8 8腳無PWM功能
pinMode(Left_motor_pwm,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_pwm,OUTPUT);// PIN 10 (PWM)
pinMode(Right_motor,OUTPUT);// PIN 11 (PWM)
pinMode(servopin7,OUTPUT);//設定舵機接口為輸出接口
pinMode(servopin12,OUTPUT);//設定舵機接口為輸出接口
pinMode(sensorPin, INPUT); //定義紅外為輸入變量、、、
}
void run() // 前進
{
Serial.flush(); //清空串口緩存
digitalWrite(Right_motor,LOW); // 右電機前進
digitalWrite(Right_motor_pwm,HIGH); // 右電機前進
analogWrite(Right_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
digitalWrite(Left_motor,LOW); // 左電機前進
digitalWrite(Left_motor_pwm,HIGH); //左電機PWM
analogWrite(Left_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
//delay(time * 100); //執行時間,可以調整
}
void brake() //剎車,停車
{
digitalWrite(Right_motor_pwm,LOW); // 右電機PWM 調速輸出0
analogWrite(Right_motor_pwm,0);//PWM比例0~255調速,左右輪差異略增減
digitalWrite(Left_motor_pwm,LOW); //左電機PWM 調速輸出0
analogWrite(Left_motor_pwm,0);//PWM比例0~255調速,左右輪差異略增減
//delay(time * 100);//執行時間,可以調整
}
void left() //左轉(左輪后退,右輪前進)
{
Serial.flush(); //清空串口緩存
digitalWrite(Right_motor,LOW); // 右電機前進
digitalWrite(Right_motor_pwm,HIGH); // 右電機前進
analogWrite(Right_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
digitalWrite(Left_motor,HIGH); // 左電機后退
digitalWrite(Left_motor_pwm,HIGH); //左電機PWM
analogWrite(Left_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
//delay(time * 100); //執行時間,可以調整
}
void right() //右轉(右輪后退,左輪前進)
{
Serial.flush(); //清空串口緩存
digitalWrite(Right_motor,HIGH); // 右電機后退
digitalWrite(Right_motor_pwm,HIGH); // 右電機PWM輸出1
analogWrite(Right_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
digitalWrite(Left_motor,LOW); // 左電機前進
digitalWrite(Left_motor_pwm,HIGH); //左電機PWM
analogWrite(Left_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
//delay(time * 100); //執行時間,可以調整
}
void back() //后退
{
Serial.flush(); //清空串口緩存
digitalWrite(Right_motor,HIGH); // 右電機后退
digitalWrite(Right_motor_pwm,HIGH); // 右電機前進
analogWrite(Right_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
digitalWrite(Left_motor,HIGH); // 左電機后退
digitalWrite(Left_motor_pwm,HIGH); //左電機PWM
analogWrite(Left_motor_pwm,110);//PWM比例0~255調速,左右輪差異略增減
//delay(time * 100); //執行時間,可以調整
}
void servopulse(int servopin7,int myangle)/*定義一個脈沖函數,用來模擬方式產生PWM值舵機的范圍是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
{
pulsewidth=(myangle*11)+450;//將角度轉化為500-2480 的脈寬值 這里的myangle就是0-180度 所以180*11+50=2480 11是為了換成90度的時候基本就是1.5MS
digitalWrite(servopin7,HIGH);//將舵機接口電平置高 90*11+50=1490uS 就是1.5ms
delayMicroseconds(pulsewidth);//延時脈寬值的微秒數 這里調用的是微秒延時函數
digitalWrite(servopin7,LOW);//將舵機接口電平置低
// delay(20-pulsewidth/1000);//延時周期內剩余時間 這里調用的是ms延時函數
delay(20-(pulsewidth*0.001));//延時周期內剩余時間 這里調用的是ms延時函數
}
void servopulsesx(int servopin12,int myangle)/*定義一個脈沖函數,用來模擬方式產生PWM值舵機的范圍是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
{
pulsewidth=(myangle*11)+400;//將角度轉化為500-2480 的脈寬值 這里的myangle就是0-180度 所以180*11+50=2480 11是為了換成90度的時候基本就是1.5MS
digitalWrite(servopin12,HIGH);//將舵機接口電平置高 90*11+50=1490uS 就是1.5ms
delayMicroseconds(pulsewidth);//延時脈寬值的微秒數 這里調用的是微秒延時函數
digitalWrite(servopin12,LOW);//將舵機接口電平置低
// delay(20-pulsewidth/1000);//延時周期內剩余時間 這里調用的是ms延時函數
delay(20-(pulsewidth*0.001));//延時周期內剩余時間 這里調用的是ms延時函數
}
void front_detection()// 左右電機前
{
//此處循環次數減少,為了增加小車遇到障礙物的反應速度
for(int i=0;i<=5;i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
servopulse(servopin7,90);//模擬產生PWM
}
}
void left_detection()//左右舵機靠左
{
for(int i=0;i<=1;i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
servopulse(servopin7,175);//模擬產生PWM
}
}
void right_detection()//左右電機靠右
{
for(int i=0;i<=1;i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
servopulse(servopin7,1);//模擬產生PWM
}
}
void s_detection()//上下舵機上
{
for(int i=0;i<=1;i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
servopulsesx(servopin12,0);//模擬產生PWM
}
}
void x_detection()//上下舵機下
{
for(int i=0;i<=1;i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
servopulsesx(servopin12,175);//模擬產生PWM
}
}
void loop()
{
if(Serial.available() > 0) //Serial.available()返回串口收到的字節數
{
int index = 0;
delay(100); //延時等待串口收完數據,否則剛收到1個字節時就會執行后續程序
int numChar = Serial.available();
if(numChar > 15) //確認數據不會溢出,應當小于緩沖大小
{
numChar = 15;
}
while(numChar--)
{
buffer[index++] = Serial.read(); //將串口數據一字一字的存入緩沖
}
splitString(buffer); //字符串分割
}
}
void splitString(char *data)
{
Serial.print("Data entered:");
Serial.println(data);
char *parameter;
parameter = strtok(data, " ,"); //string token,將data按照空格或者,進行分割并截取
Serial.print("***");
Serial.println(parameter);
while(parameter != NULL)
{
setLED(parameter);
parameter = strtok(NULL, " ,"); //string token,再次分割并截取,直至截取后的字符為空
Serial.print("---");
Serial.println(parameter);
}
for(int x = 0; x < 16; x++) //清空緩沖
{
buffer[x] = '\0';
}
Serial.flush();
}
void setLED(char *data)
{
sensorValue = digitalRead(sensorPin); // 用于讀取紅外傳感器數據信息、、、、、、
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'A')) //條件函數 在此加入了紅外傳感器的條件、、、、
{
Serial.println("go forward!");
run();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'B'))
{
Serial.println("go back!");
back();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'C'))
{
Serial.println("go left!");
left();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'D'))
{
Serial.println("go right!");
right();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'E'))
{
Serial.println("Stop!");
brake();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'F'))
{
Serial.println("Stop!");
brake();
}
/* 以下是控制舵機左,上下舵機 */
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'L'))//左
{
left_detection();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'I'))//右
{
right_detection();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'J'))//上
{
s_detection();
}
if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'K'))//下
{
x_detection();
}
}
|