如何制作树莓派游戏手柄

这个为树莓派制作的 DIY 复古视频游戏控制器既有趣也不难,但需要一些时间。
164 位读者喜欢这篇文章。
Raspberry Pi Gamepad device

我不时地会怀念我在 80 年代末和 90 年代童年时代玩过的视频游戏。 虽然我的大多数旧电脑和游戏机早已消失,但我的树莓派可以满足我对复古游戏的需求。 我喜欢 Raspbian 中包含的简单游戏,开源 RetroPie 项目帮助我将我的树莓派变成了一台高级复古游戏机。

但是,为了获得更真实的体验,就像“过去的日子”一样,我需要一个游戏手柄。 市场上有大量的 USB 游戏手柄和操纵杆可供选择,但作为一名开源爱好者、创客和工程师,我更喜欢走更艰难的路。 所以,我制作了自己的简单开源硬件游戏手柄,我将其命名为 ANAVI Play pHAT。 我将其设计为树莓派的附加板,使用 EEPROM 和我为映射按键创建的 devicetree 二进制覆盖。

获取游戏手柄按钮和 EEPROM

有各种各样的游戏手柄可供购买,其中一些非常复杂。 但是,使用我创建的设计,制作一个类似于标志性 NES 控制器的游戏手柄并不难。

游戏手柄使用八个“瞬时”按钮(即,仅在按下时才激活的开关):四个用于移动的触觉(轻触)开关(上、下、左、右),两个用于 A 和 B 的轻触按钮,以及两个较小的用于选择和开始的轻触按钮。 我使用了 通孔 轻触开关:六个 6x6x4.3 毫米的开关用于移动以及 A 和 B 按钮,两个 3x6x4.3 毫米的开关用于开始和选择按钮。

虽然游戏手柄的主要目的是玩复古游戏,但附加板足够大,可以包含家庭自动化功能,例如监控温度、湿度、光照或气压,您可以在不玩游戏时使用这些功能。 我添加了三个插槽,用于将 I2C 传感器连接到物理引脚 3 和 5 上的主 I2C 总线。

硬件设计中最有趣和最重要的部分是 EEPROM(电可擦除可编程只读存储器)。 通孔安装的 EEPROM 更容易在面包板上烧录并焊接到游戏手柄上。 MagPi 杂志上的一篇文章推荐了 CAT24C32 EEPROM; 如果该型号不可用,请尝试寻找具有类似技术规格的型号。 2014 年之后发布的所有树莓派型号和版本(树莓派 B+ 及更高版本)在物理引脚 27 和 28 上都有辅助 I2C 总线。

一旦你拥有了这些硬件,就使用面包板来检查它是否工作。

创建印刷电路板

下一步是创建印刷电路板 (PCB) 设计并进行制造。 作为一名开源爱好者,我认为应该使用自由和开源软件来创建开源硬件。 我依赖于 KiCad,一种在 GPLv3+ 许可下提供的电子设计自动化 (EDA) 软件。 KiCad 适用于 Windows、MacOS 和 GNU/Linux。 (我在 Ubuntu 18.04 上使用 KiCad 5。)

KiCad 允许您创建最多 32 个铜层加上 14 个固定用途技术层的 PCB。 它还有一个集成的 3D 查看器。 它正在积极开发中,包括 CERN 开发人员的许多贡献,并用于工业应用; 例如,Olimex 使用 KiCad 设计具有多个层的复杂 PCB,例如其 TERES-I DIY 开源硬件笔记本电脑中的 PCB。

KiCad 工作流程包括三个主要步骤

  • 在原理图布局编辑器中设计原理图
  • 在 PCB 布局编辑器中绘制边缘切割、放置组件和布线
  • 导出用于制造的 Gerber 和钻孔文件

如果您以前没有设计过 PCB,请记住学习曲线很陡峭。 请阅读 KiCad 提供的 示例和用户指南,以了解如何使用原理图和 PCB 布局编辑器。 (如果您不想从头开始做所有事情,您可以直接克隆我的 GitHub 存储库中的 ANAVI Play pHAT 项目。)

KiCad schematic

在 KiCad 的原理图布局编辑器中,将树莓派的 GPIO 连接到按钮,将传感器插槽连接到主 I2C,并将 EEPROM 连接到辅助 I2C。 为每个组件分配一个合适的封装。 执行电气规则检查,如果没有错误,则生成 网络表,该网络表描述了电子电路的连接性。

打开 PCB 布局编辑器。 它包含多个层。 读取网络表。 所有组件和走线必须位于正面和背面铜层(F.Cu 和 B.Cu)上,并且板的形状必须在 Edge.Cuts 层中创建。 任何文本,包括按钮标签,都必须位于丝印层上。

Printable circuit board design

最后,导出您将发送给生产 PCB 的公司的 Gerber 和钻孔文件。 Gerber 格式是 PCB 的事实上的行业标准。 它是一种用于 2D 二进制图像的开放 ASCII 矢量格式; 简单来说,它就像 PCB 制造的 PDF。

有很多公司可以制造像游戏手柄这样简单的两层板。 对于一些原型,您可以依靠 美国的 OSHPark欧洲的 Aisler。 也有许多中国制造商,例如 JLCPCB、PCBWay、ALLPCB、Seeed Studio 等。 或者,如果您更喜欢跳过 PCB 制造和采购组件的麻烦,您可以从 Crowd Supply 订购 ANAVI Play pHAT 制造商套件 并自己焊接所有通孔组件。

理解设备树

设备树是一种用于描述硬件组件的软件数据结构的规范。 它的目的是允许编译后的 Linux 内核处理更广泛的架构系列中的各种不同的硬件配置。 引导加载程序将设备树加载到内存中,并将其传递给 Linux 内核。

设备树包括三个组件

  • 设备树源 (DTS)
  • 设备树 blob (DTB) 和覆盖 (DTBO)
  • 设备树编译器 (DTC)

DTC 从文本源创建二进制文件。 设备树覆盖允许将中央 DTB 覆盖到设备树上。 覆盖包括许多片段。

几年来,所有新的片上系统 (SoC)(包括所有树莓派型号和版本中的 Broadcom SoC)都需要设备树。 使用树莓派流行的 Raspbian 发行版中的默认引导加载程序,可以使用关键字 device_tree= 在可引导 microSD 卡的 FAT 分区上的配置文件 (config.txt) 中设置 DTO。

自 2014 年以来,树莓派的引脚排针已扩展到 40 个引脚。 引脚 27 和 28 专用于辅助 I2C 总线。 这样,就可以从连接到这些引脚的 EEPROM 自动加载 DTBO。 此外,其他系统信息可以保存在 EEPROM 中。 此功能是树莓派基金会对任何树莓派 HAT(硬件附加在顶部)附加板的要求之一。 在 Raspbian 和其他用于树莓派的 GNU/Linux 发行版上,启动后可以从用户空间的 /proc/device-tree/hat/ 中看到来自 EEPROM 的信息。

在我看来,设备树是过去十年中 Linux 生态系统中添加的最令人着迷的功能之一。 创建设备树 blob 和覆盖是一项高级任务,需要一些背景知识。 但是,可以为树莓派附加板创建设备树二进制覆盖并将其烧录到适当的 EEPROM 上。 设备二进制覆盖定义了游戏手柄每个按键的 Linux 按键代码。 结果是一个树莓派游戏手柄,其按键在启动 Raspbian 后立即生效。

创建 DTBO

为游戏手柄创建设备树二进制覆盖有三个主要步骤

  • 基于 Linux 按键代码创建按键映射的设备树源
  • 使用设备树编译编译设备树二进制覆盖
  • 创建 .eep 文件并使用树莓派基金会提供的开源工具将其烧录到 EEPROM 上

Linux 按键代码在文件 /usr/include/linux/input-event-codes.h 中定义。 设备源文件应描述哪个树莓派 GPIO 引脚连接到哪个硬件按钮,以及按下按钮时应触发哪个 Linux 按键代码。 在此游戏手柄中,GPIO17(引脚 11)连接到向右的轻触按钮,GPIO4(引脚 7)连接到向左的轻触按钮,GPIO22(引脚 15)连接到向上的轻触按钮,GPIO27(引脚 13)连接到向下的轻触按钮,GPIO5(引脚 29)连接到开始,GPIO6(引脚 31)连接到选择,GPIO19(引脚 35)连接到 A,GPIO26(引脚 37)连接到 B。

请注意,GPIO 编号和引脚在排针上的物理位置之间存在差异。 为了方便起见,所有引脚都位于树莓派 40 针排针的第二行。 这种方法使得在 KiCad 中布线印刷电路板更容易。

游戏手柄的整个设备树源 可在 GitHub 上获取。 例如,以下是一个简短的代码片段,演示了如何将 GPIO17(对应于树莓派上的物理引脚 11)映射到向右的轻触按钮

button@17 {
               label = "right";
               linux,code = <106>;
               gpios = <&gpio 17 1>;
            };

要在树莓派上直接编译 DTS,请通过在终端中执行以下命令在 Raspbian 上安装设备树编译器

sudo apt-get update
sudo apt-get install device-tree-compiler

运行 DTC 并将输出 DTBO 的名称和源文件的路径作为参数提供。 例如

dtc -I dts -O dtb -o anavi-play-phat.dtbo anavi-play-phat.dts

树莓派基金会提供了一个 GitHub 存储库,其中包含 HAT 的机械、硬件和软件规范。 它还包括三个非常方便的工具

  • eepmake: 从带有设置的文本文件创建 .eep 文件
  • eepdump: 可用于调试,因为它将二进制 .eep 文件转储为人类可读的文本
  • eepflash:.eep 二进制镜像写入/读取到 EEPROM

eeprom_settings.txt 文件可用作模板。 树莓派基金会MagPi 杂志 提供了有用的文章和教程,因此我不会过多介绍细节。 正如我上面所写,推荐的 EEPROM 是 CAT24C32,但它可以替换为任何其他具有相同技术规格的 EEPROM。 对于爱好者来说,使用带有八针、通孔、双列直插式 (DIP) 封装的 EEPROM 更容易烧录,因为可以使用面包板完成。 以下示例命令创建了一个可以使用树莓派 GitHub 存储库中的 eepmake 工具烧录到 EEPROM 上的文件

./eepmake settings.txt settings.eep anavi-play-phat.dtbo

在开始烧录之前,请确保 EEPROM 正确连接到 Raspberry Pi 的主 I2C 总线(引脚 3 和 5)。(您可以参考上面链接的 MagPi 杂志文章,了解有关接线原理图的讨论。)然后运行以下命令,并按照屏幕上的说明将 .eep 文件烧录到 EEPROM 中。

sudo ./eepflash.sh -w -f=settings.eep -t=24c32

在将 EEPROM 焊接到印刷电路板之前,请将其移动到面包板上的辅助 I2C 总线上并进行测试,以确保其按预期工作。如果在面包板上测试 EEPROM 时发现任何问题,请更正设置文件,将其移回主 I2C 总线,然后再次烧录。

测试游戏手柄

现在是有趣的部分了!是时候使用 Raspbian 测试附加板了,您可以从 RaspberryPi.org 下载 Raspbian。启动后,打开一个终端并输入以下命令

cat /proc/device-tree/hat/product
cat /proc/device-tree/hat/vendor

输出应类似于这样

Testing output

如果是,恭喜!EEPROM 中的数据已成功读取。

下一步是验证 Play pHAT 上的按键是否已正确设置并正常工作。在终端或文本编辑器中,按下八个按钮中的每一个,并验证它们是否按配置执行。

最后,是时候玩游戏了!默认情况下,Raspbian 的桌面包含 Python 游戏。从应用程序菜单启动它们。选择一个音频输出,然后从列表中选择一个游戏。我最喜欢的是 Wormy,一款类似贪吃蛇的游戏。作为一名前 Symbian 移动应用程序开发人员,我发现玩 Wormy 让我想起了诺基亚的辉煌岁月。

使用 RetroPie 进行复古游戏

RetroPie with the Play pHAT

Raspbian 很棒,但 RetroPie 为复古游戏爱好者提供了更多。它是一个为玩复古游戏而优化的 GNU/Linux 发行版,并结合了开源项目 RetroArch 和 Emulation Station。它适用于 Raspberry Pi、Odroid C1/C2 以及运行 Debian 或 Ubuntu 的个人计算机。它提供用于加载 ROM 的模拟器——游戏卡带的数字版本。请记住,由于版权问题,RetroPie 中不包含任何 ROM。您需要在启动 RetroPie 后找到合适的 ROM 并将其复制到 Raspberry Pi。

开源硬件游戏手柄在 RetroPie 的菜单中运行良好,但我发现启动某些游戏和模拟器后,按键会失效。调试后,我找到了确保它们在游戏模拟器中工作的解决方案:添加一个 Python 脚本,用于额外地软件模拟按键。该脚本可在 GitHub 上找到。以下是如何获取它并在 RetroPie 上安装 Python

sudo apt-get update
sudo apt-get install -y python-pip
sudo pip install evdev
cd ~
git clone https://github.com/AnaviTechnology/anavi-examples.git

最后,将以下行添加到 /etc/rc.local,以便它在 RetroPie 启动时自动执行

sudo python /home/pi/anavi-examples/anavi-play-phat/anavi-play-gamepad.py &

就这样!完成这些步骤后,您就可以创建一个完全开源的硬件游戏手柄,作为任何带有 40 针接头的 Raspberry Pi 型号的附加板,并将其与 Raspbian 和 RetroPie 一起使用!

下一步是什么?

将免费和开源软件与开源硬件相结合很有趣,而且并不困难,但它需要大量时间。在业余时间创建了开源硬件游戏手柄之后,我在 Crowd Supply 上发起了一场适度的众筹活动,以便在我家乡保加利亚普罗夫迪夫进行小批量生产。开源硬件协会 根据 BG000007 认证了 ANAVI Play pHAT 作为开源硬件项目。甚至 保护电路板免受灰尘侵害的亚克力外壳 也是使用免费和开源软件 OpenSCAD 创建的开源硬件。

Game pad in acrylic enclosure

如果您喜欢阅读本文,我鼓励您尝试使用 KiCad 为 Raspberry Pi 创建自己的开源硬件附加板。如果您没有足够的业余时间,您可以订购 ANAVI Play pHAT maker kit,拿起您的烙铁,然后组装通孔组件。如果您不熟悉烙铁,您可以直接订购完全组装的版本。

祝大家复古游戏愉快!下次有人不耐烦地问你从玩老式电脑游戏中能学到什么时,告诉他们关于 Raspberry Pi、开源硬件、Linux 和设备树。

User profile image.
专业的软件工程师和开源爱好者

5 条评论

看起来不错,但仍然不完整。您需要某种外壳来保护电路板,以防您在玩游戏时触摸电路轨迹。

以及一些带有轮廓的塑料帽罩在按钮上,使其更舒适,并使对角线运动(同时按下两个方向按钮)成为可能。也许是这部分的 3D 打印项目。

嗨 David,谢谢!我已经使用免费和开源软件 OpenSCAD 为 Rapberry Pi 0 和 3B/3B+ 的外形尺寸创建了激光切割亚克力外壳。您可以在文章末尾看到一张照片,并且可以在 GitHub 上找到原理图
https://github.com/AnaviTechnology/anavi-cases/tree/master/anavi-play-p…

如果您没有激光切割机,您可以取消注释 scad 文件中以 linear_extrude 开头的行,使外壳 3D 化并在 3D 打印机上打印它。

这些亚克力外壳非常简单。我不是一个好的设计师,作为开发人员,OpenSCAD 比任何现代花哨的 3D GUI 工具都更容易上手。如果有人可以制作一个带有塑料按钮帽的完整外壳,那就太好了 :)

回复 作者:David C.

嗨,我是来自巴基斯坦的 Ayesha,非常感谢您分享这篇文章,我是一名工程师,我喜欢使用 Raspberry Pi 进行游戏。我从 w11stop.com/raspberry-pi 购买了一些 Raspberry Pi,并尝试连接蓝牙以通过手机从我的笔记本电脑控制游戏。但我收到了这些错误
[常规]
启用=网关、源
主控=真
禁用=套接字
自动连接=真

[耳机]
HFP=真

但现在我将尝试您的想法。
感谢分享,如果您能帮助我完成这个项目,请回复。

感谢您的反馈。我很高兴您觉得这篇文章有用。使用描述的简单游戏手柄方法,您将不需要蓝牙。

回复 作者:ayeshasalman

看起来不错,但仍然不完整。您需要某种外壳来保护电路板,以防您在玩游戏时触摸电路轨迹。

以及一些带有轮廓的塑料帽罩在按钮上,使其更舒适,并使对角线运动(同时按下两个方向按钮)成为可能。也许是这部分的 3D 打印项目。以及像 https://scanse.io/ 这样的 3D 打印创业项目

Creative Commons License本作品采用 Creative Commons Attribution-Share Alike 4.0 International License 授权。
© . All rights reserved.