当前位置: 首页 > news >正文

基于Makey Makey与Arduino的辅助沟通设备制作指南

1. 项目概述:为沟通不便者打造一个“会说话”的按钮板

几年前,我在参与一个社区科技助残活动时,遇到一位因中风导致语言表达困难的老人。他眼神里的急切和双手无力的比划,让我深刻感受到,对于有沟通障碍的人群来说,一个简单、可靠、低成本的表达工具,可能就是他们与世界重新连接的桥梁。这促使我开始研究如何利用身边触手可及的开源硬件,快速搭建一个实用的辅助沟通设备(AAC)。

这次分享的项目,核心就是基于Makey MakeyArduino这两块极具创意的开发板,结合一块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 物料清单与选型考量

工欲善其事,必先利其器。以下是经过验证的物料清单,我会说明关键部件的选型原因:

  1. 主控制器

    • Makey Makey 开发板 x1:选择经典款即可。它是整个系统的输入枢纽。
    • Arduino Uno R3 x1:兼容性好,资料丰富。如果追求体积小巧,可以用Nano,但要注意引脚的对应关系。
  2. 显示模块

    • 16x2 字符型LCD显示屏(带I2C接口)x1这是关键选择!务必选择带有I2C接口转换板的LCD。传统的1602 LCD需要连接6-7根线,接线复杂且占用大量IO口。而I2C版本只需要4根线(VCC, GND, SDA, SCL),接线清爽,编程也简单。显示内容“16x2”也完全够用,能清晰显示短句。
  3. 输入部件

    • 大尺寸按钮开关 x 4-6个:建议选用直径3cm以上的金属按钮,手感清晰,易于寻找和按压。颜色最好不同,便于区分功能。
    • 铝箔胶带或导电布 1卷:用于制作自定义的、任意形状的触发区域。比如可以贴在一张图片上,触摸图片即触发。
    • 鳄鱼夹导线 10根以上:连接按钮与Makey Makey的桥梁,数量宁多勿少。
  4. 连接与供电

    • USB数据线(A to B)x1:用于连接Arduino和电脑。
    • USB数据线(Micro USB)x1:用于连接Makey Makey和电脑。
    • 杜邦线(公对公、母对母)若干:用于Arduino与LCD屏等之间的连接。
    • 面包板 x1:在测试阶段非常有用,可以避免反复焊接。
  5. 其他

    • 电脑一台:需要安装Arduino IDE和Scratch 3.0(或支持Makey Makey的版本)。
    • 小音箱或耳机:连接电脑用于播放语音。

注意:购买LCD时一定要确认是“I2C接口”。你可以看到屏幕背面有一个小小的蓝色电路板,上面通常有4个引脚(VCC, GND, SDA, SCL)和一个可调节对比度的电位器。

3.2 硬件连接步骤与原理

连接遵循“电源共地,信号独立”的原则。下面分两部分进行:

第一部分:Makey Makey输入系统连接

  1. 将Makey Makey通过Micro USB线连接到电脑的另一个USB口(与Arduino分开)。电脑会将其识别为一个标准键盘。
  2. 取一个大型按钮。将按钮的两个引脚,一个用鳄鱼夹线连接到Makey Makey上标有“Earth”(地线)的端口。
  3. 将按钮的另一个引脚,用鳄鱼夹线连接到Makey Makey上任意一个输入端口,例如“Click”(左键)、“Space”(空格)或“W”、“A”、“S”、“D”等。每个端口对应一个键盘按键。建议做好标签,记录下哪个按钮对应哪个按键(如:红色按钮 -> “Space”)。
  4. 重复步骤2-3,连接其他按钮。你可以将“Earth”线并联到所有按钮的一个引脚上,以节省Makey Makey的地线接口。

第二部分:Arduino与LCD显示系统连接

  1. 将Arduino Uno通过USB线(A to B)连接到电脑。
  2. 连接LCD的I2C模块到Arduino。这是最简连接:
    • LCD I2C模块 VCC->Arduino 5V
    • LCD I2C模块 GND->Arduino GND
    • LCD I2C模块 SDA->Arduino A4(在Uno上,SDA是A4引脚)
    • LCD I2C模块 SCL->Arduino A5(在Uno上,SCL是A5引脚)
  3. 检查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); }

关键点解析

  1. I2C地址0x27是常见地址,如果屏幕不亮,可以尝试改为0x3F。有一个简单的Arduino扫描I2C地址的程序可以帮你确定。
  2. 通信协议:这里我们定义了一个极其简单的协议:电脑发送一个字符,其ASCII值代表消息的索引(‘0’对应0,‘1’对应1)。Arduino收到后,根据索引从messages数组中取出对应的字符串显示。
  3. 消息定制:你可以随意修改messages数组里的内容,换成任何你需要的中文或英文短句。注意LCD 16x2的屏幕,一行最多显示16个英文字符或8个汉字(需要支持汉字库的LCD,更复杂一些)。

将代码上传到Arduino后,打开“串口监视器”(波特率设为9600),手动发送字符‘0’,‘1’等,应该能看到屏幕显示相应的语句。这证明Arduino部分工作正常。

4.2 Scratch端程序:处理按键与播放语音

Scratch部分的任务是:监听来自Makey Makey的按键,当特定按键被按下时,一方面播放录制好的语音,另一方面向Arduino的串口发送对应的指令字符。

操作步骤

  1. 打开Scratch 3.0(在线版或桌面版均可)。确保Makey Makey已连接,Scratch能识别到它(在Scratch的扩展里添加“Makey Makey”)。
  2. 录制或上传语音:在“声音”标签页,为每个按钮功能录制或上传一个简短的语音文件。例如,为“你好”按钮录制“你好,我需要帮助。”。将声音命名为“sound_hello”、“sound_thirsty”等,便于管理。
  3. 编写主控脚本

核心积木逻辑(以空格键触发“Hello”消息为例):

当 [空格键] 被按下 播放声音 [sound_hello] 直到播放完毕 向串口发送数据 [0] // 发送字符‘0’,对应Arduino程序中的第一条消息

你需要为Makey Makey上连接的每一个按键(如W, A, S, D, 点击, 空格等)都创建这样一个事件块。每个块里播放对应的声音,并发送不同的字符(‘0’, ‘1’, ‘2’…)。

  1. 连接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 完整工作流程测试

  1. 启动顺序:先给硬件上电(连接USB到电脑),再打开电脑上的软件。顺序是:连接Makey Makey和Arduino -> 打开Arduino IDE(仅用于供电和监视,程序已上传)-> 运行s2a_fm等串口桥接软件 -> 最后打开Scratch项目。
  2. 触发测试:按下连接在Makey Makey上的第一个大按钮。你应该能立即听到电脑播放出对应的语音。同时,观察Arduino连接的LCD屏幕,它应该清空原有内容并显示出对应的文字短句。
  3. 同步性检查:语音和文字的出现应该基本同步。由于串口通信和音频播放的微小延迟,完全毫秒级同步很难,但人耳和肉眼几乎无法察觉差异,体验是连贯的。

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 优化与扩展思路

一个基础版本成功后,你可以考虑以下优化,让它更好用:

  1. 物理外观与交互优化

    • 外壳制作:使用激光切割亚克力或3D打印一个盒子,将Arduino、LCD屏幕固定在内,按钮面板置于顶部,形成一个整洁的一体设备。
    • 按钮定制:使用大型卡通图案的电容触摸贴纸,或者将按钮与代表不同需求的图片(一杯水、一碗饭、笑脸)结合起来,让界面更直观。
    • 增加视觉反馈:在Arduino上连接不同颜色的LED,当某个按钮被触发时,对应的LED亮起,提供多感官确认。
  2. 功能扩展

    • 短语页切换:增加一个“翻页”按钮。按下后,LCD显示“Page 2”,此时其他按钮对应的短语集合切换到第二组,实现更多短语的存储和调用。这需要修改Arduino程序,管理多组消息数组和当前页状态。
    • 离线语音合成:如果希望脱离电脑,可以升级到Arduino兼容的语音合成模块(如SYN6288)。这样,Arduino在驱动LCD显示的同时,还能直接驱动喇叭发声,实现真正的便携一体机。但这需要更强的编程能力和硬件连接。
    • 记录使用频率:在Arduino程序中加入SD卡模块,记录每个按钮被按下的时间和次数。这些数据对于护理人员或语言治疗师分析用户的需求模式非常有价值。

这个项目的魅力在于,它从一个简单的想法出发,用并不高深的技术,组合出了一个能解决真实问题的产品原型。它涉及了输入传感、微控制器编程、串口通信、软件交互等多个物联网和嵌入式系统的核心概念,是一个绝佳的综合性实践。更重要的是,当你看到制作出的设备被有需要的人使用,并真切地帮助他们表达出需求时,那种成就感远超完成一个普通的电子制作。希望这份详尽的记录,能帮你绕过我踩过的那些坑,顺利做出你自己的辅助沟通设备。

http://www.jsqmd.com/news/949996/

相关文章:

  • 定制衣柜选板材怎么看?2026年常用品牌全维度选型指南 - 科技焦点
  • 如何高效实现Python量化交易:jqktrader智能自动化交易系统深度解析
  • EASY-HWID-SPOOFER深度解析:内核级硬件指纹伪装技术揭秘
  • UI-TARS桌面版:终极零代码GUI自动化解决方案,让AI成为你的数字操作员
  • Hudi 湖仓一体架构:阿里云 AnalyticDB MySQL 原生集成最佳实践
  • 闲置大牌首饰别乱卖!杭州正规回收门店实测对比攻略 - 奢侈品回收评测
  • LGTV Companion终极指南:让你的LG电视与Windows电脑实现智能联动
  • Swagger2Word架构解析:企业级API文档自动化转换的最佳实践
  • taskt RPA自动化工具:彻底解放你的重复性工作,免费开源的全能解决方案
  • Cursor Free VIP破解工具:如何彻底解决AI编程助手试用限制问题?
  • 避坑指南:在Docker中一次性正确配置MySQL 8.0的lower_case_table_names
  • 6.2前端笔记
  • 2026北京装修公司推荐对比:丰盛谦诚装饰蓝本分析、业主可参考 - 资讯速览
  • 别再手动配色了!用QGIS的【拓扑着色】工具,5分钟搞定行政区划地图
  • ABTest:用户转付费转化率
  • Path of Building PoE2:流放之路2终极构建规划器完整指南
  • LevelUI:为LevelDB开发者的可视化数据管理革命
  • 解读“测试icef认知操作系统吸引大模型(AI千问)用于数据预训练并可能被AI内化”
  • 多用户无线系统中兼顾吞吐与公平的MATLAB调度实现
  • 车规 PCBA 生产需要满足哪些认证要求?
  • 炸猪排如何加热
  • 终极指南:如何在PC上免费运行Switch游戏 - Ryujinx模拟器完全教程
  • 杭州、上海、苏州、嘉兴、无锡、常州网站建设公司哪家性价比高?
  • 3步掌握League Akari:为什么这个英雄联盟工具能提升你的游戏效率50%?
  • 微信小程序二维码生成终极指南:weapp-qrcode完整教程
  • 基于树莓派与HTML5的互动照相亭:全栈开发与物联网应用实践
  • 实战模拟企业环境,快马一键生成vmware微服务测试集群
  • Python 多继承的导航仪:C3 线性化算法到底解决了什么问题?
  • 110页大数据案例揭秘:产品设计方法引爆行业增长!
  • 别再手动传证书了!Kubernetes里用cert-manager自动管理TLS证书的保姆级教程