Skip to content

第 12 章:看懂循迹传感器代码

本章任务

看懂"读取四路循迹传感器"的 Arduino C++ 代码——和第二册第 12 章是同一个任务。

接线回顾

同一款探头,数字输出:黑=0/灯亮、白=1/灯灭(和直觉相反,先记住)。

循迹模块Pico说明
VCC3V33.3V 供电
GNDGND共地
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)或遮光

想一想

  1. 如果把打印改成图形化:黑线打印 、白色打印 ,显示成 [□■□□],要改第几步的代码?

    💡 查看答案

    第二步(打印部分)。循环里判断一下再打印:

    cpp
    for (int i = 0; i < 4; i++) {
      if (values[i] == 0) Serial.print("■");
      else                Serial.print("□");
    }
  2. 想判断"是不是所有路都是白色",有什么偷懒的办法?(提示:把四个值加起来)

    💡 查看答案

    把四路读数加起来判断是否等于 4(全白 = 四路都是 1):

    cpp
    if (values[0] + values[1] + values[2] + values[3] == 4) {
      Serial.println("全部白色——黑线丢了!");
    }
  3. 和第二册第 12 章的 Python 版并排看,数一数两种语言各用了多少行——差别主要出在哪?

    💡 查看答案

    C++ 版行数更多,差别主要出在:变量要先声明类型、每条语句要分号、代码块要花括号、for 要写三段式。逻辑结构其实一样——多出来的都是 C++ 的"规矩"。

不积跬步,无以至千里;万里之行,始于当下。