找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4867|回復: 3
收起左側(cè)

Arduino智能小車超聲波避障

[復制鏈接]
ID:426797 發(fā)表于 2019-12-1 13:43 | 顯示全部樓層 |閱讀模式
本帖最后由 周成瑞 于 2019-12-5 15:01 編輯

#include <Servo.h>  //調(diào)用舵機函數(shù)庫
#define enable_L  13    //左輪
#define INA1  3   
#define INA2  5
#define enable_R  A4    //右輪
#define INTB1  6
#define INTB2  9
int myangle;//定義角度變量
int pulsewidth;//定義脈寬變量
int val;
int Front_Distance = 0;//
int Left_Distance = 0;
int Right_Distance = 0;
const int Trig = 7;  //超聲波
const int Echo = 8;
int myservo=10;//設(shè)置舵機驅(qū)動腳到數(shù)字口2
void setup()
{
   Serial.begin(9600);
  /*引腳初始化*/
  pinMode(enable_L,OUTPUT);
  pinMode(INA1,OUTPUT);
  pinMode(INA2,OUTPUT);
  pinMode(enable_R,OUTPUT);
  pinMode(INTB1,OUTPUT);
  pinMode(INTB2,OUTPUT);
  pinMode(myservo,OUTPUT);
  /*電機驅(qū)動使能*/
  digitalWrite(enable_L,HIGH);      // 左電機使能
  digitalWrite(enable_R,HIGH);     // 右電機使能
  pinMode(Trig, OUTPUT);         //超聲波
  pinMode(Echo, INPUT);
}
/*===========================小車基本動作===================
   小車運動函數(shù)
   后退Back
   前進Forward
   左轉(zhuǎn)Left
   右轉(zhuǎn)Right
   剎車Brake
*/
void Back(int time)                       //小車后轉(zhuǎn)
{
  analogWrite(INA1,95);           
  analogWrite(INA2,LOW);            //左PWM 調(diào)速
  
  analogWrite(INTB1,100);         
  analogWrite(INTB2,LOW);           //右PWM 調(diào)速
  delay(time * 100);     //執(zhí)行時間,可以調(diào)整  
}
void Right(int time)                        //小車左轉(zhuǎn)(右輪不動,左輪前進)
{
  analogWrite(INA1,LOW);           
  analogWrite(INA2,LOW);            //左PWM 調(diào)速
  
  analogWrite(INTB1,LOW);         
  analogWrite(INTB2,100);           //右PWM 調(diào)速
  delay(time * 100);     //執(zhí)行時間,可以調(diào)整  
}
void Forward()                      //小車前進
{
  analogWrite(INA1,LOW);           
  analogWrite(INA2,100);            //左PWM 調(diào)速
  
  analogWrite(INTB1,LOW);         
  analogWrite(INTB2,100);           //右PWM 調(diào)速
}
void Left(int time)                         //小車右轉(zhuǎn)(左輪不動,右輪前進)
{
  analogWrite(INA1,LOW);           
  analogWrite(INA2,100);            //左PWM 調(diào)速
  
  analogWrite(INTB1,LOW);         
  analogWrite(INTB2,LOW);           //右PWM 調(diào)速
  delay(time * 100);     //執(zhí)行時間,可以調(diào)整   
}
void spin_left(int time)         //左轉(zhuǎn)(左輪后退,右輪前進)
{
  analogWrite(INA1,LOW);           
  analogWrite(INA2,100);            //左PWM 調(diào)速
  
  analogWrite(INTB1,100);         
  analogWrite(INTB2,HIGH);           //右PWM 調(diào)速
  delay(time * 100);     //執(zhí)行時間,可以調(diào)整  
}
void Brake(int time)                     //剎車
{  
  analogWrite(INA1,LOW);           
  analogWrite(INA2,LOW);            //左PWM 調(diào)速
  
  analogWrite(INTB1,LOW);      
  analogWrite(INTB2,LOW);           //右PWM 調(diào)速
  delay(time * 100);     //執(zhí)行時間,可以調(diào)整
}
//==================超聲波===============
float Distance_test()   // 量出前方距離
{
  digitalWrite(Trig, LOW);   // 給觸發(fā)腳低電平2μs
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);  // 給觸發(fā)腳高電平10μs,這里至少是10μs
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);    // 持續(xù)給觸發(fā)腳低電
  float Fdistance = pulseIn(Echo, HIGH);  // 讀取高電平時間(單位:微秒)
  Fdistance= Fdistance/58;       //為什么除以58等于厘米,  Y米=(X秒*344)/2
  return Fdistance;
}
void servopulse(int myservo,int myangle)/*定義一個脈沖函數(shù),用來模擬方式產(chǎn)生PWM值舵機的范圍是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
{
  pulsewidth=(myangle*11)+500;//將角度轉(zhuǎn)化為500-2480 的脈寬值 這里的myangle就是0-180度  所以180*11+50=2480  11是為了換成90度的時候基本就是1.5MS
  digitalWrite(myservo,HIGH);//將舵機接口電平置高                                      90*11+50=1490uS  就是1.5ms
  delayMicroseconds(pulsewidth);//延時脈寬值的微秒數(shù)  這里調(diào)用的是微秒延時函數(shù)
  digitalWrite(myservo,LOW);//將舵機接口電平置低
// delay(20-pulsewidth/1000);//延時周期內(nèi)剩余時間  這里調(diào)用的是ms延時函數(shù)
  delay(20-(pulsewidth*0.001));//延時周期內(nèi)剩余時間  這里調(diào)用的是ms延時函數(shù)
}
void front_detection()
{
  //此處循環(huán)次數(shù)減少,為了增加小車遇到障礙物的反應速度
  for(int i=0;i<=5;i++) //產(chǎn)生PWM個數(shù),等效延時以保證能轉(zhuǎn)到響應角度
  {
    servopulse(myservo,90);//模擬產(chǎn)生PWM
  }
  Front_Distance = Distance_test();
}
void left_detection()
{
  for(int i=0;i<=15;i++) //產(chǎn)生PWM個數(shù),等效延時以保證能轉(zhuǎn)到響應角度
  {
    servopulse(myservo,175);//模擬產(chǎn)生PWM
  }
  Left_Distance = Distance_test();
}
void right_detection()
{
  for(int i=0;i<=15;i++) //產(chǎn)生PWM個數(shù),等效延時以保證能轉(zhuǎn)到響應角度
  {
   servopulse(myservo,5);//模擬產(chǎn)生PWM
  }
  Right_Distance = Distance_test();
}
void loop()
{
  while(1)
  {
    front_detection();//測量前方距離
    if(Front_Distance < 30)//當遇到障礙物時
    {
      Back(2);//后退減速
      Brake(2);//停下來做測距
      left_detection();//測量左邊距障礙物距離
      right_detection();//測量右邊距障礙物距離
      if((Left_Distance < 30 ) &&( Right_Distance < 30 ))//當左右兩側(cè)均有障礙物靠得比較近
        spin_left(0.7);//旋轉(zhuǎn)掉頭
      else if(Left_Distance > Right_Distance)//左邊比右邊空曠
      {      
        Left(3);//左轉(zhuǎn)
        Brake(1);//剎車,穩(wěn)定方向
      }
      else//右邊比左邊空曠
      {
        Right(3);//右轉(zhuǎn)
        Brake(1);//剎車,穩(wěn)定方向
      }
    }
    else
    {
      Forward(); //無障礙物,直行     
    }
  }
}


4e2cb94784526fa1.jpg
-71d4027d625f6db5.jpg
-71ff049aca1d7c1a.jpg
283718114eee7cce.png

fire_robot.pdf

336.21 KB, 下載次數(shù): 17, 下載積分: 黑幣 -5

fire_robot_2.pdf

230.56 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:1 發(fā)表于 2019-12-4 17:27 | 顯示全部樓層
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

ID:685875 發(fā)表于 2020-1-31 21:44 | 顯示全部樓層
電機帶的是風扇還是螺旋槳?
回復

使用道具 舉報

ID:426797 發(fā)表于 2020-3-15 18:13 | 顯示全部樓層
gch1 發(fā)表于 2020-1-31 21:44
電機帶的是風扇還是螺旋槳?

風扇,螺旋槳也可以,安全起見用風扇
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表