首页 > 代码库 > 玩转树莓派——支持PS3手柄
玩转树莓派——支持PS3手柄
之前写过一篇用树莓派玩模拟器的。通过retropie可以集成不同的模拟器,在树莓派上玩街机、玩红白机、玩PSP都不是问题。
不过我不喜欢让游戏直接接管我的树莓派,毕竟用树莓派还得做正经事对吧。
还好retorpie提供on the top的使用方式,只不过是需要自行运行Shell命令。这里有指导:
https://github.com/retropie/retropie-setup/wiki/Manual-Installation
可以直接通过github拉回来:
git clone --depth=1 https://github.com/RetroPie/RetroPie-Setup.git
修改运行权限,然后运行设置脚本
cd RetroPie-Setup
chmod +x retropie_setup.sh
sudo ./retropie_setup.sh
后续通过菜单来安装包、配置,并无二致。
前文书也写过,在树莓派上可以通过XBOX 360手柄收发器来使用XBOX手柄。可是树莓派自己有蓝牙啊,不能用蓝牙接手柄吗?
查了一下,PS3的手柄是蓝牙的。可是,Sony并未支持在蓝牙协议栈上使用PS3手柄……不过也不是没有办法,有很多牛人写了PC上的驱动,树莓派这种开源系统,自然更加不缺大神来研究。
于是,万能的淘宝买了个PS3手柄,才25元……嗯,我知道,仿品嘛,不确定是不是能用,搞了再说。
Retropie官方支持PS3手柄的说明在这:
https://github.com/retropie/retropie-setup/wiki/Setting-up-a-PS3-controller
写的很简单,我拿到手柄照着说明,只要USB线一插上,手柄就震个不停……顿时有点绝望……
用dmesg命令看看,仿品是SHAN WAN做的,必须是咱国内仿的,你懂的。对于这个牌子的克隆货,老外用的也非常多,在github上都有专门的issue和解决……
https://github.com/RetroPie/RetroPie-Setup/issues/1677
问题是,没解决我的问题…
再加上,使用PS3的蓝牙驱动,就不能再使用蓝牙鼠标键盘啥的,很难以接受……难道要再搞一个蓝牙适配器?那和使用XBOX手柄有啥区别……
于是,我打算贴下心,研究使用补丁过的bluez驱动。好在有牛人把东西都折腾好了,我开始了新的冒险~
1、抓github上的打过补丁的bluez源码
git clone https://github.com/luetzel/bluez
2、配置检查并编译bluez驱动
cd bluez
./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc \ --localstatedir=/var --enable-sixaxis
make -j3
sudo make install
编译时会需要依存库或者包:
- GCC compiler
- GLib library
- D-Bus library
- udev library (optional)
- readline (command line clients)
我卡在最后一个包,猜了半天库名字,最后发现是libreadline-dev。如果缺少包,直接sudo apt-get install即可。其实在Linux上编译bluez来支持蓝牙的文章也不少,可以参考下。
搞定后用命令:
sudo service bluetooth status
可以查看蓝牙协议栈版本和daemon运行进程。我第一次没成功,是通过蓝牙版本发现的。
3、重启蓝牙服务
这步留到后面蓝牙配对之前也没啥问题。更新蓝牙堆栈之后,可以更新一下daemon。然后重启一下蓝牙服务。当然,你愿意重启树莓派我也没意见。
sudo systemctl daemon-reload
sudo service bluetooth restart
4、从http://qtsixa.sourceforge.net/下载QtSixA源码并编译
实际只需要utils目录
make
然后找到sixpair,可以把它复制到bluez或者你常用目录下面。
将PS3手柄连接到USB线上,插入树莓派,手柄会抽筋一样不停地震。这也是我最早怀疑手柄是否能工作的原因。不管它,使用sixpair进行配对:
sudo ./sixpair
5、复制固件
因为重新编译安装了蓝牙驱动栈,需要把bcm的固件复制一下:
sudo ln -s /lib/firmware/ /etc/firmware
否则,使用sixpair显示的蓝牙地址不对,变成全是a。
Current Bluetooth master: aa:aa:aa:aa:aa:aa
Setting master bd_addr to aa:aa:aa:aa:aa:aa
正常的应该类似以下:
Current Bluetooth master: b8:27:eb:e5:2f:e1
Setting master bd_addr to b8:27:eb:e5:2f:e1
6、拔出USB线,手柄会自己连接蓝牙,当只剩下一个LED的时候,手柄就配对成功了。
可以使用蓝牙控制应用看蓝牙连接情况
sudo bluetoothctl
[NEW] Controller b8:27:eb:e5:2f:e1raspi5 [default]
[NEW] Device 01:B6:AD:7F:63:25 PLAYSTATION(R)3 Controller
[NEW] Device 20:73:AB:91:DD:6F Bluetooth V3.0 Keyboard
[CHG] Device 01:B6:52:85:63:25 Connected: yes
[PLAYSTATION(R)3 Controller]# info 01:B6:AD:7F:63:25
Device 01:B6:52:85:63:25
Name: PLAYSTATION(R)3 Controller
Alias: PLAYSTATION(R)3 Controller
Class: 0x000540
Icon: input-keyboard
Paired: no
Trusted: yes
Blocked: no
Connected: yes
LegacyPairing: no
UUID: Human Interface Device... (00001124-0000-1000-8000-00805f9b34fb)
Modalias: usb:v054Cp0268d0000
显示为Trusted,并且Connected,已经分配了UUID,就意味着手柄已经配对成功了。
还可以使用hciconfig来观察HCI扫描和配对的过程。在dmesg里面也能看到设备从USB转到了bluetooth/hci0上。如果什么也没发生,可以尝试增加检测:
sudo modprobe joydev
sudo modprobe uinput
整个过程痛苦不堪,我看了200多条英文的帖子,还不算基于这些帖子来做的搜索和查询。现在,拿起你的PS3手柄,在树莓派上玩DOOM吧~
玩转树莓派——支持PS3手柄