IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 超声波+红外线避障小车(Arduino + L298P电机驱动扩展板) -> 正文阅读

[嵌入式]超声波+红外线避障小车(Arduino + L298P电机驱动扩展板)

我是一名小学6年级的学生,就叫我小花生吧。我就读于北京市朝阳区垂杨柳中心小学金都分校。我学习Python编程已经两年多了,曾获得蓝桥杯全国选拔赛二等奖(Python中级青少年组)和北京复赛二等奖。打算明年初开始学习C++,? 由于Arduino语言有些类似C++语言而且简单,所以在父亲的帮助下我学习了Arduino单片机和Arduino编程语言,这篇文章介绍了我使用Arduino单片机制作超声波+红外线智能避障小车并附上程序源代码。

最开始我做的是超声波避障小车,做成之后我发现超声波测量距离有死角和盲区,小车在稍复杂的障碍物的环境下会探测不到障碍物,小车会撞到障碍物上。经过和父亲聊,父亲建议我在超声波传感器两边增加2路红外线传感器来探测超声波死角和盲区障碍物。这样超声波+红外线一起来探测障碍物,消除了小车在复杂障碍物的环境下发生碰撞的现象。

使用材料:

1. Arduino UNO R3 主控

2. L298P 电机驱动扩展版

3. 超声波传感器(HC-SR04)

4. 红外避障传感器X2

5. 直流减速电机X2(6V)

6. 舵机+云台

7. 小车底板+直流电机安装支架+万向轮

8. LED灯模块X4

9. 铜柱+五金件若干

10. 杜邦线若干

11. 电池和电池盒

12. 扎带

13.?巡线传感器X3(这个小车用不到,为其他程序预先装配)

14.?HC-05蓝牙模块(这个小车用不到,为其他程序预先装配)

以上这些材料从4家淘宝电商分别采购,价格如下图:

??

?

我的小车接线图(所有的线都接在L298P电机驱动扩展板上),接线示意图如下:

??

我计划要小车实现的运动和功能:

小车在行使过程中探测到40CM内有障碍物或者红外线避障传感器探测到障碍时,小车停下,舵机左右摆动,摆动时超声波探测小车左侧和右侧的距离。如果左侧大于右侧,那么左转,否则右转。前进时,前车灯点亮,后退时后车灯点亮蜂鸣器响起,左转左侧灯点亮蜂鸣器响起。右转右侧灯点亮蜂鸣器响起。停车全部灯点亮。

在程序编写和调试过程中遇到的困难和发现的问题:

1. 舵机控制我开始调用了库函数<Servo.h>, 但是我发现只要使用舵机库代码,那么有一个直流电机就一直无法转动。后来经过学习凌寒11的博客了解到舵机库会禁用Arduino 数字10引脚的PWM功能。而L298P电机驱动扩展板固化了Arduino数字 10,11,12,13引脚,而且10号引脚正是固化用来调速的(PWM)。

解决办法:参考凌寒11的博客:(19条消息) arduino-解决舵机与直流电机冲突问题_u010351766的专栏-CSDN博客https://blog.csdn.net/u010351766/article/details/64904756

2. 我的L298P电机驱动扩展板的D3和D5引脚之间的GND引脚其实并不是GND,也不是5V,建议接线的时候避开这个GND引脚就可以了。

程序代码:

int EchoPin = 8;
int TrigPin = 7;
int lval;
int rval;
int buzz = 4;
int E1 = 10;
int M1 = 12;
int E2 = 11;
int M2 = 13;
int fleft = A3;
int fright = A0;
int bleft = A1;
int bright = A2;
int lsensor = 6;
int rsensor = 5;
int servoPin = 9;
float distance,distance_left,distance_right;  
void setup() 
{
  pinMode(M1,OUTPUT);
  pinMode(M2,OUTPUT);
  pinMode(EchoPin,INPUT);
  pinMode(TrigPin,OUTPUT);
  pinMode(E1,OUTPUT);
  pinMode(E2,OUTPUT);
  pinMode(servoPin,OUTPUT);
  pinMode(fleft,OUTPUT);
  pinMode(fright,OUTPUT);
  pinMode(bleft,OUTPUT);
  pinMode(bright,OUTPUT);
  pinMode(lsensor,INPUT);
  pinMode(rsensor,INPUT);
  pinMode(buzz,OUTPUT);
  servo(90);
}

void buzz0()
{
  digitalWrite(buzz,LOW);
}

void buzz1()
{
  digitalWrite(buzz,HIGH);
  delay(135);
  digitalWrite(buzz,LOW);
  delay(135);
}

void buzz2()
{
  digitalWrite(buzz,HIGH);
}
void servo(int angle) { 
  for(int i=0;i<50;i++){
    int pulsewidth = (angle * 11) + 500; 
    digitalWrite(servoPin, HIGH);   
    delayMicroseconds(pulsewidth);
    digitalWrite(servoPin, LOW);
    delayMicroseconds(20000 - pulsewidth);
  }
  delay(100);
}
void measdist()
{
  digitalWrite(TrigPin,LOW);
  delayMicroseconds(10);
  digitalWrite(TrigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin,LOW);
  distance = pulseIn(EchoPin,HIGH);
  distance = distance / 58;
}
void scsr()
{
  measdist();
  lval = digitalRead(lsensor);
  rval = digitalRead(rsensor);
  if(distance<40||lval==0||rval==0)
  {  
    car_stop();
    servo(165);   //舵机左转
    delay(1000);
    measdist();
    distance_left = distance;
    distance_left = distance_left / 58;
    servo(0);//舵机右转
    delay(1000);
    measdist();
    distance_right = distance;
    distance_right = distance_right / 58;
    servo(90);//舵机转回中间
    delay(1000);
    if(distance_left<distance_right)
    { 
      car_back();
      delay(500);
      car_right();  
      delay(450);
      car_stop();   
    }
    else
    {
      car_back();
      delay(500);
      car_left(); 
      delay(450);
      car_stop();
    }
  }
  else
  {
    car_up(); 
  }
}

void car_left()
{
  digitalWrite(M1,HIGH);
  digitalWrite(M2,HIGH);
  analogWrite(E1,80);
  analogWrite(E2,0);
  digitalWrite(fleft,HIGH);
  digitalWrite(fright,LOW);
  digitalWrite(bleft,HIGH);
  digitalWrite(bright,LOW);
  buzz1();
}

void car_right()
{
  digitalWrite(M1,HIGH);
  digitalWrite(M2,HIGH);
  analogWrite(E1,0);
  analogWrite(E2,80);
  digitalWrite(fright,HIGH);
  digitalWrite(fleft,LOW);
  digitalWrite(bleft,LOW);
  digitalWrite(bright,HIGH);
  buzz1();
}

void car_up()
{
  digitalWrite(M1,HIGH);
  digitalWrite(M2,HIGH);
  analogWrite(E1,85);
  analogWrite(E2,85);
  digitalWrite(fleft,HIGH);
  digitalWrite(fright,HIGH);
  digitalWrite(bleft,LOW);
  digitalWrite(bright,LOW); 
  buzz0();
}

void car_back()
{
  digitalWrite(M1,LOW);
  digitalWrite(M2,LOW);
  analogWrite(E1,85);
  analogWrite(E2,85);
  digitalWrite(bleft,HIGH);
  digitalWrite(bright,HIGH);
  digitalWrite(fleft,LOW);
  digitalWrite(fright,LOW);
  buzz2();
}
void car_stop(){
  digitalWrite(M1,LOW);
  digitalWrite(M2,LOW);
  analogWrite(E1,0);
  analogWrite(E2,0);
  digitalWrite(fleft,HIGH);
  digitalWrite(fright,HIGH);
  digitalWrite(bleft,HIGH);
  digitalWrite(bright,HIGH);
  buzz1();
}

void loop() 
{
  scsr();
}

本文手稿原作者:小花生

本文的修改 / 网络排版 / 网络码字:小花生父亲

以下是原作手稿的一部分截图:

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 15:01:40  更:2021-10-02 15:02:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:03:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码