树莓派创客实践:从电子墨水屏到机械蝎子的DIY之旅
1. 项目缘起当“无用”的创造欲遇上树莓派不知道你有没有过这样的时刻看着手边那些功能强大、设计精良的工业产品心里却会冒出一种“叛逆”的念头——这东西好是好但总感觉缺了点“我”的味道。它太完美、太标准了完美到抹杀了一切个性化的可能。于是一种想要亲手“捏”出点什么的冲动就来了。对我来说这种冲动最终落在了三个看似毫不相干却又内核相通的项目上一台用电子墨水屏模拟打字机体验的“慢速”输入设备、一把完全贴合我个人手型与习惯的65键人体工程学键盘以及一只用舵机和3D打印件拼凑出来的、能张牙舞爪的机械蝎子。这三个项目表面上一个是复古情怀一个是效率工具一个是机械玩具但它们背后都指向同一个核心用开源硬件和创客思维将个人化的需求与天马行空的想象变成可以触摸、可以交互的物理实体。而这一切的“大脑”大多时候都是一块小小的树莓派。树莓派这个平台太迷人了它价格亲民、社区庞大、生态完善更重要的是它给了你一种“万物皆可编程”的底气。无论是驱动一块墨水屏还是扫描几十个键盘按键或是协调十几个舵机的动作你都可以用熟悉的Python或C语言去实现这种掌控感是成品设备无法给予的。所以这篇文章不是什么严肃的产品评测或技术论文它更像是我个人创客旅程中的三篇“手记”。我会分享从构思、选材、踩坑到最终让它们“动起来”的全过程。你会发现这些项目里没有高不可攀的技术更多的是对现有模块的巧妙组合以及对“解决问题”这一过程的享受。如果你也手痒想给自己做点独一无二的小玩意儿希望我的这些经验能帮你少走点弯路。2. 复古与极简的碰撞自制电子墨水打字机第一个项目源于我对“专注写作”的执念。现代电脑和手机的通知太吵了而机械键盘的敲击声有时也会成为一种干扰。我想要一种极度安静、视觉舒缓甚至带点仪式感的输入体验。于是电子墨水屏和复古打字机的概念结合在了一起。2.1 核心构想与硬件选型我的目标是一块足够大的电子墨水屏作为显示终端一个手感舒适的键盘作为输入所有运算和存储由树莓派完成最终实现一个只能打字、保存文本的“单功能设备”。硬件清单如下主控树莓派 Zero 2 W。选择它是因为功耗低、体积小、性能足够驱动图形界面和处理输入。Wi-Fi功能方便后期传文件。屏幕7.5英寸电子墨水屏HD。这是关键。我选择了WaveShare的一款800x480分辨率的型号。为什么是7.5寸因为再小显示文字就吃力再大则价格和功耗飙升。电子墨水屏的特性是只在刷新时耗电显示静态内容时零功耗且本身不发光视觉上非常接近纸张。键盘Cherry MX红轴机械键盘PCB自己焊接。为了追求极致的个性化我放弃了成品键盘选择了一块支持热插拔的65%配列PCB板自己焊接轴体和键帽。轴体选了线性红轴触发轻、声音小符合“安静”的主题。外壳与结构用CAD软件我用的Fusion 360设计了两个部分一个是将树莓派和屏幕驱动板固定在一起的背板另一个是支撑键盘并有一定倾角的面板。材料选用激光切割的亚克力板兼顾了轻量、美观和一定的强度。电源一块5000mAh的充电宝模块直接给树莓派供电保证数小时的无线续航。注意电子墨水屏的驱动板需要与树莓派GPIO正确连接通常通过SPI接口。务必仔细阅读屏幕厂商提供的引脚定义图接错可能烧毁屏幕或树莓派。2.2 软件环境的搭建与核心代码逻辑硬件组装相对直接真正的挑战在软件。树莓派系统我选择了精简的Raspberry Pi OS Lite然后手动安装图形环境和必要的驱动。系统与驱动刷入系统后首先通过raspi-config启用SPI接口。然后根据屏幕厂商提供的GitHub仓库安装对应的Python库通常是waveshare-epd。这个过程可能会遇到Python版本依赖问题一个常见的坑是系统默认的Python3版本与库要求不符需要灵活使用pip3和虚拟环境。显示逻辑的实现电子墨水屏的刷新很慢全刷需要2-3秒且有全刷和局部刷新模式。为了获得更好的打字体验我不能每次敲一个字就全刷一次屏幕。我的策略是在内存中维护一个“画布”使用PIL库的Image和ImageDraw。打字时只在内存画布上更新文本。每输入一行或者定时比如每30秒才将当前画布的内容一次性刷新到屏幕上。局部刷新虽然快但多次使用后残影严重所以我只在翻页等操作时使用局部刷新日常输入积累到一定量后使用全刷来清残影。# 示例代码片段初始化屏幕和画布 from waveshare_epd import epd7in5_V2 from PIL import Image, ImageDraw, ImageFont import time epd epd7in5_V2.EPD() epd.init() epd.Clear() # 创建一张和屏幕一样大的黑白图像 image Image.new(1, (epd.width, epd.height), 255) draw ImageDraw.Draw(image) font ImageFont.truetype(/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf, 20) # 在画布上写字 draw.text((10, 10), Hello, E-Ink Typewriter!, fontfont, fill0) # 将画布内容显示到屏幕上全刷 epd.display(epd.getbuffer(image)) time.sleep(2) # 后续打字只更新 draw 对象积累一定内容后再调用 epd.display()输入处理键盘通过USB连接到树莓派Zero 2 W。我使用Python的evdev库来监听键盘事件。evdev可以直接读取原始键值我需要编写一个转换层将键值映射为字符并处理退格、回车等控制功能。这里的一个关键技巧是去抖和防止按键重复触发特别是在自己焊接的键盘上硬件去抖可能不完美需要在软件层做补充。文本存储与同步打出的文字实时追加到一个文本文件中。我写了一个简单的菜单系统通过键盘组合键触发可以将当前文件通过SCP同步到局域网内的主力电脑上或者清空当前内容开始新文档。整个系统没有复杂的编辑器功能只有最纯粹的输入和保存。实操心得这个项目最大的成就感来自于那种“剥离感”。当你面对这块只有黑白两色、刷新缓慢的屏幕时你会不自觉地慢下来更专注于思考文字本身而不是格式、字体或颜色。电子墨水屏在光线下的阅读体验远超普通液晶屏。不过它的局限性也很明显不适合需要频繁交互或动态更新的场景。另外自己设计的亚克力外壳在长时间使用后边缘可能因为应力出现细微裂痕下次我会考虑使用CNC雕刻的铝合金虽然成本高但质感和使用寿命会好很多。3. 从“用手适应键盘”到“让键盘适应手”65键人体工程学键盘第二个项目是出于对效率和舒适度的追求。长时间码字后手腕和手指的酸痛是程序员的职业病。标准键盘的平行键位迫使手腕处于不自然的夹角。人体工程学键盘通常价格昂贵且布局固定。于是自己设计一把就成了最优解。3.1 设计哲学与布局规划我的设计目标很明确分体、轻量、无线、高度定制化。分体左右手完全分离可以随意调整角度和距离让前臂和手腕保持自然的直线。65键布局保留了方向键和常用的编辑键如Page Up/Down在紧凑性和功能性上取得了很好的平衡适合编程和写作。无线化使用蓝牙或2.4G无线连接摆脱线缆束缚。设计的第一步是确定键位布局。我使用了在线工具Keyboard Layout Editor来可视化我的设计。这里涉及到一个核心概念键位矩阵。为了减少GPIO引脚占用键盘按键不是一对一连接而是排列成矩阵如8行x8列通过扫描行列来确定被按下的键。我设计的65键矩阵大约是8行x9列。每个键的坐标行列决定了它在固件中的“键码”。这一步需要反复调整确保常用的按键如空格、回车、退格落在手指的“主场区”Home Row附近。3.2 硬件制作PCB、焊接与组装PCB打样将设计好的键位矩阵和主控电路我选择了流行的Pro Micro兼容的蓝牙主控如Nice!Nano它基于nRF52840支持ZMK固件画成电路图使用KiCad这类免费软件完成PCB设计。然后将设计文件发给PCB打样厂如嘉立创通常几十块钱就能得到5-10片高质量的板子。这是整个项目里科技感最强的一步也是成本的大头之一。焊接收到PCB后就是细致的焊接工作。需要焊接的包括轴体插座热插拔座或直接焊接机械轴。主控芯片及其周围的滤波电容、复位按钮等。电池接口用于无线供电。如果有RGB底灯或侧灯的LED及其限流电阻。 这里有个血泪教训焊接热插拔座如凯华轴座时一定要确保烙铁温度足够建议350°C左右并且使用高质量的焊锡丝和助焊剂。我最初因为温度不够导致几个轴座虚焊按键时灵时不灵排查了很久。固件烧录与配置我选择了ZMK固件这是一个为无线键盘设计的强大开源固件。它的配置基于devicetree和keymap文件。你需要在配置文件中定义你的键盘矩阵行、列对应的GPIO引脚。编写键位映射表将每个矩阵位置映射到具体的键值如KC_A、层切换Layer或多媒体功能。编译固件并烧录到主控。 ZMK支持“层”的概念你可以通过一个修饰键如Fn切换到另一层从而让65个物理按键发挥出上百个功能键的作用这是客制化键盘的灵魂。外壳与键帽外壳我同样使用3D打印树脂材料精度高。设计时要充分考虑PCB的固定、电池的安放、以及键入时整体的稳定性。键帽则选择了PBT材质的球帽接触面积更大对手指的包裹感更好进一步提升了手感。实操心得从标准键盘切换到自制的分体人体工学键盘需要大约一周的适应期。初期会频繁打错字因为肌肉记忆需要重建。但一旦适应那种舒适感是革命性的。手腕不再扭曲手指移动距离更短。无线连接非常稳定ZMK固件的低功耗做得很好一块小电池能用一两个月。最大的收获不是键盘本身而是你彻底拥有了对输入工具的绝对控制权。任何一个键不顺手你都可以随时修改固件把它换到你觉得最舒服的位置。这种自由是任何量产键盘都无法给予的。4. 让机械“活”起来树莓派驱动的机械萌宠蝎子第三个项目纯粹是为了乐趣和探索。我想做一个能动态爬行、摆出各种姿势的机械生物蝎子独特的形态和运动方式很有挑战性。4.1 机械结构设计与3D建模蝎子的运动核心在于多自由度的关节。我将其简化为几个主要部分身体主体框架内部容纳树莓派、电源和舵机控制板。头部与双螯头部可左右转动1个舵机每个螯有开合动作各1个舵机。尾部分为多节实现灵活的弯曲和抬起动作末端“毒刺”可上下摆动共需3-4个舵机。八条腿这是最复杂的部分。每条腿采用三轮结构髋、膝、踝至少需要3个舵机才能实现基本的抬腿、伸腿、收腿动作。八条腿就是24个舵机这对于控制和电源都是巨大挑战。为了控制成本和学习曲线我做了简化每条腿只使用2个舵机髋关节和膝关节踝关节做成固定的。这样总共需要2螯 1头 4尾 8*2腿 23个舵机。这仍然是一个庞大的数量。使用Fusion 360进行建模。每个关节的连接处都需要精心设计舵机舵盘舵机自带的圆盘的安装孔位并留出足够的空间让舵机线穿过。关节之间用M2或M3的螺丝和螺母连接。建模过程就是不断的“画图-打印-测试-修改”的循环。4.2 运动控制系统的搭建23个舵机树莓派的GPIO引脚远远不够而且驱动电流也不足。解决方案是使用舵机控制板。硬件核心PCA9685舵机驱动板。这是一款通过I2C通信的16通道PWM舵机驱动芯片。我使用了两个PCA9685模块就可以控制32个舵机绰绰有余。树莓派通过I2C总线仅需SDA、SCL两根线与这两个模块通信给每个舵机发送角度指令。供电的严峻挑战这是本项目最大的坑。一个微型舵机如SG90在堵转时瞬时电流可能超过1A。23个舵机哪怕只有一小部分同时运动总电流也可能瞬间超过10A。普通的5V USB电源或移动电源根本无法承受会导致电压骤降树莓派重启舵机乱转。解决方案使用大电流输出的稳压模块如LM2596降压模块搭配大容量锂电池如3S锂聚合物电池11.1V。将电池电压降压到舵机工作电压通常5V或6V单独给所有舵机供电。树莓派则用另一块独立的电池或通过降压模块的另一个输出口供电但共地。务必在舵机电源总线上并联一个大容量如1000μF的电解电容以缓冲瞬间的大电流需求。控制逻辑与步态生成控制程序的核心是计算每条腿在行走周期中每个时刻的理想角度。我采用了经典的三角步态将八条腿分为两组左1、右2、左3、右4 为一组右1、左2、右3、左4为另一组两组交替支撑和摆动实现平稳爬行。为每个舵机设定“中立位”角度。编写函数根据时间参数计算每条摆动腿的髋、膝角度轨迹通常是简单的正弦或抛物线函数。将计算出的角度通过PCA9685的库如Adafruit_PCA9685发送给对应舵机。通过调整两组腿的相位差可以实现前进、后退、转弯。# 示例代码片段初始化PCA9685并设置舵机角度 import time from adafruit_pca9685 import PCA9685 from board import SCL, SDA import busio i2c busio.I2C(SCL, SDA) pca1 PCA9685(i2c, address0x40) # 第一个模块 pca2 PCA9685(i2c, address0x41) # 第二个模块 pca1.frequency 50 # 设置PWM频率为50Hz标准舵机信号 pca2.frequency 50 # 将角度0-180度转换为PCA9685的脉宽计数值 def angle_to_duty_cycle(angle): pulse_min 150 # 对应0度的脉冲宽度单位计数值范围4096 pulse_max 600 # 对应180度的脉冲宽度 return int(pulse_min (pulse_max - pulse_min) * angle / 180) # 控制0号舵机转到90度 pca1.channels[0].duty_cycle angle_to_duty_cycle(90) time.sleep(1)实操心得机械蝎子项目是硬件、软件和结构知识的综合考验。3D打印件的强度是瓶颈关节处容易断裂后来我改用更坚韧的PETG材料并在关键部位增加了加强筋。 wiring布线是一场噩梦23根舵机线需要仔细捆扎固定防止相互缠绕或卡住关节。运动控制算法比想象中复杂简单的步态在不平整的地面上很容易失去平衡。但这个项目带来的快乐是巨大的——当你看到自己设计、打印、组装的机械结构按照你编写的代码一步一步爬行时那种创造生命的错觉无比美妙。它不仅仅是一个玩具更是一个关于机器人学入门的最佳实践课。5. 树莓派作为创客核心的深度解析贯穿这三个项目树莓派都扮演着“大脑”或“核心控制器”的角色。它不仅仅是一台微型电脑更是连接数字世界与物理世界的桥梁。这里深入聊聊在类似项目中如何更好地驾驭树莓派。5.1 系统选择与环境配置的“脏活累活”很多人拿到树莓派第一步就是刷入官方镜像。但对于资源受限或特定需求的项目这一步就有讲究。系统选择对于打字机这种功能单一的项目Raspberry Pi OS Lite无桌面环境是最佳选择它占用资源极少启动快。而对于机械蝎子如果涉及复杂的图像识别比如想用摄像头让蝎子跟踪目标则可能需要完整的桌面版以方便调试。一个常见误区是盲目使用最新版系统。有些硬件驱动特别是小众的屏幕、传感器可能对新内核支持不佳。如果项目依赖特定驱动在社区确认其兼容性前保守一点选择稍旧的稳定版LTS系统更稳妥。源配置与软件安装国内使用树莓派第一件事往往是修改软件源为国内镜像如清华、中科大源这能极大提升apt更新和安装的速度。命令虽简单但却是顺畅开发的基石。安装Python库时也优先使用-i参数指定国内PyPI镜像。我踩过的一个坑是混合使用apt安装的python3-package和pip安装的同一包的不同版本导致导入冲突。最佳实践是系统级工具用apt项目特定的Python依赖用venv虚拟环境配合pip安装。GPIO与外围接口调试raspi-config工具是初始配置的好帮手可以轻松开启I2C、SPI、串口等接口。但更底层的调试离不开gpiod工具集和i2cdetect、lsusb等命令。例如当PCA9685舵机板没反应时先用i2cdetect -y 1查看I2C总线是否识别到了设备地址0x40这是硬件排查的第一步。5.2 电源管理与无线连接稳定性树莓派尤其是性能更强的型号对电源质量非常敏感。电压不稳或电流不足会导致各种玄学问题USB设备掉线、网络断流、甚至系统崩溃。电源务必使用官方推荐或质量可靠的5V/3A以上电源适配器。在移动项目中如蝎子使用高品质的DC-DC降压模块从锂电池取电并确保模块输出波纹小、带载能力强。在树莓派电源输入引脚附近并联一个470μF的钽电容可以有效滤除高频噪声。无线连接树莓派Zero 2 W或Pi 3/4/5的Wi-Fi和蓝牙已经相当稳定但在金属外壳内或2.4G设备密集的环境下仍可能受影响。对于键盘这类对实时性要求高的设备ZMK固件使用的蓝牙连接已经优化得很好。但对于需要传输视频流如蝎子加装图传或大文件优先使用5GHz Wi-Fi并考虑调整区域代码countryCNin/etc/wpa_supplicant/wpa_supplicant.conf和信道以减少干扰。5.3 从原型到“产品”的进阶思考当项目跑通兴奋劲过后你会开始思考如何让它更可靠、更美观、更像一个“产品”而非实验品。固化配置与开机自启不要再每次启动都手动运行Python脚本。使用systemd创建自定义服务是最规范的方式。编写一个.service文件定义你的启动命令、工作目录、重启策略等然后sudo systemctl enable your_service。这样树莓派一上电你的程序就自动在后台运行了。日志与调试将程序的关键运行状态、错误信息写入日志文件如使用Python的logging模块。当项目在无人值守状态下出现异常时日志是唯一的“黑匣子”。可以配置logrotate防止日志文件无限膨胀。外壳与散热长期运行散热不可忽视。树莓派4B及以后的型号发热量较大。即使不加风扇也一定要安装散热片。对于封闭在外壳内的场景必须设计通风孔甚至考虑加装静音小风扇。蝎子项目里我将树莓派和舵机驱动板分开布局中间用金属支架隔开既作为结构支撑也充当了散热片。安全与维护更改默认密码、禁用不必要的服务如bluetooth、avahi-daemon如果不用、定期更新系统安全补丁这些是好习惯。对于需要远程访问的项目使用SSH密钥登录而非密码并考虑更改默认的22端口。回过头看这三个项目虽然领域不同但都遵循着相似的创客循环定义问题 - 设计解决方案 - 选型与采购 - 动手制作 - 编程调试 - 迭代优化。树莓派在其中提供了统一的、强大的计算和控制平台而开源社区则提供了几乎无穷无尽的软件库和硬件模块支持。最重要的不是最终成品有多完美而是在这个过程中你学会了如何将想法分解为可执行的步骤如何与硬件打交道如何让代码驱动现实世界。这种能力才是创客精神的核心。当你下次再有一个异想天开的点子时你不会再觉得它遥不可及因为你已经知道通往它的路无非是又一次从画下第一根线、写下第一行代码开始的旅程。