深色模式
第 12 章:看懂循迹传感器代码
本章任务
看懂"读取四路循迹传感器"的 Arduino C++ 代码——和第二册第 12 章是同一个任务。
接线回顾
同一款探头,数字输出:黑=0/灯亮、白=1/灯灭(和直觉相反,先记住)。
| 循迹模块 | Pico | 说明 |
|---|---|---|
| VCC | 3V3 | 3.3V 供电 |
| GND | GND | 共地 |
| X1 通道 | GP11 | 数字输出 |
| X2 通道 | GP10 | 数字输出 |
| X3 通道 | GP12 | 数字输出 |
| X4 通道 | GP13 | 数字输出 |
特别提醒:四个探头的物理排列(从左到右)是 X2、X1、X3、X4,不是 1234 顺序。如果模块是其它批次,物理排列顺序需实测确认——用黑胶带逐个遮挡探头,看哪个通道变 0。
Mind+ 生成的典型代码
cpp
const int PINS[4] = {10, 11, 12, 13}; // 四路探头接 GP10~GP13
void setup() {
Serial.begin(115200);
for (int i = 0; i < 4; i++) {
pinMode(PINS[i], INPUT); // 四个脚全部设为"输入"(听传感器说话)
}
}
void loop() {
int values[4]; // 准备一个数组,装四路读数
// 第一步:依次读四路探头
for (int i = 0; i < 4; i++) {
values[i] = digitalRead(PINS[i]); // 读到 0(黑线)或 1(白色)
}
// 第二步:把四路读数打印出来
for (int i = 0; i < 4; i++) {
Serial.print("GP");
Serial.print(PINS[i]);
Serial.print("=");
Serial.print(values[i]);
Serial.print(" ");
}
Serial.println(); // 换行
// 第三步:判断黑线在哪一路,打印出来
for (int i = 0; i < 4; i++) {
if (values[i] == 0) { // 这一路压到黑线(黑 = 0)
Serial.print(" -> GP");
Serial.print(PINS[i]);
Serial.println(" 检测到黑线");
}
}
Serial.println("------------------------------");
delay(500); // 每 0.5 秒刷新一次
}代码讲解
这段代码是第 6 章"数组 + for 循环"的实战,结构很清楚:读四路 → 打印四路 → 找黑线。
digitalRead(引脚):读数字引脚,返回HIGH(1)或LOW(0)——就这一个新"单词"PINS[4]数组装着四个引脚号,for循环把 i 从 0 数到 3,PINS[i]就依次是 10、11、12、13——一次循环搞定四路,不用写四遍- 对照第二册:Python 用列表推导
[s.value() for s in sensors]一行读完,C++ 要老老实实写for循环——这是两种语言风格差异的典型例子
运行效果
探头对准白纸,四路都输出 1;黑胶带移到某路下方,对应通道变 0,模块上指示灯亮,串口打印"GPxx 检测到黑线"。
常见坑
- 极性和直觉相反:压黑线 = 0、灯亮;白色区域 = 1、灯灭——记反了,后面所有判断都会跟着错
- 悬空也读 0:探头离地太远(比如拿在手里调试)收不到回波,读数和压黑线一样,别被"假黑线"误导
- 读数和指示灯对不上:先查物理顺序(X2、X1、X3、X4),再查 GP 编号——这是本模块最容易踩的坑
- 读数不稳定:环境光干扰,调整探头高度(离纸面约 1~2cm)或遮光
想一想
如果把打印改成图形化:黑线打印
■、白色打印□,显示成[□■□□],要改第几步的代码?💡 查看答案
改第二步(打印部分)。循环里判断一下再打印:
cppfor (int i = 0; i < 4; i++) { if (values[i] == 0) Serial.print("■"); else Serial.print("□"); }想判断"是不是所有路都是白色",有什么偷懒的办法?(提示:把四个值加起来)
💡 查看答案
把四路读数加起来判断是否等于 4(全白 = 四路都是 1):
cppif (values[0] + values[1] + values[2] + values[3] == 4) { Serial.println("全部白色——黑线丢了!"); }和第二册第 12 章的 Python 版并排看,数一数两种语言各用了多少行——差别主要出在哪?
💡 查看答案
C++ 版行数更多,差别主要出在:变量要先声明类型、每条语句要分号、代码块要花括号、
for要写三段式。逻辑结构其实一样——多出来的都是 C++ 的"规矩"。
