
1. 项目缘起当Scratch遇上物理世界作为一名长期混迹于创客教育和编程启蒙领域的老玩家我一直在寻找能让编程概念“看得见、摸得着”的项目。Scratch作为图形化编程的标杆极大地降低了编程的门槛但它通常被束缚在电脑屏幕的二维世界里。而树莓派基金会推出的Sense HAT这个集成了LED矩阵、陀螺仪、加速度计、温湿度传感器和摇杆的小巧扩展板则是一个通往物理世界的绝佳窗口。于是一个自然而然的想法诞生了能不能用Scratch那只标志性的小猫通过摇杆在Sense HAT的8x8 LED矩阵上“行走”并且每走一步都点亮一个随机的、绚丽的颜色这个项目听起来简单但其背后串联了事件驱动编程、坐标系统理解、硬件交互和视觉反馈等多个核心概念。它不仅仅是一个“让猫动起来”的小把戏而是一个绝佳的、低门槛的硬件交互入门案例。通过它初学者可以直观地理解“程序如何感知物理世界摇杆输入”以及“程序如何影响物理世界LED显示”这种即时、可见的反馈是激发学习兴趣和深化理解的最强催化剂。接下来我将手把手带你从零开始实现这个充满趣味的项目并分享我在多次教学和实践中积累的“避坑”心得。2. 环境搭建连接虚拟与现实的桥梁要让Scratch一个运行在浏览器或桌面应用中的软件控制Sense HAT一块物理硬件我们需要一座“桥”。这座桥就是Scratch Link和树莓派上的代理服务。整个通信链路是Scratch客户端 - Scratch Link - 树莓派上的Scratch GPIO服务 - Sense HAT硬件。2.1 硬件与系统准备首先确保你手头有一套可用的装备树莓派任何型号均可推荐Raspberry Pi 3B或更新型号性能更稳定。我实测过从Zero W到Pi 4都能完美运行。Sense HAT务必将其准确插入树莓派的40针GPIO排针上注意对齐方向。一个常见的错误是插反或插歪导致无法识别甚至损坏硬件。插入后启动树莓派你应该能看到Sense HAT上的LED矩阵亮起一个彩虹色的测试图案这表明硬件连接和基础驱动是正常的。操作系统官方推荐的Raspberry Pi OS原Raspbian是最省心的选择。建议使用带桌面环境的版本方便后续操作。2.2 关键软件安装与配置在树莓派上我们需要安装让Scratch能与GPIO包括Sense HAT通信的软件包。打开终端依次执行以下命令# 首先更新软件源列表确保获取最新的软件包信息 sudo apt update # 然后升级所有已安装的软件包到最新版本避免兼容性问题 sudo apt upgrade -y # 安装Scratch 3的GPIO扩展支持包这是核心组件 sudo apt install scratch3-gpio -y安装完成后一个名为“scratchgpio”的服务应该已经自动运行。你可以通过以下命令检查其状态sudo systemctl status scratchgpio如果看到“active (running)”的字样说明服务运行正常。注意有些教程会提到安装scratchgpio或scratchpy等旧版包但对于Scratch 3和Sense HAT务必使用scratch3-gpio。新旧版本协议不兼容用错了会导致Scratch里根本找不到Sense HAT设备。2.3 电脑端Scratch Link配置接下来在你的电脑Windows或macOS上操作前往Scratch官网下载并安装Scratch Link。这是一个后台运行的小程序负责在电脑和树莓派之间建立连接。安装并运行Scratch Link。你可以在系统托盘Windows或菜单栏macOS找到它的图标确保它正在运行。最后在电脑上打开浏览器访问Scratch 3在线编辑器https://scratch.mit.edu。务必使用Chrome或Edge等基于Chromium的浏览器以获得最佳的硬件连接支持。至此虚拟与现实的桥梁已经架设完毕。树莓派上的服务在监听指令电脑上的Scratch Link已就绪浏览器中的Scratch正在等待连接硬件。3. 核心原理坐标、事件与颜色模型在动手编程前我们需要厘清几个核心概念这能让你在搭建积木时心中有数而不是盲目堆砌。3.1 二维坐标系统小猫的舞台与LED的网格Scratch的舞台和Sense HAT的LED矩阵都使用二维坐标系统但原点和方向不同这是第一个需要转换的思维点。Scratch舞台坐标中心点(0,0)在舞台正中央。X轴向右为正向左为负范围大约在-240到240之间Y轴向上为正向下为负范围大约在-180到180之间。小猫的“移动X步”、“移动Y步”积木就是基于这个坐标系。Sense HAT LED矩阵坐标这是一个8x8的网格。它的原点(0,0)通常被定义在左上角。X轴向右递增0到7Y轴向下递增0到7。也就是说右下角的LED坐标是(7,7)。我们的目标是将小猫在Scratch舞台上的“相对移动”映射为在LED矩阵上的“绝对位置”显示。一个更直观的做法是我们不直接同步小猫的舞台坐标而是在Scratch中用一个变量来逻辑表示小猫在8x8矩阵上的位置然后把这个位置发送给Sense HAT去点亮对应的LED。这样避免了复杂的坐标换算逻辑更清晰。3.2 事件驱动摇杆如何“说话”Sense HAT的摇杆是一个数字输入设备它有五个状态上、下、左、右、按下中间。在Scratch的GPIO扩展中这些状态被抽象为“事件”。当你在摇杆上触发一个动作比如向左推树莓派上的scratch3-gpio服务会捕获这个硬件信号并通过Scratch Link转发给浏览器中的Scratch。在Scratch中我们通过“当接收到广播消息”积木来响应这些事件。我们需要预先定义好一系列消息例如“joystick_left”、“joystick_right”等并将摇杆的物理动作与发送这些广播消息关联起来。这部分配置是在Scratch的“扩展”中添加“GPIO”后在一个特殊的“设备配置”区域完成的。3.3 颜色生成从随机数到RGBSense HAT的LED可以显示RGB颜色即通过红(Red)、绿(Green)、蓝(Blue)三种光的不同强度混合出各种颜色。每个颜色的强度值范围是0到255。在Scratch中我们可以利用“在...到...间随机选一个数”积木分别生成0到255之间的随机数作为R、G、B的值。然后我们需要将这三个数字组合成一个Scratch GPIO扩展能识别的颜色格式。通常它接受一个代表颜色的数字其计算方法为红色值 * 65536 绿色值 * 256 蓝色值。例如纯红色(255,0,0)就是255*65536 0*256 0 16711680。理解这个公式很重要因为有时候扩展也会直接接受一个十六进制字符串如#FF0000但根据我的经验使用上述十进制计算法在与Scratch GPIO扩展通信时最为稳定可靠。4. 实战步骤从零搭建可运行的项目现在让我们进入Scratch 3编辑器开始搭建这个项目。4.1 添加硬件扩展与配置广播消息在Scratch编辑器左下角点击“添加扩展”按钮。在弹出的扩展库中选择“GPIO”扩展。添加成功后你会看到积木区多了一个“GPIO”分类里面有一些紫色的积木。添加扩展后舞台上通常会自动出现一个“设备配置”的图标或区域。点击它进入硬件配置界面。在这个界面中你需要建立摇杆动作与Scratch广播消息的映射。找到配置Sense HAT摇杆的部分可能会以“Raspberry Pi Sense HAT”或类似名称列出。通常是以列表或表格形式让你为每个摇杆方向上、下、左、右、按下指定一个“广播消息”。请按照如下示例进行设置摇杆“上” - 广播消息joystick_up摇杆“下” - 广播消息joystick_down摇杆“左” - 广播消息joystick_left摇杆“右” - 广播消息joystick_right摇杆“按下” - 广播消息joystick_press配置完成后关闭配置窗口。这样当你在物理摇杆上做出相应动作时Scratch中就会自动发出对应的广播消息。4.2 初始化与变量定义我们首先为小猫角色编写初始化脚本创建变量在“变量”分类中创建三个变量矩阵X用于记录小猫在8x8矩阵中的X坐标0-7。矩阵Y用于记录小猫在8x8矩阵中的Y坐标0-7。颜色值用于存储计算出的随机颜色对应的数字。初始化脚本当绿旗被点击 将 [矩阵X v] 设为 [3] // 初始位置设为矩阵中心附近比如(3,3) 将 [矩阵Y v] 设为 [3] 将 [颜色值 v] 设为 [0] 广播 [init_display v] 并等待 // 发送一个初始化显示的消息这里我们广播了一个init_display消息用于触发清空LED矩阵等初始化操作这部分逻辑我们放在后面。4.3 响应摇杆移动逻辑与边界检测接下来我们需要为小猫角色添加多个“当接收到广播消息”的脚本块来响应摇杆的五个动作。边界检测是这里的核心必须确保矩阵X和矩阵Y的值始终在0到7之间。响应向左移动当接收到 [joystick_left v] 如果 (矩阵X) [0] 那么 // 检查是否在左边界内 将 [矩阵X v] 增加 [-1] // X坐标减1 广播 [update_led v] 并等待 // 发送更新LED显示的消息 否则 播放声音 [pop v] // 到达边界可以加个提示音效 结束响应向右移动当接收到 [joystick_right v] 如果 (矩阵X) [7] 那么 // 检查是否在右边界内 将 [矩阵X v] 增加 [1] 广播 [update_led v] 并等待 否则 播放声音 [pop v] 结束响应向上移动注意在Sense HAT的矩阵坐标系中“上”对应Y坐标减小。当接收到 [joystick_up v] 如果 (矩阵Y) [0] 那么 // 检查是否在上边界内 将 [矩阵Y v] 增加 [-1] // Y坐标减1 广播 [update_led v] 并等待 否则 播放声音 [pop v] 结束响应向下移动“下”对应Y坐标增加。当接收到 [joystick_down v] 如果 (矩阵Y) [7] 那么 // 检查是否在下边界内 将 [矩阵Y v] 增加 [1] 广播 [update_led v] 并等待 否则 播放声音 [pop v] 结束响应按下动作我们可以设计按下摇杆时在当前位置生成一个全新的随机颜色。当接收到 [joystick_press v] 广播 [randomize_color v] 并等待 // 发送生成随机颜色的消息 广播 [update_led v] 并等待 // 用新颜色更新当前LED 结束4.4 生成随机颜色我们创建一个新的角色比如一个隐藏的按钮或者直接在小猫角色中来处理颜色生成。为了模块清晰建议单独写一个生成颜色的脚本。当接收到 [randomize_color v] 将 [R v] 设为 (在 (0) 到 (255) 间随机选一个数) // 假设创建了临时变量R,G,B 将 [G v] 设为 (在 (0) 到 (255) 间随机选一个数) 将 [B v] 设为 (在 (0) 到 (255) 间随机选一个数) 将 [颜色值 v] 设为 ((((R) * (65536)) ((G) * (256))) (B)) // 计算颜色数字值 结束你也可以不用临时变量直接在一行复杂的运算积木里完成随机数和计算但拆分开来更易于理解和调试。4.5 控制Sense HAT LED显示这是与硬件交互的核心。我们需要使用GPIO扩展里的积木来控制Sense HAT。通常我们会用一个角色比如就叫“LED控制器”来专门负责所有与LED矩阵的通信。初始化显示清屏当接收到 [init_display v] gpio clear all leds // 使用GPIO扩展的“清除所有LED”积木熄灭所有灯或者你也可以使用“在(x)(y)显示颜色”积木遍历所有坐标设置为黑色(0)来清屏。更新指定LED当接收到 [update_led v] gpio set servo pin [13] to [颜色值] // 注意这是一个常见的误区停这里是一个关键坑点。上面的写法是错误的它错误地使用了控制舵机的积木。Sense HAT的LED矩阵有专用的积木。正确的做法是GPIO扩展添加后应该会有针对Sense HAT的特定积木例如sensehat set led x (矩阵X) y (矩阵Y) to color (颜色值)或者可能是sensehat draw pixel at x (矩阵X) y (矩阵Y) with color (颜色值)请仔细在GPIO扩展的积木列表中寻找类似描述的积木。如果找不到很可能是因为scratch3-gpio服务没有正确识别你的Sense HAT或者Scratch Link连接不稳定。这时需要返回树莓派终端检查服务日志sudo journalctl -u scratchgpio -f然后重新插拔Sense HAT并重启scratchgpio服务sudo systemctl restart scratchgpio。最后在Scratch中重新连接硬件。找到正确积木后更新脚本应为当接收到 [update_led v] sensehat set led x (矩阵X) y (矩阵Y) to color (颜色值) // 使用正确的积木连接硬件在Scratch编辑器顶部通常GPIO扩展区域会有一个“连接”按钮。点击它选择你的树莓派可能会以主机名或IP地址显示。连接成功后按钮状态会改变。5. 调试与优化让项目运行得更稳健即使按照步骤操作第一次运行时也可能遇到问题。以下是几个常见的故障点及排查思路。5.1 连接失败Scratch Link与树莓派服务现象Scratch中无法找到或连接树莓派设备。排查检查树莓派服务在树莓派终端运行sudo systemctl status scratchgpio确保状态为“active (running)”。如果不是尝试sudo systemctl restart scratchgpio。检查网络确保电脑和树莓派在同一个局域网下。Scratch Link通过网络发现设备。检查防火墙电脑或树莓派的防火墙可能阻止了通信。尝试暂时禁用防火墙测试。重启服务依次重启树莓派的scratchgpio服务和电脑上的Scratch Link程序。5.2 摇杆无响应广播消息映射错误现象推动摇杆Scratch里的小猫不动。排查确认配置再次打开“设备配置”检查每个摇杆方向对应的广播消息名称是否与代码中“当接收到广播消息”积木里的名称完全一致包括大小写和空格。测试广播你可以手动在Scratch中发送一个广播消息如joystick_left看小猫是否响应。如果响应说明代码逻辑没问题问题出在硬件映射配置上。检查Sense HAT识别在树莓派终端可以运行一个简单的Python脚本来测试摇杆硬件本身是否正常排除硬件故障。5.3 LED不亮或显示错乱坐标与颜色格式现象程序运行了但Sense HAT上的LED没反应或者亮的位置不对、颜色奇怪。排查坐标范围确保你的矩阵X和矩阵Y变量值始终在0-7之间。添加严格的边界检测逻辑并在调试时用“说”积木把它们的值显示出来。颜色计算确认颜色计算公式R*65536 G*256 B是否正确。你可以先写死一个颜色测试比如纯红色16711680看对应的LED是否亮起红灯。积木选择这是最易出错的地方。绝对不要使用gpio set servo pin这类积木。必须使用明确为Sense HAT LED设计的积木如sensehat set led...。仔细阅读积木的提示文本。硬件连接确保Sense HAT插紧。可以运行树莓派自带的Sense HAT示例程序如sudo python3 -c \from sense_hat import SenseHat; s SenseHat(); s.show_message(Hi)\来验证硬件和基础Python驱动是否正常。5.4 项目优化与扩展思路当基础功能跑通后你可以考虑以下优化和扩展让项目更有趣视觉反馈优化不要让之前点亮的小猫“足迹”消失。在update_led的逻辑中不要清屏这样小猫的移动轨迹会以彩色路径的形式保留在矩阵上形成一条彩色足迹。增加游戏性在矩阵上随机生成一个“目标点”用特定颜色表示控制小猫移动到目标点得分。这需要引入碰撞检测逻辑判断矩阵X和矩阵Y是否等于目标坐标。利用其他传感器Sense HAT还有陀螺仪。可以修改项目让小猫根据树莓派的倾斜方向移动而不是摇杆。多角色同步在Scratch舞台上创建多个角色让它们同步映射到LED矩阵的不同位置形成一个简单的多人或多彩点阵动画。这个项目虽然小但它像一把钥匙打开了用图形化编程控制物理世界的大门。从摇杆事件到LED响应每一个环节都体现了输入、处理、输出的核心计算思维。我在带领孩子们完成这个项目时最兴奋的时刻往往不是第一次点亮LED而是当他们调试成功亲手推动摇杆看到自己编写的程序在真实的硬件上产生即时、绚丽的反馈时眼中闪烁的光芒。这种成就感是纯软件编程难以比拟的。希望你在实现过程中也能体验到这种连接虚拟与现实的乐趣。如果在实践中遇到任何问题不妨回头检查一下硬件连接、服务状态和那个最容易出错的LED控制积木祝你好运