一、 壁障小車的制作
1、 制作避障小車的準備工作
硬件:Arduino UNO、L298N驅動模塊、超聲波模塊、小車底盤、舵機模塊、一塊面包板、一些杜邦線。
軟件: Arduino UNO的程序下載軟件
下面來一張安裝好的的圖
2、舵機模塊的解析認識
本次用的是簡單實用的9克小舵機。
它的扭力不是很大,但是對于咱們想用作掃描超聲測距探頭來說足夠了。一般舵機的旋轉角度范圍都是0-180度旋轉的,也有一種數字電機可以在電機和舵機這兩種狀態下切換,既可以控制精確的旋轉角度也可以連續旋轉作為電機使用。舵機轉動的角度是由控制器的脈沖寬度決定的,假如舵機處在中間位置(90度),這時的脈沖寬度設定為1.5ms那么我們想讓舵機轉動到0度的時候可以給他1ms的脈沖,如果想讓它轉動到180度的時候可以給2ms的脈沖,這就是舵機角度控制的基本原理了。
3、超聲波模塊的解析認識
本次用的超聲波模塊如圖所示
模塊工作原理:
1、采用IO觸發測距,給至少10us的高電平信號;
2、模塊自動發送8個40KHz的方波,自動檢測是否有信號返回;
3、有信號返回,通過IO輸出一高電平,高電平持續的時間就是超聲波從發射到返回的時間.測試距離=(高電平時間*聲速(340m/s))/2;
4、L298N模塊的解析認識
本次用的L298N模塊如圖所示
2.驅動部分端子供電范圍Vs:+5V~+35V ; 如需要板內取電,則供電范圍Vs:+7V~+35V
3.驅動部分峰值電流Io:2A
4.邏輯部分工作電流范圍:0~36mA
6.控制信號輸入電壓范圍(IN1 IN2 IN3 IN4):
低電平:-0.3V≤Vin≤1.5V
高電平:2.3V≤Vin≤Vss
7.使能信號輸入電壓范圍(ENA ENB):
低電平:-0.3≤Vin≤1.5V(控制信號無效)
高電平:2.3V≤Vin≤Vss(控制信號有效)
8.最大功耗:20W(溫度T=75℃時)
9.存儲溫度:-25℃~+130℃
10.驅動板尺寸:58mm*40mm
12.其他擴展:控制方向指示燈、邏輯部分板內取電接口。
L298N可接受標準TTL邏輯電平信號VSS,VSS可接4.5~7 V電壓。4腳VS接電源電壓,VS電壓范圍VIH為+2.5~46 V。輸出電流可達2.5 A,可驅動電感性負載。L298可驅動2個直流電機,OUT1,OUT2和OUT3,OUT4之間可分別接直流電機。
電機轉動狀態編碼:
4、 面包板的解析認識
在具體使用的時候,通常是兩窄一寬同時使用,兩個窄條的第一行一般和地線連接,第二行和電源相連。由于集成塊電源一般在上面,接地在下面,如此布局有助于將集成塊的電源腳和上面第二行窄條相連,接地腳和下面窄條的第一行相連,減少連線長度和跨接線的數量。中間寬條用于連接電路,由于凹槽上下是不連通的,所以集成塊一般跨插在凹槽上。中間寬條一行5個,串聯到一起。插入面包板上孔內引腳或導線銅芯直徑為0.4~0.6mm,即比大頭針的直徑略微細一點。元器件引腳或導線頭要沿面包板的板面垂直方向插入方孔,應能感覺到有輕微、均勻的摩擦阻力,在面包板倒置時,元器件應能被簧片夾住而不脫落。面包板應該在通風、干燥處存放,特別要避免被電池漏出的電解液所腐蝕。要保持面包板清潔,焊接過的元器件不要插在面包板上。
6、總連接圖的解析
(1)Arduino與面包板接線說明
由于arduino UNO的引腳太少,所以需要把電源還有GND引出來,所以需要與面包板配合使用。Arduino上的5V接到面包板正極,arduino上的GND接到面包板上的負極。
(2)Arduino與L298N電機驅動模塊接線說明
I1 I2 I3 I4:電機控制輸入端,直接接單片機的IO口
OUT1 OUT2 OUT3 OUT4:電機接線端子。
SGND:接板子的GND
VIN:電機電源輸入端,電壓范圍+5V~+35v.
+5V:+5V電源輸入/輸出端。利用板子外面的電源給L298N芯片供電時,可以芯片電源的輸入端口。板內取電的時候也可以作為+5V電源引出腳。Out1和out2接直流電機的兩個引腳,Out3和out4接另一個直流電機的兩個引腳,vin接面包板上正極,SGND接面包板上的負極,L289N驅動板的I1,I2接arduino上的6,9兩個引腳。L289N驅動板的I3,I4接arduino上的10、11兩個引腳,L289N驅動板的5V接面包板上正極, L289N驅動板的GND接面包板上的負極。
(3)Arduino與超聲波模塊接線說明
超聲波上的VCC接面包板上的正極,GND接面包板上的負極,Echo接arduino板子上的模擬口A0,Trig接arduino上的模擬口A1.
(4)Arduino與舵機模塊接線說明
舵機上的紅線接面包板的正極,舵機上的棕線接面包板的負極,面包板上的橙線接arduino上的數字引腳5。
程序代碼:
#include
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(" ");
}
}
評論
查看更多