超声波+红外线避障小车(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();
}
本文手稿原作者:小花生
本文的修改 / 网络排版 / 网络码字:小花生父亲
以下是原作手稿的一部分截图:
超声波+红外线避障小车(Arduino + L298P电机驱动扩展板)相关推荐
- (4WD+2路红外线)arduino UNO四驱arduino超声波+红外线避障小车
有兴趣可以点击**我的店铺**看看小车硬件.提供安装说明.此图片仅供参考,图中是2驱超声波避障+循迹双模式小车.程序与本文有相同之处. .................... 四驱arduino超声 ...
- arduino超声波自动避障小车制作过程
超声波自动避障小车 #include <Servo.h> #define Trig 2 //引脚控制超声波发出声波 #define Echo 3 //引脚反应接收到返回声波 #define ...
- 将循迹小车改为蓝牙控制自动避障小车#arduino
演示视频:https://www.bilibili.com/video/BV1CM41187oh/?share_source=copy_web&vd_source=d43eaf7cae2ed3 ...
- stm32捕获占空比_基于STM32超声波避障小车
不管是对于初学者还是对于一个玩过单片机的电子爱好者来说,或多或少都接触到过小车项目,今天给大家介绍的的一个项目基于STM32超声波避障小车.这也是我曾经的一个课设,在此开源分享给大家,全文5000多字 ...
- Arduino开发实例-DIY超声波传感器避障机器人
超声波传感器避障机器人 1.应用介绍 在本应用中,我们将使用一个超声波传感器与两个直流电机和一个伺服电机相结合,Arduino作为主控板创建一个简单的避障机器人. 超声波传感器发送和接收信号以确定物体 ...
- 利用52单片机制作的超声波避障小车(包含所有源码)
做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...
- 【arduino】KitteBlock自动避障小车
原文链接:http://www.arduino.cn/thread-45399-1-1.html [KitteBlock]自动避障小车 (超级简单, 推荐新手) avirufus 注册会员 201 ...
- STM32F103RCT6 实验代码之舵机+超声波避障小车(一)杂谈+电机+L298N
STM32 舵机+超声波避障 一.直流电机 二.L298N模块 寒假由于时间较长,自己就想做一个智能车玩玩,第一个做的是蓝牙小车,不过比较简单,我就不打算具体另开一个部分,到时候挑一些与避障小车不一样 ...
- 基于arduino单片机智能避障小车
基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...
最新文章
- Java 游泳时长计算
- jquery 对框架自适应高度 兼容各种浏览器
- 斑能不能彻底去掉_小龙虾的头、虾黄到底能不能吃?赶紧告诉身边人......
- 备考3次终于过信息系统项目管理师长篇心路历程
- java从键盘输入一组数据,输出其最大值,平均值,最小值没法输出
- java多线程入门1
- 为什么input中的maxlength属性失效了
- 强化学习数学基础1---Policy Gradient
- 数据结构与算法之栈的用法
- 多个高危 BIOS 缺陷影响英特尔处理器,特斯拉 Model 3 未幸免,可用于供应链攻击...
- 文件——rstrip() 、lstrip()和 strip()、zip() 函数
- 人工智能之-产生式系统
- 22年QQ号被盗,好友协助验证却申诉无效
- Ubuntu安装cuckoo布谷鸟沙箱详细步骤
- Outlook 阿里邮箱 重复收取邮件 的情况 及解决方案
- halcon第五讲:汉字识别
- 【数学建模】2022亚太赛A题 结晶器熔炼结晶过程序列图像特征提取与建模分析
- 第1章 对象入门——Thinking-in-Java
- parseInt() 函数的奇怪行为
- html标签可以嵌套吗,HTML标签的嵌套