Latest News

首頁 » Arduino 控制 » 【 Arduino 開發與運用】從尋跡競賽自走車學習(快速理解:車輛機器人控制自動化的世界)

【 Arduino 開發與運用】從尋跡競賽自走車學習(快速理解:車輛機器人控制自動化的世界)

【 Arduino 開發與運用】從尋跡競賽自走車學習(快速理解:車輛機器人控制自動化的世界)
尋跡競賽自走車學習是現今非常多年輕人研修的一個項目,藉此提昇自己在職場上的競爭能力
用Arduino控制尋跡競賽自走車學習是很有趣,尋跡競賽自走車學習項目一般總是吸引初學者介紹基礎電子學習,了解自動化的世界。

時常有時問『總教頭』:『如何簡單的製作 Arduino 自走車(Android 控制藍牙)』呢?
以下是:如何簡單的製作 Arduino 自走車(Android 控制藍牙)的步驟與講解

看這影片:CxemCar – Android control Car via Bluetooth 是不是很有趣呢?

這是一個Android藍牙車載藍芽控制的簡單項目。 使用Arduino控制器

使用內建加速度計控制汽車使用的Android裝置。
向前傾斜 – 車向前傾斜,向左傾斜 – 車向左轉,向後傾斜 – 汽車返回。
搬移速度或旋轉速度取決於您傾斜裝置的數量。 配置Android-apps中的傾斜度靈敏度和價值。
還提供了標準的控制模式:螢幕上的按鈕。 除了所有我實現的觸摸控制。 共有3種模式來控制RC車。
您可以在上面的視訊中看到的裝置的功能

步驟1:Android設備
所需零件
Android裝置

最重要的部分 – 具有加速度計和藍牙功能的Android裝置:
平板電腦,智慧手機等…作為Android裝置,我使用一個便宜的中文平板電腦「Ainol Aurora」與外部USB-Bluetooth模組(因為它沒有自己的)通過USB主機連線。

步驟2:DIY車底盤

我們還需要任何帶2或4個直流電機的底盤。
您可以使用舊的RC玩具車。

作為一個平台,我使用了一個小的RC DIY平台, 在AliExpress上購買了25美元 。 這是該項目最適合的軌道底盤。

步驟3:控制器(MCU)

3.控制器(MCU)

您需要任何Arduino兼容控制器 (Nano,Uno,Leonardo,Mini等)
控制器應包含2個PWM和UART。

步驟4:藍牙模組

藍牙模組

作為藍牙模組使用便宜的中文模組藍牙序列HC-06( 3-4 $ on AliExpress )。 將藍牙模組連線到Arduino的說明指南在這裡 。
您可以使用HC-05,HC-07和其他序列藍牙模組

步驟5:馬達 電機驅動

5.電機驅動器

我使用L298N雙橋直流步進電機驅動模塊。 在AliExpress上花費3-5美元 。

步驟6:其他零件

6.其他部分

 


第7步:理論(技術原理:)

理論

所有計算都在Android應用程序中執行,並立即計算左右電機PWM值2 <2 <。
 應用具有靈活的設置,如PWM的範圍,傾斜的靈敏度,PWM的最小閾值等。 藍牙傳輸的示例命令:
L-255 \ rR-120 \ r
L – 左側引擎的命令,右側的R –
破折號意味著電機的旋轉向後移動
255 – PWM值(Arduino為最大轉速)
\ r – 命令結束。
在這個命令上,RC車將向前移動並向右旋轉,右發動機慢慢地向左旋轉。

L255 \ rR-255 \ r
在這個命令上,左側引擎將向右旋轉,迫使汽車圍繞其軸線逆時針旋轉。

H1 \ r
命令是一個可以連接的附加通道,例如燈光,聲音等。

符號命令L,R和H可以在Android應用程序的設置中定義。

在MCU控製程序中提供一個定時器,如果最後一個命令在超過n秒之前被接收,則關閉引擎。 數據存儲在控制器的EEPROM存儲器中,可以從Android設備更改。
此設置的範圍為0.1秒至99.9秒。 可以禁用此設置。 使用EEPROM提供命令:Fr讀取值2 <2 <和Fw – 記錄值。

第8步:Android應用程序

我們可以看到,Arduino連線到藍牙模組和帶有兩個或四個連線的電機的電機磁碟機。

Android應用程式

Android應用程式是在Eclipse IDE中編寫的。 項目的所有來源和Eclipse項目,您可以在下面下載。 您的裝置上的Android版本必須> 3.0。

該應用程式包括幾個活動。 主要活動是主螢幕,按鈕運行不同的操作模式和設定

有三種控制模式藍牙車:從加速度計,螢幕按鈕和觸摸控制。

Android應用設定

設定螢幕快照CxemCar Android應用程式版本1.0

MAC位址

要與RC Car的藍牙模組建立連線,必須在應用程式設定中設定MAC位址。
但首先,您必須在Android裝置上配置裝置:開啟設定 – >藍牙,然後點選「搜尋裝置」。
當手機找到我們的藍牙模組時,點擊它們並輸入配對密碼(通常為「1234」)

瞭解藍牙模組的MAC位址可能來自任何應用程式,如藍牙終端 。
為此,請點選「連線裝置 – 安全」,然後在生成的視窗中,點選「掃瞄裝置」按鈕。
軟體將掃瞄藍牙裝置並顯示它們的MAC位址。

步驟9:Arduino RC汽車接線

Arduino控制器接線圖


 

在電路中我使用跳線(在專案Jmp1中),因為連線的藍牙模組是不可能的加載草圖到Arduino。

我將藍牙模組焊接到Arduino並引導狀態指示燈。 有關Arduino和藍牙之間的通信,請閱讀本文:Arduino和藍牙。 模組HC-06置於熱縮管10mm。 具有限流電阻( 計算器 )的藍牙狀態LED也放置在熱收縮管中。

在麵包板平台上,我鑽了一個洞,並安裝了電機磁碟機L298N。 Arduino板貼有雙面膠帶

在車平台和麵包板之間,我放置了3節鋰電池3.7V 1100 mAh。 電源配置到控制器和電機:Arduino由3.7 V電池供電,電機和磁碟機L298N由兩台3.7V電池串聯連線。 有兩個2位電源開關 – 一個位置是從電池到消費者的電源,另一個位置是充電終端。

BT端RX(2)和Arduino引腳TX可能需要電平移位器。 為此,您可以使用分壓器: 計算器5V至3.3V

第10步:軟體
該程序是用Arduino IDE 1.01編寫的。


#include“EEPROM.h”

#define D1 2 //電機旋轉方向1
#define M1 3 // PWM左電機
#define D2 4 //電機旋轉方向2
#define M2 5 // PWM右電機
#define HORN 13 //附加頻道1
// #define autoOFF 2500 //毫秒之後機器人停止連接

#define cmdL'L'//左電機的UART命令
#define cmdR'R'//右電機的UART命令
#define cmdH'H'//其他通道的UART命令(例如喇叭)
#define cmdF'F'//用於EEPROM操作的UART命令
#define cmdr'r'//用於EEPROM操作的UART命令(讀取)
#define cmdw'w'//用於EEPROM操作的UART命令(寫)

char incomingByte; //傳入數據

char L_Data [4]; //左電機的數組數據
字節L_index = 0; //數組L的索引
char R_Data [4]; //右側電機的數組數據
字節R_index = 0; //數組R的索引
char H_Data [1]; //附加通道的數組數據
字節H_index = 0; //數組H的索引
char F_Data [8]; // EEPROM的數組數據
byte F_index = 0; //數組F的索引
char命令 //命令

unsigned long currentTime,lastTimeCommand,autoOFF;

void setup(){
Serial.begin(9600); //初始化UART
pinMode(HORN,OUTPUT); //附加頻道
pinMode(D1,OUTPUT); //電機旋轉輸出
pinMode(D2,OUTPUT); //電機旋轉輸出
/*EEPROM.write(0,255);
EEPROM.write(1,255);
EEPROM.write(2,255);
EEPROM.write(3,255); * /
timer_init(); //初始化軟件定時器
}

void timer_init(){
uint8_t sw_autoOFF = EEPROM.read(0); //讀EEPROM“被激活或不停車時丟失連接”
if(sw_autoOFF =='1'){//如果激活
char var_Data [3];
var_Data [0] = EEPROM.read(1);
var_Data [1] = EEPROM.read(2);
var_Data [2] = EEPROM.read(3);
autoOFF = atoi(var_Data)* 100; //變量autoOFF ms
}
else if(sw_autoOFF =='0'){
autoOFF = 999999;
}
else if(sw_autoOFF == 255){
autoOFF = 2500; //如果EEPROM為空白,dafault值為2.5秒
}
currentTime = millis(); //讀取自應用程序啟動以來經過的時間
}

void loop(){
if(Serial.available()> 0){//如果接收到UART數據
incomingByte = Serial.read(); // raed字節
if(incomingByte == cmdL){//如果接收到左電機L的數據
command = cmdL; //當前命令
memset(L_Data,0,sizeof(L_Data)); //清除數組
L_index = 0; //重置數組索引
}
else if(incomingByte == cmdR){//如果接收到左電機R的數據
command = cmdR;
memset(R_Data,0,sizeof(R_Data));
R_index = 0;
}
else if(incomingByte == cmdH){//如果接收到附加通道的數據
command = cmdH;
memset(H_Data,0,sizeof(H_Data));
H_index = 0;
}
else if(incomingByte == cmdF){//如果接收到EEPROM的數據操作
command = cmdF;
memset(F_Data,0,sizeof(F_Data));
F_index = 0;
}
else if(incomingByte =='\ r')command ='e'; // 行結束
else if(incomingByte =='\ t')command ='t'; // EEPROM的行尾

if(command == cmdL && incomingByte!= cmdL){
L_Data [L_index] = incomingByte; //存儲數組中的每個字節
L_index ++; //增加數組索引
}
else if(command == cmdR && incomingByte!= cmdR){
R_Data [R_index] = incomingByte;
R_index ++;
}
else if(command == cmdH && incomingByte!= cmdH){
H_Data [H_index] = incomingByte;
H_index ++;
}
else if(command == cmdF && incomingByte!= cmdF){
F_Data [F_index] = incomingByte;
F_index ++;
}
else if(command =='e'){//如果我們把行結束
Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
延遲(10);
}
else if(command =='t'){//如果我們把EEPROM行結束
Flash_Op(F_Data [0],F_Data [1],F_Data [2],F_Data [3],F_Data [4]);
}
lastTimeCommand = millis(); //讀取自應用程序啟動以來經過的時間
}
if(millis()> =(lastTimeCommand + autoOFF)){//將當前計時器與變量lastTimeCommand + autoOFF進行比較
Control4WD(0,0,0); //停車
}
}

void Control4WD(int mLeft,int mRight,uint8_t Horn){

bool directionL,directionR; //電機旋轉方向L298N
字節值L,值R; // PWM M1,M2(0-255)

if(mLeft> 0){
值L = mLeft;
directionL = 0;
}
else if(mLeft <0){
valueL = 255 – abs(mLeft);
directionL = 1;
}
else {
directionL = 0;
valueL = 0;
}

if(mRight> 0){
valueR = mRight;
directionR = 0;
}
else if(mRight <0){
valueR = 255 – abs(mRight);
directionR = 1;
}
else {
directionR = 0;
valueR = 0;
}

analogWrite(M1,valueL); //設置左側電機的速度
analogWrite(M2,valueR); //設置右側電機的速度
digitalWrite(D1,directionL); //設置左電機旋轉方向
digitalWrite(D2,directionR); //設定正確的電機旋轉方向

digitalWrite(HORN,Horn); //附加頻道
}

void Flash_Op(char FCMD,uint8_t z1,uint8_t z2,uint8_t z3,uint8_t z4){

if(FCMD == cmdr){//如果EEPROM數據讀取命令
Serial.print(“FData:”); //發送EEPROM數據
Serial.write(EEPROM.read(0)); //從0地址讀取存儲器的值並將其打印到UART
Serial.write(EEPROM.read(1));
Serial.write(EEPROM.read(2));
Serial.write(EEPROM.read(3));
Serial.print(“\ r \ n”); //標記數據EEPROM的傳輸結束
}
else if(FCMD == cmdw){//如果EEPROM數據寫入命令
EEPROM.write(0,z1); // z1記錄到具有0地址的內存
EEPROM.write(1,z2);
EEPROM.write(2,z3);
EEPROM.write(3,z4);
timer_init(); //重新初始化計時器
Serial.print(“FWOK \ r \ n”); //發送數據成功寫入EEPROM的消息
}

代碼使用庫來與EEPROM AVR存儲器一起使用。 來自藍牙模塊的USART的Arduino板接收準備好左右引擎的數據。 所有基本的計算都在Android應用程序中執行。

Eclipse中的項目結構可以在上面的截圖中看到。

您可以下載Arduino的源代碼和Eclipse項目
下載適用於Android設備的APK應用程序

最新的軟件版本可以在這個頁面找到
虛擬方向盤模式演示視訊(1.2版及以上):

好了!這樣就大功告成了!是不是很有趣呢?
您也可以自己購買所需要的零件,自己組裝來玩玩看!

發佈留言