arduino控制超声波,基于arduino的超声波避障小车
我是小学六年级学生。请叫我花生。我在北京市朝阳区垂柳中心小学金都分校上学。学习Python编程两年多,获得蓝桥杯全国选拔赛二等奖(Python中级青年组)和北京复赛二等奖。我打算明年年初开始学习C语言。因为Arduino语言和C语言相似,简单,所以我在父亲的帮助下学习了Arduino单片机和Arduino编程语言。介绍了用Arduino单片机制作超声波红外智能越障车,并附上了程序源代码。
我做的第一个是超声波避障车。制作后发现超声波测距存在死角和死角。购物车在稍微复杂的障碍物环境下是无法检测到障碍物的,购物车会撞到障碍物。和父亲谈过之后,父亲建议我在超声波传感器两侧加两个红外传感器,用来探测超声波死角和死角障碍物。这样超声波和红外线就可以一起探测障碍物,从而消除复杂障碍物环境下的汽车碰撞现象。
使用材料:
1.主Arduino Uno R3
2.L298P电机驱动加长版
3.超声波传感器(HC-SR04))。
4.2红外屏障传感器
5.DC减压器x2(6v))。
6.转向器万向节
7.台车底板DC电机安装支架用万向轮
8.4 led指示器模块
9.有几个铜柱配件。
10.多少条杜邦线?
11.电池和电池盒
12.扎带
13.巡逻传感器X3)此购物车不可用。为其他程序提前汇编)。
14.HC-05蓝牙模块(本购物车不提供。为其他程序提前汇编)。
以上这些材料从4家淘宝电商分别采购,价格如下图:
我的小车接线图(所有的线都接在L298P电机驱动扩展板上),接线示意图如下:
我计划要小车实现的运动和功能:
当小车在运行中检测到40CM以内的障碍物,或红外隐身传感器检测到障碍物时,小车停止,舵机左右摆动。摆动时,通过超声波检测小车左右两侧的距离。左侧大于右侧时左转,否则右转。前进时大灯亮,后退时背景灯亮,蜂鸣器响,左转时左灯亮,蜂鸣器响。右侧的灯亮起,蜂鸣器鸣响。所有的灯都亮着。
在程序编写和调试过程中遇到的困难和发现的问题:
1.舵机控制。我开始调用库函数Servo.h,发现只要用梯形图存储库代码,就有一个DC电机一直转不动。之后根据凌凌11的博客,梯形图库会禁用Arduino数字10针的PWM功能。另一方面,L298P电机驱动扩展板固化了Arduino的数字引脚10、11、12、13,引脚10固化了调速(PWM)。
解决方法:参考韩玲11博客:(第19条新闻(arduino-解决舵机与DC电机碰撞问题_ column _ u 010351766-blog.csdn.net/u CSDN博客3359 010351766/artion
2.我的L298P电机驱动扩展板D3端子和D5端子之间的GND端子实际上既不是GND也不是5V。建议避免使用这种GND端子进行接线。
程序代码:
int echo pin=8;int trig pin=7;int lvalint rvalint buzz=4;int E1=10;int M1=12;int E2=11int M2=13;int fleft=A3int fright=A0int bleft=A1int bright=A2int l sensor=6;int r sensor=5;int servo pin=9;浮点距离,distance _ left,distance _ right;void setup () pinmode(m1,输出);pinmode(m2,输出);pinmode(echopin,输入);拼音模式(trig pin,输出);pinmode(E1,输出;pinmode(E2,输出;pinmode(servopin,输出);pinmode(fleft,输出);pinmode(惊骇,输出);pinmode(bleft,输出);pinmode(亮,输出);引脚模式(l传感器,输入);引脚模式(r传感器,输入);pinmode(嗡嗡声,输出);服务器(90;}void buzz0() { digit
alWrite(嗡嗡声,低);}void buzz1(){ digitalWrite(buzz,HIGH);延迟(135);数字书写(嗡嗡声,低);延迟(135);}void buzz2(){ digitalWrite(buzz,HIGH);} void servo(int angle){ for(int I=0;i50i ){ int pulsewidth=(角度* 11)500;数字书写(伺服引脚,高电平);延迟微秒(脉冲宽度);数字书写(伺服引脚,低电平);延迟微秒(20000脉冲宽度);}延迟(100);} void meas dist(){数字写入(trig引脚,低电平);耽搁微秒(10);数字书写(触发,高电平);耽搁微秒(10);数字书写(触发,低电平);距离=pulseIn(EchoPin高);距离=距离/58;} void scsr(){ meas dist();lval=digitalRead(l传感器);rval=数字读数(r传感器);if(distance 40 lval==0 rval==0){ car _ stop();伺服(165);//舵机左转延时(1000);测量距离();左侧距离=距离;左侧距离=距离_左/58;伺服(0);//舵机右转延时(1000);测量距离();距离_右侧=距离;距离_右=距离_右/58;伺服(90);//舵机转回中间延时(1000);if(distance _ left distance _ right){ car _ back();延迟(500);car _ right();延迟(450);car _ stop();} else { car _ back();延迟(500);car _ left();延迟(450);car _ stop();} } else { car _ up();} } void car _ left(){数字写(M1,高);digitalWrite(M2,高);analogWrite(E1,80);analogWrite(E2,0);digitalWrite(fleft,高);数字书写(惊吓,低);数字书写(bleft,高);数字书写(亮,低);buzz 1();} void car _ right(){数字写(M1,高);digitalWrite(M2,高);analogWrite(E1,0);analogWrite(E2,80);数字书写(惊吓,高);digitalWrite(fleft,低);数字书写(bleft,低);数字书写(亮,高);buzz 1();}void car_up(){ digitalWrite(M1高);digitalWrite(M2,高);analogWrite(E1,85);analogWrite(E2,85);digitalWrite(fleft,高);数字书写(惊吓,高);数字书写(bleft,低);数字书写(亮,低);buzz 0();} void car _ back(){数字写(M1,低);digitalWrite(M2,低);analogWrite(E1,85);analogWrite(E2,85);数字书写(bleft,高);数字书写(亮,高);digitalWrite(fleft,低);数字书写(惊吓,低);巴兹2();} void car _ stop(){数字写(M1,低);digitalWrite(M2,低);analogWrite(E1,0);analogWrite(E2,0);digitalWrite(fleft,高);数字书写(惊吓,高);数字书写(bleft,高);数字书写(亮,高);buzz 1();} void loop(){ scsr();} 本文手稿原作者:小花生
本文的修改/网络排版/网络码字:小花生父亲
以下是原作手稿的一部分截图: