遥控器控制树莓派,详细记录Wiimotes如何连接树莓派

在这篇树莓派Wiimote控制器指南中,我记录下在树莓派上设置Wiimote的过程,并展示如何配置cwiid和wminput。

wiicontroller-thumbnail.png

在树莓派上使用Wiimote是让人抓狂的,虽然它也是蓝牙连接,但是操作方式和Xbox控制器和PlayStation控制器有很大差异。

为了支持Wiimote控制器的全部功能,必须额外利用两个软件。

他们是cwiid和wminput。一个是作为依赖库,将Wiimotes的动作解释为操纵杆动作,另一个是驱动程序。

设备清单

下面是我在这个树莓派Wiimote控制器教程中使用的所有设备。

建议

可选

在Raspberry Pi上设置Wiimote

像大多数无线控制器一样,Wiimotes并不能与树莓派直接开箱工作。虽然Wiimote控制器使用蓝牙,但在标准接口下,它们的大部分功能都不能被正确识别。

可以利用两个软件来规避这个问题,我们使用这些软件,因为它们是比较好的解决方案,并被Retropie等流行项目所使用。

1. 现在,在开始使用Raspberry Pi的Wiimote的第一个方法之前,首先确保软件包都是最新的。在Raspberry Pi上运行以下命令来完成。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
sudo rpi-update

2. 现在已经更新了Raspberry Pi,继续安装所需要的一些包。

Python-Cwiid是libcwiid的python接口。Libcwiid是一个库,它是Wiimote控制器和Linux操作系统之间的桥梁,并将控制器的动作解释为树莓派理解的东西。

Wminput是本教程的重要组成部分,它作为Wiimote的事件/操纵杆/鼠标驱动程序。Wminput可以与支持操纵杆设备的程序兼容。

sudo apt-get install python-cwiid
sudo apt-get install wminput

请注意,如果使用的是Raspberry Pi 2或更早的产品,可能需要安装蓝牙包,为此需要在Raspberry Pi上运行以下命令。

sudo apt-get install bluetooth

3. 现在需要的包已经安装到Raspberry Pi上,可以设置udev规则了,允许非root用户访问uinput设备。Uinput是wminput创建Wiimote的接口。

运行以下命令来创建这些Wiimote规则。

sudo nano /etc/udev/rules.d/wiimote.rules

4. 在文件中输入以下一行。这一行将在系统启动时被读取。

KERNEL=="uinput", MODE="0666"

5. 现在让按Ctrl + X保存文件,然后按Y,最后按Enter键。

6. 重启udev服务,这样做是为了让它加载在上一步写的新规则文件,在Raspberry Pi上运行以下命令。

sudo service udev restart

7. 现在,检查下蓝牙是不是正常的,用以下命令来检查其状态。

sudo systemctl status bluetooth

如果看到命令行中出现 “Active: active (running)”,就可以进入本教程的第8步了。

如果看到有其他东西,可以尝试通过运行下面的命令来重新启动蓝牙服务。

sudo systemctl start bluetooth

8. 现在蓝牙服务已经启动并运行了,创建一个配置文件来完成对wminput的设置。这个配置文件将把所有的wiimote按钮与Linux中的特定动作/事件关联起来。

运行下面的命令来创建需要的配置文件,我把它命名为 “mywminput”。

sudo nano /home/pi/mywminput

9. 在该文件中输入以下几行。

# Classic-Controller
Classic.Dpad.X = ABS_X
Classic.Dpad.Y = ABS_Y
Classic.LStick.X = ABS_HAT0X
Classic.LStick.Y = ABS_HAT0Y
Classic.RStick.X = ABS_HAT1X
Classic.RStick.Y = ABS_HAT1Y
Classic.A = BTN_A
Classic.B = BTN_B
Classic.X = BTN_X
Classic.Y = BTN_Y
Classic.Minus = BTN_SELECT
Classic.Plus  = BTN_START
Classic.Home  = BTN_MODE
Classic.L  = BTN_TL
Classic.R  = BTN_TR
Classic.ZL = BTN_TL2
Classic.ZR = BTN_TR2

# WiiMote
Wiimote.A = BTN_A
Wiimote.B  = BTN_B
Wiimote.Dpad.X = ABS_Y
Wiimote.Dpad.Y = -ABS_X
Wiimote.Minus = BTN_SELECT
Wiimote.Plus = BTN_START
Wiimote.Home = BTN_MODE
Wiimote.1 = BTN_X
Wiimote.2 = BTN_Y

# Nunchuk
Nunchuk.C = BTN_C
Nunchuk.Z = BTN_Z

10. 下一步是可选的,如果不想让Wiimote的LED灯打开,可以跳到Raspberry Pi Wiimote控制器教程的第11步。

另外,如果想学习起来如何更好地配置Wiimote配置文件,可以看看这两个有用的文档,第一个是Wiimote按钮和轴的列表,可以利用配置文件,在他们的Github上找到Wiimote按钮和轴的列表。

另一个是一个可能的按钮和轴的列表,可以分配给Wiimote按钮和轴,也可以在cwiids的github页面上找到这个按钮和轴的列表。

如果想设置当连接到Wiimote时,哪些LED灯被激活,可以通过使用下面这些配置项来设置它们。只需在mywminput配置文件的底部添加这些内容。

Plugin.led.Led1 = 1
#Plugin.led.Led2 = 1
#Plugin.led.Led3 = 1
#Plugin.led.Led4 = 1

11. 现在按Ctrl + X然后按Y键保存wminput配置文件,最后按Enter键。

12. 查看Wiimote的MAC地址,需要这些地址来启动与树莓派的蓝牙设备的连接。

利用以下命令来搜索周围的蓝牙设备。

hcitool scan

启动了该工具后,同时按下Wiimote控制器上的1+2按钮,开始查找。如果不确定是什么按钮,那么请看下图。

wiimotediagram-horizontal-1.png

13. 应该看到类似下面的东西出现在命令行,这是Wiimote控制器的MAC地址,然后是一个标识符。记下打算使用的控制器的MAC地址。

Scanning ...
        00:24:1E:63:E0:AD       Nintendo RVL-CNT-01

14. 现在,写一个脚本,简化控制器与Raspberry Pi的连接。

我会解释下bash脚本的作用。

首先,在Raspberry Pi上运行以下命令,在主目录中创建一个文件来存储这个bash脚本。

nano /home/pi/connectwiimote.sh

15. 现在在connectwiimote.sh文件中添加以下内容。

#!/bin/bash
sleep 1 # Wait until Bluetooth services are fully initialized
hcitool dev | grep hci >/dev/null

顶部一行作为标识符,这样操作系统就知道使用/bin/bash来运行该文件。

第二行告诉脚本睡眠一秒,这样做是为了确保在尝试使用蓝牙服务之前,蓝牙服务已经完全启动。

第三行利用hcitool查看是否有蓝牙适配器可供利用,如果没有蓝牙适配器可供利用,就停止wminput工具的运行。

if test $? -eq 0 ; then
	wminput -d -c  /home/pi/mywminput YOUR_MAC_ADDRESS &
else

第一行只是检查之前的hcitool行是否输出了结果,需要知道蓝牙适配器是否可用。

下一行是文件中最关键的部分之一,这一行初始化wminput开始搜索Wiimote控制器。

可以有多个这样的行,只需确保在每次出现时用你要连接的Wiimote控制器的MAC地址替换YOUR_MAC_ADDRESS。

第三行是一个简单的 else 语句,后面是最后三行代码。

	echo "Bluetooth adapter not present!"
	exit 1
fi

最后这三行代码非常简单。第一行只是打印 “Bluetooth adapter not present!”到命令行。当hcitool看不到蓝牙适配器时,就会出现这个消息。

第二行停止执行。

代码的最后一行是if、else语句的结束。

16. 完整的代码如下,用你的MAC地址代替YOUR_MAC_ADDRESS。

#!/bin/bash
sleep 1 # Wait until Bluetooth services are fully initialized
hcitool dev | grep hci >/dev/null
if test $? -eq 0 ; then
	wminput -d -c  /home/pi/mywminput YOUR_MAC_ADDRESS &
else
	echo "Blue-tooth adapter not present!"
	exit 1
fi

这里还有一个例子,如果想连接多个不同的控制器,文件会是这样子的。可以在下一页的代码块中看到。

#!/bin/bash
sleep 1 # Wait until Bluetooth services are fully initialized
hcitool dev | grep hci >/dev/null
if test $? -eq 0 ; then
	wminput -d -c  /home/pi/mywminput YOUR_MAC_ADDRESS &
	wminput -d -c  /home/pi/mywminput YOUR_MAC_ADDRESS &
	wminput -d -c  /home/pi/mywminput YOUR_MAC_ADDRESS &
else
	echo "Blue-tooth adapter not present!"
	exit 1
fi

17. 完成代码后,按Ctrl + X然后Y,最后按Enter键保存文件。

18. 现在创建了脚本,使用chmod给它775的权限,使它可以执行。这个命令是让所有者和组拥有完整的读/写/执行权限,但只授予其他人运行脚本的能力。

在Raspberry Pi的命令行上运行如下命令。

sudo chmod 775 /home/pi/connectwiimote.sh

19. 进入脚本的测试阶段。必须首先启用uinput模块。在Raspberry Pi上运行以下命令,利用modprobe来实现。

sudo modprobe uinput

20. 现在启用了uinput模块,终于可以运行的脚本来测试它是否能正常工作。

/home/pi/connectwiimote.sh

当脚本运行时,按Wiimote控制器上的1 + 2按钮,这将初始化连接。LED应该短暂地闪烁,然后完全关闭或改变到在本教程第9步中设置的设置。

wiimotediagram-horizontal-1.png

21. 现在脚本已经工作了,继续下一步,就是让脚本和uinput模块在启动时启动,这样控制器就可以随时随地连接。

编辑/etc/modules文件开始,在启动时加载uinput。运行以下命令开始编辑该文件。

sudo nano /etc/modules

22. 在这个文件的底部添加以下一行。这一行确保uinput在启动时被加载。

uinput

23. 按Ctrl + X,然后按Y,最后按Enter键保存文件。

24. 最后,编辑rc.local文件,利用它在启动时执行connectwiimote.sh脚本。用下面的命令开始编辑该文件。

sudo nano /etc/rc.local

25. 在该文件中添加以下一行:

寻找

exit 0

添加以上

sh /home/pi/connectwiimote.sh

26. 现在可以按Ctrl + X然后按Y,最后按Enter键保存文件。

27. 重新启动Raspberry Pi来测试脚本是否被正确执行。在Raspberry Pi上运行以下命令。

sudo reboot

28. 如果你按Wiimote控制器上的1+2按钮,它应该会自动连接成功。

29. 现在,测试控制器,使用jstest工具。要开始使用这个工具,首先让安装操纵杆包,虽然它通常包含在Raspbian的完整安装中,但它不包含在精简版中。

在Raspberry Pi上运行下面的命令来安装它。

sudo apt-get install joystick

30. 运行下面的命令来测试新设备,在jstest工具中,应该看到在Wiimote上做某些动作时,数值会发生变化。

sudo jstest /dev/input/js0

希望读完树莓派Wiimote指南,您已经成功地把Wiimote连接到树莓派上了,如果您对本教程有任何反馈或需要帮助,请在下方留言。

平均: 0 / 5. votes: 0

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 遥控器控制树莓派,详细记录Wiimotes如何连接树莓派

赞 (0)

评论

8+8=