一、 壁障小车的制作
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(" ");
}
}
以上硬件购买链接如下:
cepark.taobao.com