一、 壁障小車的制作 1、 制作避障小車的準(zhǔn)備工作 硬件:Arduino UNO、L298N驅(qū)動(dòng)模塊、超聲波模塊、小車底盤、舵機(jī)模塊、一塊面包板、一些杜邦線。 軟件: Arduino UNO的程序下載軟件 下面來一張安裝好的的圖 2、舵機(jī)模塊的解析認(rèn)識(shí) 本次用的是簡(jiǎn)單實(shí)用的9克小舵機(jī)。 它的扭力不是很大,但是對(duì)于咱們想用作掃描超聲測(cè)距探頭來說足夠了。一般舵機(jī)的旋轉(zhuǎn)角度范圍都是0-180度旋轉(zhuǎn)的,也有一種數(shù)字電機(jī)可以在電機(jī)和舵機(jī)這兩種狀態(tài)下切換,既可以控制精確的旋轉(zhuǎn)角度也可以連續(xù)旋轉(zhuǎn)作為電機(jī)使用。舵機(jī)轉(zhuǎn)動(dòng)的角度是由控制器的脈沖寬度決定的,假如舵機(jī)處在中間位置(90度),這時(shí)的脈沖寬度設(shè)定為1.5ms那么我們想讓舵機(jī)轉(zhuǎn)動(dòng)到0度的時(shí)候可以給他1ms的脈沖,如果想讓它轉(zhuǎn)動(dòng)到180度的時(shí)候可以給2ms的脈沖,這就是舵機(jī)角度控制的基本原理了。 3、超聲波模塊的解析認(rèn)識(shí) 本次用的超聲波模塊如圖所示 模塊工作原理: 1、采用IO觸發(fā)測(cè)距,給至少10us的高電平信號(hào); 2、模塊自動(dòng)發(fā)送8個(gè)40KHz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回; 3、有信號(hào)返回,通過IO輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間.測(cè)試距離=(高電平時(shí)間*聲速(340m/s))/2; 4、L298N模塊的解析認(rèn)識(shí) 本次用的L298N模塊如圖所示 1.驅(qū)動(dòng)芯片:L298N雙H橋直流電機(jī)驅(qū)動(dòng)芯片 2.驅(qū)動(dòng)部分端子供電范圍Vs:+5V~+35V ; 如需要板內(nèi)取電,則供電范圍Vs:+7V~+35V 3.驅(qū)動(dòng)部分峰值電流Io:2A 4.邏輯部分工作電流范圍:0~36mA 6.控制信號(hào)輸入電壓范圍(IN1 IN2 IN3 IN4): 低電平:-0.3V≤Vin≤1.5V 高電平:2.3V≤Vin≤Vss 7.使能信號(hào)輸入電壓范圍(ENA ENB): 低電平:-0.3≤Vin≤1.5V(控制信號(hào)無效) 高電平:2.3V≤Vin≤Vss(控制信號(hào)有效) 8.最大功耗:20W(溫度T=75℃時(shí)) 9.存儲(chǔ)溫度:-25℃~+130℃ 10.驅(qū)動(dòng)板尺寸:58mm*40mm 12.其他擴(kuò)展:控制方向指示燈、邏輯部分板內(nèi)取電接口。 L298N可接受標(biāo)準(zhǔn)TTL邏輯電平信號(hào)VSS,VSS可接4.5~7 V電壓。4腳VS接電源電壓,VS電壓范圍VIH為+2.5~46 V。輸出電流可達(dá)2.5 A,可驅(qū)動(dòng)電感性負(fù)載。L298可驅(qū)動(dòng)2個(gè)直流電機(jī),OUT1,OUT2和OUT3,OUT4之間可分別接直流電機(jī)。 電機(jī)轉(zhuǎn)動(dòng)狀態(tài)編碼: 4、 面包板的解析認(rèn)識(shí) 在具體使用的時(shí)候,通常是兩窄一寬同時(shí)使用,兩個(gè)窄條的第一行一般和地線連接,第二行和電源相連。由于集成塊電源一般在上面,接地在下面,如此布局有助于將集成塊的電源腳和上面第二行窄條相連,接地腳和下面窄條的第一行相連,減少連線長(zhǎng)度和跨接線的數(shù)量。中間寬條用于連接電路,由于凹槽上下是不連通的,所以集成塊一般跨插在凹槽上。中間寬條一行5個(gè),串聯(lián)到一起。插入面包板上孔內(nèi)引腳或?qū)Ь€銅芯直徑為0.4~0.6mm,即比大頭針的直徑略微細(xì)一點(diǎn)。元器件引腳或?qū)Ь€頭要沿面包板的板面垂直方向插入方孔,應(yīng)能感覺到有輕微、均勻的摩擦阻力,在面包板倒置時(shí),元器件應(yīng)能被簧片夾住而不脫落。面包板應(yīng)該在通風(fēng)、干燥處存放,特別要避免被電池漏出的電解液所腐蝕。要保持面包板清潔,焊接過的元器件不要插在面包板上。 6、總連接圖的解析 (1)Arduino與面包板接線說明 由于arduino UNO的引腳太少,所以需要把電源還有GND引出來,所以需要與面包板配合使用。Arduino上的5V接到面包板正極,arduino上的GND接到面包板上的負(fù)極。 (2)Arduino與L298N電機(jī)驅(qū)動(dòng)模塊接線說明 I1 I2 I3 I4:電機(jī)控制輸入端,直接接單片機(jī)的IO口 OUT1 OUT2 OUT3 OUT4:電機(jī)接線端子。 SGND:接板子的GND VIN:電機(jī)電源輸入端,電壓范圍+5V~+35v. +5V:+5V電源輸入/輸出端。利用板子外面的電源給L298N芯片供電時(shí),可以芯片電源的輸入端口。板內(nèi)取電的時(shí)候也可以作為+5V電源引出腳。Out1和out2接直流電機(jī)的兩個(gè)引腳,Out3和out4接另一個(gè)直流電機(jī)的兩個(gè)引腳,vin接面包板上正極,SGND接面包板上的負(fù)極,L289N驅(qū)動(dòng)板的I1,I2接arduino上的6,9兩個(gè)引腳。L289N驅(qū)動(dòng)板的I3,I4接arduino上的10、11兩個(gè)引腳,L289N驅(qū)動(dòng)板的5V接面包板上正極, L289N驅(qū)動(dòng)板的GND接面包板上的負(fù)極。 (3)Arduino與超聲波模塊接線說明 超聲波上的VCC接面包板上的正極,GND接面包板上的負(fù)極,Echo接arduino板子上的模擬口A0,Trig接arduino上的模擬口A1. (4)Arduino與舵機(jī)模塊接線說明 舵機(jī)上的紅線接面包板的正極,舵機(jī)上的棕線接面包板的負(fù)極,面包板上的橙線接arduino上的數(shù)字引腳5。 程序代碼: #include <Servo.h> int pinLB=6; int pinLF=9; int pinRB=10; int pinRF=11; int inputPin = A0; int outputPin =A1; int Fspeedd = 0; int Rspeedd = 0; int Lspeedd = 0; int direcTIonn = 0; Servo myservo; int delay_TIme = 250; int Fgo = 8; int Rgo = 6; int Lgo = 4; int Bgo = 2; void setup() { Serial.begin(9600); pinMode(pinLB,OUTPUT); pinMode(pinLF,OUTPUT); pinMode(pinRB,OUTPUT); pinMode(pinRF,OUTPUT); pinMode(inputPin, INPUT); pinMode(outputPin, OUTPUT); myservo.attach(5); } void advance(int a) { digitalWrite(pinRB,LOW); digitalWrite(pinRF,HIGH); digitalWrite(pinLB,LOW); digitalWrite(pinLF,HIGH); delay(a * 100); } void right(int b) { digitalWrite(pinRB,LOW); digitalWrite(pinRF,HIGH); digitalWrite(pinLB,HIGH); digitalWrite(pinLF,HIGH); delay(b * 100); } void left(int c) { digitalWrite(pinRB,HIGH); digitalWrite(pinRF,HIGH); digitalWrite(pinLB,LOW); digitalWrite(pinLF,HIGH); delay(c * 100); } void turnR(int d) { digitalWrite(pinRB,LOW); digitalWrite(pinRF,HIGH); digitalWrite(pinLB,HIGH); digitalWrite(pinLF,LOW); delay(d * 100); } void turnL(int e) { digitalWrite(pinRB,HIGH); digitalWrite(pinRF,LOW); digitalWrite(pinLB,LOW); digitalWrite(pinLF,HIGH); delay(e * 100); } void stopp(int f) { digitalWrite(pinRB,HIGH); digitalWrite(pinRF,HIGH); digitalWrite(pinLB,HIGH); digitalWrite(pinLF,HIGH); delay(f * 100); } void back(int g) { digitalWrite(pinRB,HIGH); digitalWrite(pinRF,LOW); digitalWrite(pinLB,HIGH); digitalWrite(pinLF,LOW); delay(g * 100); } void detecTIon() { int delay_TIme = 250; ask_pin_F(); if(Fspeedd < 10) { stopp(1); back(2); } if(Fspeedd < 25) { stopp(1); ask_pin_L(); delay(delay_time); ask_pin_R(); delay(delay_time); if(Lspeedd > Rspeedd) { directionn = Rgo; } if(Lspeedd <= Rspeedd) { directionn = Lgo; } if (Lspeedd < 10 && Rspeedd < 10) { directionn = Bgo; } } else { directionn = Fgo; } } void ask_pin_F() { myservo.write(90); digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); delayMicroseconds(10); digitalWrite(outputPin, LOW); float Fdistance = pulseIn(inputPin, HIGH); Fdistance= Fdistance/5.8/10; Serial.print("F distance:"); Serial.println(Fdistance); Fspeedd = Fdistance; } void ask_pin_L() { myservo.write(5); delay(delay_time); digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); delayMicroseconds(10); digitalWrite(outputPin, LOW); float Ldistance = pulseIn(inputPin, HIGH); Ldistance= Ldistance/5.8/10; Serial.print("L distance:"); Serial.println(Ldistance); Lspeedd = Ldistance; } void ask_pin_R() { myservo.write(177); delay(delay_time); digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); delayMicroseconds(10); digitalWrite(outputPin, LOW); float Rdistance = pulseIn(inputPin, HIGH); Rdistance= Rdistance/5.8/10; Serial.print("R distance:"); Serial.println(Rdistance); Rspeedd = Rdistance; } void loop() { myservo.write(90); detection(); if(directionn == 2) { back(8); turnL(2); Serial.print(" Reverse "); } if(directionn == 6) { back(1); turnR(6); Serial.print(" Right "); } if(directionn == 4) { back(1); turnL(6); Serial.print(" Left "); } if(directionn == 8) { advance(1); Serial.print(" Advance "); Serial.print(" "); } } |
|