树莓派创客实践:从电子墨水屏到机械蝎子的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,然后手动安装图形环境和必要的驱动。

  1. 系统与驱动:刷入系统后,首先通过raspi-config启用SPI接口。然后,根据屏幕厂商提供的GitHub仓库,安装对应的Python库(通常是waveshare-epd)。这个过程可能会遇到Python版本依赖问题,一个常见的坑是系统默认的Python3版本与库要求不符,需要灵活使用pip3和虚拟环境。

  2. 显示逻辑的实现:电子墨水屏的刷新很慢(全刷需要2-3秒),且有全刷和局部刷新模式。为了获得更好的打字体验,我不能每次敲一个字就全刷一次屏幕。我的策略是:

    • 在内存中维护一个“画布”(使用PIL库的ImageImageDraw)。
    • 打字时,只在内存画布上更新文本。
    • 每输入一行(或者定时,比如每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!', font=font, fill=0) # 将画布内容显示到屏幕上(全刷) epd.display(epd.getbuffer(image)) time.sleep(2) # 后续打字只更新 `draw` 对象,积累一定内容后再调用 epd.display()
  3. 输入处理:键盘通过USB连接到树莓派Zero 2 W。我使用Python的evdev库来监听键盘事件。evdev可以直接读取原始键值,我需要编写一个转换层,将键值映射为字符,并处理退格、回车等控制功能。这里的一个关键技巧是去抖和防止按键重复触发,特别是在自己焊接的键盘上,硬件去抖可能不完美,需要在软件层做补充。

  4. 文本存储与同步:打出的文字实时追加到一个文本文件中。我写了一个简单的菜单系统(通过键盘组合键触发),可以将当前文件通过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、焊接与组装

  1. PCB打样:将设计好的键位矩阵和主控电路(我选择了流行的Pro Micro兼容的蓝牙主控,如Nice!Nano,它基于nRF52840,支持ZMK固件)画成电路图,使用KiCad这类免费软件完成PCB设计。然后将设计文件发给PCB打样厂(如嘉立创),通常几十块钱就能得到5-10片高质量的板子。这是整个项目里科技感最强的一步,也是成本的大头之一。

  2. 焊接:收到PCB后,就是细致的焊接工作。需要焊接的包括:

    • 轴体插座(热插拔座或直接焊接机械轴)。
    • 主控芯片及其周围的滤波电容、复位按钮等。
    • 电池接口(用于无线供电)。
    • 如果有,RGB底灯或侧灯的LED及其限流电阻。 这里有个血泪教训:焊接热插拔座(如凯华轴座)时,一定要确保烙铁温度足够(建议350°C左右),并且使用高质量的焊锡丝和助焊剂。我最初因为温度不够,导致几个轴座虚焊,按键时灵时不灵,排查了很久。
  3. 固件烧录与配置:我选择了ZMK固件,这是一个为无线键盘设计的强大开源固件。它的配置基于devicetreekeymap文件。你需要:

    • 在配置文件中定义你的键盘矩阵(行、列对应的GPIO引脚)。
    • 编写键位映射表,将每个矩阵位置映射到具体的键值(如KC_A)、层切换(Layer)或多媒体功能。
    • 编译固件并烧录到主控。 ZMK支持“层”的概念,你可以通过一个修饰键(如Fn)切换到另一层,从而让65个物理按键发挥出上百个功能键的作用,这是客制化键盘的灵魂。
  4. 外壳与键帽:外壳我同样使用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引脚远远不够,而且驱动电流也不足。解决方案是使用舵机控制板

  1. 硬件核心:PCA9685舵机驱动板。这是一款通过I2C通信的16通道PWM舵机驱动芯片。我使用了两个PCA9685模块,就可以控制32个舵机,绰绰有余。树莓派通过I2C总线(仅需SDA、SCL两根线)与这两个模块通信,给每个舵机发送角度指令。

  2. 供电的严峻挑战:这是本项目最大的坑。一个微型舵机(如SG90)在堵转时瞬时电流可能超过1A。23个舵机哪怕只有一小部分同时运动,总电流也可能瞬间超过10A。普通的5V USB电源或移动电源根本无法承受,会导致电压骤降,树莓派重启,舵机乱转。

    • 解决方案:使用大电流输出的稳压模块(如LM2596降压模块)搭配大容量锂电池(如3S锂聚合物电池,11.1V)。将电池电压降压到舵机工作电压(通常5V或6V),单独给所有舵机供电。树莓派则用另一块独立的电池或通过降压模块的另一个输出口供电(但共地)。务必在舵机电源总线上并联一个大容量(如1000μF)的电解电容,以缓冲瞬间的大电流需求。
  3. 控制逻辑与步态生成:控制程序的核心是计算每条腿在行走周期中每个时刻的理想角度。我采用了经典的三角步态:将八条腿分为两组(左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, address=0x40) # 第一个模块 pca2 = PCA9685(i2c, address=0x41) # 第二个模块 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-packagepip安装的同一包的不同版本,导致导入冲突。最佳实践是:系统级工具用apt,项目特定的Python依赖用venv虚拟环境配合pip安装。

  • GPIO与外围接口调试:raspi-config工具是初始配置的好帮手,可以轻松开启I2C、SPI、串口等接口。但更底层的调试离不开gpiod工具集和i2cdetectlsusb等命令。例如,当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,并考虑调整区域代码(country=CNin/etc/wpa_supplicant/wpa_supplicant.conf)和信道,以减少干扰。

5.3 从原型到“产品”的进阶思考

当项目跑通,兴奋劲过后,你会开始思考如何让它更可靠、更美观、更像一个“产品”而非实验品。

  • 固化配置与开机自启:不要再每次启动都手动运行Python脚本。使用systemd创建自定义服务是最规范的方式。编写一个.service文件,定义你的启动命令、工作目录、重启策略等,然后sudo systemctl enable your_service。这样,树莓派一上电,你的程序就自动在后台运行了。

  • 日志与调试:将程序的关键运行状态、错误信息写入日志文件(如使用Python的logging模块)。当项目在无人值守状态下出现异常时,日志是唯一的“黑匣子”。可以配置logrotate防止日志文件无限膨胀。

  • 外壳与散热:长期运行,散热不可忽视。树莓派4B及以后的型号发热量较大。即使不加风扇,也一定要安装散热片。对于封闭在外壳内的场景,必须设计通风孔,甚至考虑加装静音小风扇。蝎子项目里,我将树莓派和舵机驱动板分开布局,中间用金属支架隔开,既作为结构支撑,也充当了散热片。

  • 安全与维护:更改默认密码、禁用不必要的服务(如bluetoothavahi-daemon如果不用)、定期更新系统安全补丁,这些是好习惯。对于需要远程访问的项目,使用SSH密钥登录而非密码,并考虑更改默认的22端口。

回过头看,这三个项目虽然领域不同,但都遵循着相似的创客循环:定义问题 -> 设计解决方案 -> 选型与采购 -> 动手制作 -> 编程调试 -> 迭代优化。树莓派在其中提供了统一的、强大的计算和控制平台,而开源社区则提供了几乎无穷无尽的软件库和硬件模块支持。最重要的不是最终成品有多完美,而是在这个过程中,你学会了如何将想法分解为可执行的步骤,如何与硬件打交道,如何让代码驱动现实世界。这种能力,才是创客精神的核心。当你下次再有一个异想天开的点子时,你不会再觉得它遥不可及,因为你已经知道,通往它的路,无非是又一次从画下第一根线、写下第一行代码开始的旅程。