Hack 和 / - Wiimote 控制
如果您仔细想想,与计算机交互的方式几乎与基于 Debian 的发行版一样多——而且这非常多。除了可靠的键盘和光学鼠标之外,还有轨迹球鼠标、触摸板、触摸屏、速记键盘、操纵杆、演示遥控器,甚至还有测量脑电波的设备。虽然我主要坚持使用我久经考验的键盘和轨迹球鼠标(手指放在主行上,谢谢),但当我开始听说人们使用 Wiimote(任天堂 Wii 的主控制器)做的所有有趣的事情时,我知道我必须尝试一下。
现在传统上,将全新的设备连接到 Linux 机器需要在互联网研究、内核模块 hacking、祈祷以及我自大学以来就没用过的晦涩编程技能方面进行投入。我认为仅仅因为这是一个蓝牙设备,就意味着我将不得不花一些时间使用 hcidump。令我惊讶的是,所有艰苦的工作都已经为我完成了,我只需几个基本步骤就可以在我的笔记本电脑上连接和使用 Wiimote。
首先,您的内核需要 uinput 模块可用并已加载。此模块在现代内核中可用,我的 Ubuntu Gutsy 安装已经安装了它。但是,如果您希望能够以普通用户的身份连接到 Wiimote,则需要添加新的 udev 规则以将权限扩展到 uinput 设备。我创建了一个名为 /etc/udev/rules.d/95-uinput.rules 的文件,其中包含以下内容
KERNEL=="uinput", GROUP="plugdev"
然后,我确保我的用户是 plugdev 组的成员。如果您的系统没有 plugdev 组,您可以选择或创建另一个组用于此设备。接下来,运行/etc/init.d/udev reload以确保您的更改生效。最后,我运行了modprobe uinput以确保模块已加载,并且我还将 uinput 添加到 /etc/modules 以确保它在启动时加载。
下一步是安装 wminput 软件。对我来说,这很简单,因为 wminput 已为我的发行版打包;否则,您可以从官方网站 (www.cwiid.org) 下载源代码。然后,确保计算机中的蓝牙设备已启用。例如,对于我的笔记本电脑,我必须拨动侧面的开关,但如果您有外部 USB 蓝牙适配器,那么现在是插入它的好时机。最后,在控制台中运行 wminput 并按照说明操作
greenfly@minimus:~$ wminput Put Wiimote in discoverable mode now (press 1+2)... Ready.
当您按下 Wiimote 上的按钮 1 和 2 时,它会进入可发现模式,并且底部的蓝色 LED 开始闪烁。有时您可能没有足够快地启动可发现模式,或者 wminput 无法检测到它,但只要 Wiimote 上的 LED 闪烁,它仍然处于该模式。因此,如果 wminput 超时,只需再次运行该程序即可。
如果您一直无法连接,您可能应该仔细检查您的蓝牙设备是否正常工作。为此,请按下 Wiimote 上的按钮 1 和 2,然后使用 hcitool 扫描 Wiimote。成功的扫描将如下所示
greenfly@minimus:~$ hcitool scan Scanning ... 00:1B:7A:3E:8C:54 Nintendo RVL-CNT-01
在 wminput 连接后,您还可以查看 /var/log/dmesg 以确认 Wiimote 已连接
[ 1226.247203] usb 3-2: new full speed USB device using ↪uhci_hcd and address 13 [ 1226.288768] usb 3-2: configuration #1 chosen ↪from 1 choice [ 1227.922403] input: Nintendo Wiimote as ↪/devices/virtual/input/input21
连接 Wiimote 后,默认绑定将其用作鼠标。Wiimote 中的加速度计用于移动鼠标指针,因此如果您将 Wiimote 向下或向上指,鼠标将分别向下或向上移动,如果您向左或向右滚动 Wiimote,鼠标将分别向左或向右移动。如果您查看 /etc/cwiid/wminput/buttons,您可以看到默认映射
Wiimote.A = BTN_LEFT Wiimote.B = BTN_RIGHT Wiimote.Up = KEY_UP Wiimote.Down = KEY_DOWN Wiimote.Left = KEY_LEFT Wiimote.Right = KEY_RIGHT Wiimote.Minus = KEY_BACK Wiimote.Plus = KEY_FORWARD Wiimote.Home = KEY_HOME Wiimote.1 = KEY_PROG1 Wiimote.2 = KEY_PROG2 ...
默认情况下,wminput 读取 /etc/cwiid/wminput/default 中列出的配置以获取其映射。在此文件中,您将看到
#acc_ptr include buttons Plugin.acc.X = REL_X Plugin.acc.Y = REL_Y
本质上,此文件包含用于按键绑定的按钮文件,并且还启用了加速度计用于 X 和 Y 移动。wminput 最棒的地方在于,所有这些映射都是完全可配置的。如果您查看 /etc/cwiid/wminput,您应该会看到许多其他示例映射,您可以将其用作灵感。您还可以将自定义映射存储在主目录下的 ~/.cwiid/wminput 中。按钮映射使用 /usr/include/linux/input.h 中可以找到的键和鼠标按钮的标准名称,但大多数名称都非常直观。
连接 Wiimote 后,我想做的第一件事就是将其用作各种游戏系统模拟器的控制器。但是,在继续之前,如果您确实使用了像 nestra、fceu、snes9x 或 MAME 这样的游戏系统模拟器,请确保您拥有使用您可能拥有的任何 ROM 的完全权利。与您的律师预约了解详情,但本质上,要玩商业 ROM,您应该拥有相应的游戏。
抛开法律免责声明,Wiimote 是一个出色的无线 NES(任天堂娱乐系统)控制器。所有基本按钮都在那里,剩下的就是重新排列按钮映射以与 nestra 或 fceu NES 模拟器一起使用。这两个程序使用略有不同的映射,因此我创建了名为 buttons-fceu 和 buttons-nestra 的文件,并将它们放在 ~/.cwiid/wminput 中。首先是 buttons-nestra
Wiimote.A = KEY_0 Wiimote.B = KEY_1 Wiimote.Up = KEY_LEFT Wiimote.Down = KEY_RIGHT Wiimote.Left = KEY_DOWN Wiimote.Right = KEY_UP Wiimote.Minus = KEY_TAB Wiimote.Plus = KEY_ENTER Wiimote.Home = KEY_PAUSE Wiimote.1 = KEY_Z Wiimote.2 = KEY_SPACE
设置常规 NES 按钮后,我还有一些额外的按钮要绑定,所以我将 A 按钮绑定到暂停模拟器,B 按钮绑定到将 nestra 设置为正常速度,并将 Home 按钮绑定到重置游戏。
fceu 模拟器具有完全不同的按键绑定,所以这是我的 buttons-fceu 文件
Wiimote.A = KEY_F7 Wiimote.B = KEY_F5 Wiimote.Up = KEY_A Wiimote.Down = KEY_S Wiimote.Left = KEY_Z Wiimote.Right = KEY_W Wiimote.Minus = KEY_TAB Wiimote.Plus = KEY_ENTER Wiimote.Home = KEY_F10 Wiimote.1 = KEY_KP2 Wiimote.2 = KEY_KP3
除了标准按钮外,我还将 B 按钮绑定到保存游戏状态,A 按钮绑定到恢复,Home 按钮绑定到重置游戏。
现在,要使用这些配置文件中的任何一个,我所需要做的就是告诉 wminput 加载这些文件
greenfly@minimus:~/$ wminput -c ~/.cwiid/wminput/buttons-nestra Put Wiimote in discoverable mode now (press 1+2)... Ready.
由于 wminput 发送常规键盘事件,因此我无需对 nestra 或 fceu 进行任何特殊操作。
Wiimote 非常适合 NES 游戏,但 SNES(超级任天堂)模拟怎么样?我实际上为 Wii 虚拟主机购买了一些不同的 SNES 游戏,并且我还购买了一个经典控制器,这样我就拥有了所有标准的 SNES 按钮。事实证明,wminput 还可以将按键绑定到 Nunchuck 和经典控制器附件,因此我为使其与 snes9x 一起工作所要做的就是创建一个新的配置文件,该文件映射所有按键。这是我的 buttons-snes9x 文件
Wiimote.A = KEY_X Wiimote.B = KEY_S Wiimote.Up = KEY_LEFT Wiimote.Down = KEY_RIGHT Wiimote.Left = KEY_DOWN Wiimote.Right = KEY_UP Wiimote.Minus = KEY_TAB Wiimote.Plus = KEY_ENTER Wiimote.Home = KEY_ESC Wiimote.1 = KEY_C Wiimote.2 = KEY_D Nunchuk.C = BTN_LEFT Nunchuk.Z = BTN_RIGHT Classic.Up = KEY_UP Classic.Down = KEY_DOWN Classic.Left = KEY_LEFT Classic.Right = KEY_RIGHT Classic.Minus = KEY_SPACE Classic.Plus = KEY_ENTER Classic.Home = KEY_ESC Classic.A = KEY_D Classic.B = KEY_C Classic.X = KEY_S Classic.Y = KEY_X #Classic.ZL = #Classic.ZR = Classic.L = KEY_A Classic.R = KEY_Z
即使我计划使用经典控制器,我也尝试将尽可能多的常规 Wiimote 按键映射到有意义的按钮,这样您也可以使用常规 Wiimote 玩至少一些游戏。如果您注意到,我还为特殊的 ZL 和 ZR 键留下了空白绑定,这样您就可以将它们绑定到额外的键。
MAME 是最好的游戏系统模拟器之一。MAME 模拟经典街机游戏,并且有很多指南(包括在Linux Journal本身中)关于如何使用 MAME 创建您自己的街机柜。好吧,我还没有抽出时间来做这个项目,但我确实想将我的 Wiimote 和经典控制器附件用于 MAME 游戏。MAME 有大量的绑定(在 MAME 中按 Tab 键查看列表),因此很难选择将哪些绑定到额外的键。这是我创建的示例 buttons-xmame 文件
Wiimote.A = KEY_P Wiimote.B = KEY_5 Wiimote.Up = KEY_LEFT Wiimote.Down = KEY_RIGHT Wiimote.Left = KEY_DOWN Wiimote.Right = KEY_UP Wiimote.Minus = KEY_2 Wiimote.Plus = KEY_1 Wiimote.Home = KEY_F3 Wiimote.1 = KEY_LEFTCTRL Wiimote.2 = KEY_LEFTALT Nunchuk.C = BTN_LEFT Nunchuk.Z = BTN_RIGHT Classic.Up = KEY_UP Classic.Down = KEY_DOWN Classic.Left = KEY_LEFT Classic.Right = KEY_RIGHT Classic.Minus = KEY_2 Classic.Plus = KEY_1 Classic.Home = KEY_F3 Classic.A = KEY_LEFTCTRL Classic.B = KEY_LEFTALT Classic.X = KEY_SPACE Classic.Y = KEY_LEFTSHIFT Classic.ZL = KEY_5 Classic.ZR = KEY_P Classic.L = KEY_Z Classic.R = KEY_X
除了您可能期望的标准绑定之外,Home 键重置 MAME;加号键选择单人游戏;减号键选择双人游戏;经典控制器上的 ZL 和 Wiimote 上的 B 键插入硬币;经典控制器上的 ZR 和 Wiimote 上的 A 键暂停。这些绝不是完美的绑定,因此我建议您尝试使用更适合您的不同按键。
wminput 的可能性远远超出我在此处介绍的内容。还有一些配置文件使用经典控制器上的模拟摇杆输入、Wiimote 上的 IR 传感器和 Nunchuck 上的加速度计。wminput 不仅仅是在笔记本电脑或台式机上玩视频游戏的便捷方式。连接到计算机是无线的事实使 Wiimote 成为 MythTV 客户端或其他连接到您的 PC 的计算机的出色游戏输入设备。至于我,我想我将再花几天时间尝试击败这个在互联网上流传的不可能的超级马里奥兄弟 hack。
Kyle Rankin 是旧金山湾区的高级系统管理员,也是许多书籍的作者,包括 O'Reilly Media 的 Knoppix Hacks 和 Ubuntu Hacks。他目前是北湾 Linux 用户组的主席。