用Scratch与Sense HAT实现软硬件交互:控制LED矩阵与摇杆输入
2026/8/20 7:29:31 网站建设 项目流程

1. 项目概述:当Scratch遇上物理世界

如果你玩过Scratch,一定对那只橘黄色的卡通猫不陌生。我们习惯了用鼠标拖拽积木,让它在屏幕的二维世界里奔跑、跳跃、说话。但有没有想过,让这只猫“活”过来,在一个真实的、可以触摸的硬件设备上动起来,并且用绚丽的灯光与你互动?这就是“Moving around with Scratch cat and show colors on SenseHat”这个项目要做的核心事情。

简单来说,这是一个软硬件结合的创意编程项目。我们利用树莓派(Raspberry Pi)上一块名为Sense HAT的扩展板,它自带一个8x8的LED点阵屏、一个摇杆(Joystick)以及多种传感器。然后,我们通过Scratch 3(确切地说是其增强版本Scratch GPIOScratch Link)来编程,实现一个直观的交互逻辑:你推动摇杆,屏幕上的Scratch小猫就朝相应方向移动;同时,小猫每走到“Sense HAT屏幕”上的一个新位置,该位置的LED灯就会点亮一种特定的颜色,形成一个跟随小猫足迹的动态彩色路径。

这听起来像是一个简单的游戏,但其背后融合了多个有趣的技术层面:从图形化编程到物理硬件控制,从事件处理到状态管理,再到最直观的视觉反馈。它打破了虚拟与现实的界限,让编程的成果不再局限于电脑屏幕,而是变成了一个看得见、摸得着、可以即时交互的实体装置。无论是用于教育场景激发学生对编程和电子学的兴趣,还是作为一个极客的桌面玩具,这个项目都充满了乐趣和启发性。

2. 核心硬件与平台解析

在动手之前,我们必须把“舞台”和“演员”搞清楚。这个项目的硬件核心是树莓派和Sense HAT,软件桥梁则是Scratch的特殊版本。

2.1 Sense HAT:你的微型交互舞台

Sense HAT是一块专为树莓派设计的多功能扩展板,它之所以成为本项目的不二之选,是因为它集成了我们所需的所有硬件模块:

  1. 8x8 RGB LED矩阵:这是项目的视觉输出核心。总共64个LED,每个都可以独立编程,显示1600万种颜色中的任何一种。在本项目中,它将扮演双重角色:一是作为Scratch小猫移动的“微型地图”或“舞台”,二是作为颜色反馈的显示器。
  2. 五向摇杆:这是项目的核心输入设备。它相当于游戏手柄的方向键,可以检测上、下、左、右、按下五个动作。我们将用它来控制小猫的移动。
  3. 环境传感器:虽然本项目未直接使用,但Sense HAT还配备了陀螺仪、加速度计、磁力计、温度、湿度和气压传感器。这为项目的未来扩展(比如根据温度改变颜色、用姿态控制小猫等)留下了巨大空间。

注意:Sense HAT通过树莓派的40针GPIO接口直接连接,安装时务必确保引脚对齐,断电操作。它的LED矩阵亮度很高,避免长时间直视。

2.2 Scratch 3与硬件扩展

标准的Scratch 3在线编辑器是无法直接控制硬件的。因此,我们需要一个“翻译官”,把Scratch里的指令转换成树莓派GPIO能理解的信号。主要有两种主流方案:

  1. Scratch GPIO (scratchgpio):这是一个历史更久、更底层的方案。它需要在树莓派上运行一个Python服务程序(如scratchpy),并在Scratch 2.0的离线编辑器中通过“广播”积木与硬件通信。虽然对Scratch 3支持不佳,但因其稳定性和强大的底层控制能力,在一些老教程中仍常见。
  2. Scratch Link + Raspberry Pi OS 自带扩展:这是目前更推荐、更现代的方案。从Raspberry Pi OS(原Raspbian)的某个版本开始,官方集成了对Scratch 3的硬件支持。
    • 操作流程:在树莓派上启动Scratch 3(桌面版),点击左下角“添加扩展”按钮。
    • 选择“Raspberry Pi GPIO”扩展:添加后,Scratch的积木区会出现一系列新的紫色积木,其中就包括“设置GPIO引脚高低电平”、“读取引脚状态”等。但注意,这还不足以直接控制Sense HAT的LED矩阵。
    • 关键一步:安装sense-hatScratch扩展:为了更方便地控制Sense HAT,我们需要一个专用扩展。这通常需要通过终端命令来安装。安装后,Scratch中会出现新的“Sense HAT”类别积木,包括“清除LED矩阵”、“将LED在(x)(y)点亮为颜色(颜色)”等核心功能。同时,摇杆的状态也可以通过GPIO扩展来读取。

方案选择建议:对于新手和希望流程简洁的用户,强烈推荐使用第二种方案(Raspberry Pi OS + Scratch 3 桌面版 + sense-hat扩展)。它免去了复杂的服务配置,与Scratch 3环境集成度更高,积木更直观。

3. 项目设计与逻辑拆解

在开始堆砌积木之前,理清程序逻辑至关重要。这个项目可以分解为两个并行的主线:输入处理(摇杆)输出反馈(小猫移动与LED显示)

3.1 摇杆输入与小猫移动映射

Sense HAT的摇杆本质上连接到了树莓派的几个特定GPIO引脚。当我们推动摇杆时,相应的引脚电平会发生变化。在Scratch中,我们需要通过“读取GPIO引脚”类积木来持续检测这些变化。

逻辑流程如下:

  1. 初始化:程序开始时,确定小猫的初始位置(例如,舞台中心或LED矩阵中心对应的屏幕坐标)。
  2. 持续检测(在“重复执行”积木内):使用“如果...那么”积木,轮询检查与摇杆上、下、左、右、按下对应的GPIO引脚状态。
  3. 事件响应:当检测到某个方向引脚被触发(如“上”),则改变小猫的对应属性(y坐标增加),使其在Scratch舞台上向上移动。同时,记录小猫移动后的“逻辑坐标”。这个逻辑坐标需要与8x8的LED矩阵坐标(x: 0-7, y: 0-7)建立一个映射关系。
  4. 边界处理:必须加入判断,确保小猫的“逻辑坐标”不会超出LED矩阵的范围(0到7)。例如,当小猫在x=0的位置时,向左移动的指令应被忽略。

3.2 LED矩阵的状态管理与颜色显示

这是项目的视觉精华所在。我们需要一个数据结构来“记住”LED矩阵上每个点的状态(颜色)。

  1. 坐标映射:将Scratch中小猫的移动,映射到8x8的矩阵坐标上。一个简单的方法是:设定Scratch舞台的某个区域(如一个无形的网格)对应整个LED矩阵。小猫的x、y坐标经过一个缩放和偏移计算,转换为矩阵的(col, row)坐标。
  2. 颜色策略:决定每个位置显示什么颜色。这里有多种创意玩法:
    • 固定颜色路径:小猫走过的所有格子都变成同一种颜色(如蓝色),像一条轨迹。
    • 随机颜色:每次移动到新位置,随机生成一个鲜艳的颜色,创造出五彩斑斓的效果。
    • 渐变颜色:根据移动顺序,颜色按一定规律渐变(如从红到蓝)。
    • 方向关联颜色:向上移动亮绿色,向下亮红色,向左亮蓝色,向右亮黄色,让操作与颜色反馈直接关联。
  3. 显示更新:在小猫每次移动后,根据其新的“逻辑坐标”,调用Sense HAT扩展中的“将LED在(x)(y)点亮为颜色(颜色)”积木,更新该点的显示。
  4. 清屏与重置:需要考虑如何重置游戏。通常将摇杆的“按下”动作定义为清屏:调用“清除LED矩阵”积木,并将小猫重置到初始位置,同时清空内部记录的颜色状态。

3.3 双线程并行处理模型

在Scratch中,我们可以通过“当绿旗被点击”启动多个并行执行的脚本块,来模拟多线程:

  • 线程一(主控线程):负责持续检测摇杆输入,并更新小猫在Scratch舞台上的位置和内部逻辑坐标。
  • 线程二(显示线程):负责监听逻辑坐标的变化。一旦坐标改变,就根据当前的颜色策略,计算颜色并调用Sense HAT积木更新LED显示。

这种分离使得逻辑更清晰,输入处理和输出渲染互不阻塞。

4. 分步实现与核心代码积木

下面,我们进入具体的实现环节。假设我们使用Raspberry Pi OS + Scratch 3 桌面版 + 已安装sense-hat扩展的环境。

4.1 环境准备与扩展确认

  1. 启动树莓派,进入桌面环境。
  2. 打开Scratch 3应用程序。
  3. 点击左下角“添加扩展”。
  4. 确保列表中已有“Raspberry Pi GPIO”(紫色)和“Sense HAT”(可能是另一种颜色,如深蓝色)扩展。如果没有Sense HAT扩展,可能需要打开终端,运行类似sudo apt-get update && sudo apt-get install scratch3-sense-hat的命令来安装(具体包名请查询最新文档)。
  5. 将Sense HAT牢固地安装到树莓派的GPIO针脚上。

4.2 Scratch角色与变量初始化

  1. 选择角色:从角色库中选择“Cat”作为我们的主角。
  2. 创建关键变量:在“变量”分类中,创建以下用于存储状态的变量:
    • 矩阵X:记录小猫当前在8x8矩阵中的列坐标(0-7)。
    • 矩阵Y:记录小猫当前在8x8矩阵中的行坐标(0-7)。
    • 方向颜色:一个临时变量,用于存储根据移动方向计算出的颜色值。
  3. 初始化脚本:
    当绿旗被点击 清除LED矩阵 :: sense hat // 清空Sense HAT屏幕 将 [矩阵X] 设为 [3] // 初始位置设为矩阵中心附近 将 [矩阵Y] 设为 [3] 将角色 [Cat] 的x坐标设为 (0) // 根据你的舞台映射调整 将角色 [Cat] 的y坐标设为 (0) 将角色 [Cat] 的大小设为 (50) // 调整到合适大小,便于在舞台网格上观察

4.3 摇杆输入检测与坐标更新

我们需要知道Sense HAT摇杆对应的GPIO引脚编号。通常,摇杆的五个方向连接的是特定的BCM编码引脚(例如,上=17,下=22,左=27,右=23,按下=4)。你需要在Scratch的GPIO扩展中查看或配置。这里假设是常见配置。

编写输入处理线程的脚本:

当绿旗被点击 重复执行 如果 <(读取GPIO引脚 [17] 的数字值 :: raspberrypi gpio) = [1]> 那么 // 上 将 [矩阵Y] 增加 (1) 将 [方向颜色] 设为 [#00FF00] // 绿色代表上 end 如果 <(读取GPIO引脚 [22] 的数字值 :: raspberrypi gpio) = [1]> 那么 // 下 将 [矩阵Y] 增加 (-1) 将 [方向颜色] 设为 [#FF0000] // 红色代表下 end 如果 <(读取GPIO引脚 [27] 的数字值 :: raspberrypi gpio) = [1]> 那么 // 左 将 [矩阵X] 增加 (-1) 将 [方向颜色] 设为 [#0000FF] // 蓝色代表左 end 如果 <(读取GPIO引脚 [23] 的数字值 :: raspberrypi gpio) = [1]> 那么 // 右 将 [矩阵X] 增加 (1) 将 [方向颜色] 设为 [#FFFF00] // 黄色代表右 end 如果 <(读取GPIO引脚 [4] 的数字值 :: raspberrypi gpio) = [1]> 那么 // 按下 清除LED矩阵 :: sense hat // 清屏 将 [矩阵X] 设为 [3] 将 [矩阵Y] 设为 [3] 广播 [重置位置] // 通知其他部分重置 end // 边界检查 如果 <(矩阵X) > [7]> 那么 将 [矩阵X] 设为 [7] end 如果 <(矩阵X) < [0]> 那么 将 [矩阵X] 设为 [0] end 如果 <(矩阵Y) > [7]> 那么 将 [矩阵Y] 设为 [7] end 如果 <(矩阵Y) < [0]> 那么 将 [矩阵Y] 设为 [0] end // 根据矩阵坐标,更新Scratch舞台上小猫的视觉位置(这里需要你建立映射函数) 将角色 [Cat] 的x坐标设为 ( ((矩阵X) - 3) * (30) ) // 示例映射,将矩阵坐标-3到4映射到舞台的某个范围 将角色 [Cat] 的y坐标设为 ( ((矩阵Y) - 3) * (30) ) 等待 [0.1] 秒 // 防止检测过于频繁,降低CPU占用 end

4.4 LED矩阵显示更新

编写显示更新线程的脚本。这个线程监听坐标变化并更新LED。

当绿旗被点击 重复执行 等待直到 <(矩阵X) 已改变> 或 <(矩阵Y) 已改变> // 使用“变量”类别的“已改变”条件 将LED在x (矩阵X) y (矩阵Y) 点亮为颜色 (方向颜色) :: sense hat end

这里我们使用了“方向关联颜色”策略,方向颜色变量在输入线程中已被设置。如果你想尝试随机颜色,可以将上述最后一行积木替换为:

将LED在x (矩阵X) y (矩阵Y) 点亮为颜色 (连接 [rgb(] (连接 (在 (1) 到 (255) 间随机选一个数) (连接 [,] (连接 (在 (1) 到 (255) 间随机选一个数) (连接 [,] (连接 (在 (1) 到 (255) 间随机选一个数) [)] ) ) ) ) ) ) :: sense hat

但更优雅的做法是创建一个“生成随机颜色”的自定义积木(函数)。

4.5 创建自定义积木:颜色生成器

为了代码更清晰,我们可以创建一个自定义积木来封装颜色生成逻辑。

  1. 点击“我的积木”,然后“创建一个积木”。
  2. 命名为“生成随机颜色”,并添加一个“数字”输入项,命名为“颜色值”。
  3. 勾选“运行时不刷新屏幕”,这样它只计算并返回值,不会产生视觉延迟。
  4. 定义积木:
    定义 生成随机颜色 (颜色值) 将 [颜色值] 设为 (连接 [rgb(] (连接 (在 (1) 到 (255) 间随机选一个数) (连接 [,] (连接 (在 (1) 到 (255) 间随机选一个数) (连接 [,] (连接 (在 (1) 到 (255) 间随机选一个数) [)] ) ) ) ) ) )
  5. 在显示线程中,就可以这样调用:
    生成随机颜色 (临时颜色) :: custom 将LED在x (矩阵X) y (矩阵Y) 点亮为颜色 (临时颜色) :: sense hat

5. 调试技巧与常见问题排查

即使逻辑清晰,第一次运行时也难免遇到问题。以下是一些实战中总结的排查经验。

5.1 硬件连接与驱动问题

  • 现象:Scratch中Sense HAT或GPIO扩展积木显示灰色不可用,或执行无反应。
  • 排查:
    1. 检查物理连接:确保Sense HAT完全插入树莓派GPIO接口,没有歪斜。
    2. 检查扩展是否加载:在Scratch中,点击“添加扩展”,确认“Raspberry Pi GPIO”和“Sense HAT”已添加且不是灰色。
    3. 终端测试:打开终端,输入python3 -c "from sense_hat import SenseHat; s = SenseHat(); s.clear()"。如果正常,Sense HAT的LED矩阵会全部熄灭。如果报错(如“ModuleNotFoundError: No module named 'sense_hat'”),说明Python的sense-hat库未安装,运行sudo apt-get install sense-hat
    4. 用户权限:确保你运行Scratch的用户有操作GPIO的权限。通常,pi用户默认有此权限。

5.2 摇杆无响应或响应错误

  • 现象:推动摇杆,小猫不动或乱动。
  • 排查:
    1. 引脚映射错误:这是最常见的问题。Sense HAT的摇杆引脚编号是固定的(BCM编码),但不同资料可能不同。最可靠的方法是查看官方文档或使用命令行工具pinout来确认。在Scratch GPIO扩展的设置中,可能需要手动配置引脚模式为“输入”。
    2. 电平逻辑:确认你的判断逻辑是“引脚为高电平(1)时触发”还是“低电平(0)时触发”。通常,摇杆未按下时引脚为高电平,按下时连接到地变为低电平。但具体要看电路。我们的示例假设“按下时为1”(内部上拉,按下接地变低,但Sense HAT可能反相)。如果方向相反,将判断条件= [1]改为= [0]
    3. 去抖动处理:机械摇杆在触点闭合或断开时会产生瞬间的抖动,导致程序误判多次触发。我们的脚本中加入了等待0.1秒就是最简单的软件去抖动。如果问题依旧,可以适当增加这个等待时间。

5.3 LED显示异常

  • 现象:颜色不对、位置错乱、亮度异常或部分LED不亮。
  • 排查:
    1. 坐标系统:Sense HAT的LED矩阵坐标原点(0,0)通常位于左上角。x轴向右增加,y轴向下增加。这与Scratch舞台坐标系(原点在中心,y轴向上增加)不同。确保你的坐标映射计算正确。
    2. 颜色格式:Scratch Sense HAT积木接受的颜色字符串格式是rgb(R, G, B),其中R、G、B是0-255的整数。确保你生成的字符串格式完全正确,没有多余空格。
    3. 亮度问题:Sense HAT的LED非常亮。你可以在点亮LED的积木后,添加一个将亮度设为 (10) :: sense hat积木来调低全局亮度,保护眼睛也节省电量。
    4. 刷新太快:如果小猫移动过快,LED更新可能跟不上。确保显示更新线程不会在一个循环内无延迟地疯狂执行。我们使用了“等待直到变量改变”来优化,这是很好的做法。

5.4 性能优化与体验提升

  • 问题:程序运行卡顿,摇杆控制不跟手。
  • 优化:
    1. 简化循环:确保所有“重复执行”循环内都有短暂的等待(如0.05秒到0.1秒)。这能显著降低CPU占用,让系统响应更灵敏。
    2. 减少广播:尽量避免在高速循环内使用“广播”积木,改用变量传递信息。
    3. 视觉映射优化:将矩阵坐标到Scratch舞台坐标的计算,可以封装在一个自定义积木里,避免在主循环中重复进行复杂的算术运算。

6. 创意扩展与进阶玩法

基础功能实现后,这个项目还有巨大的扩展空间,可以融入更多编程概念和硬件特性。

6.1 融入传感器数据

Sense HAT的传感器是宝藏。你可以让环境数据影响游戏:

  • 温度颜色:读取温度传感器值,将其映射到一个颜色梯度(如蓝色到红色),让LED显示的颜色随室温变化。
  • 姿态控制:使用加速度计或陀螺仪数据来控制小猫移动。倾斜树莓派,让小猫朝倾斜方向“滑”动。这需要处理传感器的原始数据并转换为移动向量。
  • 压力触发:当气压发生显著变化时(模拟天气变化),触发一次特殊的视觉效果,比如LED矩阵全屏闪烁。

6.2 设计复杂游戏规则

将简单的移动点亮,升级成一个完整的游戏:

  • 收集目标:在LED矩阵上随机生成几个“目标点”(用特殊颜色显示,如白色)。控制小猫移动去“触碰”这些点,碰到后目标消失并得分,同时在别处生成新目标。
  • 障碍物与计时:设置一些红色的“障碍”LED。碰到障碍游戏结束或扣分。加入计时器,挑战在限定时间内点亮尽可能多的格子。
  • 双人对战:如果有两个摇杆(需要另一个输入设备,如额外的游戏手柄),可以实现双人各自控制一个光点,进行追逐或占地盘的游戏。

6.3 与Scratch其他功能联动

Scratch的强大之处在于多媒体整合。

  • 音效反馈:为不同的移动方向或碰撞事件添加音效。例如,向上移动时播放一个高音,向下时播放一个低音。
  • 舞台背景互动:在Scratch舞台背景上绘制一个放大版的8x8网格,当Sense HAT上某点被点亮时,舞台背景上对应的格子也改变颜色或出现动画,实现“虚实同步放大显示”。
  • 角色对话:让Scratch小猫在移动到特定位置时,说出一些话,比如到达边缘时说“哎呀,没路啦!”。

这个项目的魅力在于,它用一个非常直观有趣的方式,串联起了事件驱动编程、状态管理、坐标系统、硬件接口、颜色模型等多个核心概念。从调试摇杆引脚时对硬件原理的粗浅理解,到设计颜色算法时对RGB模型的实践,每一步都是实实在在的学习。我个人的体会是,当看到自己推动摇杆,虚拟的小猫和现实的灯光同步响应时,那种“造物”的成就感,是纯软件编程难以比拟的。它完美地诠释了“编程是连接想法与现实世界的桥梁”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询