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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3699|回復: 3
打印 上一主題 下一主題
收起左側

基于Arduino UNO的智能自主避障小車和藍牙遙控小車制作 代碼與教程

[復制鏈接]
跳轉到指定樓層
樓主
ID:1012298 發表于 2022-4-19 12:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Hello,大家好!今天我要給大家分享一下我近期制作的一個arduino的小項目----智能避障小車。之前在某站上無意間刷到某位博主制作的一款智能避障小車,覺得很有意思,便打算自己也只做一個來玩玩,于是便寫了一款我自己理解的避障小車,在此基礎上,我還增加了藍牙遙控功能,二者可以相互切換,提高其趣味性。和其他的避障小車類似,這款也是超聲波來進行距離避障,代碼相對其他大神來說顯得比較表層,但這也相對來說顯得更加好理解一些,廢話不多說,看代碼!!!

一、代碼

/*********************************/                  //調取藍牙模塊庫,調取伺服電機庫

#include <SoftwareSerial.h>                          //調取庫函數
#include <Servo.h>                                   //聲明調用Servo.h庫
SoftwareSerial BT(A0, A1);                           //新建對象,接收腳為A0--TXD,發送腳為A1--RXD
Servo servo;                                         //創建一個舵機對象

/*********************************/                  //定義驅動模塊串口及變量

int TrigPin = 2;                                     //發出超聲波
int EchoPin = 3;                                     //收到反射回來的超聲波                                                                                                   
int Input1 = 4;                                      //定義uno的pin5向Input1輸出
int Input2 = 5;                                      //定義uno的pin5向Input2輸出
int Input3 = 6;                                      //定義uno的pin5向Input3輸出
int Input4 = 7;                                      //定義uno的pin5向Input4輸出
int pos = 118;                                       //創建變量,存儲從模擬端口讀取的值
float cm;                                            //因為測得的距離是浮點型的,單位為cm
int xuan;                                            
int choice;                                          //小車功能選擇

/********************* ************/                 //控制函數部分

void stop()                                          //小車停止
{
   digitalWrite(Input1,LOW);                         //給低電平
   digitalWrite(Input2,LOW);                         //給低電平
   digitalWrite(Input3,LOW);                         //給低電平
   digitalWrite(Input4,LOW);                         //給低電平
   delay(50);  
}

void forward()                                       //小車前進
{
   digitalWrite(Input1,HIGH);                        //給高電平
   digitalWrite(Input2,LOW);                         //給低電平
   digitalWrite(Input3,HIGH);                        //給高電平
   digitalWrite(Input4,LOW);                         //給低電平
   delay(50);
}

void backward()                                      //小車后退
{
   digitalWrite(Input1,LOW);                         //給低電平
   digitalWrite(Input2,HIGH);                        //給高電平
   digitalWrite(Input3,LOW);                         //給低電平
   digitalWrite(Input4,HIGH);                        //給高電平
   delay(50);  
}

void turnleft()                                      //小車左轉
{
   digitalWrite(Input1,HIGH);                        //給高電平
   digitalWrite(Input2,LOW);                         //給低電平
   digitalWrite(Input3,LOW);                         //給低電平
   digitalWrite(Input4,HIGH);                        //給高電平
   delay(50);  
}

void turnright()                                     //小車右轉
{
   digitalWrite(Input1,LOW);                         //給低電平
   digitalWrite(Input2,HIGH);                        //給高電平
   digitalWrite(Input3,HIGH);                        //給高電平
   digitalWrite(Input4,LOW);                         //給低電平
   delay(50);
}

void Left()                                          //舵機左轉
{
   while(pos < 180)
    {
      pos++;
      servo.write(pos);                              //寫入舵機角度      
      delay(15);                                     //延時使舵機轉到相應角度   
    }
}

void Right()                                         //舵機右轉
{
   while(pos > 60)
    {
      pos--;
      servo.write(pos);                                 
      delay(15);                                       
    }
}

void Ranging()                                       //測量距離
{
   digitalWrite(TrigPin, LOW);                       //低電平發一個短時間脈沖去TrigPin
   delayMicroseconds(2);                             //delayMicroseconds在更小的時間內延時準確,delayMicroseconds是毫秒級計時單位
   digitalWrite(TrigPin, HIGH);                      //通過這里控制超聲波的發射
   delayMicroseconds(10);                           
   digitalWrite(TrigPin, LOW);                       //通過這里控制停止超聲波的發射
   cm = pulseIn(EchoPin, HIGH) / 58.0;               //將回波時間換算成cm ,其中pulseIn(接收信號引腳,高低電平)函數用來接收反射回來的聲波
   cm = (int(cm * 100.0)) / 100.0;                   //保留兩位小數
   Serial.print("Distance:");
   Serial.print(cm);
   Serial.print("cm");
   Serial.println();
   //以上四句在串口監視器中輸出
   delay(1000);
}

/****************************************************/

void setup()
{
   Serial.begin(9600);                               //與電腦串口相連,波特率為9600
   servo.attach(9);                                  //9號引腳輸出電機控制信號,僅能使用PWM引腳
   pinMode(Input1, OUTPUT);                          //Input1引腳設置為輸出模式
   pinMode(Input2, OUTPUT);                          //Input2引腳設置為輸出模式
   pinMode(Input3, OUTPUT);                          //Input3引腳設置為輸出模式
   pinMode(Input4, OUTPUT);                          //Input4引腳設置為輸出模式
   pinMode(TrigPin, OUTPUT);                         //發出超聲波串口設置為輸出
   pinMode(EchoPin, INPUT);                          //接受超聲波接口設為輸入
   BT.begin(9600);                                   //設置波特率為9600
}

void loop()
{
  switch(choice)
    {
       case 'X' :                                    //選擇避障
         Ranging();                                  //測量距離
         if(cm > 10.0)                               //沒有碰到障礙物
           forward();
         else                                        //碰到障礙物
           {
             backward();                             //小車后退
             delay(200);                             //延時確定后退距離
             stop();                                 //小車停止
             Right();                                //舵機右轉
             Ranging();                              //測量距離
             servo.write(118);                       //舵機回中
             if(cm > 10.0)                           //如果右邊滿足條件
               {
                 turnright();                        //小車右轉
                 delay(200);                         //延時確定轉彎角度
               }
             else                                    //如果右邊不滿足
               {
                 Left();                             //舵機左轉
                 Ranging();                          //測量距離
                 servo.write(118);                   //舵機回中
                 turnleft();                         //小車左轉
                 delay(200);                         //延時確定轉彎角度
               }
           }
      case 'Y' :                                     //選擇遙控
        while(BT.available())                        //藍牙識別字符
          {
             xuan = BT.read();                       //藍牙讀取字符
             switch(xuan)
               {
                 case 'A' :                                
                   forward();                        //調取前進函數
                 case 'B' :                                 
                   backward();                       //調取后退函數  
                 case 'C' :                                
                   turnleft();                       //調取左轉函數
                 case 'D' :                              
                   turnright();                      //調取右轉函數   
                 case 'E' :                                
                   stop();                           //調取停止函數
               }
          }   
    }
}
代碼看起來是不是很通俗易懂呢!!!

接下來給你們介紹我理解的手機藍牙通訊和電腦串口通訊分別是(波特率):

BT.begin(9600);

Serial.begin(9600);

雖然說二者的更深層次的含義由于學術不精,無法給出具體解釋,但經過實際檢測是正確的。

在代碼中涉及的伺服電機角度,是根據我所買的伺服電機結合制作時需要所測量和設定的角度,只具有參考性。各位可以根據自己買的伺服電機來進行修改。

void Left()                                          //舵機左轉
{undefined
   while(pos < 180)
    {undefined
      pos++;
      servo.write(pos);                          //寫入舵機角度      
      delay(15);                                     //延時使舵機轉到相應角度   
    }
}

這部分控制舵機轉動運用while循環主要是為了能夠是舵機逐角度的變化,也可以直接用

servo.write(pos);

寫入需要的角度,但這就會使得舵機在轉動到所需要的角度所需時間會非常短,可能會對舵機有損耗(個人觀點)。

二、所需材料

1.Arduino UNO板子

2.HC-SR04超聲波模塊

3.HC-06藍牙模塊

4.L298N電機驅動板模塊

5.智能小車底盤

6.18650充電電池及電池倉

7.杜邦線若干

以上這些材料我制作時所用到,都是可以在某1個寶上買到的。當然對于小車底盤,有能力的朋友,可以自己設計建模一款小車底盤,然后通過3D打印機打印出來也是很好的。

手機端藍牙遙控器用的是‘手機藍牙調試器’,在應用商店里就可以下載到。相對應的A,B,C,D,E,X,Y在按鍵操作里編輯即可。



評分

參與人數 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1020048 發表于 2022-4-21 15:27 來自手機 | 只看該作者
樓主,還在嗎我那個藍牙模塊通過arduino的串口監視器發送就有回應。然后手機遙控就還是一點反應都沒有。能看出這是什么問題?
回復

使用道具 舉報

板凳
ID:1011222 發表于 2022-4-23 13:00 | 只看該作者
編譯錯誤
回復

使用道具 舉報

地板
ID:995613 發表于 2024-6-28 22:27 | 只看該作者
你好,有ad原理圖嘛
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩一区 | 91麻豆精品国产91久久久更新资源速度超快 | 黑色丝袜三级在线播放 | 福利视频网址 | 精品一区二区三区四区 | 久久手机视频 | 一区二区三区国产精品 | 亚洲精品久久久久久下一站 | 免费在线日韩 | 91视频一区二区三区 | 久久最新精品视频 | 无码一区二区三区视频 | av一级在线观看 | 久久成人激情 | 一区二区在线免费观看视频 | 欧美色性 | 国产精品99久久久久久久久 | 国产一区二区黑人欧美xxxx | 日韩1区 | 精品久久久久久久久久久院品网 | 日韩欧美1区2区 | 久久麻豆精品 | 久久专区 | 日韩不卡一区二区三区 | 日本精品一区二区 | 国产日韩欧美中文字幕 | 男女啪啪高潮无遮挡免费动态 | 欧美精品网站 | 亚洲一区二区三区在线观看免费 | 欧美亚洲在线 | 精品乱人伦一区二区三区 | 亚洲欧美一区二区三区视频 | 免费观看毛片 | 欧美精品第一页 | 成人亚洲精品久久久久软件 | 涩涩视频网站在线观看 | 国产日韩欧美一区 | 国内自拍真实伦在线观看 | 国产精彩视频一区 | 欧美视频三区 | 日韩视频在线观看一区二区 |