一、基础篇
智能小车通常采用灰度或红外模块来判断在循迹线的位置。
以 8 路红外模块为例,从左到右依次记为灯 1 - 灯 8。小车在线中间位置时灯 4 和灯 5 亮起,对应信号输出口返回 0。若小车往右偏,灯 3 和灯 4 对应的信号输出口为 0,主控据此判断位置。快速循迹一般建议至少 8 路,推荐使用 12 路以提高微动判断精度。
二、进阶篇
主控读取信号后的处理逻辑至关重要。相比多层 if-else 判断,将传感器状态合并为二进制数值并使用 switch 语句更为简洁高效。 以 STM32 标准库为例,读取 GPIO 高低电平函数如下:
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1);
将多个引脚状态合并为一个整型变量 val:
int read(void) {
int val = 0;
val |= (GPIO_ReadInputDataBit(GPIOC, OUT1) << 7);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT2) << 6);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT3) << 5);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT4) << 4);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT5) << 3);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT6) << 2);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT7) << 1);
val |= (GPIO_ReadInputDataBit(GPIOC, OUT8) << 0);
return val;
}
通过 switch 语句对 val 进行判断:
read();
switch (read()) {
case 127: break; // 0111 1111
case 191: break; // 1011 1111
case : ;
: ;
: ;
: ;
: ;
: ;
: ;
: ;
: ;
}


