PS2手柄按键测试

PS2手柄按键测试arduino的PS2手柄控制测试:#include<PS2X_lib.h>//电机引脚#definePWMA12//A电机转速#defineDIRA134#defineDIRA235//A电机方向#definePWMB8//B电机转速#defineDIRB137#defineDIRB236//B电机方向#def…

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

arduino的PS2手柄控制测试

 #include <PS2X_lib.h>
//电机引脚
#define PWMA 12 //A电机转速
#define DIRA1 34 
#define DIRA2 35 //A电机方向
#define PWMB 8 //B电机转速
#define DIRB1 37 
#define DIRB2 36 //B电机方向
#define PWMC 9 //C电机转速
#define DIRC1 43 
#define DIRC2 42 //C电机方向
#define PWMD 5 //D电机转速
#define DIRD1 26 
#define DIRD2 27 //D电机方向

//PS2控制器
#define PS2_DAT 52 //14 
#define PS2_CMD 51 //15
#define PS2_SEL 53 //16
#define PS2_CLK 50 //17

PS2X ps2x; // create PS2 Controller Class


#define MOTORA_FORWARD(pwm) do{digitalWrite(DIRA1,LOW); digitalWrite(DIRA2,HIGH);analogWrite(PWMA,pwm);}while(0)
#define MOTORA_STOP(x) do{digitalWrite(DIRA1,LOW); digitalWrite(DIRA2,LOW); analogWrite(PWMA,0);}while(0)
#define MOTORA_BACKOFF(pwm) do{digitalWrite(DIRA1,HIGH);digitalWrite(DIRA2,LOW); analogWrite(PWMA,pwm);}while(0)

#define MOTORB_FORWARD(pwm) do{digitalWrite(DIRB1,LOW); digitalWrite(DIRB2,HIGH);analogWrite(PWMB,pwm);}while(0)
#define MOTORB_STOP(x) do{digitalWrite(DIRB1,LOW); digitalWrite(DIRB2,LOW); analogWrite(PWMB,0);}while(0)
#define MOTORB_BACKOFF(pwm) do{digitalWrite(DIRB1,HIGH);digitalWrite(DIRB2,LOW); analogWrite(PWMB,pwm);}while(0)

#define MOTORC_FORWARD(pwm) do{digitalWrite(DIRC1,LOW); digitalWrite(DIRC2,HIGH);analogWrite(PWMC,pwm);}while(0)
#define MOTORC_STOP(x) do{digitalWrite(DIRC1,LOW); digitalWrite(DIRC2,LOW); analogWrite(PWMC,0);}while(0)
#define MOTORC_BACKOFF(pwm) do{digitalWrite(DIRC1,HIGH);digitalWrite(DIRC2,LOW); analogWrite(PWMC,pwm);}while(0)

#define MOTORD_FORWARD(pwm) do{digitalWrite(DIRD1,LOW); digitalWrite(DIRD2,HIGH);analogWrite(PWMD,pwm);}while(0)
#define MOTORD_STOP(x) do{digitalWrite(DIRD1,LOW); digitalWrite(DIRD2,LOW); analogWrite(PWMD,0);}while(0)
#define MOTORD_BACKOFF(pwm) do{digitalWrite(DIRD1,HIGH);digitalWrite(DIRD2,LOW); analogWrite(PWMD,pwm);}while(0)

#define SERIAL Serial

#define MAX_PWM 200
#define MIN_PWM 100
int Motor_PWM = 130;

//控制电机运动 宏定义

// ↑A-----B↑ 
// | ↑ |
// | | |
// ↑C-----D↑
void ADVANCE(){ 
   
  MOTORA_FORWARD(Motor_PWM);MOTORB_FORWARD(Motor_PWM);    
  MOTORC_FORWARD(Motor_PWM);MOTORD_FORWARD(Motor_PWM);    
}

// ↓A-----B↓ 
// | | |
// | ↓ |
// ↓C-----D↓
void BACK(){ 
   
  MOTORA_BACKOFF(Motor_PWM);MOTORB_BACKOFF(Motor_PWM);
  MOTORC_BACKOFF(Motor_PWM);MOTORD_BACKOFF(Motor_PWM);
}

// =A-----B↑ 
// | ↖ |
// | ↖ |
// ↑C-----D=
void LEFT_1(){ 
   
  MOTORA_FORWARD(Motor_PWM);MOTORB_STOP(Motor_PWM);
  MOTORC_STOP(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}

// ↓A-----B↑ 
// | ← |
// | ← |
// ↑C-----D↓
void LEFT_2(){ 
   
  MOTORA_BACKOFF(Motor_PWM);MOTORB_FORWARD(Motor_PWM);
  MOTORC_FORWARD(Motor_PWM);MOTORD_BACKOFF(Motor_PWM);
}

// ↓A-----B= 
// | ↙ |
// | ↙ |
// =C-----D↓
void LEFT_3(){ 
   
  MOTORA_BACKOFF(Motor_PWM);MOTORB_STOP(Motor_PWM);
  MOTORC_STOP(Motor_PWM);MOTORD_BACKOFF(Motor_PWM);
}

// ↑A-----B= 
// | ↗ |
// | ↗ |
// =C-----D↑
void RIGHT_1(){ 
   
  MOTORA_FORWARD(Motor_PWM);MOTORB_STOP(Motor_PWM);
  MOTORC_STOP(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}

// ↑A-----B↓ 
// | → |
// | → |
// ↓C-----D↑
void RIGHT_2(){ 
   
  MOTORA_FORWARD(Motor_PWM);MOTORB_BACKOFF(Motor_PWM);
  MOTORC_BACKOFF(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}

// =A-----B↓ 
// | ↘ |
// | ↘ |
// ↓C-----D=
void RIGHT_3(){ 
   
  MOTORA_STOP(Motor_PWM);MOTORB_BACKOFF(Motor_PWM);
  MOTORC_BACKOFF(Motor_PWM);MOTORD_STOP(Motor_PWM);
}

// =A-----B= 
// | = |
// | = |
// =C-----D=
void STOP(){ 
   
  MOTORA_STOP(Motor_PWM);MOTORB_STOP(Motor_PWM);
  MOTORC_STOP(Motor_PWM);MOTORD_STOP(Motor_PWM);
}

void UART_Control(){ 
   
  char Uart_Date=0;
 if(SERIAL.available())
  { 
   
   Uart_Date = SERIAL.read();
  }
  switch(Uart_Date)
  { 
   
     case 'A':  ADVANCE();              break;
     case 'B':  RIGHT_1();              break;
     case 'C':  RIGHT_2();              break;
     case 'D':  RIGHT_3();              break;
     case 'E':  BACK();                 break;
     case 'F':  LEFT_3();               break;
     case 'G':  LEFT_2();               break;
     case 'H':  LEFT_1();               break;
     case 'Z':  STOP();                 break;
     case 'L':  Motor_PWM = 240;        break;
     case 'M':  Motor_PWM = 130;        break;
   }
}

void IO_init(){ 
   
  pinMode(PWMA, OUTPUT);
  pinMode(DIRA1, OUTPUT);
  pinMode(DIRA2, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(DIRB1, OUTPUT);
  pinMode(DIRB2, OUTPUT);
  pinMode(PWMC, OUTPUT);
  pinMode(DIRC1, OUTPUT);
  pinMode(DIRC2, OUTPUT);
  pinMode(PWMD, OUTPUT);
  pinMode(DIRD1, OUTPUT);
  pinMode(DIRD2, OUTPUT);
  STOP();
}

void setup(){ 
   
  int error,type;
  Serial.begin(9600);
  delay(300) ;//added delay to give wireless ps2 module some time to startup, before configuring it
  //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, false, false);

  type = ps2x.readType();
  switch (type) { 
   
  case 0:
    Serial.print("Unknown Controller type found ");
    break;
  case 1:
    Serial.print("DualShock Controller found ");
    break;
  case 2:
    Serial.print("GuitarHero Controller found ");
    break;
  case 3:
    Serial.print("Wireless Sony DualShock Controller found ");
    break;
  }
  IO_init();
}

void loop() { 
   
  byte vibrate = 0;
  UART_Control();//串口接收处理 
  ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
//start 开始运行,电机初PWM为120;
    if (ps2x.Button(PSB_START))  { 
   
      Serial.println("Start");
     Motor_PWM = 90;
      ADVANCE();
    }
// 电机正转;
    if (ps2x.Button(PSB_PAD_UP)) { 
   
      Serial.println("Up held this hard: ");
      Motor_PWM = 120;
     ADVANCE();
    }

// 电机反转;
    if (ps2x.Button(PSB_PAD_DOWN)) { 
   
      Serial.println("Down held this hard: ");
       Motor_PWM = 120;
      BACK();
    }

//左转;
    if (ps2x.Button(PSB_PAD_LEFT)) { 
   
      Serial.println("turn left ");
        Motor_PWM = 120;//200
      LEFT_1();
    }

//右转;
    if (ps2x.Button(PSB_PAD_RIGHT)) { 
   
      Serial.println("turn right");
        Motor_PWM = 120;//200
      RIGHT_1();
    }
// Stop
    if (ps2x.Button(PSB_SELECT)) { 
   
      Serial.println("stop");
      STOP();
    }
// 左平移
    if (ps2x.Button(PSB_PINK)) { 
   
      Serial.println("motor_pmove_left");
      LEFT_2();
    }
// 右平移
    if (ps2x.Button(PSB_RED)) { 
   
      Serial.println("motor_pmove_right");
      RIGHT_2();
    }

    vibrate = ps2x.Analog(PSAB_CROSS);  //this will set the large motor vibrate speed based on how hard you press the blue (X) button
    if (ps2x.NewButtonState()) { 
           //will be TRUE if any button changes state (on to off, or off to on)
      if(ps2x.Button(PSB_L3))
        Serial.println("L3 pressed");
      if(ps2x.Button(PSB_R3))
        Serial.println("R3 pressed");
      if(ps2x.Button(PSB_L2))
        Serial.println("L2 pressed");
      if(ps2x.Button(PSB_R2))
        Serial.println("R2 pressed");
      if(ps2x.Button(PSB_TRIANGLE))
        Serial.println("Triangle pressed");        
    }

    // 摇杆测试
    int LX,LY,RX,RY;
    LY=ps2x.Analog(PSS_LY);  //中间值127
    LX=ps2x.Analog(PSS_LX);  //中间值128
    RY=ps2x.Analog(PSS_RY);  //中间值127
    RX=ps2x.Analog(PSS_RX);  //中间值128
    Serial.print("Stick Values:");
    Serial.print(LY);
    Serial.print(LX);
    Serial.print(RY);
    Serial.println(RX);
    delay(20);
}

ps

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130636.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 循环队列 基本概念「建议收藏」

    循环队列 基本概念「建议收藏」循环队列是队列的一种特殊形式。首先介绍队列,然后引申出循环队列。队列又称为“先进先出”(FIFO)线性表限定插入操作只能在队尾进行,而删除操作只能在队首进行队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列队列的顺序表示—顺序队列用一组连续的存储单元依次存放从队首到队尾的元素,附设两个指针head和tail分别指向队首元素和队尾元素的位置,(有的地方用f…

    2022年5月6日
    62
  • tomcat大量time wait问题

    tomcat大量time wait问题在服务端访问量大的时候检测到大量的timewait,并且接口请求延时较高。执行netstat-n|awk‘/^tcp/{++S[$NF]}END{for(minS)printm,S[m]}’这个shell命令的意思是把netstat-n后结果的最后一条放到S[]数组中,如果相同则执行+1操作。此时能看到TCP各种状态下的连接数量,示例服务端架构是采用nginx

    2022年5月1日
    54
  • SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合

    SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合PS:因一客户的运营环境需求,需要nginx和resin整合,nginx负责处理静态页面部份,resin负责处理动态JSP部份。Resin是CAUCHO公司的产品,是一个非常流行的applicationserver,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发,而且Resin速度比Tomcat快,稳定性也比Tomcat好。关于各软件版本,我使用

    2022年5月12日
    53
  • navicat premium激活码_在线激活

    (navicat premium激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~08…

    2022年3月28日
    36
  • 520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!

    520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!昨天发表了一篇用python教你画心形图表白的文章:想要表白的看这里,教你用python画不同类型的心形图虏获芳心,值得收藏!!里面详细介绍了各种心形图的画法以及最终的表白神器,值得点赞收藏!!同样matlab也可以实现相同的功能并且还可以做得更好,今天就用教你用matlab画动态心形曲线图,不信请看下面:虏获芳心matlab画动态心形曲线图matlab画动态心形曲线图(基础版)matlab画3D心形图备注matlab画动态心形曲线图利用数学上的格式f(x)=x^2^/^3+e/3*(π-x^2

    2022年10月17日
    3
  • 青龙面板从零搭建教程(一)

    青龙面板从零搭建教程(一)大家好,QX系列教程教会了大家js脚本挂机的基础玩法,Boxjs为这个玩法提升了不少可玩性,但是IOS系统下最多支持2个账号,许多助力需求无法满足,应群友要求出一个青龙从零开始搭建教程,欢迎大家入群交流:106511927注意教程看不懂的话可以进群找群主帮你代挂!如果本教程看不懂或者操作出现问题,证明您的计算机专业知识并不支持本文章的搭建操作。第一步购买云服务器个人推荐阿里云服务器1核2G即可搞活动一年一百来块钱系统选择CentOs7等待配置完成。百度搜索Finalshell下载安装

    2022年6月13日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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