巡线小车学习笔记(arduino 四路循迹)

1 篇文章 1 订阅
1 篇文章 0 订阅

巡线小车代码学习笔记

红外布局原理

在这里插入图片描述
中间两路巡线一直在黑线上,小车会直行,当任意一个出来,小车会自动纠正。如果最外面的检测到黑线。则小车以更大速度纠正到黑线上去。在算法上,优先处理锐角,直角等外围传感器检测到黑线的状况

目前进度:无PID算法之路况已得全套
具体见PPT且补充只有左边或者右边探得线之况

遗留问题:此套路况分析适用于含PID算法之程序否?

解决方式:进一步探究用和不用PID算法的得到的误差值对电机速度的控制的异同

所得结论:用PID算法者,误差的大小(偏差程度)正负(方向)皆有意义,经过PID系数的运算后直接加到PWM波的输出当中去
不用PID算法者,误差值没有物理意义,只起情况的标记作用,将不同的情况对应到不同的函数中去,且不同的函数中轮子的转速值也已经调成固定值。

目前PPT改动:1.只去对称部分
2.右直角和右斜向上锐角与极右偏情况分列出来,前者采取固定函数,后者使用偏差值更大的PID

小车初始参数值
初始电机速度:60 (阈值-250~250)
初始PID参数: kp=10 ki=0.5 kd=0

电路实测区域结果

实测结果记录

*红外:(原理:模块对白色可检测到的距离要大于黑色的距离。故将红外的检测距离调整到黑色无反射值但白色有的区间之内,有黑线处为1)
*舵机:舵机函数可通过一一对应的数值来调整舵机转动的角度
*马达:只要正输入不为零,负电平为零,无论是正是负,都会正转。但同样的数值,负输入会比正输入转动的快很多,惑矣。同样输入不为零,正电平为零,都会反转。

红外避障模块

物理实测部分
VCC–5V
GND–5V
OUT–(A0~A5 or 0-13任选一个)
只要接通电源,电源指示灯会亮起
若其前有障碍物,另外一边的输出指示也会亮。
中间骑线两模块在无障碍物的情况下不会相互干扰,即无障碍物的情况下二者的输出皆不亮。

串口监视电平输出部分
(1.在Arduino IDE 中通过串口监视器来获取程序在板子上运行过程中的实时数,调用与串口相关的任意函数之前都需要在setup函数中初始化波特率,一般想要获取模块中某一部分输出电压或者其余数据只需要 begin 和 printfln两个函数足矣。
2.红外避障模块输出端输出的是数字电平

问题

①PS2手柄的接入

② 考虑将出发和停止的操作基于手柄来完成,以此避免和十字路口产生混淆,抑或十字路口和T型路口在检测到之后再进一步检测其后有无延申

③直角弯和锐角弯再进一步细化程序,目前想法检测到之后转一定的角度(采用延时)再进一步检测其后路况。

以下是红外循迹小车直角转弯的代码示例: ```arduino //定义左右电机引脚 int leftMotor1 = 5; int leftMotor2 = 6; int rightMotor1 = 10; int rightMotor2 = 9; //定义红外传感器引脚 int leftSensor = A0; int middleSensor = A1; int rightSensor = A2; int backSensor = A3; //定义红外传感器检测到黑线的阈值 int threshold = 500; void setup() { //初始化电机引脚为输出模式 pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); } void loop() { //读取红外传感器的值 int leftValue = analogRead(leftSensor); int middleValue = analogRead(middleSensor); int rightValue = analogRead(rightSensor); int backValue = analogRead(backSensor); //判断是否在黑线上 if (middleValue > threshold) { //直行 digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); } else if (leftValue > threshold && rightValue < threshold) { //左转 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); } else if (leftValue < threshold && rightValue > threshold) { //右转 digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); } else if (backValue > threshold) { //后退 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); delay(500); //左转 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); delay(500); } else { //停止 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); } } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值