基于Makey Makey与Arduino的辅助沟通设备制作指南
1. 项目概述为沟通不便者打造一个“会说话”的按钮板几年前我在参与一个社区科技助残活动时遇到一位因中风导致语言表达困难的老人。他眼神里的急切和双手无力的比划让我深刻感受到对于有沟通障碍的人群来说一个简单、可靠、低成本的表达工具可能就是他们与世界重新连接的桥梁。这促使我开始研究如何利用身边触手可及的开源硬件快速搭建一个实用的辅助沟通设备AAC。这次分享的项目核心就是基于Makey Makey和Arduino这两块极具创意的开发板结合一块LCD屏幕和几个大按钮制作一个能将按压动作转化为语音和文字输出的交互装置。你不需要是电子工程科班出身只要对动手制作有兴趣跟着我的思路和踩过的坑走一遍就能做出一个真正能帮到人的小工具。它的原理不复杂用导电材料制作的超大按钮作为输入Makey Makey将这些按钮的触发模拟成键盘按键信号传给电脑电脑上的Scratch程序接收到特定按键后一方面在连接的LCD屏幕上显示预设的语句另一方面通过电脑音箱播放对应的语音。整个系统成本可控制作过程充满乐趣最终成果却非常实用。2. 核心设计思路与方案选型2.1 为什么是Makey Makey Arduino市面上微控制器很多为何独选这两者组合这源于它们互补的特性。Makey Makey本质上是一个高度简化的、可编程的USB键盘控制器。它的巨大优势在于“输入”的极致易用性任何导电物体铝箔、水果、橡皮泥甚至人体连接到它的输入口都可以被识别为一个按键触发。这意味着我们可以轻松制作各种形状、大小、材质的“按钮”非常适合行动不便或需要大目标区域的操作者。然而Makey Makey的“输出”能力较弱主要依赖电脑端的程序反馈。这时就需要Arduino登场。Arduino Uno或Nano这类板子拥有丰富的数字和模拟IO口可以轻松驱动LCD显示屏、LED灯、蜂鸣器等输出设备。但它处理复杂、多样化的模拟输入比如来自各种奇异导电材料的信号上需要额外的电路和编程调试不如Makey Makey来得直接。所以我们的方案思路很清晰让专业的设备做专业的事。用Makey Makey负责接收来自特制大按钮的、可能不那么“规整”的输入信号并将其转化为稳定、标准的键盘事件。这个键盘事件同时触发两个分支一是电脑上运行的Scratch程序负责播放语音二是通过串口通信USB将指令发送给Arduino由Arduino驱动LCD屏幕显示对应的文字。这种架构既利用了Makey Makey输入端的友好性又发挥了Arduino在控制外设方面的灵活性还借助了电脑强大的音频处理能力。2.2 从理想设计到可行方案的调整原计划其实更“完美”希望屏幕显示和语音播放严格同步且均由Arduino一体化控制。这意味着需要Arduino能解码音频文件并驱动喇叭同时刷新屏幕。我们尝试过使用Arduino的Wave Shield或DFPlayer Mini模块来播放语音但在实际焊接和编程中发现同时处理LCD刷新和MP3文件解码对Arduino Uno的内存和处理器是很大的考验极易导致语音卡顿或显示延迟体验很差。因此我们果断采纳了原文作者提到的“替代方案”将语音输出任务“卸载”到电脑上。电脑处理音频播放游刃有余Scratch编程又极其简单直观非常适合定义“按下A键播放‘你好’”这样的映射关系。Arduino则专心致志地管理LCD显示通过串口接收来自电脑Scratch程序的指令。虽然系统从“一体机”变成了“电脑外设”但稳定性和易实现性大大提升。这也提醒我们在项目原型阶段优先保证核心功能的稳定运行比追求技术上的“集成度”更重要。3. 硬件准备与连接详解3.1 物料清单与选型考量工欲善其事必先利其器。以下是经过验证的物料清单我会说明关键部件的选型原因主控制器Makey Makey 开发板 x1选择经典款即可。它是整个系统的输入枢纽。Arduino Uno R3 x1兼容性好资料丰富。如果追求体积小巧可以用Nano但要注意引脚的对应关系。显示模块16x2 字符型LCD显示屏带I2C接口x1这是关键选择务必选择带有I2C接口转换板的LCD。传统的1602 LCD需要连接6-7根线接线复杂且占用大量IO口。而I2C版本只需要4根线VCC, GND, SDA, SCL接线清爽编程也简单。显示内容“16x2”也完全够用能清晰显示短句。输入部件大尺寸按钮开关 x 4-6个建议选用直径3cm以上的金属按钮手感清晰易于寻找和按压。颜色最好不同便于区分功能。铝箔胶带或导电布 1卷用于制作自定义的、任意形状的触发区域。比如可以贴在一张图片上触摸图片即触发。鳄鱼夹导线 10根以上连接按钮与Makey Makey的桥梁数量宁多勿少。连接与供电USB数据线A to Bx1用于连接Arduino和电脑。USB数据线Micro USBx1用于连接Makey Makey和电脑。杜邦线公对公、母对母若干用于Arduino与LCD屏等之间的连接。面包板 x1在测试阶段非常有用可以避免反复焊接。其他电脑一台需要安装Arduino IDE和Scratch 3.0或支持Makey Makey的版本。小音箱或耳机连接电脑用于播放语音。注意购买LCD时一定要确认是“I2C接口”。你可以看到屏幕背面有一个小小的蓝色电路板上面通常有4个引脚VCC, GND, SDA, SCL和一个可调节对比度的电位器。3.2 硬件连接步骤与原理连接遵循“电源共地信号独立”的原则。下面分两部分进行第一部分Makey Makey输入系统连接将Makey Makey通过Micro USB线连接到电脑的另一个USB口与Arduino分开。电脑会将其识别为一个标准键盘。取一个大型按钮。将按钮的两个引脚一个用鳄鱼夹线连接到Makey Makey上标有“Earth”地线的端口。将按钮的另一个引脚用鳄鱼夹线连接到Makey Makey上任意一个输入端口例如“Click”左键、“Space”空格或“W”、“A”、“S”、“D”等。每个端口对应一个键盘按键。建议做好标签记录下哪个按钮对应哪个按键如红色按钮 - “Space”。重复步骤2-3连接其他按钮。你可以将“Earth”线并联到所有按钮的一个引脚上以节省Makey Makey的地线接口。第二部分Arduino与LCD显示系统连接将Arduino Uno通过USB线A to B连接到电脑。连接LCD的I2C模块到Arduino。这是最简连接LCD I2C模块 VCC-Arduino 5VLCD I2C模块 GND-Arduino GNDLCD I2C模块 SDA-Arduino A4(在Uno上SDA是A4引脚)LCD I2C模块 SCL-Arduino A5(在Uno上SCL是A5引脚)检查LCD背面的I2C模块上是否有一个小的电位器。使用螺丝刀微调它直到上电后屏幕能清晰显示字符通常是在纯色背景下看到一排黑色方块。连接示意图逻辑关系[特制大按钮] -- (鳄鱼夹) -- [Makey Makey输入口] | v [USB模拟键盘信号] | v [电脑USB口] | -------------------- | | v v [Scratch程序] [Arduino IDE串口监视] (播放对应语音) (或自定义串口程序) | | | v | [Arduino Uno] | | (通过USB串口) | v | [LCD显示屏显示文字] | v [电脑音响出声音]这个连接图的核心在于Makey Makey和Arduino是独立连接到电脑的两个USB设备。它们之间的“通信”是通过电脑上的软件Scratch和Arduino串口来协调的而非直接的硬件连线。4. 软件编程Arduino与Scratch的协同硬件是躯体软件是灵魂。这一部分我们将让两块开发板“活”起来。4.1 Arduino端程序驱动LCD显示Arduino的程序负责初始化LCD并时刻监听来自电脑串口的指令根据指令更新屏幕显示。我们需要先安装一个关键的库LiquidCrystal_I2C。可以在Arduino IDE的“库管理器”中搜索并安装。以下是完整的Arduino代码并附有详细注释// 引入Wire和LiquidCrystal_I2C库 #include Wire.h #include LiquidCrystal_I2C.h // 设置LCD的I2C地址通常是0x27或0x3F如果不显示可以尝试修改 // 16和2分别代表每行字符数和行数 LiquidCrystal_I2C lcd(0x27, 16, 2); // 定义一个字符串数组用来存储需要显示的语句。索引号0,1,2,3...对应后续串口收到的数字指令。 String messages[] { Hello! I need help., // 索引0 I am thirsty., // 索引1 I am hungry., // 索引2 Thank you!, // 索引3 Yes., // 索引4 No. // 索引5 }; int messageCount 6; // 消息的总数量 void setup() { // 初始化串口通信波特率设为9600与电脑端Scratch程序匹配 Serial.begin(9600); // 初始化LCD lcd.init(); lcd.backlight(); // 打开背光 lcd.clear(); // 清屏 // 显示启动信息 lcd.setCursor(0, 0); // 设置光标到第一行开头 lcd.print(AAC Device); lcd.setCursor(0, 1); // 设置光标到第二行开头 lcd.print(Ready...); delay(2000); lcd.clear(); lcd.print(Press a button); } void loop() { // 检查串口是否有数据可读 if (Serial.available() 0) { // 读取一个字节的数据我们约定发送的是字符0, 1, 2... char receivedChar Serial.read(); // 将接收到的字符转换为整数索引 // 0的ASCII码是48减去48得到数字0以此类推 int index receivedChar - 0; // 检查索引是否在有效范围内 if (index 0 index messageCount) { lcd.clear(); // 清屏 lcd.setCursor(0, 0); // 从第一行开始显示 // 如果消息超过16字符可以简单处理这里假设都在16字内 lcd.print(messages[index]); // 可选在串口监视器也打印一下用于调试 Serial.print(Displaying: ); Serial.println(messages[index]); } else { // 如果收到非法指令可以显示错误或忽略 // Serial.println(Invalid index received.); } // 清空串口缓冲区避免处理残留数据 while(Serial.available() 0) { Serial.read(); } } // 短暂延迟避免循环过快占用资源 delay(100); }关键点解析I2C地址0x27是常见地址如果屏幕不亮可以尝试改为0x3F。有一个简单的Arduino扫描I2C地址的程序可以帮你确定。通信协议这里我们定义了一个极其简单的协议电脑发送一个字符其ASCII值代表消息的索引‘0’对应0‘1’对应1。Arduino收到后根据索引从messages数组中取出对应的字符串显示。消息定制你可以随意修改messages数组里的内容换成任何你需要的中文或英文短句。注意LCD 16x2的屏幕一行最多显示16个英文字符或8个汉字需要支持汉字库的LCD更复杂一些。将代码上传到Arduino后打开“串口监视器”波特率设为9600手动发送字符‘0’‘1’等应该能看到屏幕显示相应的语句。这证明Arduino部分工作正常。4.2 Scratch端程序处理按键与播放语音Scratch部分的任务是监听来自Makey Makey的按键当特定按键被按下时一方面播放录制好的语音另一方面向Arduino的串口发送对应的指令字符。操作步骤打开Scratch 3.0在线版或桌面版均可。确保Makey Makey已连接Scratch能识别到它在Scratch的扩展里添加“Makey Makey”。录制或上传语音在“声音”标签页为每个按钮功能录制或上传一个简短的语音文件。例如为“你好”按钮录制“你好我需要帮助。”。将声音命名为“sound_hello”、“sound_thirsty”等便于管理。编写主控脚本核心积木逻辑以空格键触发“Hello”消息为例当 [空格键] 被按下 播放声音 [sound_hello] 直到播放完毕 向串口发送数据 [0] // 发送字符‘0’对应Arduino程序中的第一条消息你需要为Makey Makey上连接的每一个按键如W, A, S, D 点击 空格等都创建这样一个事件块。每个块里播放对应的声音并发送不同的字符‘0’ ‘1’ ‘2’…。连接Scratch与Arduino串口这是关键且容易出错的一步。Scratch默认不直接支持串口通信。我们需要借助一个“桥梁”程序。最常用的是“scratch-link”或“s2a_fm”这类第三方插件。以s2a_fm为例在电脑上运行s2a_fm一个本地小服务器。在Scratch中添加“s2a_fm”扩展。在s2a_fm的界面中选择Arduino对应的串口如COM3或/dev/ttyUSB0。此时Scratch中的“向串口发送数据”积木就能将数据通过s2a_fm转发到Arduino了。实操心得Scratch与硬件串口通信的配置因操作系统和版本而异是项目最大的调试难点。如果s2a_fm不成功可以尝试使用“串口助手”类软件作为中转让Scratch通过“网络发送”积木将数据发往本地的一个UDP/TCP端口再由一个用Python使用pyserial库编写的小程序监听该端口并将收到的数据转发到Arduino的串口。虽然多了一步但更稳定可控。5. 系统集成、调试与优化当硬件连接妥当Arduino程序和Scratch程序分别测试成功后就到了激动人心的联调时刻。5.1 完整工作流程测试启动顺序先给硬件上电连接USB到电脑再打开电脑上的软件。顺序是连接Makey Makey和Arduino - 打开Arduino IDE仅用于供电和监视程序已上传- 运行s2a_fm等串口桥接软件 - 最后打开Scratch项目。触发测试按下连接在Makey Makey上的第一个大按钮。你应该能立即听到电脑播放出对应的语音。同时观察Arduino连接的LCD屏幕它应该清空原有内容并显示出对应的文字短句。同步性检查语音和文字的出现应该基本同步。由于串口通信和音频播放的微小延迟完全毫秒级同步很难但人耳和肉眼几乎无法察觉差异体验是连贯的。5.2 常见问题与排查实录在实际搭建中你几乎一定会遇到下面这些问题。这是我的排查笔记问题现象可能原因排查步骤与解决方案按下按钮电脑有反应如网页滚动但Scratch没声音1. Scratch中未正确添加Makey Makey扩展。2. Scratch中按键事件积木未正确关联按键。3. 声音文件未正确加载或命名错误。1. 检查Scratch扩展区确认“Makey Makey”已添加且显示已连接。2. 在Scratch中右键点击“当按下[键]”积木中的按键区域选择“重新录制”然后按下物理按钮看Scratch是否能捕获到正确的按键。3. 检查“播放声音”积木中选择的声音名称是否与声音标签页中的名称完全一致。Scratch有声音但LCD不显示1. Arduino未供电或USB线松动。2. LCD I2C地址错误或接线错误。3. Scratch串口数据未成功发送到Arduino。1. 检查Arduino板上的电源指示灯是否亮起。2. 运行一个简单的I2C地址扫描程序确认LCD地址。检查VCC、GND、SDA、SCL四根线是否接牢且对应正确。3.这是最常出问题的地方首先确认串口桥接软件如s2a_fm是否运行并选择了正确的COM口。然后打开Arduino IDE的串口监视器按下按钮时观察是否有字符如‘0’显示出来。如果没有说明数据没从Scratch传到串口。LCD显示乱码或黑块1. LCD对比度未调节。2. I2C通信不稳定。3. 库不兼容或初始化问题。1.首要操作使用小螺丝刀调节LCD背面I2C模块上的蓝色电位器直到字符清晰显示。2. 检查接线是否过长或接触不良尝试缩短SDA/SCL线。3. 确保使用的是正确的LiquidCrystal_I2C库并且构造函数中的地址和行列参数正确。按钮反应不灵敏1. 接地不良。2. 按钮或导电材料接触电阻太大。3. Makey Makey灵敏度问题。1. 确保使用者的手或身体其他部位稳定地接触到了Makey Makey的“Earth”地线。这是Makey Makey工作的关键回路。2. 对于自制的导电区域如铝箔确保面积足够大且鳄鱼夹夹持牢固必要时用导电胶加固。3. 可以尝试用更潮湿的手接触或者用一根导线将“Earth”端直接引到使用者容易接触的部位如手腕带。多个按钮同时按下时混乱Scratch事件处理是并发的可能造成串口数据发送冲突。在Scratch中为每个按键事件块内部在“播放声音”和“发送数据”之前增加一个“停止所有声音”积木并考虑使用“广播并等待”机制来管理状态避免语音重叠和数据竞争。5.3 优化与扩展思路一个基础版本成功后你可以考虑以下优化让它更好用物理外观与交互优化外壳制作使用激光切割亚克力或3D打印一个盒子将Arduino、LCD屏幕固定在内按钮面板置于顶部形成一个整洁的一体设备。按钮定制使用大型卡通图案的电容触摸贴纸或者将按钮与代表不同需求的图片一杯水、一碗饭、笑脸结合起来让界面更直观。增加视觉反馈在Arduino上连接不同颜色的LED当某个按钮被触发时对应的LED亮起提供多感官确认。功能扩展短语页切换增加一个“翻页”按钮。按下后LCD显示“Page 2”此时其他按钮对应的短语集合切换到第二组实现更多短语的存储和调用。这需要修改Arduino程序管理多组消息数组和当前页状态。离线语音合成如果希望脱离电脑可以升级到Arduino兼容的语音合成模块如SYN6288。这样Arduino在驱动LCD显示的同时还能直接驱动喇叭发声实现真正的便携一体机。但这需要更强的编程能力和硬件连接。记录使用频率在Arduino程序中加入SD卡模块记录每个按钮被按下的时间和次数。这些数据对于护理人员或语言治疗师分析用户的需求模式非常有价值。这个项目的魅力在于它从一个简单的想法出发用并不高深的技术组合出了一个能解决真实问题的产品原型。它涉及了输入传感、微控制器编程、串口通信、软件交互等多个物联网和嵌入式系统的核心概念是一个绝佳的综合性实践。更重要的是当你看到制作出的设备被有需要的人使用并真切地帮助他们表达出需求时那种成就感远超完成一个普通的电子制作。希望这份详尽的记录能帮你绕过我踩过的那些坑顺利做出你自己的辅助沟通设备。