今天为大家分享一个Arduino自动避障小车的完整制作过程,昨天有朋友咨询想做一个自动施肥的创意,但说实话Arduino这个单片机是比较简单的,做一些简单的应用还可以,涉及到复杂的应用不管是从算力还是接口方面都稍显不足。不过整体而言还是很适合大家入门单片机的。
关于单片机方面,波波本身也没有经过专业的学习,而是因为本身爱好编程和电子业余学习。因此分享的笔记中难免有不足之处。还望大家指正。
首先看下小车安装好的效果图:
想做一个Arduino 自动避障智能小车我们至少需要以下几种材料,当然类似螺丝刀这样的工具就不说了。
1、Arduino主板一块(不是必需的,如果大家有Esp8266这样的芯片,也可以用来开发成网络控制的小车)
2、L298N电机驱动模块,作用驱动两个轮子的直流电机。
3、超声波模块,陀机及其支架。
4、小车底盘、万向轮、电池盒、接线。
材料准备好了,我们要按照图片所示安装起来,写入程序。
- #include <Servo.h>
- #define Trig 2 //引脚控制超声波发出声波
- #define Echo 3 //引脚反应接收到返回声波
- #define LIN1 7 //左侧轮子
- #define LIN2 6
- #define RIN1 5 //右侧轮子
- #define RIN2 4
- //#define Steeringpin 9 //舵机控制端口
- int S = 0; //初始化距离
- Servo Steering; //转向舵机
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(9600); //设置比特率
- pinMode(Trig, OUTPUT);
- pinMode(Echo, INPUT);
- pinMode(LIN1, OUTPUT);
- pinMode(LIN2, OUTPUT);
- pinMode(RIN1, OUTPUT);
- pinMode(RIN2, OUTPUT);
- // pinMode(Steeringpin, OUTPUT);
- Steering.attach(9); //定义舵机所用引脚
- Steering.write(90); //初始化舵机角度
- delay(2000); //开机延时
- }
- void loop() {
- // put your main code here, to run repeatedly:
- Steering.write(90);
- Range(); //测距函数
- if(S <= 5) //距离太近不足以转弯
- {
- Back(); //执行后退函数
- delay(300); //后退持续时间
- }
- else if(S >= 5 && S <= 15) //距离中等可以转弯
- {
- Turn(); //执行转弯判断函数
- }
- else //距离充足
- {
- Line(); //执行直行函数
- }
- }
- void Range() //测距函数
- {
- digitalWrite(Trig,LOW); //测距
- delay(2); //延时2微秒
- digitalWrite(Trig,HIGH);
- delay(10);
- digitalWrite(Trig,LOW);
- float distance = pulseIn(Echo,HIGH); //读取高电平时间
- S = float( distance * 17 )/1000; //把值赋给S
- Serial.println(S); //向串口发送S的值,可以在显示器上显示距离
- }
- // float distance = pulseIn(Echo,HIGH);
- // S = float( distance * 17 )/1000;
- // 将回波时间换算成cm
- // 读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。
- // 返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。
- // 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒)
- // 接收到的高电平的时间(us)* 340m/s / 2 = 接收到高电平的时间(us) * 17000 cm / 1000000 us = 接收到高电平的时间 * 17 / 1000 (cm)
- void Turn() //转向函数
- {
- Lull(); //停止
- Steering.write(170); //使舵机转到170度(左侧)
- delay(1000); //留时间给舵机转向
- Range(); //测距
- Steering.write(90); //使舵机回复原位
- delay(1000);
- if(S >= 15) //距离充足
- {
- turnLeft(); //左转弯后退
- }
- else //距离不足
- {
- Steering.write(10); //使舵机转到10度(右侧)
- delay(1000);
- Range();
- Steering.write(90); //使舵机回复原位
- delay(1000);
- if(S >= 15) //距离充足
- {
- turnRight(); //右转弯后退
- }
- else
- {
- Back(); //后退
- int x = random(1); //产生一个随机数使小车随机转向
- if(x == 0)
- turnLeft();
- else
- turnRight();
- }
- }
- }
- void Back() //后退函数(使电机反转)
- {
- digitalWrite(LIN1, LOW);
- digitalWrite(LIN2, HIGH);
- digitalWrite(RIN1, HIGH);
- digitalWrite(RIN2, LOW);
- }
- void Line() //直线行驶函数(使电机正转)
- {
- digitalWrite(LIN1, HIGH);
- digitalWrite(LIN2, LOW);
- digitalWrite(RIN1, LOW);
- digitalWrite(RIN2, HIGH);
- }
- void turnLeft() //小车左转后退
- {
- digitalWrite(LIN1, LOW);
- digitalWrite(LIN2, HIGH);
- digitalWrite(RIN1, LOW);
- digitalWrite(RIN2, LOW);
- delay(1000);
- }
- void turnRight() //小车右转后退
- {
- digitalWrite(LIN1, LOW);
- digitalWrite(LIN2, LOW);
- digitalWrite(RIN1, HIGH);
- digitalWrite(RIN2, LOW);
- delay(1000);
- }
- void Lull() //停止
- {
- digitalWrite(LIN1, LOW);
- digitalWrite(LIN2, LOW);
- digitalWrite(RIN1, LOW);
- digitalWrite(RIN2, LOW);
- }
接下来打开小车的电源开关就可以测试小车了。喜欢的朋友们别忘了点个赞哟~~