1. 项目概述:一个能感知你情绪的“外星小宠物”
几年前,我在一个创客展上看到一个孩子对着一块会发光的石头说话,那一刻我突然意识到,我们赋予无生命物体以“生命感”的渴望是如此强烈。这催生了Glormi——一个基于PICAXE 08M2微控制器的情感交互机器人。它不是什么高科技AI,没有复杂的神经网络,但它会因为你抚摸它而“开心”地振动,因为你长时间不理它而“失落”地发出低鸣。这个项目本质上,是用最简单的数字逻辑和传感器,模拟出最原始的情感反馈,打造一个专属于你的“宇宙拥抱小怪兽”。
Glormi的核心价值在于其极简的交互哲学。它摒弃了屏幕和复杂的按钮,只通过触摸和倾斜两种最直觉的交互方式,配合振动马达和压电蜂鸣器两种最基础的反馈,构建了一个温暖、直接的对话通道。无论是用于STEM教育,向孩子们直观展示输入、处理、输出的电子系统闭环;还是作为感官友好的陪伴装置,为需要情绪安抚的用户提供一个可预测、无压力的互动对象;亦或是作为创客入门嵌入式系统和情感计算的绝佳练手项目,它都提供了一个完整且迷人的起点。接下来,我将拆解从电路设计、代码逻辑到外壳塑造的全过程,并分享那些只有亲手做过才会知道的“坑”和技巧。
2. 核心硬件选型与电路设计思路
2.1 微控制器:为什么是PICAXE 08M2?
在开源硬件领域,Arduino和树莓派Pico无疑是更耀眼的选择。但我为Glormi选择了略显“复古”的PICAXE 08M2,这背后有非常实际的考量。首先,极低的学习门槛是其最大优势。PICAXE使用类BASIC语言编程,语法直观,像IF...THEN、GOTO这样的语句对于编程新手甚至孩子来说都非常友好,无需面对C++的指针、类等复杂概念。其次,极简的开发环境。仅需一个串口(甚至老式COM口)和一条简单的三线下载线,无需安装复杂的驱动和IDE,降低了项目启动的“摩擦力”。最后,极致的成本与尺寸控制。08M2仅有8个引脚,在资源极度受限的情况下迫使设计者进行最精简的思考,这对于理解嵌入式系统的本质——“用有限的资源做确定的事”——非常有帮助。
当然,选择它也意味着接受其局限性:处理能力弱、内存小、缺乏现代外设。但这恰恰是项目的教学意义所在:情感交互的核心并非算力,而是恰当的逻辑设计和对有限资源的创造性运用。08M2的5个可用I/O引脚(C.1-C.4,C.0和C.5用于编程)就像五个音符,如何谱写出丰富的情感乐章,才是挑战所在。
2.2 传感器与执行器:构建交互的感官与表达
Glormi的“感官系统”由一触一动构成,简单却有效。
- 触摸感知(TTP223电容式触摸传感器):这是Glormi的“头皮”。TTP223模块输出数字信号(触摸时高电平,否则低电平),直接连接微控制器引脚,无需复杂的模拟电路。其灵敏度可通过模块上的焊点调节。在Glormi中,我们将它置于外壳顶部,覆盖一块绒布,模拟被抚摸的感觉。选择电容式而非电阻式触摸,是因为前者只需感应接近,无需压力,更适合这种轻柔的交互。
- 运动感知(两个SW-200D倾斜开关并联):这是Glormi的“平衡感”。倾斜开关内部有一个滚珠,在特定角度下导通。我将两个开关并联后接至同一个I/O引脚(C.4),这样无论向左还是向右倾斜,只要角度足够,都能触发同一个“运动”信号。这种设计实现了“摇晃”交互,同时节省了一个宝贵的I/O口。并联时需注意,开关的常态(未倾斜)必须都是开路,触发时闭合,否则逻辑会混乱。
- 情感表达(振动马达与压电蜂鸣器):
- 振动马达:选择微型扁平振动马达,它功耗低,体积小,能产生细腻的“呼噜”感。关键点:微控制器I/O口的驱动电流(通常约20mA)不足以直接驱动马达,必须使用MOSFET(如BS170)作为电子开关。C.1引脚输出高电平时,MOSFET导通,马达电路接通;低电平时关闭。这保护了微控制器,也允许使用更高电压(如电池直接供电)来驱动马达,获得更强振动。
- 压电蜂鸣器:用于发出“唧唧”声。PICAXE的
SOUND或PLAY指令可以很方便地驱动它产生不同频率的声音。直接连接至C.2引脚即可。注意,无源蜂鸣器需要程序产生PWM波才能发声,而有源蜂鸣器给电就响,这里使用无源的以获得音调变化。
2.3 电源与电路布局:稳定与紧凑的艺术
电源选用单节3.7V锂聚合物电池,体积小、能量密度高。整个系统功耗极低,待机电流在微安级别,一个小容量电池也能运行很久。电路中加入了10uF和0.1uF的电容分别用于电源滤波和去耦,这是保证数字电路稳定工作的基础,尤其在马达启停的瞬间,可以吸收电压尖峰。
电路布局采用双层穿孔板堆叠设计,这是本项目的精华之一,也是紧凑型项目的常用技巧。顶层板放置核心逻辑器件(PICAXE、电阻、电容),底层板放置“外围”器件(传感器、执行器)。两者通过长排针垂直连接,既提供了机械支撑,又完成了电气互联。这样做的好处显而易见:极大节省了平面空间,使整个核心电路板能做到硬币大小;将易损的传感器(如倾斜开关)与密集的芯片分开,便于安装和保护;模块化设计让调试和维修变得更容易——你可以单独测试每一层。
实操心得:布局规划先行千万不要拿到板子就直接焊接!务必使用DIY Layout Creator这类免费软件先进行虚拟布局。在软件中放置好每一个元件,规划好每一条走线,确认排针位置对应无误。打印出来1:1的图纸,将元件插在纸上比对,能避免绝大多数“装不下”或“连不上”的悲剧。我的一个早期版本就因为没规划好,导致振动马达顶住了排针,不得不全部重来。
3. 从零开始焊接与组装:打造Glormi的“神经系统”
3.1 分层焊接:先核心,后外围,留接口
焊接顺序遵循“由内而外,由低到高”的原则。
- 焊接顶层板(逻辑核心):
- 首先焊接最低矮的元件:电阻和电容。使用色环电阻时,务必用万用表复核阻值,我曾在10k和1k上栽过跟头。
- 然后焊接PICAXE 08M2芯片。使用IC座是个好习惯,方便日后更换或复用芯片。焊接时注意芯片缺口方向与布局图一致。
- 此时切勿焊接连接底层板的排针!这些排针的焊盘需要保持清洁,以便后续与底层板对齐焊接。
- 焊接底层板(感官与动作):
- 先焊接倾斜开关和压电蜂鸣器。倾斜开关的引脚可以弯折90度,使其平贴在板子上,减少高度。
- 焊接BS170 MOSFET。注意它的三个脚(G栅极、D漏极、S源极)不要接错。原理图中,G极接控制信号(C.1),D极接振动马达正极,S极接地。
- 焊接连接电源、马达、蜂鸣器的信号线。使用细导线或利用板子背后的铜箔走线。
- 同样,预留出连接顶层板的排母焊盘和触摸传感器的焊盘。
3.2 关键步骤:堆叠、绝缘与传感器安装
这是将两块板子“合体”并确保长期可靠工作的关键阶段。
- 堆叠与固定:将焊接好元件的顶层板,通过长排针小心地对准底层板对应的过孔。轻轻压紧,确保没有元件引脚相互短路。先只焊接四个角上的排针,这样既能固定结构,又留有调整余地。确认整体平整无应力后,再焊接剩余的排针。
- 全面绝缘:这是血的教训换来的步骤。空气干燥粘土(后续做外壳用)含有水分和微量电解质,具有轻微的导电性!如果电路板有裸露的铜箔或焊点,粘土干燥过程中可能导致短路或信号紊乱。我的做法是:
- 用绝缘胶带将整个堆叠后的电路板模块像木乃伊一样包裹起来,重点覆盖所有焊点和走线。
- 对触摸传感器TTP223的感应面及周围,涂抹一层透明指甲油或专用的三防漆(Conformal Coating)。这能形成绝缘保护层,且不影响触摸灵敏度。等待其完全干透。
- 安装触摸传感器:将TTP223模块背面的引脚焊接上短排针,然后像插接件一样安装到底层板预留的位置上。这样做的好处是,传感器模块高于主板,其感应面能更贴近外壳内壁,提高触摸灵敏度。最后,用一小块双面泡沫胶将其牢牢固定在板子上,避免晃动。
3.3 防呆设计与充电/下载接口
为了确保安全,必须防止电池或编程线接反。我采用了一种简单的“机械防呆”设计:
- 在6Pin的母座排针中,故意将中间的一个引脚(例如第3脚)在电路设计上定义为NC(不连接)。
- 组装时,用一颗M1规格的小螺丝拧入这个空的引脚孔,将其物理堵死。
- 制作下载/充电线时,将对应的公头排针的第3根针脚提前剪掉或压弯。 这样,只有当方向正确时,线缆才能插入;反了则会被那颗螺丝挡住。这个小技巧成本为零,却能有效保护昂贵的芯片和电池。
4. 情感逻辑编程:用代码赋予Glormi“灵魂”
硬件是躯体,软件才是灵魂。Glormi的情感逻辑全部由PICAXE BASIC编写,其核心是几个变量和状态机。
4.1 基础框架与变量定义
' === Directives === #picaxe 08M2 #no_data ' 节省变量空间 ' === 引脚定义 === symbol touchPin = pinC.3 ' 触摸输入 symbol tiltPin = pinC.4 ' 倾斜输入 symbol speakerPin = C.2 ' 蜂鸣器输出 symbol motorPin = C.1 ' 马达输出 ' === 情绪变量 === symbol happiness = b0 ' 快乐值 (0-100) symbol loneliness = b1 ' 孤独值 (0-100) symbol energy = b2 ' 精力值 (0-100) symbol moodState = b3 ' 当前情绪状态 (0:快乐, 1:孤独, 2:困倦, 3:兴奋) ' === 计时器与标志 === symbol idleTimer = w4 ' 空闲计时器 (字变量,0-65535) symbol touchFlag = bit0 ' 触摸事件标志 symbol tiltFlag = bit1 ' 倾斜事件标志4.2 核心情绪引擎与状态迁移
情绪不是简单的刺激-反应,而是随时间变化的内部状态。我设计了一个简单的“情绪引擎”在主循环中运行:
main: gosub checkSensors ' 检查传感器输入 gosub updateMood ' 更新内部情绪状态 gosub expressMood ' 根据情绪状态做出反应 pause 100 ' 主循环延迟,控制反应速度 goto main ' --- 子程序:检查传感器 --- checkSensors: touchFlag = 0 tiltFlag = 0 if touchPin = 1 then ' 如果被触摸 touchFlag = 1 happiness = happiness + 5 MAX 100 ' 快乐增加,上限100 loneliness = loneliness - 10 MIN 0 ' 孤独减少,下限0 energy = energy + 3 MAX 100 ' 精力恢复 endif if tiltPin = 1 then ' 如果被摇晃 tiltFlag = 1 happiness = happiness + 3 MAX 100 energy = energy + 5 MAX 100 if tiltFlag = 1 and touchFlag = 1 then ' 同时触摸和摇晃,更兴奋 moodState = 3 ' 进入兴奋状态 endif endif if touchPin = 0 and tiltPin = 0 then inc idleTimer ' 无交互时,空闲计时增加 else idleTimer = 0 ' 有交互,清零计时器 endif return ' --- 子程序:更新情绪状态 --- updateMood: ' 规则1:长时间无交互,变得孤独或困倦 if idleTimer > 1000 then ' 约100秒无交互 loneliness = loneliness + 1 MAX 100 energy = energy - 1 MIN 0 endif ' 规则2:根据变量值决定主导情绪 if loneliness > 70 then moodState = 1 ' 孤独 elseif energy < 30 then moodState = 2 ' 困倦 elseif happiness > 60 and energy > 50 then moodState = 3 ' 兴奋 (需要高快乐和高精力) else moodState = 0 ' 普通/快乐 endif return4.3 情绪表达与输出反应
不同的情绪状态,触发不同的输出模式,这是Glormi显得“有生命”的关键。
' --- 子程序:表达情绪 --- expressMood: select case moodState case 0: ' 快乐/普通 if touchFlag = 1 then high motorPin : pause 80 : low motorPin ' 短促愉快的振动 play speakerPin, 100, 100 ' 发出一次欢快音调 endif if tiltFlag = 1 then play speakerPin, 150, 50 ' 摇晃时音调更高 endif case 1: ' 孤独 if idleTimer // 200 = 0 then ' 每隔约20秒 play speakerPin, 80, 500 ' 发出一声低长的、类似叹息的声音 high motorPin : pause 30 : low motorPin ' 微弱的、无力的振动 endif case 2: ' 困倦 ' 反应变慢,输出减弱 if touchFlag = 1 then pause 200 ' 反应延迟 high motorPin : pause 40 : low motorPin ' 轻微振动 endif ' 倾斜可能无反应 case 3: ' 兴奋 if touchFlag = 1 or tiltFlag = 1 then for b5 = 1 to 4 high motorPin : pause 20 : low motorPin : pause 20 play speakerPin, 200, 20 next b5 ' 快速连续的振动和短促鸣叫 endif endselect return编程心得:让交互更“自然”的秘诀
- 引入随机性:完全确定的反应会很快让人感到机械。可以在反应中加入微小的随机延迟或随机选择不同的声音模式。PICAXE的
random命令可以生成伪随机数。- 使用非对称奖励:对“好”的行为(如抚摸)给予强烈而及时的正反馈(振动+声音);对“不好”的行为(如长时间不理)给予轻微、缓慢的负反馈。这更符合生物学习规律。
- 状态迁移的滞后:不要让情绪状态切换得太频繁。例如,从“孤独”切换到“快乐”需要连续多次的积极交互,而从“快乐”滑向“孤独”则需要一段时间的冷落。这模拟了情绪的“惯性”。
5. 塑造外星躯体:从电路板到可拥抱的伙伴
电子部分完成后,Glormi还只是一块冰冷的板子。赋予它触感和形态,是项目从“技术Demo”升华到“情感载体”的关键一步。
5.1 外壳材料选择与造型
我选择了空气干燥粘土作为主体材料。它无毒、易塑形、干燥后质地轻便且有一定韧性。不建议使用烤箱烘烤的聚合物粘土,因为高温可能损坏内部电子元件。
- 塑形要点:
- 将电路模块用绝缘胶带包裹好后,作为“内核”开始包裹粘土。粘土厚度建议在5-10mm,太薄易裂,太厚影响触摸传感器灵敏度。
- 务必为充电/编程接口和触摸传感器留出位置。接口处可以用手指或工具压出一个凹槽,确保干燥后插头能顺利插入。触摸传感器上方只需覆盖极薄的一层粘土,或者先不覆盖,后期粘贴绒布。
- 设计造型时,考虑重心。让Glormi在平放时,倾斜开关处于断开状态;当被拿起或倾斜玩耍时,重心变化能可靠地触发开关。我将其底部做成微平的蛋形,背部略厚,这样它自然平放时是稳定的。
- 干燥与处理:空气干燥需要耐心,在通风处静置至少24-48小时,确保从内到外完全干透。干燥过程中可能产生细微裂纹,可以用少量清水涂抹修补。完全干透后,可以用丙烯颜料上色,增加个性。
5.2 触感升级与最终整合
干燥上色后,最后一步是提升交互质感。
- 粘贴绒布/仿毛皮:在触摸传感器对应的外壳区域,粘贴一小块柔软的绒布或仿毛皮。这不仅是装饰,更重要的是提供了温暖、舒适的触感,与电子产品的冰冷感形成对比,极大地增强了“抚摸”这个动作的情感价值。用双面胶或手工白胶粘贴即可。
- 安装眼睛:使用活动眼珠(Googly Eyes)能瞬间赋予生命感。在粘土干燥前预先压出眼窝,干燥后用强力胶(如热熔胶或环氧树脂)粘贴。眼睛的位置和大小直接影响“性格”,可以多尝试几种组合。
- 最终测试与调试:组装完成后,再次连接编程线,上传完整的情绪逻辑代码。进行全面测试:抚摸绒布区域,观察振动和声音反应;轻轻摇晃,测试倾斜触发;静置一段时间,听它是否会发出“孤独”的鸣叫。根据实际表现,回到代码中微调计时器阈值、反应强度等参数,让Glormi的行为更符合你的预期。
6. 项目扩展与深度优化思路
基础版的Glormi已经是一个完整的项目,但它的开放性为无限扩展提供了可能。
6.1 硬件扩展方向
| 扩展模块 | 实现功能 | 连接与思路 |
|---|---|---|
| RGB LED | 增加视觉情绪反馈。快乐时发光,孤独时闪烁,兴奋时快速变色。 | 可使用单个共阳极RGB LED,利用PICAXE的PWM引脚(如果有)或软件PWM控制颜色。需串联限流电阻。 |
| 环境光传感器 | 感知昼夜,实现“睡眠-唤醒”循环。在黑暗中自动进入低功耗睡眠模式。 | 如光敏电阻或TSL2561数字传感器。模拟传感器接ADC引脚,数字传感器可尝试用软件模拟I2C。 |
| 声音传感器 | 响应拍手或呼唤。实现“叫名字有反应”的功能。 | 使用模拟输出的声音传感器模块,连接至ADC引脚,检测音量阈值。 |
| 蓝牙模块 | 无线控制和编程。通过手机APP调整情绪参数或上传新行为模式。 | 如HC-05,连接至串口引脚(C.0, C.5)。需要处理串口通信协议,难度较高。 |
6.2 软件逻辑深化
- 情绪记忆:利用PICAXE的EEPROM(电可擦写存储器)保存关键情绪变量(如快乐值)。这样即使断电重启,Glormi也能“记得”之前与你的关系亲密度,实现更长期的情感绑定。
- 学习与适应:通过记录不同交互模式(如快速抚摸、慢速摇晃)的频率和结果,让Glormi逐渐“偏好”某种互动方式。例如,如果它发现每次发出某种声音后都能得到抚摸,它可能会更频繁地发出这种“求关注”的声音。
- 更复杂的状态机:引入“健康值”、“饥饿值”等更多变量,并设计它们之间的相互影响关系(如饥饿值增加会降低快乐值),构建一个更丰富的虚拟生命系统。
6.3 在教育与辅助领域的应用定制
- STEM教育套件:将Glormi作为载体,设计一系列课程。第一课焊接LED,第二课编程让LED闪烁,第三课加入触摸传感器……循序渐进地学习电子和编程。其可爱的外形能极大吸引孩子的兴趣。
- 感官整合训练工具:为有特殊需求的儿童定制。例如,将倾斜反应调得非常灵敏,鼓励孩子进行精细动作控制;或将触摸反馈与特定的、舒缓的声音绑定,用于焦虑缓解。
- 老年人电子宠物:简化交互,强化反馈。例如,将程序改为只在被拿起时发出温和的振动和一段固定的、怀旧的音乐,成为一个简单的、提供触觉和听觉陪伴的装置。
7. 常见问题与故障排查实录
在制作和调试Glormi的过程中,我遇到了各种各样的问题。这里将最常见的问题和解决方法整理成表,希望能帮你少走弯路。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 上电后无任何反应 | 1. 电池没电或接反。 2. 电源线路断路。 3. PICAXE芯片未正确编程或损坏。 | 1. 用万用表测量电池电压,检查正负极焊接。 2. 检查从电池到芯片VCC引脚的通路,查看滤波电容是否短路。 3. 尝试用编程器给芯片下载一个最简单的LED闪烁程序,测试芯片和下载线是否正常。 |
| 触摸传感器无反应 | 1. TTP223模块供电或接地错误。 2. 感应面板被绝缘材料过度隔离。 3. 模块本身损坏或灵敏度设置不当。 | 1. 确认模块VCC接3.3V/5V,GND接地,OUT引脚接C.3。 2. 触摸感应面应仅覆盖薄层非导电材料(如绒布)。粘土或过厚的胶水会屏蔽信号。 3. 用金属导体直接触碰模块上的感应焊盘测试。检查模块上的A/B焊点是否被焊上以调整灵敏度(通常焊A为高灵敏度)。 |
| 倾斜开关一直触发或不触发 | 1. 开关类型错误(常开/常闭)。 2. 安装角度不对。 3. 并联的两个开关逻辑冲突。 | 1. SW-200D通常是“常开”型(滚珠离开触点断开)。用万用表通断档测试。 2. 确保Glormi在“静止”姿态时,开关处于断开状态。可能需要调整开关在板上的焊接角度。 3. 确认两个开关并联接法正确:两个开关的一端共同接信号线,另一端共同接地。 |
| 振动马达不工作或力度弱 | 1. MOSFET(BS170)接错或损坏。 2. 马达本身损坏或供电不足。 3. 程序未正确控制引脚。 | 1. 确认BS170的G极接C.1,D极接马达正极,S极接地。测量C.1输出是否为高电平。 2. 直接将马达两端接电池(注意极性),测试马达是否正常转动。 3. 检查程序中 high motorPin和low motorPin的指令是否被执行。 |
| 蜂鸣器不响或声音小 | 1. 蜂鸣器类型错误(用了有源蜂鸣器)。 2. 引脚驱动能力不足。 3. 程序音调参数错误。 | 1. 无源蜂鸣器需要频率驱动。用play或sound指令测试。有源蜂鸣器给电就响,但音调固定。2. 尝试在蜂鸣器两端并联一个100欧姆电阻,或在程序中增加 pullup指令(如果支持)增强驱动。3. 检查 play pin, note, duration指令中的音调和时长参数是否在合理范围。 |
| 程序运行不稳定,偶尔死机 | 1. 电源干扰,特别是马达启停时。 2. 程序陷入死循环或变量溢出。 3. 时钟设置不正确。 | 1. 确保电源滤波电容(10uF和0.1uF)紧靠PICAXE芯片的VCC和GND引脚焊接。 2. 检查所有循环是否有退出条件,特别是使用 do...loop时。确保字节变量(b0-b13)不会从255增加到256(会归零)。3. 检查 #picaxe 08M2指令是否正确,它设定了内部时钟频率。 |
| 粘土干燥后Glormi行为异常 | 1. 粘土导电导致短路(最常见)。 2. 干燥过程挤压导致元件或连线损坏。 3. 传感器被粘土覆盖或压迫。 | 1.彻底绝缘!拆开外壳,检查电路板是否有绿色铜锈(短路痕迹)。重新用绝缘胶带严密包裹。 2. 重新检查所有焊点和连线。 3. 确保触摸传感器和倾斜开关周围有足够空间,未被粘土完全包裹或压住。 |
这个项目最迷人的地方,不在于它用了多高级的技术,而在于用如此有限的资源,构建了一个能与人产生情感联结的实体。当你抚摸它,它给予回应时,那种简单的快乐是任何复杂算法都难以替代的。它提醒我们,技术的温度,往往就藏在这些看似笨拙却充满诚意的交互细节里。如果你也制作了一个属于自己的Glormi,不妨试着为它编写独一无二的“性格”,比如一个特别贪睡的模式,或者一个听到特定节奏拍打就会跳舞的彩蛋,让这个来自星星的小怪物,真正成为你生活中的一部分。