arduino与蔽障小车的连接使用

一、 壁障小车的制作

1、 制作壁障小车的准备工作

硬件:Arduino UNO、L298N驱动模块、超声波模块、小车底盘、舵机模块、一块面包板、一些杜邦线。

软件: Arduino UNO的程序下载软件

下面来一张安装好的的图

arduino与蔽障小车的连接使用

2、舵机模块的解析认识

本次用的是简单实用的9克小舵机。

arduino与蔽障小车的连接使用

它的扭力不是很大,但是对于咱们想用作扫描超声测距探头来说足够了。一般舵机的旋转角度范围都是0-180度旋转的,也有一种数字电机可以在电机和舵机这两种状态下切换,既可以控制精确的旋转角度也可以连续旋转作为电机使用。舵机转动的角度是由控制器的脉冲宽度决定的,假如舵机处在中间位置(90度),这时的脉冲宽度设定为1.5ms那么我们想让舵机转动到0度的时候可以给他1ms的脉冲,如果想让它转动到180度的时候可以给2ms的脉冲,这就是舵机角度控制的基本原理了。

3、超声波模块的解析认识

本次用的超声波模块如图所示

arduino与蔽障小车的连接使用

模块工作原理:

1、采用IO触发测距,给至少10us的高电平信号;

2、模块自动发送8个40KHz的方波,自动检测是否有信号返回;

3、有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340m/s))/2;

4、L298N模块的解析认识

arduino与蔽障小车的连接使用

本次用的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之间可分别接直流电机。

电机转动状态编码:

arduino与蔽障小车的连接使用

4、 面包板的解析认识

arduino与蔽障小车的连接使用

在具体使用的时候,通常是两窄一宽同时使用,两个窄条的第一行一般和地线连接,第二行和电源相连。由于集成块电源一般在上面,接地在下面,如此布局有助于将集成块的电源脚和上面第二行窄条相连,接地脚和下面窄条的第一行相连,减少连线长度和跨接线的数量。中间宽条用于连接电路,由于凹槽上下是不连通的,所以集成块一般跨插在凹槽上。中间宽条一行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(” “);

}

}