MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据MJKDZPS2手柄控制OskarBot小车(一):Arduino串口发送数据【目录】    -1、无线通信模块设置        -1.1设置参数        -1.2调试步骤    -2、按键与通信格式        -2.1PS2按键定义        -2.2发送数据格式    -3、源代码        -3.1串口手…

大家好,又见面了,我是你们的朋友全栈君。

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 设置参数

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

 

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

 

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

 

一个手柄控制几个设备,参数设置成一样;

几个手柄在同一场合使用,改变信道,改变组网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

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

(2)输入无线模块设置参数

串口发送设置参数AA5A00010001000000040064000000120080

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

返回参数 AA 5B AB 36 00 01 00 00 00 04 00 64 00 00 00 12 00 61

模块ID AB36

Q1、返回参数显示特别慢?

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

注意:再次按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

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

2、按键与通信格式

2.1 PS2按键定义

MJKDZ PS2手柄按键定义如下

MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据

2.2 发送数据格式

原数据格式:AA+BB+按键+摇杆

//====================发送数据函数=========================
 void TX_data() { //发送数据函数
  unsigned int i = 0;//定义循环变量
  unsigned int crc_byte = 0;//定义CRC校验变量
  tx_data[0] = 0xAA;    //校验码1
  tx_data[1] = 0xBB;    //校验码2
  tx_data[2] = buttons;//按键数字
  tx_data[3] = (unsigned char)L1int; //左摇杆上下A0  
  tx_data[4] = (unsigned char)L2int;//左摇杆左右A1
  tx_data[5] = (unsigned char)R1int;//右摇杆上下A2
  tx_data[6] = (unsigned char)R2int;//右摇杆左右A3
  for(i = 0; i < 7; i++)
  crc_byte += tx_data[i];
  while(crc_byte > 255)
   crc_byte -= 255;
  tx_data[7] = crc_byte;    // CRC校验
  Serial1.write(tx_data, 8);

}

根据PS2手柄格式,修改后:73+按键+摇杆+5A(对应关系参考第二篇博文)

//====================发送数据函数=========================
   void TX_DATA() { //发送数据函数
    unsigned int i = 0;//定义循环变量
    unsigned int crc_byte = 0;//定义CRC校验变量
    tx_data[0] = 0x73;    //红灯模式

if(buttons>=8 && buttons<=15)//发送第二组数据:左、下、右、上、START、R3、L3、SELECT
    {

            tx_data[1] = buttons_PS2;//按键数字
    }
    else{

            tx_data[1] = 0xFF;
    }

if(buttons>=0 && buttons<=7)//发送第二组数据:方形/叉/圆圈/三角/R1/L1/R2/L2
    {

            tx_data[2] = buttons_PS2;//按键数字
    }
    else{

            tx_data[2] = 0xFF;
    }

tx_data[3] = (unsigned char)R2int;//右摇杆R3左右A3 
    tx_data[4] = (unsigned char)R1int;//右摇杆上下A2
    tx_data[5] = (unsigned char)L2int;//左摇杆L3左右A1
    tx_data[6] = (unsigned char)L1int; //左摇杆上下A0

tx_data[7] = 0x5A;    //数据发送Ready

3、源代码

关键点:(1)无线模块参数设置正确;

(2)串口调试时,模拟串口(Serial)通过USB连接电脑,串口1(Serial1)连接无线模块;相互转发消息,用于串口调试,确保发送数据正确。

(3)发送的按键值,先判断条件,再赋值。

3.1 串口手动发送数据进行设置

//======SELECT+START按键:手动配置无线串口模块AT设置===============
  if(keyint==16383){

    //Serial.println(“无线串口模块:开始手动设置,请输入参数”);
    setwi=!setwi;//组合键第一次按下,设置标志位,开启串口设置
    digitalWrite(RULED,setwi);//功能指示灯开启用于显示无线模块开始设置
    delay(600);//为了防止按键重复开启关闭设置端口必须延时

if(setwi==1){
//如果是组合键按下,第一次按下为1,则启动设置无线模块参数
      digitalWrite(SET, LOW);//设置无线模块管脚开启
      setWX=true;//串口转发标志true,代表开启串口转发,为了软件设置串口
      //Serial.println(“无线串口模块(手动设置):参数读取完毕,请再次按ELECT+START键”);
   
     
    }

else{
//如果是组合键按下,第二次按下为0,则关闭设置无线模块
       delay(600);//为了防止按键重复开启关闭设置端口必须延时
       digitalWrite(SET, HIGH);//关闭无线模块的设置管脚
       digitalWrite(RULED, LOW);//功能指示关闭无线模块设置结束
       //Serial.println(“无线串口模块:手动设置OK”);
       setWX=false;//串口转发标志false,代表关闭串口,转发为了软件设置串口
    }
  }

/*//======串口转发:手动设置无线模块,并显示返回值=============
  输入参数较慢,需要在主循环中不停遍历和判断
  //(1)、电脑通过USB模拟串口,发送无线模块设置参数给Ardunino;
  //(2)、Arduino的模拟串口,收到设置参数,转发给串口1,传给无线串口模块,完成参数设置;
  //(3)、无线串口模块返回参数(包含模块ID),给串口1;
  //(4)、串口1转发给模拟串口,通过USB在电脑上显示返回参数
  //  ===================================================//*/
 
 

//======接收数据在主函数中,因为不知道什么时候串口发数据,要一直轮询========
  if(setWX == true){   //接收串口设置参数 18位数组
    if(Serial.available()){
//串口转发,模拟串口发给串口1
        for(char i=0;i<18;i++)//一次只能读取一位数据,轮训18次
        {

          Serial1.write(Serial.read()); //模拟串口读取数据,发给串口1。
        }    
        bibi();//蜂鸣器函数
    }

    if(Serial1.available()){
//串口转发,串口1返回参数,发给模拟串口
        for(char i=0;i<18;i++)//一次只能读取一位数据,轮训18次
        {

          Serial.write(Serial1.read()); //串口1读取数据,发给模拟串口。
        }    
        bibi();

     }

}

3.2 程序自动发送数据设置

//======SELECT+START按键:自动设置无线串口模块参数===============
  if(keyint==16383){ //判断SELECT+START按键是否同时按下
    setwi=!setwi;//组合键第一次按下,设置标志位,开启串口设置

if(setwi==1){
//如果是组合键按下则启动设置无线模块参数
      digitalWrite(RULED, HIGH);//功能指示灯开启用于显示无线模块开始设置
      digitalWrite(SET, LOW);//设置无线模块管脚开启
      setWX=true;//串口转发标志true,代表开启串口转发,为了软件设置串口
     
      delay(600);//延时600ms
      Serial1.write(SETWX,18);//给串口(无线模块)发送18组16进制数,设置参数指令的18位字符数组
      delay(600);//延时600ms
      
      if(Serial1.available())//串口转发,串口1返回参数,发给模拟串口
      {

        for(char i=0;i<18;i++)//一次只能读取一位数据,轮训18次
        {

          Serial.write(Serial1.read()); //串口1读取数据,发给模拟串口。
        }
        Serial.print(\n);
       
        bibi();//蜂鸣器函数
      }

digitalWrite(RULED, LOW);//功能指示,关闭无线模块设置结束
      //Serial.println(“无线串口模块设置OK,可以发送数据”);
     

3.3 全部代码

#include <Mkeyin2.h>//按键函数库调用
Mkeyin2<2> Mkey; //按键控制芯片设置

/*=============================
程序说明:
1、模拟串口通过USB连接电脑,串口1连接无线模块;
2、AT+Shift,启动串口无线设置:程序自动设置无线模块参数,串口1发送参数到无限模块,并将返回参数通过模拟串口显示。
无法在Arduino IDE的串口监视器中显示,需要使用串口调试助手 USR-TCP232-Test-V1.3
3、按键有更新,模拟串口显示按键数据+发送数据+按键功能(Arduino IDE查看),串口1无线模块发送8位数据(串口调试助手查看)。
4、摇杆数值有变更,不发送串口数据(后期再追加 )Volts: 4.24LX: 129LY: 128RX: 125RY: 125;
5、更新按键号码,保持与按键函数一致;
6、改摇杆输出顺序:右摇杆R3左右(X轴)->右摇杆R3上下(Y轴)->左摇杆L3左右(X轴)->左摇杆L3上下(Y轴);
7、增加变量 buttons_PS2,用于保持与PS2手柄按键格式一致;去掉校验位与CRC和校验
无线模块发送数据,格式为8为字符:校验位/红灯模式/0x73+按键值+摇杆数值+校验位0x5A;
/*======================

/*==========================
 *   串口无线模块设置指令
 ===========================*/
//AA 5A 00 01 00 01 00 00 00 04 00 64 00 00 00 12 00 80
unsigned char SETWX[18] ={
0xAA,0x5A,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x64,0x00,0x00,0x00,0x12,0x00,0x80};//18个16进制

//========所有IO功能口定义===========
const int LMotor=10;//左震动电机
const int RMotor=6;//右震动电机
const int buzzer=9;//蜂鸣器接口
const int SET=4;//串口无线模块AT调试使能接口
const int CS=13;//无线模块使能睡眠管脚(2.4G无线模块有效)
const int OFF_POW=23;//关机端口(默认必须低电平否则会自动关机)

//====================================
const int Bat=A4;//电池电压读取
const int Lxvr=A2;//左摇杆上下
const int Lyvr=A3;//左摇杆左右
const int Rxvr=A0;//右摇杆上下
const int Ryvr=A1;//右摇杆上下
const int RULED=17;//运行状态指示灯

//==============变量定义==================
long keyint=0;//测试电压摇杆标记变量
byte setwi;//无线模块设置状态变量

float Var;//计算公式得到的数值存储变量
float voltage;//实际电压存储变量
unsigned char buttons = 99;    //按键值变量,初始值为99,对应65535
unsigned int buttons_PS2 = 99;//PS2手柄按键值,初始值为99,对应65535

byte Lset;  //左摇杆数据发送状态变量
byte Rset;  //左摇杆数据发送状态变量

//**======小车加速、减速控制============**//
int L1int=0//左摇杆上下数据存储变量,

int L2int=0//左摇杆左右数据存储变量
int R1int=0//右摇杆上下数据存储变量
int R2int=0//右摇杆左右数据存储变量

byte tx_data[8];//发送8个数据

//=====小车运动方向控制========
#define FORWARD 3//MOTO COMMAND
#define BACKWARD 1
#define TURNLEFT 0
#define TURNRIGHT 2
#define CARSTOP 99

//==========超声波舵机方向控制======
#define SONICINCREASE 10  //角度增大,向右转0->30->60
#define SONICDECREASE 12  //角度减小,向左转0<-30<-60

//==========摄像头舵机方向控制======
#define CAMERAINCREASE 13  //角度增大,向右转0->30->60
#define CAMERADECREASE 11  //角度减小,向左转0<-30<-60

//=========== 标志=========================
boolean setWX= false;//false!true 切换串口转发功能标志,主要用于软件设置无线模块。

//=================设置函数==================
void setup() {

   pinMode(OFF_POW, OUTPUT);//设定关机端口为输出
   digitalWrite(OFF_POW, LOW);//关机端口默认设置为关闭状态否则会自动关机

Var=1023.0/(3.3/(10.0/(10.0+10.0)));//电池电压计算公式,并将计算好的数值送给变量

pinMode(CS, OUTPUT);//设置为输出
   pinMode(SET, OUTPUT);//设置为输出
   pinMode(RULED, OUTPUT);//设置为输出

Serial1.begin(9600);//串口1,连接无线模块2.4GHz
   Serial.begin(9600);//默认虚拟串口,USB连接电脑

Mkey.begin();//按键函数库初始化
   digitalWrite(CS, LOW);//设置无线模块开启(2.4G无线模块可用)
   digitalWrite(SET, HIGH);//设置无线模块管脚关闭
}

//=============主函数
void loop() {

if(setWX==false){
//判断串口转发标志是否开启false代表没有开启
   if (Serial1.available()) {
//判断无线模块是否接收到了数据
    if (Serial1.read()==‘A’){
//串口接收到了数据就调用蜂鸣器函数
      bibi();//蜂鸣器函数 哔哔响
      }
    }
  }

voltage = (float)analogRead(Bat)/Var;//读取电压并除以计算公式所得到的数值,然后将得到的实际电压送给实际电压存储变量
 
  L1int = analogRead(Lxvr);//读取左摇杆上下数据
  L2int = analogRead(Lyvr);//读取左摇杆左右数据
  R1int = analogRead(Rxvr);//读取右摇杆上下数据
  R2int = analogRead(Ryvr);//读取右摇杆左右数据

L1int= map(L1int, 0, 1023, 0, 255);//将左摇杆上下数据1023转换成255,并送给发送数据串里
  L2int= map(L2int, 0, 1023, 0, 255);//将左摇杆左右数据1023转换成255,并送给发送数据串里
  R1int= map(R1int, 0, 1023, 0, 255);//将右摇杆上下数据1023转换成255,并送给发送数据串里
  R2int= map(R2int, 0, 1023, 0, 255);//将右摇杆左右数据1023转换成255,并送给发送数据串里

//========调用函数,更新按键值为按键号码==========
  Bkey_Long();//调用按键函数,支持长按键(前:L1/2,R1/2)
  Bkey_Short(); //调用按键按下和释放功能函数,短按键(左+右)
  Bkey_Function();//功能按键函数(前:L1/2,R1/2)
 
  if (Mkey.update()) {

    for (int i = 0; i < Mkey.getDataWidth(); i++);//循环读取按键数值
    keyint=Mkey.getCurrent();//将读取按键数值送给按键变量
  
    if(buttons<14){
// 除SELECT,START,SELECT+START按键
      Serial.println(buttons);//模拟串口,让USB口发送按键值,除外:SELECT+START按键没有被按下(buttons=16)

if(setWX==false){
//判断串口转发标志是否开启,false代表没有开启,串口转发。
        //======按键号码更新,调用发送数据函数
   
        TX_DATA();//按键有更新,发送数据,模拟串口发送按键功能命令
        //Serial1.println(keyint);//串口1,让无线模块发送按键值
      }
    }
  }

//======SELECT+START按键:自动设置无线串口模块参数===============
  if(keyint==16383){ //判断SELECT+START按键是否同时按下
    setwi=!setwi;//组合键第一次按下,设置标志位,开启串口设置

if(setwi==1){
//如果是组合键按下则启动设置无线模块参数
      digitalWrite(RULED, HIGH);//功能指示灯开启用于显示无线模块开始设置
      digitalWrite(SET, LOW);//设置无线模块管脚开启
      setWX=true;//串口转发标志true,代表开启串口转发,为了软件设置串口
     
      delay(600);//延时600ms
      Serial1.write(SETWX,18);//给串口(无线模块)发送18组16进制数,设置参数指令的18位字符数组
      delay(600);//延时600ms
      
      if(Serial1.available())//串口转发,串口1返回参数,发给模拟串口
      {

        for(char i=0;i<18;i++)//一次只能读取一位数据,轮训18次
        {

          Serial.write(Serial1.read()); //串口1读取数据,发给模拟串口。
        }
        Serial.print(\n);
       
        bibi();//蜂鸣器函数
      }

digitalWrite(RULED, LOW);//功能指示,关闭无线模块设置结束
      //Serial.println(“无线串口模块设置OK,可以发送数据”);
      digitalWrite(SET, HIGH);//关闭无线模块的设置管脚
      setWX=false;//串口转发标志false,代表关闭串口,转发为了软件设置串口   
      setwi=0;//清除设置标志位
    }    
  }

}

//====================发送数据函数=========================
   void TX_DATA() { //发送数据函数
    unsigned int i = 0;//定义循环变量
    unsigned int crc_byte = 0;//定义CRC校验变量
    tx_data[0] = 0x73;    //红灯模式

if(buttons>=8 && buttons<=15)//发送第二组数据:左、下、右、上、START、R3、L3、SELECT
    {

            tx_data[1] = buttons_PS2;//按键数字
    }
    else{

            tx_data[1] = 0xFF;
    }

if(buttons>=0 && buttons<=7)//发送第二组数据:方形/叉/圆圈/三角/R1/L1/R2/L2
    {

            tx_data[2] = buttons_PS2;//按键数字
    }
    else{

            tx_data[2] = 0xFF;
    }

tx_data[3] = (unsigned char)R2int;//右摇杆R3左右A3 
    tx_data[4] = (unsigned char)R1int;//右摇杆上下A2
    tx_data[5] = (unsigned char)L2int;//左摇杆L3左右A1
    tx_data[6] = (unsigned char)L1int; //左摇杆上下A0

tx_data[7] = 0x5A;    //数据发送Ready

/*  参考PS2格式,去掉CRC校验位
    for(i = 0; i < 7; i++)
    crc_byte += tx_data[i];
    while(crc_byte > 255)
     crc_byte -= 255;
    tx_data[7] = crc_byte;    // CRC校验
*/

Serial1.write(tx_data, 8); // 发送数据

//=====打印发送的数据
     Serial.print(“Send Data=”);
     Serial.print(tx_data[0],HEX);
     Serial.print(“-“);
     Serial.print(tx_data[1],HEX);
     Serial.print(“-“);
     Serial.print(tx_data[2],HEX);
     Serial.print(“-“);
     Serial.print(tx_data[3]);
     Serial.print(“-“);
     Serial.print(tx_data[4]);
     Serial.print(“-“);
     Serial.print(tx_data[5]);
     Serial.print(“-“);
     Serial.print(tx_data[6]);
     Serial.print(“-“);
     Serial.println(tx_data[7],HEX);

switch(tx_data[2])
    {

       case FORWARD:
      Serial.println(前进”);
       //tone(buzzer, 1000); // 发送给蜂鸣器1KHz声音信号
       break;
       case BACKWARD:
      Serial.println(后退”);
        // tone(buzzer, 100); // 发送给蜂鸣器1KHz声音信号
       break;
       case TURNLEFT:
       Serial.println(左转”);
      // tone(buzzer, 400); // 发送给蜂鸣器1KHz声音信号
       break;
       case TURNRIGHT:
       Serial.println(右转”);
      // tone(buzzer, 500); // 发送给蜂鸣器1KHz声音信号
       break;
       case CARSTOP:
       Serial.println(停止”);
     //  noTone(buzzer);     //停止发送
       break;

case SONICINCREASE:
       Serial.println(超声波右转(角度增大)”);
       break;
       case SONICDECREASE:
       Serial.println(超声波左转(角度减小)”);
       break;
       case CAMERAINCREASE:
       Serial.println(摄像头右转(角度增大)”);
       break;
       case CAMERADECREASE:
       Serial.println(摄像头左转(角度减小)”);
       break;
    }
  }

//**===========按键数值转换为按键号码:支持长按===========
  void Bkey_Long(){
//按键函数
    switch(keyint){

    case 65023://判断如果是L1按键按下
    //buttons=9;//给按键变量赋值9
    buttons=7;//给按键变量赋值7,根据PS2按键定义,与R1,R2在同一组
    buttons_PS2=0xFB;        //PS2按键赋值
    break;
    case 65279://判断如果是L2按键按下
    //buttons=8;//给按键变量赋值8
    buttons=6;//给按键变量赋值6,根据PS2按键定义,与R1,R2在同一组
    buttons_PS2=0xFE;        //PS2按键赋值
    break;
    case 65519://判断如果是R1按键按下
    buttons=4;//给按键变量赋值4
    buttons_PS2=0xF7;        //PS2按键赋值
    break;
    case 65503://判断如果是R2按键按下
    buttons=5;//给按键变量赋值5
    buttons_PS2=0xFD;        //PS2按键赋值
    break;
    case 16383://判断如果是Shift+Start按键同时按下
    buttons=16;//给按键变量赋值16
    break;
    }
  }
//**===========按键数值转换为按键号码:仅支持短按===========
void Bkey_Short(){

//===========三角按键=======================
   if(Mkey.released(3)){
//判断按键是否按下
    buttons=3;                        //给按键变量赋值3,前进,FORWARD
    buttons_PS2=0xEF;        //PS2按键赋值
    }
   if(Mkey.pressed(3)){ //按键是否松开
   buttons=99;                        //给按键变量赋值99
   buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========X按键=======================
   if(Mkey.released(1)){
//判断按键是否按下
    buttons=1;                        //给按键变量赋值1,后退,BACKWARD
    buttons_PS2=0xBF;        //PS2按键赋值
    }
   if(Mkey.pressed(1)){ //按键是否松开
    buttons=99;                        //给按键变量赋值99
   buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========正方形按键=======================
   if(Mkey.released(0)){
//判断按键是否按下
    buttons=0;//给按键变量赋值0,左转,LEFT
    buttons_PS2=0x7F;        //PS2按键赋值
    }
   if(Mkey.pressed(0)){ //按键是否松开
   buttons=99;//给按键变量赋值99
   buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========圆圈按键=======================
   if(Mkey.released(2)){
//判断按键是否按下
    buttons=2;给按键变量赋值2,右转,RIGHT
    buttons_PS2=0xDF;        //PS2按键赋值
    }
   if(Mkey.pressed(2)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
    }

//===========上按键=======================
   if(Mkey.released(10)){
//判断按键是否按下
    buttons=10;//给按键变量赋值3,前进,FORWARD
    buttons_PS2=0xEF;        //PS2按键赋值
    }
   if(Mkey.pressed(10)){ //按键是否松开
   buttons=99;//给按键变量赋值99
   buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========下按键=======================
   if(Mkey.released(12)){
//判断按键是否按下
    buttons=12;//给按键变量赋值1,后退,BACKWARD
    buttons_PS2=0xBF;        //PS2按键赋值
    }
   if(Mkey.pressed(12)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========左按键=======================
   if(Mkey.released(11)){
//判断按键是否按下
    buttons=11;//给按键变量赋值0,左转,LEFT
    buttons_PS2=0x7F;        //PS2按键赋值
    }
   if(Mkey.pressed(11)){ //按键是否松开
   buttons=99;//给按键变量赋值99
   buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========右按键=======================
   if(Mkey.released(13)){
//判断按键是否按下
    buttons=13;给按键变量赋值2,右转,RIGHT
    buttons_PS2=0xDF;        //PS2按键赋值
    }
   if(Mkey.pressed(13)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
    }

//===========SELECT按键=======================
   if(Mkey.released(14)){
//判断按键是否按下
    buttons=14;//给按键变量赋值14
    buttons_PS2=0xFE;        //PS2按键赋值
    }
   if(Mkey.pressed(14)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
    }
 //===========START按键=======================
   if(Mkey.released(15)){
//判断按键是否按下
    buttons=15;//给按键变量赋值15
    buttons_PS2=0xF7;        //PS2按键赋值
    }
   if(Mkey.pressed(15)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
    }
  //===============摇杆按键========================
    if(Mkey.released(7)){
//L3左摇杆按键判断是否按下
    //buttons=7;//给按键变量赋值7
    buttons=9;//给按键变量赋值9,根据PS2按键定义,与SELCT,START在同一组
    buttons_PS2=0xFD;        //PS2按键赋值
    }
    if(Mkey.pressed(7)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
    }
    if(Mkey.released(6)){
//R3右摇杆按键判断是否按下
    //buttons=6;//给按键变量赋值6
    buttons=8;//给按键变量赋值8,根据PS2按键定义,与SELCT,START在同一组
    buttons_PS2=0xFB;        //PS2按键赋值
    }
    if(Mkey.pressed(6)){ //按键是否松开
    buttons=99;//给按键变量赋值99
    buttons_PS2=0xFF;        //给变量赋值FF
  }

//===============功能按键:R1========================
    if(Mkey.released(4)){
//R1键判断是否按下
    buttons=4;//给按键变量赋值4
    buttons_PS2=0xF7;        //PS2按键赋值
    }
    delay(100);//延时判断按键松开

if(buttons==4 && Mkey.pressed(4)){ //按键一次,并松开
      Serial.print(“Volts: “);//串口输出“Volts: ”字符串
      Serial.print(voltage);//串口输出电池电压数值
      Serial.print(“LX: “);//串口输出“LX: ”字符串
      Serial.print(L1int);//串口输出左摇杆X轴数据
      Serial.print(“LY: “);//串口输出“LY: ”字符串
      Serial.print(L2int);//串口输出左摇杆Y轴数据
      Serial.print(“RX: “);//串口输出“RX: ”字符串
      Serial.print(R1int);串口输出右摇杆X轴数据
      Serial.print(“RY: “);//串口输出“RY: ”字符串
      Serial.println(R2int);串口输出右摇杆Y轴数据,并换行
      buttons=99;//给按键变量赋值99
    }
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145013.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Redis锁的介绍「建议收藏」

    Redis锁的介绍「建议收藏」Redis锁的实现:由于Redis是单进程的,可以简单用setnx这个命令进行加锁操作,谁能操作成功,谁就可以获得锁。简单的代码如下:defacquire_lock():   #identifier:唯一标识客户端   #lockname锁名字   #redis客户端连接   ifredis.setnx(lockname,identifier):     …

  • 初识云计算的三种服务模式 (IaaS SaaS PaaS)

    初识云计算的三种服务模式 (IaaS SaaS PaaS)

  • String、StringBuffer与StringBuilder之间区别

    String、StringBuffer与StringBuilder之间区别String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区…

  • JAVA reference_Java instanceof

    JAVA reference_Java instanceof本文介绍对象的强、软、弱和虚引用的概念、应用。1.对象的强、软、弱和虚引用  在JDK1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

  • ie浏览器兼容性视图灰色怎么办_浏览器没有兼容性视图设置

    ie浏览器兼容性视图灰色怎么办_浏览器没有兼容性视图设置2018-07-1010:57:17win8系统浏览一些高级网站会出现打不开的问题,其实我们需要设置兼容性视图才能正常浏览,那么怎么设置IE8浏览器兼容性视图?其实设置IE8浏览器兼容性视图的方法很简单,接下去教程和…2015-06-0516:15:42Win8系统自带的IE11浏览器有兼容模式功能,通过开启兼容模式,可以让用户在将浏览器关闭后再重启,然后在测试下输入网站即可正常打开一些兼…

  • JSP include参数的中文乱码问题

    JSP include参数的中文乱码问题最近在做jsp页面时,需要在a.jsp页面中,include一个b.jsp文件。a.jsp传递给b.jsp的参数是动态加载的,可能是中文。当出现中文时,b.jsp就会显示乱码。a.jsp文件如下所示:Stringsearchword=(String)request.getAttribute(“searchword”);   “/>b.jsp文件如下所示:

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号