颜色传感器 Color Sensor
FLL 最重要的传感器,没有之一。巡线、找线、识别场地标记全靠它。
能测什么
| 模式 | 读值 | 说明 |
|---|---|---|
| 颜色(Color) | 黑、白、红、黄、绿、蓝等 8 种颜色 + 无颜色;注意 Word Blocks 下拉和 Python color 常量的命名集合不完全相同(如 Python 有 AZURE、ORANGE),分别以官方参考为准 | 识别离散颜色 |
| 反射光(Reflected Light) | 0-100% | 传感器发光,测反射回来多少。巡线用这个 |
| 环境光(Ambient Light) | 0-100% | 不发光,测环境亮度,FLL 很少用 |
安装要点
- 朝下,离地约 16 mm(官方最佳读取距离,约 5 块乐高平板高)。太高读值发散,太低会蹭地。
- 装在底盘前部、两驱动轮轴线之前——传感器越靠前,巡线纠偏越及时。
- 双传感器巡线时,两个并排装,间距约一条线宽。
- 遮光:传感器周围用乐高件围一圈,减少环境光干扰,比赛场馆的射灯很坑。
Word Blocks 积木
wordblocks
<颜色传感器 [C] 颜色 = [黑色]> ← Sensors 类,条件积木
(颜色传感器 [C] 反射光) ← 报告积木(圆形读值)
等待到 <颜色传感器 [C] 颜色 = [黑色]>示例 1:走到黑线停
wordblocks
当程序启动时
设置移动马达 [A+E]
开始移动 [前进]
等待到 <颜色传感器 [C] 反射光 < [30]>
停止移动示例 2:数线
wordblocks
设置 [线数] 为 [0]
开始移动 [前进]
重复执行直到 <(线数) = [3]>
等待到 <颜色传感器 [C] 反射光 < [30]>
将 [线数] 增加 [1]
等待到 <颜色传感器 [C] 反射光 > [60]> ← 关键:等出线,否则一条线数好几次
停止移动Python 写法
python
import runloop, color_sensor, color
from hub import port
async def main():
# 读颜色(返回 color.BLACK 等常量)
if color_sensor.color(port.C) == color.BLACK:
pass
# 读反射光 0-100
value = color_sensor.reflection(port.C)
runloop.run(main())阈值标定:必做
"反射光 < 30 算黑线"里的 30 不能抄,必须在你的场地、你的灯光下实测:
- 写一段程序把反射光实时显示到灯光矩阵:
重复执行 → 显示文字 (反射光)。 - 把传感器放在黑线上读一个数(比如 12),放在白场上读一个数(比如 85)。
- 阈值取中间:(12 + 85) / 2 ≈ 48。判黑用
< 48,判白用> 48。
每换一个场地都要重标
灯光、垫子新旧、传感器高度都影响读值。比赛日到场第一件事:重测黑白值。用变量存阈值,只改一处。
常见坑
- 颜色模式在快速移动时不可靠:机器人一快,颜色跳变。巡线永远用反射光,不用颜色模式。
- 场地上的彩色图案会骗过"找黑线":深蓝、深绿的反射光也很低。数线时结合位置(先走固定距离再开始找线)。
- 两个传感器读值不一样是正常的:每个各标各的阈值。
常见问答
到了比赛场地阈值就不灵了,怎么回事?
场馆灯光、垫子新旧、传感器高度都会改变反射光读值。比赛日到场第一件事重测黑白值;把阈值存进变量,只需改一处。
该用颜色模式还是反射光模式?
巡线和找线永远用反射光——颜色模式在机器人快速移动时读值会跳变。颜色模式只用于静止或低速下识别离散颜色。
两个颜色传感器读值不一样,是坏了吗?
不是,个体差异是正常的。每个传感器各自标定各自的黑白阈值即可。