pXH手机蓝牙手柄柄怎么连接手机

手机模拟蓝牙手柄控制kobuki底座 - CSDN博客
手机模拟蓝牙手柄控制kobuki底座
手机模拟蓝牙手柄控制kobuki底座
最近在做ros相关的东西, 硬件平台kobuki, 成功实现手机模拟蓝牙手柄控制kobuki底座, 在这里记录一下折腾过程
HC-05 主从模块各一(可以任意转换M/S模式)
树莓派2 x1
Arduino UNO x1
USB蓝牙适配器 x1
安卓手机 x1
杜邦线若干
略懒, 所以这部分没自己写, 直接找商店现成的模拟器app
Play商店搜索适合的APP
选定 Joy BT Commander 链接
模块参数设定
参考上述wiki链接, 我用的串口调试软件是: 用到的AT命令主要有:
查看/更改匹配PIN码
AT+PSWD=1234
更改主从模式
更改设备名
AT+NAME=MY_BLUE
更改UART(这里改115200后面有用)
AT+UART? # 查
AT+UART=115200,1,0 # 改 change default 9600 to 115200, 1 stop bit, 0 parity
注意: 有的板子可能没有key引脚, 而是state, en引脚附近有一个硬按键, 这种板子进入AT模式需要在上电之前按住这个按键不放, 然后上电, 待LED灯闪烁间隔大约两秒一次时, 说明进入AT模式成功, 此模式下默认的UART参数是
与Arduino通信
#include &SoftwareSerial.h&
SoftwareSerial Conn(10, 11);
void setup() {
Conn.begin(115200);
void loop() {
Conn.println("Test Transmission String.");
delay(600);
此时打开调试软件接通端口会收到循环的Test Transmission String.字符串
与树莓派直连通信
引脚定义见链接:
树莓派测试程序
import serial
port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=0.5)
while True:
port.write("\r\nSay something:")
rcv = port.read(100)
port.write("\r\nYou sent:" + repr(rcv))
分析模拟APP
Joy BT Commander本身很强大, 见, 我只用到其中的摇杆数据, 软件发送的数据格式为标准ASCII码, 具体是形如x共八个字节, 第一个字节是开始符, 最后一个为终止符, 中间6位是实际坐标, 前三位表示横坐标, 后三位表示纵坐标, 默认坐标原点为(200, 200)最左为100最上为300
插上手柄, 监听/joy话题消息内容
消息内容如下:
frame_id: ''
axes: [0.11612, -0.482582, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
frame_id: ''
axes: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
其中有意义的是axes的前两位, 分别表示横纵坐标; buttons的第五位必须为1. 剩下的seq为系统自动生成, 表示消息序号; stamp为时间戳, 这个作用不大, 不处理也可以.
注意: 手柄实际坐标取值范围是[-1, 1], 原点坐标为(0, 0), 横坐标向左为正, 纵坐标正常, 需要转换
明显手机发出的数据和/joy话题需要收到的标准手柄数据不一样, 所以这里需要写一个程序负责把蓝牙串口收到的x数据包装成类似上面获取到的手柄真实数据格式, 然后发布给/joy这个topic, 以达到冒充手柄的目的
假定手机app发送给ROS系统的坐标为(x, y), 那么对应的手柄坐标(m, n)就应该是:
m = (200 - x) / 100
n = (y -200) / 100
模拟手柄数据
上面说到需要有一个程序收取蓝牙串口数据并伪装成真手柄数据发布到/joy这个topic, 需要写一个脚本来处理, 内容如下(joy_cmd.py):
from datetime import datetime
import serial
import rospy
from sensor_msgs.msg import Joy
port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=0.5)
buttons = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
axes_end = [0, 0, 0, 0, 0, 0]
def send_cmd(m_n):
pub = rospy.Publisher("/joy", Joy, queue_size=10)
rospy.init_node('joy_cmd')
joy_msg = Joy()
joy_msg.header.stamp = rospy.Time.now()
joy_msg.axes = m_n + axes_end
joy_msg.buttons = buttons
pub.publish(joy_msg)
def cal_xy(rcv):
result = rcv[1:-1]
x = int(result[:-3])
y = int(result[3:])
m = (200 - x) / 100.0
n = (y - 200) / 100.0
return [m, n]
while True:
rcv = port.read(8)
if len(rcv) == 8:
result = cal_xy(rcv)
send_cmd(result)
python joy_cmd.py
rostopic echo /joy
连接蓝牙, 操作手机APP摇杆, 观察终端输出数据, 如图, 成功!
依次启动相关launch来测试效果吧:
roslaunch turtlebot_bringup minimal.launch # 驱动kobuki最小系统
roslaunch turtlebot_teleop xbox360_teleop.launch # 启动手柄驱动
python joy_cmd.py
自启动设定
至此, 已经可以用手机模拟器控制kobuki了, 但比较麻烦的问题是ROS的这些launch都只能维持在前台状态, 需要找一种略和谐的方式来把launch放在后台运行, 在需要的时候随时可切换查看log日志, 当然要是可以随系统自动启动那就更完美了. 尝试了以下几种方式来自启动这些launch
supervisor
环境变量env不好处理, 总是失败, 暂时放弃…
ros官方推荐的处理方式, 然而打开他的一看, 内容好少, 简单试了下, 跟supervisor一样的问题, 环境变量配置过程中source命令总出错, 遂放弃…
这可能是我目前能想到最容易实现的方法, 把launch封装成shell脚本, 然后在/etc/rc.local中依次调用, 具体内容如下
- turtlebot_bringup.sh
#!/bin/bash
source /home/ubuntu/catkin_ws/devel/setup.bash
roslaunch turtlebot_bringup minimal.launch
xbox360_teleop.sh
#!/bin/bash
source /home/ubuntu/catkin_ws/devel/setup.bash
roslaunch turtlebot_teleop xbox360_teleop.launch
launch_ros.sh
#!/bin/bash
echo "running turtlebot_bringup"
screen -dmS turtlebot_bringup /home/ubuntu/bin/turtlebot_bringup.sh
echo "running xbox360_teleop"
screen -dmS xbox360_teleop /home/ubuntu/bin/xbox360_teleop.sh
echo "running joy_cmd"
screen -dmS joy_cmd python joy_cmd.py
/etc/rc.local
# 添加自启动, 以ubuntu用户执行
su ubuntu -c "/home/ubuntu/bin/launch_ros.sh"
还遇到一个问题是: 蓝牙模块通过GPIO引脚接入树莓派后, 默认指定的设备文件
/dev/ttyAMA0权限不够, 非root用户无法读取, 所以需要给单独写个udev规则文件
ududevadm info -a -n /dev/ttyAMA0
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/dev:f1/tty/ttyAMA0':
KERNEL=="ttyAMA0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/dev:f1':
KERNELS=="dev:f1"
SUBSYSTEMS=="amba"
DRIVERS=="uart-pl011"
ATTRS{id}==""
ATTRS{irq0}=="83"
根据获取到的硬件信息在这里/etc/udev/rules.d新建一个设备规则60-hc05.rules
SUBSYSTEM=="tty", ATTRS{id}=="", MODE:="0666", GROUP:="dialout"
权限给个RW就行, 然后重启系统查看/dev/ttyAMA0权限, 如下:
crw-rw-rw- 1 root dialout 204, 64 Jan
6 11:55 /dev/ttyAMA0
终于, 一切正常, 系统自动启动, 不依赖host机器通过ssh预先启动launch, 可独立被手机控制行走.
测试过程中发现HC-05这个模块的信号很强, 比罗技蓝牙手柄的控制距离远了好多, 稳定性也非常好.
控制信息只处理了摇杆坐标信息, 有待添加按键, 自定义数据支持
screen方法还是不太稳定, minimal.launch进程有概率挂掉
如发生程序异常退出, 系统无法自动恢复, 需要重启或者接入host主机才能处理, 健壮性不足, 后续还是应该考虑supervisor的监控方案,
目前只用蓝牙2.0模块做了测试,
控制距离大概50米左右, 不知道换4.0/1模块会有怎样的提升
本文已收录于以下专栏:
相关文章推荐
Linux把设备分为了字符设备和块设备(网络设备除外),这几乎是个常识了。对做驱动的linux程序员来说,驱动要么是字符设备驱动,要么是块设备驱动。那么什么是字符设备和块设备?本节我们探索一下字符设备...
编写本文的目的:
看完本章,朋友们可以进行随心所欲的运用udev,编写udev规则,更好的管理Linux设备。例如,把硬盘sda根据盘的SN码生成一个软连接,使得SN码当做sda一样使用。
每个人都有不一样的儿时记忆,但是对于男孩子来说,有一个记忆是我们共同拥有的,那就是NES(FC),在欧洲发布的版本为NES,全称是Nintendo Entertainment System,而在亚洲发...
本文不详细讨论手柄和安卓手机的连接方法,也不对所用插件进行深入探讨,仅仅就InControl插件的简单应用进行了尝试,以实现通过手柄对Unity发布的安卓项目进行控制...
Android 手机模拟游戏手柄(USB,C#,winio)使用的知识点:Android服务器通过USB连接PC端,winio发送键盘消息,Socket编程,线程,Android多点触控先说下思路,首...
鉴于某些手机在使用大朋SDK以及谷歌SDK时会出现神器的小屏现象(比如某想的)故为了能够最大程度的兼容更多的手机,决定使用暴风魔镜的SDK。废话不多说~直接将使用暴风魔镜SDK时遇到的问题以及解决方案...
蓝牙4.0BLE开发板实现空中飞鼠、体感游戏手柄
近年来开始流行空中飞鼠与体感游戏手柄,正好我们的开发板上设计有插入mpu6050六轴传感器的适配接口,我们中秋节期间兴趣使然,实现了这...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)安卓蓝牙手柄连接电脑教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
安卓蓝牙手柄连接电脑教程
&&趣迷免ROOT安卓蓝牙手柄连接电脑的方法
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 蓝牙手柄怎么连接手机 的文章

 

随机推荐