Arduino小车相关学习
HEAD、拓展板图解
一、电机L298N相关(非专业,直接摘自CSDN)
L298N接线如图所示
L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是起输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等等,特别是其输入端可以与单片机直接相连,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机的正转和反转,实现此功能只需要改变输入端的逻辑电平。为了避免电机对单片机的干扰,本模块加入光耦,进行光电隔离,从而使系统能够稳定可靠的工作。
Output A:接DC 电机 1 或步进电机的 A+和 A-;
Output B:接DC 电机 2 或步进电机的 B+和 B-;
5V Enable:如果使用输入电源大于12V的电源,请将跳线帽移除。输入电源小于12V时短接可以提供5V电源输出;
+5V Power:当输入电源小于12V时且5V Enable处于短接状态,可以提供+5V电源输出;(实际位置请参考驱动板上的标注)
Power Gnd:电源地;
+12V Power:连接电机电源,最大35V。输入电压大于12V时,为确保安全,请去除 5V Enble 针脚上的跳线帽;(实际位置请参考驱动板上的标注)
A/B Enble:可用于输入PWM脉宽调制信号对电机进行调速控制。(如果无须调速可将两引脚接5V,使电机工作在最高速状态,既将短接帽短接)实现电机正反转就更容易了,输入信号端IN1接高电平输入端IN2接低电平,电机M1正转。(如果信号端IN1接低电平, IN2接高电平,电机M1反转。)控制另一台电机是同样的方式,输入信号端IN3接高电平,输入端IN4接低电平,电机M2正转。(反之则反转),PWM信号端A控制M1调速,PWM信号端B控制M2调速。可参考下图表:
测试程序如下,USB接口连接电脑通过IDE上传程序后,先拔除USB数据线,再根据上图连接电路即可开始测试。
二、驱动轮子测试
void setup(){
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop(){
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}
原理为电流从高电平到低电平,驱动电机转动。
三、超声波小车
1、超声波模块与舵机接线
超声波模块接线如图
舵机接线如图
2、超声波代码测试
float checkdistance_2_3() {
digitalWrite(2, LOW);
delayMicroseconds(2);//暂停晶片2微秒
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
float distance = pulseIn(3, HIGH) / 58.00;
delay(10);
return distance;
}//超声波算法函数,返回前方障碍物的距离,单位为cm
void setup(){
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}
void loop(){
Serial.println(checkdistance_2_3());
}
[pulseIn()] pulseIn()说明读引脚的脉冲信号, 被读取的脉冲信号可以是 HIGH 或 LOW. 例如我们要检测HIGH脉冲信号, Arduino将在引脚变为高电平时开始计时, 当引脚变为低电平时停止记时,并返回脉冲持续时长(时间单位:微秒)。如果在超时时间内没有读到脉冲信号的话, 将返回0.根据经验发现,pulseIn()函数在检测脉冲间隔过短的信号时会产生错误。Arduino可检测的脉冲间隔时间范围是10微秒到3分钟。请留意假如调用pulseIn()函数时读取信号的引脚上已经为高电平,此时Arduino将等待该引脚变为低电平以后再开始检测脉冲信号。另外只有Arduino的中断是开启时,才能使用pulseIn()。语法
pulseIn(pin, value)pulseIn(pin, value, timeout)
参数pin 引脚编号 state 脉冲状态 timeout 超时时间(单位:微秒) 如果Arduino在超时时间(timeout)内没有读到脉冲信号的话, 该函数将返回0.超时时间参数是可选参数,其默认值为1秒。返回值脉冲持续时长。 如果在超时时间内没有读到脉冲信号, 将返回0.[delayMicroseconds()] delayMicroseconds()说明delayMicroseconds()与delay()函数都可用于暂停程序运行。不同的是,delayMicroseconds()的参数单位是微秒(1毫秒=1000微秒)。语法delayMicroseconds(us)参数us: 暂停时间,该时间单位是微秒( unsigned long型数据)返回值无示例程序Arduino12345678910111213int ledPin = 13; // Arduino Uno引脚13接有LEDvoid setup(){ pinMode(ledPin, OUTPUT); // 将LED连接引脚设置为输出模式} void loop(){ digitalWrite(ledPin, HIGH); // 点亮LED delayMicroseconds(10000); // 等待10000微秒 digitalWrite(ledPin, LOW); // 熄灭LED delayMicroseconds(10000); // 等待10000微秒}
3、超声波避障小车实战
#include <Servo.h>
Servo servo_9;
float checkdistance_2_3() {
digitalWrite(2, LOW);
delayMicroseconds(2);
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
float distance = pulseIn(3, HIGH) / 58.00;
delay(10);
return distance;
}//超声波测小小车距离cm
void back() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}//小车后退
void go() {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}//小车前进
void left() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车向左
void stop() {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车停止
void setup(){
servo_9.attach(9);
servo_9.write(90);
delay(1000);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}
void loop(){
if (checkdistance_2_3() > 15) {
go();
} else if (checkdistance_2_3() <= 15) {
stop();
delay(200);
back();
delay(200);
left();
delay(300);
}
}
4、跟随版小车(直线)
#include <Servo.h>
Servo servo_9;
float checkdistance_2_3() {
digitalWrite(2, LOW);
delayMicroseconds(2);
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
float distance = pulseIn(3, HIGH) / 58.00;
delay(10);
return distance;
}//超声波测小小车距离cm
void back() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}//小车后退
void go() {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}//小车前进
void left() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车向左
void stop() {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车停止
void setup(){
servo_9.attach(9);
servo_9.write(90);
delay(1000);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}
void loop(){
if (checkdistance_2_3() > 15) {
go();
} else if (checkdistance_2_3() <= 15) {
stop();
delay(200);
back();
delay(200);
left();
delay(300);
}
}
四、红外遥控小车(开发中)
1、红外模块接线
红外模块接线如图
2、遥控对应的值
按键 | 对应的值 |
---|---|
按键1 | 0xFFA25D |
按键2 | 0xFF629D |
按键3 | 0xFFE21D |
按键4 | 0xFF22DD |
按键5 | 0xFF02FD |
按键6 | 0xFFC23D |
按键7 | 0xFFE01F |
按键8 | 0xFFA857 |
按键9 | 0xFF960F |
按键* | 0xFF6897 |
按键0 | 0xFF9867 |
按键# | 0xFFB04F |
按键上 | 0xFF18E7 |
按键下 | 0xFF4AB5 |
按键左 | 0xFF10EF |
按键右 | 0xFF5AA5 |
按键OK | 0xFF38C7 |
3、红外控制代码
四、红外避障小车
1、红外模块连线(2个)
左侧如图
右侧如图
3、红外模块代码测试
#include <Servo.h>
Servo servo_9;
float checkdistance_2_3() {
digitalWrite(2, LOW);
delayMicroseconds(2);
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
float distance = pulseIn(3, HIGH) / 58.00;
delay(10);
return distance;
}//超声波测小小车距离cm
void back() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}//小车后退
void go() {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}//小车前进
void left() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车向左
void stop() {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车停止
void setup(){
servo_9.attach(9);
servo_9.write(90);
delay(1000);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}
void loop(){
if (checkdistance_2_3() > 15) {
go();
} else if (checkdistance_2_3() <= 15) {
stop();
delay(200);
back();
delay(200);
left();
delay(300);
}
}
4、调红外模块灵敏度
旋转旋钮,使其处于两灯都亮和只亮一盏灯的边界,此时灵敏度最高。
5、红外加超声波进行避障(避障完美版)
#include <Servo.h>
Servo servo_9;
float checkdistance_2_3() {
digitalWrite(2, LOW);
delayMicroseconds(2);
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
float distance = pulseIn(3, HIGH) / 58.00;
delay(10);
return distance;
}//超声波测小小车距离cm
void back() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}//小车后退
void go() {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}//小车前进
void left() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车向左
void stop() {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}//小车停止
void setup(){
servo_9.attach(9);
servo_9.write(90);
delay(1000);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}
void loop(){
if (checkdistance_2_3() > 15) {
go();
} else if (checkdistance_2_3() <= 15) {
stop();
delay(200);
back();
delay(200);
left();
delay(300);
}
}
五、蓝牙控制
1、HC-06蓝牙模块连接
如图连接
2、蓝牙控制代码测试
float checkdistance_2_3() {
digitalWrite(2, LOW);
delayMicroseconds(2);
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
float distance = pulseIn(3, HIGH) / 58.00;
delay(10);
return distance;
}//超声波测小小车距离cm
void back() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}
void go() {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}
void left() {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void right() {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}
void Stop() {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void joyMode(char serialCmd){
switch(serialCmd){
case 'w':
go();
break;
case 's':
back();
break;
case 'a':
left();
delay(200);
Stop();
break;
case 'd':
right();
delay(200);
Stop();
break;
case 'p':
Stop();
break;
}
}
void setup(){
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
Serial.begin(9600);
}
void loop(){
if(Serial.available()>0){
char serialCmd = Serial.read();
joyMode(serialCmd);
}else{
delay(300);
}
if(checkdistance_2_3() < 7){
Stop();
delay(300);
}
if (digitalRead(11) == 0 && digitalRead(12) == 0) {
Stop();
delay(200);
back();
delay(300);
left();
delay(300);
} else if (digitalRead(11) == 1 && digitalRead(12) == 0) {
Stop();
delay(200);
} else if (digitalRead(11) == 0 && digitalRead(12) == 1) {
Stop();
delay(200);
}
}
3、切换模式版(开发中)