久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2487|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

如何做到讓Arduino小車(chē)檢測(cè)到障礙物就停止呢?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:714862 發(fā)表于 2020-4-7 19:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我想做一個(gè)WiFi遙控小車(chē),現(xiàn)在可以實(shí)現(xiàn)WiFi遙控了,但是在前方加了一個(gè)紅外,做避障,如何做到讓小車(chē)檢測(cè)到障礙物就停止呢。


/*前進(jìn)  按下發(fā)出 ONA  松開(kāi)ONF
  后退:按下發(fā)出 ONB  松開(kāi)ONF
  左轉(zhuǎn):按下發(fā)出 ONC  松開(kāi)ONF
  右轉(zhuǎn):按下發(fā)出 OND  松開(kāi)ONF
  停止:按下發(fā)出 ONE  松開(kāi)ONF

  WIFI程序功能是按下對(duì)應(yīng)的按鍵執(zhí)行操,松開(kāi)按鍵就停止
*/
int Left_motor=8;     //左電機(jī)(IN3) 輸出0  前進(jìn)   輸出1 后退
int Left_motor_pwm=9;     //左電機(jī)PWM調(diào)速

int Right_motor_pwm=10;    // 右電機(jī)PWM調(diào)速
int Right_motor=11;    // 右電機(jī)后退(IN1)  輸出0  前進(jìn)   輸出1 后退

int servopin7=7;//設(shè)置左右舵機(jī)驅(qū)動(dòng)腳到數(shù)字口7
int servopin12=12;//設(shè)置上下舵機(jī)驅(qū)動(dòng)腳到數(shù)字口12
int myangle;//定義角度變量
int pulsewidth;//定義脈寬變量

const int sensorPin = 5; //定義人體紅外傳感器的引腳、、、
int sensorValue;      //聲明傳感器數(shù)據(jù)變量、、、

int val;               
char buffer[18];                //串口緩沖區(qū)的字符數(shù)組


void setup()                        //設(shè)定串口和引腳模式
{
     Serial.begin(9600);
     Serial.flush();                //清空串口緩存
     pinMode(Left_motor,OUTPUT); // PIN 8 8腳無(wú)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);//設(shè)定舵機(jī)接口為輸出接口
     pinMode(servopin12,OUTPUT);//設(shè)定舵機(jī)接口為輸出接口

     pinMode(sensorPin, INPUT);  //定義紅外為輸入變量、、、

}
void run()     // 前進(jìn)
{
  Serial.flush();    //清空串口緩存

  digitalWrite(Right_motor,LOW);  // 右電機(jī)前進(jìn)
  digitalWrite(Right_motor_pwm,HIGH);  // 右電機(jī)前進(jìn)     
  analogWrite(Right_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減


  digitalWrite(Left_motor,LOW);  // 左電機(jī)前進(jìn)
  digitalWrite(Left_motor_pwm,HIGH);  //左電機(jī)PWM     
  analogWrite(Left_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減
  //delay(time * 100);   //執(zhí)行時(shí)間,可以調(diào)整

}

void brake()         //剎車(chē),停車(chē)
{

  digitalWrite(Right_motor_pwm,LOW);  // 右電機(jī)PWM 調(diào)速輸出0      
  analogWrite(Right_motor_pwm,0);//PWM比例0~255調(diào)速,左右輪差異略增減

  digitalWrite(Left_motor_pwm,LOW);  //左電機(jī)PWM 調(diào)速輸出0         
  analogWrite(Left_motor_pwm,0);//PWM比例0~255調(diào)速,左右輪差異略增減
  //delay(time * 100);//執(zhí)行時(shí)間,可以調(diào)整  
}

void left()         //左轉(zhuǎn)(左輪后退,右輪前進(jìn))
{
  Serial.flush();    //清空串口緩存
  digitalWrite(Right_motor,LOW);  // 右電機(jī)前進(jìn)
  digitalWrite(Right_motor_pwm,HIGH);  // 右電機(jī)前進(jìn)     
  analogWrite(Right_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減

  digitalWrite(Left_motor,HIGH);  // 左電機(jī)后退
  digitalWrite(Left_motor_pwm,HIGH);  //左電機(jī)PWM     
  analogWrite(Left_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減
  //delay(time * 100);  //執(zhí)行時(shí)間,可以調(diào)整  
}

void right()        //右轉(zhuǎn)(右輪后退,左輪前進(jìn))
{
  Serial.flush();    //清空串口緩存
  digitalWrite(Right_motor,HIGH);  // 右電機(jī)后退
  digitalWrite(Right_motor_pwm,HIGH);  // 右電機(jī)PWM輸出1     
  analogWrite(Right_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減


  digitalWrite(Left_motor,LOW);  // 左電機(jī)前進(jìn)
  digitalWrite(Left_motor_pwm,HIGH);  //左電機(jī)PWM     
  analogWrite(Left_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減
  //delay(time * 100);        //執(zhí)行時(shí)間,可以調(diào)整   
}

void back()          //后退
{
  Serial.flush();    //清空串口緩存
  digitalWrite(Right_motor,HIGH);  // 右電機(jī)后退
  digitalWrite(Right_motor_pwm,HIGH);  // 右電機(jī)前進(jìn)     
  analogWrite(Right_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減


  digitalWrite(Left_motor,HIGH);  // 左電機(jī)后退
  digitalWrite(Left_motor_pwm,HIGH);  //左電機(jī)PWM     
  analogWrite(Left_motor_pwm,110);//PWM比例0~255調(diào)速,左右輪差異略增減
  //delay(time * 100);   //執(zhí)行時(shí)間,可以調(diào)整   
}

void servopulse(int servopin7,int myangle)/*定義一個(gè)脈沖函數(shù),用來(lái)模擬方式產(chǎn)生PWM值舵機(jī)的范圍是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
{
  pulsewidth=(myangle*11)+450;//將角度轉(zhuǎn)化為500-2480 的脈寬值 這里的myangle就是0-180度  所以180*11+50=2480  11是為了換成90度的時(shí)候基本就是1.5MS
  digitalWrite(servopin7,HIGH);//將舵機(jī)接口電平置高                                      90*11+50=1490uS  就是1.5ms
  delayMicroseconds(pulsewidth);//延時(shí)脈寬值的微秒數(shù)  這里調(diào)用的是微秒延時(shí)函數(shù)
  digitalWrite(servopin7,LOW);//將舵機(jī)接口電平置低
// delay(20-pulsewidth/1000);//延時(shí)周期內(nèi)剩余時(shí)間  這里調(diào)用的是ms延時(shí)函數(shù)
  delay(20-(pulsewidth*0.001));//延時(shí)周期內(nèi)剩余時(shí)間  這里調(diào)用的是ms延時(shí)函數(shù)
}
void servopulsesx(int servopin12,int myangle)/*定義一個(gè)脈沖函數(shù),用來(lái)模擬方式產(chǎn)生PWM值舵機(jī)的范圍是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
{
  pulsewidth=(myangle*11)+400;//將角度轉(zhuǎn)化為500-2480 的脈寬值 這里的myangle就是0-180度  所以180*11+50=2480  11是為了換成90度的時(shí)候基本就是1.5MS
  digitalWrite(servopin12,HIGH);//將舵機(jī)接口電平置高                                      90*11+50=1490uS  就是1.5ms
  delayMicroseconds(pulsewidth);//延時(shí)脈寬值的微秒數(shù)  這里調(diào)用的是微秒延時(shí)函數(shù)
  digitalWrite(servopin12,LOW);//將舵機(jī)接口電平置低
// delay(20-pulsewidth/1000);//延時(shí)周期內(nèi)剩余時(shí)間  這里調(diào)用的是ms延時(shí)函數(shù)
  delay(20-(pulsewidth*0.001));//延時(shí)周期內(nèi)剩余時(shí)間  這里調(diào)用的是ms延時(shí)函數(shù)
}
void front_detection()// 左右電機(jī)前   
{
  //此處循環(huán)次數(shù)減少,為了增加小車(chē)遇到障礙物的反應(yīng)速度
  for(int i=0;i<=5;i++) //產(chǎn)生PWM個(gè)數(shù),等效延時(shí)以保證能轉(zhuǎn)到響應(yīng)角度
  {
    servopulse(servopin7,90);//模擬產(chǎn)生PWM
  }

}
void left_detection()//左右舵機(jī)靠左
{
  for(int i=0;i<=1;i++) //產(chǎn)生PWM個(gè)數(shù),等效延時(shí)以保證能轉(zhuǎn)到響應(yīng)角度
  {
    servopulse(servopin7,175);//模擬產(chǎn)生PWM
  }

}

void right_detection()//左右電機(jī)靠右
{
  for(int i=0;i<=1;i++) //產(chǎn)生PWM個(gè)數(shù),等效延時(shí)以保證能轉(zhuǎn)到響應(yīng)角度
  {
    servopulse(servopin7,1);//模擬產(chǎn)生PWM
  }

}
void s_detection()//上下舵機(jī)上
{
  for(int i=0;i<=1;i++) //產(chǎn)生PWM個(gè)數(shù),等效延時(shí)以保證能轉(zhuǎn)到響應(yīng)角度
  {
    servopulsesx(servopin12,0);//模擬產(chǎn)生PWM
  }
}
void x_detection()//上下舵機(jī)下
{
  for(int i=0;i<=1;i++) //產(chǎn)生PWM個(gè)數(shù),等效延時(shí)以保證能轉(zhuǎn)到響應(yīng)角度
  {
    servopulsesx(servopin12,175);//模擬產(chǎn)生PWM
  }
}
void loop()
{
    if(Serial.available() > 0)                        //Serial.available()返回串口收到的字節(jié)數(shù)
    {
       int index = 0;
       delay(100);                                //延時(shí)等待串口收完數(shù)據(jù),否則剛收到1個(gè)字節(jié)時(shí)就會(huì)執(zhí)行后續(xù)程序
       int numChar = Serial.available();        
       if(numChar > 15)                                //確認(rèn)數(shù)據(jù)不會(huì)溢出,應(yīng)當(dāng)小于緩沖大小
       {
         numChar = 15;
        }
       while(numChar--)
      {
          buffer[index++] = Serial.read();        //將串口數(shù)據(jù)一字一字的存入緩沖
      }
       splitString(buffer);                                //字符串分割
    }
}

void splitString(char *data)
{
       Serial.print("Data entered:");
       Serial.println(data);
       char *parameter;
       parameter = strtok(data, " ,");                //string token,將data按照空格或者,進(jìn)行分割并截取
       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);     //  用于讀取紅外傳感器數(shù)據(jù)信息、、、、、、
   if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'A'))  //條件函數(shù)  在此加入了紅外傳感器的條件、、、、
   {
      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();  
   }
  /* 以下是控制舵機(jī)左,上下舵機(jī)                            */
  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();
   }

}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91社区视频| 欧美亚洲综合久久 | 久草精品在线 | 国产激情片在线观看 | 国产在线观| 日韩av一区二区在线观看 | 日日骚av | 亚洲精品一区在线观看 | 中文字幕一区二区三区精彩视频 | 毛片韩国 | 在线看黄免费 | 一区二区三区免费观看 | 亚洲精品国产成人 | 精品少妇一区二区三区日产乱码 | 91视频网址 | 一级黄色夫妻生活 | 亚洲欧美综合精品久久成人 | 精品欧美一区二区中文字幕视频 | 涩涩操| 精品一区精品二区 | 农夫在线精品视频免费观看 | 精品国产91乱码一区二区三区 | 国产情侣啪啪 | 国产a区| 亚洲男人的天堂网站 | 一区二区三区欧美 | 精品国产乱码久久久 | 日韩成人在线网址 | 国产欧美日韩综合精品一区二区 | 久久久99国产精品免费 | 狠狠av| 日韩毛片在线观看 | 久久久久久国产精品 | 亚洲a人| 综合久久一区 | 久久国产精品免费一区二区三区 | 国产成人a亚洲精品 | h视频亚洲| 91毛片在线看| 国产精品久久久久一区二区三区 | 狠狠干天天干 |