小白Arduino小车学习分模块版

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、遥控对应的值
按键对应的值
按键10xFFA25D
按键20xFF629D
按键30xFFE21D
按键40xFF22DD
按键50xFF02FD
按键60xFFC23D
按键70xFFE01F
按键80xFFA857
按键90xFF960F
按键*0xFF6897
按键00xFF9867
按键#0xFFB04F
按键上0xFF18E7
按键下0xFF4AB5
按键左0xFF10EF
按键右0xFF5AA5
按键OK0xFF38C7
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、切换模式版(开发中)
  • 44
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值