MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据
MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据
【目录】
- 1、无线通信模块设置
- 1.1 设置参数
- 1.2 调试步骤
- 2、按键与通信格式
- 2.1 PS2按键定义
- 2.2 发送数据格式
- 3、源代码
- 3.1 串口手动发送数据进行设置
- 3.2 程序自动发送数据设置
- 3.3 全部代码
【背景信息】
铭佳科电子(MJKDZ)的无线手柄,PS2手柄形式,基于Arduino,可编程下载代码。
MJKDZ手柄相对于传统的PS2手柄,优点:USB充电,自定义按键,数据格式等,通信距离更远(2.4GHz,号称100m)。
2.4GHz通信,BK2461模块相比NRF24L01模块的优点:模块设置好之后(相同的组网、信道、波特率等),直接用串口发送数据,另一边用串口接收数据。没有像模拟SPI那种多余的数据、应答、时钟信号等。
手柄采购自:
https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-1876613493.18.32d625d3yNaM5K&id=551994689358
【参考】2.4G无线串口模块_博通_BK2461
【源代码】https://www.lanzous.com/i2wd9cd
1、无线通信模块设置
1.1 设置参数
一个手柄控制几个设备,参数设置成一样;
几个手柄在同一场合使用,改变信道,改变组网ID;
1.2 调试步骤
调试注意事项:
Arduino IDE 串口监控对中文支持好,其它串口调试助手不支持中文。
推荐 串口调试助手:USR-TCP232-Test-V1.3。
(1)手柄连接电脑,打开Arduino IDE下载源码
将源码“Test_Code_程序自动设置_UART-TX_更新按键号码_按键功能定义_改摇杆输出顺序_改PS2数据格式2.c”,修改名称,后缀为.ino后,下载到手柄中。
打开串口调试助手 USR-TCP232-Test-V1.3,打开手柄串口COM10,完成设置
按下ALT+SHIFT键,返回按键数值 16383,松开后的按键数值65535
(2)输入无线模块设置参数
串口发送设置参数AA5A00010001000000040064000000120080
返回参数 AA 5B AB 36 00 01 00 00 00 04 00 64 00 00 00 12 00 61
模块ID为 AB36
Q1、返回参数显示特别慢?
注意:再次按AT+Shift设置结束(否则串口被占用,没有释放,无线模块无法发送数据)
(3)无线模块设置参数
无线模块通过USB转串口模块连接电脑,SET端口连GND。
串口调试助手,选择COM11
串口发送设置参数 AA 5A 00 01 00 01 00 00 00 04 00 64 00 00 00 12 00 80
返回 AA 5B AA F8 00 01 00 00 00 04 00 64 00 00 00 12 00 22
模块ID为 AAF8
(4)手柄按键显示+发送信息,无线模块接收信息并显示
Arduino IDE 选择COM10
调试助手选择 COM11
2、按键与通信格式
2.1 PS2按键定义
MJKDZ PS2手柄按键定义如下
2.2 发送数据格式
原数据格式:AA+BB+按键+摇杆
//====================发送数据函数========================= } |
根据PS2手柄格式,修改后:73+按键+摇杆+5A(对应关系参考第二篇博文)
//====================发送数据函数========================= if(buttons>=8 && buttons<=15)//发送第二组数据:左、下、右、上、START、R3、L3、SELECT if(buttons>=0 && buttons<=7)//发送第二组数据:方形/叉/圆圈/三角/R1/L1/R2/L2 tx_data[3] = (unsigned char)R2int;//右摇杆R3左右A3 tx_data[7] = 0x5A; //数据发送Ready |
3、源代码
关键点:(1)无线模块参数设置正确;
(2)串口调试时,模拟串口(Serial)通过USB连接电脑,串口1(Serial1)连接无线模块;相互转发消息,用于串口调试,确保发送数据正确。
(3)发送的按键值,先判断条件,再赋值。
3.1 串口手动发送数据进行设置
//======SELECT+START按键:手动配置无线串口模块AT设置=============== if(setwi==1){//如果是组合键按下,第一次按下为1,则启动设置无线模块参数 else{//如果是组合键按下,第二次按下为0,则关闭设置无线模块 /*//======串口转发:手动设置无线模块,并显示返回值============= //======接收数据在主函数中,因为不知道什么时候串口发数据,要一直轮询======== if(Serial1.available()){//串口转发,串口1返回参数,发给模拟串口 } } |
3.2 程序自动发送数据设置
//======SELECT+START按键:自动设置无线串口模块参数=============== if(setwi==1){//如果是组合键按下则启动设置无线模块参数 digitalWrite(RULED, LOW);//功能指示,关闭无线模块设置结束 |
3.3 全部代码
#include <Mkeyin2.h>//按键函数库调用 /*============================= /*========================== //========所有IO功能口定义=========== //==================================== //==============变量定义================== float Var;//计算公式得到的数值存储变量 byte Lset; //左摇杆数据发送状态变量 //**======小车加速、减速控制============**// int L2int=0; //左摇杆左右数据存储变量 byte tx_data[8];//发送8个数据 //=====小车运动方向控制======== //==========超声波舵机方向控制====== //==========摄像头舵机方向控制====== //=========== 标志========================= //=================设置函数================== Var=1023.0/(3.3/(10.0/(10.0+10.0)));//电池电压计算公式,并将计算好的数值送给变量 pinMode(CS, OUTPUT);//设置为输出 Serial1.begin(9600);//串口1,连接无线模块2.4GHz Mkey.begin();//按键函数库初始化 //=============主函数 if(setWX==false){//判断串口转发标志是否开启false代表没有开启 voltage = (float)analogRead(Bat)/Var;//读取电压并除以计算公式所得到的数值,然后将得到的实际电压送给实际电压存储变量 L1int= map(L1int, 0, 1023, 0, 255);//将左摇杆上下数据1023转换成255,并送给发送数据串里 //========调用函数,更新按键值为按键号码========== if(setWX==false){//判断串口转发标志是否开启,false代表没有开启,串口转发。 //======SELECT+START按键:自动设置无线串口模块参数=============== if(setwi==1){//如果是组合键按下则启动设置无线模块参数 digitalWrite(RULED, LOW);//功能指示,关闭无线模块设置结束 } //====================发送数据函数========================= if(buttons>=8 && buttons<=15)//发送第二组数据:左、下、右、上、START、R3、L3、SELECT if(buttons>=0 && buttons<=7)//发送第二组数据:方形/叉/圆圈/三角/R1/L1/R2/L2 tx_data[3] = (unsigned char)R2int;//右摇杆R3左右A3 tx_data[7] = 0x5A; //数据发送Ready /* 参考PS2格式,去掉CRC校验位 Serial1.write(tx_data, 8); // 发送数据 //=====打印发送的数据 switch(tx_data[2]) case SONICINCREASE: //**===========按键数值转换为按键号码:支持长按=========== //===========上按键======================= //===========SELECT按键======================= //===============功能按键:R1======================== if(buttons==4 && Mkey.pressed(4)){ //按键一次,并松开 |
MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据相关推荐
- MJKDZ PS2手柄控制OskarBot小车(三):STM32接收无线串口模块的数据并处理
MJKDZ PS2手柄控制OskarBot小车(三):无线串口模块接收数据并处理 [目录] 1.硬件与软件设计思路 - 1.1 硬件资源 - 1.2 STM32串口接收数据的方法 2.源代码详解 - ...
- Arduino 串口发送数据代码
一.代码如下 void setup() {Serial.begin(230400); } void loop() { float gps_time = 1660538360.228776;float ...
- python树莓派串口通信实例_树莓派通过串口发送数据
可以通过串口登陆树莓派,也可以通过串口向其他主机发送数据.树莓派的串口接受数据科技爱好者博客已经写过,可以参考这篇文章:树莓派与arduino串口通信实践.这篇文章教大家如果通过树莓派的串口发送数据. ...
- java串口发送16进制_串口发送数据——字符串发送与十六进制发送的区别
在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在计算机中用 0000 0001(2)来表示.我们在用串口发送数据的时候首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照 ...
- 向STM32串口发送数据的标准函数
向STM32串口发送数据的标准函数 例子:1 void UART_Send_Message(u8 *Data,u8 lenth) {while(lenth--){USART_SendData(USAR ...
- 安捷伦万用表--Agilent34401A数字万用表串口发送数据只上位机使用说明
Agilent34401A数字万用表串口发送数据使用说明 安捷伦34410A万用表可以通过背后的RS232接口与电脑连接,进行串口通信. 仪表的串口有两种工作方式,一种是交互模式–既能接收命令,又能发 ...
- 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭
实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...
- C#串口通信—向串口发送数据,同步接收返回数据
最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接 ...
- STM32F0 HAL库软件模拟串口发送数据
试验STM32F0官方提供的例程的时候,希望看到程序中某些变量的值,但是程序中往往没有串口发送部分,自己加又非常麻烦. 而点亮LED的程序基本上每个例程都有.所以用点亮LED引脚模拟串口发送数据就很方 ...
最新文章
- 从数据中心三大趋势看如何做布线规划
- MyBitis(iBitis)系列随笔之六:mybitis与spring集成
- 安装Mediamanager 后Messenger后无法登录
- python设置excel格式_Python使用xlwt写excel并设置写入格式
- 华为手机android怎么解锁,华为手机解锁密码忘了怎么办?华为手机找回锁屏密码方法...
- 机械键盘无冲测试软件,全键无冲/六键无冲可切换 键盘测试_狼派 X09暗影机械键盘_键鼠评测-中关村在线...
- Python:计算任意n阶矩阵行列式
- 智慧医疗管理系统解决方案:医药电商系统实现智能化改造
- Cobbler自动化安装系统2
- kindle上查看微信读书的书籍
- Garbage First (G1) GC垃圾回收器:区域化分代式【图文】
- html5文本框里插图片文字,word应用教程:在文本框内插入图片
- 电脑桌面计算机文件打不开怎么办,电脑开机桌面文件都点不开的解决方法
- 最左前缀 mysql优化器_mysql查询优化之索引类型、最左前缀
- linux进程挂掉 自动启动,配置systemd以在Linux崩溃后自动启动服务
- 搞笑决战水源之巅收藏六 师傅
- 必应壁纸php,PHP 自动保存Bing 每日壁纸
- 中标麒麟学习笔记0:安装极点五笔输入法
- 计算机网络知识全面讲解:域名解析的过程
- c语言中的fock方法输出hello,(1.1.20)C程序之Fock()函数