ASi (阿南西) 机器人伙伴:Arduino Nano + LED 矩阵打造桌面陪伴机器人
项目背景与灵感
ASi (Anansi) 源于非洲民间传说中的蜘蛛神阿南西——故事之神、诡计大师。作者受 Alex Glow 的 Archimedes 猫头鹰机器人 启发,在 Xpider 蜘蛛机器人基础上深度改造,经过 4 代原型迭代,最终诞生了这个会"眨眼"、"转头"、"露表情"的桌面陪伴机器人。它不只是装饰品,更是一个会随机观察环境、对互动做出反应的"电子宠物"。
核心特性
- 双 MCU 架构:Arduino Nano 驱动双 MAX7219 8×8 LED 矩阵显示"眼睛"动画;ATtiny85 (Trinket) 控制 SG90 舵机实现头部左右随机摆动
- 丰富眼部表情:眨眼、斜视、旋转、发光、懒惰眼、疯狂眼、交叉眼等 7 种内置动画,主循环随机触发
- 头部随机转动:Trinket 每 0.5 秒以 1/10 概率随机转动头部,模拟"好奇环视"
- 可穿戴设计:底部预留绑带孔,可用铝线固定在背包肩带上,随行陪伴
- 3D 打印外壳 + 亚克力球头:黑色喷漆圣诞球作头部,极具辨识度
硬件清单 (BOM)
| 组件 | 规格/型号 | 数量 | 备注 |
|---|---|---|---|
| Arduino Nano R3 | ATmega328P 5V 16MHz | 1 | 驱动双 MAX7219 眼睛 |
| Adafruit Trinket 5V | ATtiny85 16MHz (需设 clock_prescale_set) | 1 | 控制舵机 + 状态 LED |
| MAX7219 红色 8×8 点阵模块 | FC-16 或通用 4 模块级联 | 1 | 含 2 个 8×8 矩阵,级联为双眼 |
| SG90 微型舵机 | 9g 模拟舵机 | 1 | 驱动头部左右摆动 |
| 电池供电 | 4×AA 电池盒 (6V) 或 3.7V 200mAh 锂电 | 1 | 两块板各自供电,共用开关 |
| 透明亚克力浴球模具 | 直径约 6-7cm | 1 | 做头部外壳,内喷黑漆透光 |
| 3D 打印零件 | PLA/PETG,见 CAD 文件 | 1 套 | 身体、腿、关节、齿轮、舵机座等 |
| M3 螺丝螺母、热熔胶、杜邦线 | 若干 | - | 组装固定 |
3D 打印零件清单 (STL 文件)
- 身体主体、底座、大腿、小腿、腿关节、螺丝、螺母
- 舵机齿轮 (插入舵机输出轴)、舵机固定座、颈部转盘齿轮
- 颈部连接板 (粘接亚克力球)、头部支撑环
打印建议:0.2mm 层高,20% 填充,PLA 即可;齿轮建议 PETG 耐磨。作者使用 Evnovo (Artillery) X1 打印机 (300×300×400mm)。
电子电路与接线
Arduino Nano 眼睛电路
- DIN → Pin 12,CLK → Pin 10,CS → Pin 11
- 两模块级联:第一模块 DOUT 接第二模块 DIN,共用 CLK/CS
- VCC/GND 接 5V/GND (来自 4×AA 电池盒经稳压或直接 5V)
Trinket 舵机电路
- 舵机信号线 → Trinket Pin 4 (仅支持 Pin 1/4 输出 PWM)
- 舵机 VCC/GND 直连电池 (6V 略超规但 SG90 可承受,或加二极管降压)
- 板载 LED (Pin 1) 作为"眨眼"指示,与舵机动作同步随机闪烁
供电方案
两块小面包板串联:4×AA 电池盒 → 电源开关 → 分两路分别给 Nano 板和 Trinket 板供电。建议改用两节 3.7V 锂电并联 + 5V 升压模块,或统一 5V 稳压输出,避免舵机启动瞬间电压跌落导致 Nano 复位。
固件代码详解
Arduino Nano - 眼睛动画引擎 (Asi_Eye.ino)
核心类 LedControl 驱动 MAX7219。关键数据结构:
byte eyeBall[8] = { // 眼球基础图案 (无瞳孔)
B00111100, B01111110, B11111111, B11111111,
B11111111, B11111111, B01111110, B00111100 };
byte eyePupil = B11100111; // 瞳孔掩码 (两个黑点)
byte eyeCurrent[8]; // 当前显示缓冲
int currentX, currentY; // 瞳孔偏移 (-2..+2)
主要动画函数:
displayEyes(offsetX, offsetY):按偏移绘制瞳孔,含边界裁剪与旋转修正moveEyes(newX, newY, stepDelay):线性插值平滑移动瞳孔blinkEyes(left, right):上下眼睑逐行闭合/睁开crossEyes()、methEyes()、lazyEye()、roundSpin()、crazySpin()、glowEyes():7 种特效bitswap():汇编级位反转,用于 180° 旋转矩阵显示
主循环:每周期随机移动瞳孔、随机眨眼、按迭代计数器触发随机特效。
Trinket - 颈部随机摆动 (Asi_Neck.ino)
#define SERVO_PIN 4
#define SERVO_MIN 4 // ~1ms
#define SERVO_MAX 26 // ~2ms
Adafruit_TiCoServo servo;
void setup() {
#if (F_CPU == 16000000L)
clock_prescale_set(clock_div_1); // 16MHz Trinket 必须设置
#endif
servo.attach(SERVO_PIN);
pinMode(1, OUTPUT); digitalWrite(1, HIGH); // 板载 LED
}
uint32_t lastLookTime = 0;
void loop() {
unsigned long t = millis();
if ((t - lastLookTime) > 500) {
if (random(10) == 0) { // 10% 概率转头
servo.write(random(SERVO_MIN, SERVO_MAX));
lastLookTime = t;
}
}
if (random(10) == 0) { // 10% 概率眨眼(板载 LED)
digitalWrite(1, LOW);
delay(random(50, 250));
digitalWrite(1, HIGH);
}
delay(100);
}
组装指南要点
- 腿部组装:螺丝+螺母连接大腿/小腿/关节,确保关节转动顺滑
- 舵机齿轮安装:将 3D 打印齿轮压入舵机输出轴,拧紧舵机自带螺丝
- 身体内部布线:两块面包板背靠背放入身体腔体,理线扎带固定
- 头部制作:亚克力球轻喷黑色哑光漆 (薄涂保透光) → 热熔胶粘接到颈部连接板
- 可穿戴固定:铝线穿过底座穿孔,缠绕背包肩带
个性化定制建议
- 新增表情:在
eyeBall[]定义新图案,或修改eyePupil掩码形状 (爱心、星星、竖瞳等) - 声音交互:给 Nano 添加 DFPlayer Mini + 喇叭,播放音效/语音
- 传感器融合:加装超声波/红外/光敏/触摸传感器,实现避障、跟随、抚摸反应
- 无线控制:引入 ESP8266/ESP32 或 nRF24L01,手机 App 远程控制表情/动作
- 表情同步:让 Trinket 舵机动作与 Nano 眼部动画同步 (串口/I2C 通信)
资源下载
- 完整代码:项目 Code 栏提供
Asi_Eye.ino与Asi_Neck.ino - 3D 模型 (STL):Custom parts 栏列出所有零件,可自行切片打印
- 原理图:Schematics 栏提供手绘接线图两张
结语
ASi 是一个周末即可完成的趣味项目,融合了 3D 打印、嵌入式编程、机械设计与角色创作。它展示了如何用极简硬件 (两颗 MCU、一块屏、一个舵机) 创造出极具"生命感"的互动体验。把它别在背包上,下次出门它会成为最吸睛的谈资!
制造工艺