STM32智能小车之 循迹

本文介绍了使用红外传感原理让小车沿黑色线条行驶的方法。通过检测不同颜色表面反射的红外光强度变化来引导小车调整方向。文章提供了具体的GPIO初始化代码及如何读取输入电平的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           一般小车实现了跑动之后,接着要做的就是让它按照我们设定的路线进行巡线走路,那么就要用到循迹模块了。网上循迹模块很多的,有好多种,原理就那样就是利用红外传感原理。小车能够按照黑线走是因为当红外线的光照到黑线上时会被吸收,从而检测部到信号,而照到白线时可以反射回去,也就可以接受得到,因此,空值起来也很简单,一句话,检测和模块相连管脚的电平的高低。

        哪么我就来说说,该怎样检测呢。

        通过相应的函数读取管脚的电平值就行了。

   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)== 1
     这里就是检测下,GPIOD 12管脚的值是否等于1,进而进行相应的动作,空值小车的转向。左边检测到了,说明小车往左偏,应该向左偏;右边类似。很简单吧。嘻嘻!

最重要的其实还是控制循迹模块的这些管脚,首先对他们进行的一系列的初始化操作。因为要判断这些管脚的状态,因此,在初始化的时候应该讲他们全部设置成浮空输入。关于管脚的4中初始化状态,具体可以参考stm32参考手册,里面讲的很详细,4种输入,4种输出。

下面贴出初始化的代码:

/****************************************************************************
  * @函数名:Traction_GPIO_Configuration(void)
  * @描述:  小车循迹管脚初始化
  * @输入:  无
  * @输出:  无
	* @返回值:无
  ****************************************************************************/
void Traction_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能PD端口时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14; //PD.11~PD.14端口配置
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	//GPIO_SetBits(GPIOD,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);					 				//PD.11.....PD14 输出高电平
}
上面的函数主要是对所控制的管脚进行了相应的初始化。其他的操作,就是读每个控制管脚的值了,然后进行相应的操作。

我用的循迹模块是这个型号的,我觉得还行。

凑活能用!

一直在坚持,一直没放弃……

### 实现智能小车精确90度直角转弯的控制方法 #### 控制算法概述 为了实现智能小车的精确90度直角转弯,可以采用基于PID(比例-积分-微分)控制的方法来调整小车的速度和方向。通过采集编码器脉冲数据并结合增量式PID算法,能够有效解决复杂路径中的灵活转弯问题[^1]。 #### PID参数调节 在实际应用中,PID控制器的核心在于三个参数:P(比例)、I(积分)、D(微分)。这些参数决定了系统的响应速度和平稳程度。具体来说: - **P项**用于快速纠正误差。 - **I项**消除静态偏差。 - **D项**抑制超调现象。 对于智能小车而言,可以通过实验不断优化这三个参数,使得车辆能够在保持稳定的同时迅速完成转弯动作[^2]。 #### 转弯逻辑设计 针对具体的90度直角转弯场景,推荐将路况判断与执行过程分离处理。这意味着只有当传感器确认前方存在合适的转弯条件之后才会触发相应的操作流程。例如,在检测到特定标志位`RT_LEFT`表示需要向左转时,则启动预定义好的函数`CarLeft()`来进行相应角度范围内的旋转直至满足退出循环的标准为止[^3]。 以下是简化版伪代码展示如何利用上述提到的技术要点编写程序: ```c++ void loop() { char signal = SearchSignal(); if (signal == STRAIGHT) { GoStraight(); } else if (signal == TURN_RIGHT || signal == TURN_LEFT){ HandleTurn(signal); } } // 处理转向的具体情况 void HandleTurn(char direction){ if(direction == TURN_LEFT){ LeftTurnRoutine(); }else{ RightTurnRoutine(); } } // 左转例程 void LeftTurnRoutine(){ while(!IsFinishedTurning()){ CarLeft(); delay(5); // 防止抖动 } } ``` 以上片段展示了基本框架结构,其中包含了两个主要部分——直线行驶以及依据信号改变行为模式的部分;另外还特别强调了关于左侧大体以固定点为中心转动的方式达成近似垂直变换效果的做法说明。 #### 结论 综上所述,借助于精准的数据反馈机制配合恰当设定后的自动调控手段便可以让我们的设备按照预期轨迹行动起来从而达到理想状态下的表现形式即完美呈现出来的九十度锐利折返动作[^2].
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值