一、 壁障小车的制作 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模块如图所示 1.驱动芯片:L298N双H桥直流电机驱动芯片 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 <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(" "); } } |
|