寫在前面
為什么要寫這樣一系列文章骇两,網(wǎng)上很早就有并且還很多此類文章了呀,對(duì)于電子相關(guān)專業(yè)的人分分鐘可以搞定的事呀拳喻。但哭当,我要寫一個(gè)和那些文章視角不同的系列,就是我的文章的目標(biāo)讀者是小白人士冗澈,可以是各行業(yè)對(duì)編程和電子硬件都不了解的人钦勘,可以是正在小學(xué)初中讀書的學(xué)生。讓這些人亚亲,通過價(jià)格低廉彻采、資料豐富的開源硬件和編程來做一些有意思的事情。
做個(gè)什么樣的小車
目標(biāo)是一個(gè)小車平臺(tái)捌归,后續(xù)可以基于這個(gè)平臺(tái)做巡線小車肛响、語音小車、監(jiān)控小車等等有意思的事情惜索。這樣的話特笋,我選擇了4個(gè)輪子車架,空間更大巾兆。通過arduino板子控制小車猎物,原因是arduino產(chǎn)品豐富虎囚,高中低端都有,可以使用價(jià)格很低的arduino的pro mini或nano蔫磨,便宜的10幾塊錢就可以搞到淘讥。并且arduino的資料是相當(dāng)豐富了,基于它做小車的教程也好多堤如。通信模塊選擇zigbee蒲列,比藍(lán)牙的障礙物穿透性好,隔一堵墻是沒有問題的煤惩,正好手里有這樣的板子嫉嘀,很容易上手。
Step By Step
- 最基礎(chǔ)的車架魄揉,我選擇了最常見的亞克力材料樹莓派小車車架購(gòu)買鏈接(42元購(gòu)入)。包括了4個(gè)直流電機(jī)拭宁,1個(gè)18650電池的3節(jié)電池盒洛退。這個(gè)小車底盤可以多層,也有安裝樹莓派的地方杰标,當(dāng)時(shí)就是沖著這些可擴(kuò)展性買的兵怯。提醒一點(diǎn):這個(gè)底盤組裝并不容易,安裝電機(jī)的卡槽不是很吻合腔剂,我使了好大力氣才完成媒区。
第二層車架,用來安裝電池盒掸犬、控制器袜漩、L298N等。
- 使用L298N電機(jī)驅(qū)動(dòng)板購(gòu)買鏈接(7.9元入手)湾碎。它有兩個(gè)作用宙攻,一是連接控制器和電機(jī),達(dá)到控制器編程控制電機(jī)的目的介褥。二是把12V的輸入降壓為5V輸出座掘,用來給控制器Zduino供電。具體硬件連接:OUT1連接左側(cè)兩個(gè)電機(jī)的負(fù)極柔滔,OUT2連接左側(cè)兩個(gè)電機(jī)的正極溢陪。OUT3連接右側(cè)兩個(gè)電機(jī)的正極,OUT4連接右側(cè)兩個(gè)電機(jī)的負(fù)極睛廊。
- L298N本身的供電形真,它的輸入是5V-35V,我選擇12V的電源輸入喉前。使用3節(jié)18650電池購(gòu)買鏈接(每節(jié)4.9元入手没酣,一節(jié)3.7V)串聯(lián)得到約12V輸入王财。說明:這個(gè)電池可以充電,多次使用裕便,綠色環(huán)保绒净。相關(guān)配套:18650電池充電器購(gòu)買鏈接(8.5元),18650電池盒(3節(jié)串聯(lián)偿衰,和小車底盤一并購(gòu)入)購(gòu)買鏈接挂疆。
- L298N本身的供電形真,它的輸入是5V-35V,我選擇12V的電源輸入喉前。使用3節(jié)18650電池購(gòu)買鏈接(每節(jié)4.9元入手没酣,一節(jié)3.7V)串聯(lián)得到約12V輸入王财。說明:這個(gè)電池可以充電,多次使用裕便,綠色環(huán)保绒净。相關(guān)配套:18650電池充電器購(gòu)買鏈接(8.5元),18650電池盒(3節(jié)串聯(lián)偿衰,和小車底盤一并購(gòu)入)購(gòu)買鏈接挂疆。
- 控制器選擇Zduino pro mini購(gòu)買鏈接(28元入,它屬于Arduino Pro Mini類型)下翎。這款控制器用來控制電機(jī)和控制通信模塊缤言,可以對(duì)它進(jìn)行編程。
- Zduino本身的供電视事,它的輸入電壓是5V胆萧,這里使用L298N的5V輸出。說一個(gè)慘痛經(jīng)歷:在前一天俐东,使用12v電源給Zduino pro mini供電跌穗,可以驅(qū)動(dòng)兩個(gè)電機(jī)轉(zhuǎn)動(dòng)。今天同樣連線虏辫,通電后電機(jī)也轉(zhuǎn)動(dòng)了一下蚌吸,然后就不轉(zhuǎn)了,同時(shí)聞到焦味砌庄,一摸Zduino芯片燙手羹唠,看來是板子燒了。然后娄昆,嘗試使用USB串口寫入程序佩微,發(fā)現(xiàn)燒錄程序失敗,看來結(jié)果就是這樣了稿黄。分析原因喊衫,第二次使用時(shí),電池是充滿了電的杆怕,電壓達(dá)到了12V族购,之前電池虛電并沒有12V那么高。
- 控制電機(jī)使用了引腳5,6,9,10, 它們依次連接L298N的IN1陵珍,IN2寝杖,IN3,IN4這4個(gè)輸入互纯,IN1和IN2控制輸出OUT1和OUT2瑟幕,IN3和IN4控制輸出OUT3和OUT4。
-
控制ZigBee模塊(下圖1),有兩點(diǎn)只盹,一是給Zigbee模塊供電(Zduino輸出電壓5V辣往,Zigbee模塊輸入電壓3.3V,故用降壓板)殖卑,二是與Zigbee模塊通過串口進(jìn)行通信站削。具體連線是:Zduino的VCC,GND孵稽,RXI许起,TXO依次連接Zigbee模塊的降壓板(下圖2)的5V,GND菩鲜,引腳1园细,引腳2,降壓板的3V3接校,GND猛频,引腳1,引腳2依次連接Zigbee板的VCC馅笙,GND伦乔,Tx,Rx董习。說明一下,串口的連接也就是RXI和TXO爱只,需要對(duì)調(diào)連接皿淋,即RXI連接Tx,TXO連接Rx恬试。這里的名字不太一致窝趣,命名規(guī)范問題,功能是一樣的训柴。
- 其他硬件還包括杜邦線哑舒,小車還是比較緊湊的,不需要太長(zhǎng)的杜邦線幻馁,否則顯得凌亂洗鸵,10cm以內(nèi)剛剛好。杜邦線分為公對(duì)公仗嗦,母對(duì)母膘滨,公對(duì)母,每種都采購(gòu)一些稀拐,非常便宜火邓。面包板,有了它,可以把Zduino的引腳擴(kuò)展出來铲咨,可以很方便與其他硬件模塊連接躲胳,電源的連接也會(huì)方便很多,最大的好處纤勒,就是讓我們的小車顯得很清爽坯苹,不至于邋遢。
小車最終形象
我又重新按照上面文章的步驟踊东,重新組裝了一遍小車北滥,一次成功。
整體原理介紹
L298N用來控制4個(gè)電機(jī)闸翅,比如再芋,向前轉(zhuǎn)、向后轉(zhuǎn)坚冀,左側(cè)輪子向前轉(zhuǎn)而右側(cè)向后轉(zhuǎn)济赎,從而實(shí)現(xiàn)向右轉(zhuǎn)彎,控制電機(jī)轉(zhuǎn)速快慢记某。但是司训,光有L298N是完不成這么多復(fù)雜動(dòng)作的,它只是執(zhí)行具體任務(wù)的小兵液南,還需要一個(gè)指揮官來指揮它才行壳猜。這個(gè)指揮官就是arduino板子,它可以支持編寫程序滑凉,通過程序來給L298N下發(fā)指令统扳,叫它完成響應(yīng)的動(dòng)作。arduino板子程序編寫完成后畅姊,這個(gè)指揮官就有了一些控制電機(jī)的技能了咒钟。但是,我們希望可以再指揮arduino這個(gè)指揮官若未,比如朱嘴,我說“啟動(dòng)”,它就讓小車開動(dòng)起來粗合;我說“停止”萍嬉,它就讓小車停下來。要想arduino這個(gè)指揮官可以隨時(shí)聽從我的指揮舌劳,就需要zigbee這個(gè)通訊員了帚湘,它可以進(jìn)行無線數(shù)據(jù)傳輸,我們就可以把我們的指令通過zigbee告訴給arduino這個(gè)指揮官了甚淡。
軟件編程
- 本文對(duì)應(yīng)的Arduino代碼github地址
// hardware:Zduino pro mini
//Zduino pro mini only has one serial.
// this program is used to control car
// zigbee as communication protocol throgh DL-LN33
unsigned char returnFlag[8] = {0xfe, 0x05, 0x91, 0x90, 0x14, 0x10, 0x01, 0xff};
int input1 = 5; // 定義uno的pin 5 向 input1 輸出
int input2 = 6; // 定義uno的pin 6 向 input2 輸出
int input3 = 9; // 定義uno的pin 9 向 input3 輸出
int input4 = 10; // 定義uno的pin 10 向 input4 輸出
int carState = 1;
void setup() {
Serial.begin(115200); //RX TX serial port
pinMode(LED_BUILTIN, OUTPUT);
pinMode(8, OUTPUT);
//初始化各IO,模式為OUTPUT 輸出模式
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
}
String myPtHex(int g){ // 把 g 最右邊 byte 印成 Hex 倆位
String ret = "";
int a = g& 0xf0; // 左邊 4 bits
a = a >> 4; // 右移 4 bits
int b = g& 0x0f; // 右邊 4 bits
char c = a < 10 ? a + '0' : a + 'A' - 10;
// Serial.print(c);
ret += c;
c = b < 10 ? b + '0' : b + 'A' - 10;
// Serial.print(c);
ret += c;
// Serial.print("#" + ret + "#");
return ret;
}
void blinkLed(int pinNumber){
digitalWrite(pinNumber, HIGH);
delay(1);
digitalWrite(pinNumber, LOW);
}
void loop() {
// have zigbee data to come
int dataIndex = 1;
if (Serial.available()) {
digitalWrite(LED_BUILTIN, HIGH);
//send back to zigbee board.
// Serial.write(returnFlag, 8);
myPtHex((char)Serial.read());
dataIndex ++;
while(Serial.available()){
String dataFlag = myPtHex((char)Serial.read());
if(dataIndex == 7){
// Serial.print("$"+dataFlag);
//if zigbee send data 01, start car.
if(dataFlag == "01"){
blinkLed(8);
carState = 1;
}
// if zigbee send data 00, start car.
if(dataFlag == "00"){
blinkLed(8);
carState = 0;
}
}
dataIndex ++;
}
digitalWrite(LED_BUILTIN, LOW);
}
if(carState == 0){
stopCar();
}
if(carState == 1){
startCar();
}
}
void startCar(){
//forward 向前轉(zhuǎn)
digitalWrite(input1,HIGH); //給高電平
digitalWrite(input2,LOW); //給低電平
digitalWrite(input3,HIGH); //給高電平
digitalWrite(input4,LOW); //給低電平
delay(1000); //延時(shí)0.5秒
}
void stopCar(){
digitalWrite(input1,LOW);
digitalWrite(input2,LOW);
digitalWrite(input3,LOW);
digitalWrite(input4,LOW);
delay(1000); //延時(shí)0.5秒
}
- 以上程序如何燒錄到Zduino板子中呢大诸,需要兩個(gè)工具捅厂,一是需要一個(gè)硬件USB轉(zhuǎn)串口模塊購(gòu)買地址(25元購(gòu)入,現(xiàn)在12.5元)资柔。二是需要Arduino的開發(fā)工具Arduino IDE下載地址焙贷。
-
USB轉(zhuǎn)串口模塊和Zduino的連線方式,該模塊的GND贿堰,VCC辙芍,DTR/RTS,TX羹与,RX依次連接Zduino的GND故硅,VCC,DTR纵搁,RXI吃衅,TXO。
-
打開Arduino IDE腾誉,點(diǎn)擊IDE的菜單:工具(tools)-->開發(fā)板(board)徘层,選擇Arduino Pro or Pro Mini,然后點(diǎn)擊這個(gè)菜單的下一個(gè):端口(port)利职,選擇/dev/ttyUSB0趣效。
-
把上面的代碼粘貼到編輯區(qū),點(diǎn)擊菜單:項(xiàng)目-->上傳猪贪。
-
電池通電跷敬,4個(gè)強(qiáng)勁的輪子轉(zhuǎn)起來