Arduino 阿杜伊诺操纵杆库,don';t停止操纵杆

Arduino 阿杜伊诺操纵杆库,don';t停止操纵杆,arduino,joystick,gamepad,Arduino,Joystick,Gamepad,我正在用arduino pro micro在操纵杆上制作游戏板 从控制台输入上下命令,raspberry pi的gpio将输出这些命令,arduino将接收这些命令并将其输入游戏机 我使用ArduinoJoy SticklLibrary。 我想玩一场GBA游戏,但Dpad保持打印状态。 我怎么能只按一次向上键 此外,在下面的GIF中,上下键一次按下一次,但在中间按下右键或其他键不响应。 作为补充,我使用了一款名为retro freak的游戏机。 该代码使用以下代码 arduino_pro_m

我正在用arduino pro micro在操纵杆上制作游戏板

从控制台输入上下命令,raspberry pi的gpio将输出这些命令,arduino将接收这些命令并将其输入游戏机

我使用ArduinoJoy SticklLibrary。

我想玩一场GBA游戏,但Dpad保持打印状态。 我怎么能只按一次向上键

此外,在下面的GIF中,上下键一次按下一次,但在中间按下右键或其他键不响应。

作为补充,我使用了一款名为retro freak的游戏机。

该代码使用以下代码

arduino_pro_micro_gamepad.ino

#include <Joystick.h>

#define OFFSET_BUTTON 2
#define OFFSET_DPAD 18

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
  4, 0,                  // Button Count, Hat Switch Count
  true, true, false,     // X and Y, but no Z Axis
  false, false, false,   // No Rx, Ry, or Rz
  false, false,          // No rudder or throttle
  false, false, false);  // No accelerator, brake, or steering

void setup() {
  // Initialize Button Pins
  pinMode(2, INPUT_PULLUP);  // Button 1
  pinMode(3, INPUT_PULLUP);  // Button 2
  pinMode(4, INPUT_PULLUP);  // Button 3
  pinMode(5, INPUT_PULLUP);  // Button 3
  
  pinMode(18, INPUT_PULLUP); // D-pad Up
  pinMode(19, INPUT_PULLUP); // D-pad Right
  pinMode(20, INPUT_PULLUP); // D-pad Down
  pinMode(21, INPUT_PULLUP); // D-pad Left

  Joystick.begin();
  Joystick.setXAxisRange(-1, 1);
  Joystick.setYAxisRange(-1, 1);
  Joystick.setYAxis(0);
  Joystick.setYAxis(0);
}

// Last state of the buttons
int lastDpadState[4] = {0,0,0,0};  // Up, Right, Down, Left
int lastButtonState[4] = {0,0,0,0};  // Button 1 - 4

void updateDpad() {
  for (int i = 0; i <= 3; i++) {
    int currentDpadState = digitalRead(i + OFFSET_DPAD);
    if (currentDpadState != lastDpadState[i]) {
      switch (i) {
        case 0: // UP
          if (currentDpadState == 1) {
            Joystick.setYAxis(-1);
          }
          break;
        case 1: // RIGHT
          if (currentDpadState == 1) {
            Joystick.setXAxis(1);
          }
          break;
        case 2: // DOWN
          if (currentDpadState == 1) {
            Joystick.setYAxis(1);
          }
          break;
        case 3: // LEFT
          if (currentDpadState == 1) {
            Joystick.setXAxis(-1);
          }
          break;
        }
      lastDpadState[i] = currentDpadState;
    }
  }
}

void updateButton() {
  for (int i = 0; i <= 3; i++) {
    int currentButtonState = !digitalRead(i + OFFSET_BUTTON);
    if (currentButtonState != lastButtonState[i]) {
      Joystick.setButton(i, currentButtonState);
      lastButtonState[i] = currentButtonState;
    }
  }
}

void loop() {
  updateDpad();
  updateButton();
  delay(5);
}

只需在setup()中对代码进行一点修改

改为:

  Joystick.setXAxis(0);
  Joystick.setYAxis(0);

尝试在…之前重置为初始值。。。或者在行动之后

if (currentDpadState != lastDpadState[i]) {
   reset();
   switch (i) {
    ...
   }
}


void reset(){
Joystick.setXAxis(0);
Joystick.setYAxis(0);
}

我的问题是使用操纵杆而不是开关

我想要的实现是只输入一次箭头键,所以我使用了hatswitch

#include <Joystick.h>

#define OFFSET_BUTTON 2
#define OFFSET_DPAD 18

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_GAMEPAD,
  9,1,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  pinMode(2, INPUT_PULLUP);  // Button 1
  pinMode(3, INPUT_PULLUP);  // Button 2
  pinMode(4, INPUT_PULLUP);  // Button 3
  pinMode(5, INPUT_PULLUP);  // Button 4
  pinMode(6, INPUT_PULLUP);  // Button 5
  pinMode(7, INPUT_PULLUP);  // Button 6
  pinMode(8, INPUT_PULLUP);  // Button 7
  pinMode(9, INPUT_PULLUP);  // Button 8
  pinMode(10, INPUT_PULLUP);  // Button 9

  pinMode(18, INPUT_PULLUP); // D-pad Up
  pinMode(19, INPUT_PULLUP); // D-pad Right
  pinMode(20, INPUT_PULLUP); // D-pad Down
  pinMode(21, INPUT_PULLUP); // D-pad Left
  
  Joystick.begin();
}

// Last state of the pins
int lastDpadState[2][4] = {{0,0,0,0}, {0,0,0,0}};
int lastButtonState[10] = {0,0,0,0,0,0,0,0,0,0};  // Button 1 - 10


void updateDpad(){
  bool valueChanged[2] = {false, false};
  int currentPin = 18;

  // Read pin values
  for (int hatSwitch = 0; hatSwitch < 2; hatSwitch++){
    for (int index = 0; index < 4; index++){
      int currentDpadState = !digitalRead(currentPin++);
      if (currentDpadState != lastDpadState[hatSwitch][index]){
        valueChanged[hatSwitch] = true;
        lastDpadState[hatSwitch][index] = currentDpadState;
      }
    }
  }

  for (int hatSwitch = 0; hatSwitch < 2; hatSwitch++)
  {
    if (valueChanged[hatSwitch]) {
      if ((lastDpadState[hatSwitch][0] == 0)
        && (lastDpadState[hatSwitch][1] == 0)
        && (lastDpadState[hatSwitch][2] == 0)
        && (lastDpadState[hatSwitch][3] == 0)) {
          Joystick.setHatSwitch(hatSwitch, -1);
      }
      if (lastDpadState[hatSwitch][0] == 1) {
        Joystick.setHatSwitch(hatSwitch, 0); // up
      }
      if (lastDpadState[hatSwitch][1] == 1) {
        Joystick.setHatSwitch(hatSwitch, 90); // right
      }
      if (lastDpadState[hatSwitch][2] == 1) {
        Joystick.setHatSwitch(hatSwitch, 180); // down
      }
      if (lastDpadState[hatSwitch][3] == 1) {
        Joystick.setHatSwitch(hatSwitch, 270);
      }
    } // if the value changed
  } // for each hat switch
}

void updateButton() {
  for (int i = 0; i <= 9; i++) {
    int currentButtonState = !digitalRead(i + OFFSET_BUTTON);
    if (currentButtonState != lastButtonState[i]) {
      Joystick.setButton(i, currentButtonState);
      lastButtonState[i] = currentButtonState;
    }
  }
}

void loop() {
  updateDpad();
  updateButton();
  delay(50);
}
#包括
#定义偏移量按钮2
#定义偏移量_dpad18
操纵杆(操纵杆默认报告ID),
操纵杆类型游戏板,
9,1,
假,假,假,假,假,假,假,
假,假,假,假,假,假);
无效设置(){
pinMode(2,输入\上拉);//按钮1
pinMode(3,输入\上拉);//按钮2
pinMode(4,输入\上拉);//按钮3
pinMode(5,输入\上拉);//按钮4
pinMode(6,输入\上拉);//按钮5
pinMode(7,输入\上拉);//按钮6
pinMode(8,输入\上拉);//按钮7
pinMode(9,输入\上拉);//按钮8
pinMode(10,输入\上拉);//按钮9
pinMode(18,输入\上拉);//D-pad上拉
pinMode(19,输入_上拉);//右键D-pad
pinMode(20,输入_上拉);//D-pad-Down
pinMode(21,输入_上拉);//左D键
操纵杆。开始();
}
//引脚的最后状态
int lastDpadState[2][4]={0,0,0,0},{0,0,0};
int lastButtonState[10]={0,0,0,0,0,0,0,0};//按钮1-10
void updateDpad(){
bool valueChanged[2]={false,false};
int currentPin=18;
//读取引脚值
对于(int-hatSwitch=0;hatSwitch<2;hatSwitch++){
对于(int-index=0;index<4;index++){
int currentDpadState=!digitalRead(currentPin++);
如果(currentDpadState!=lastDpadState[hatSwitch][index]){
valueChanged[hatSwitch]=真;
lastDpadState[hatSwitch][index]=当前DPadState;
}
}
}
对于(int-hatSwitch=0;hatSwitch<2;hatSwitch++)
{
如果(值已更改[hatSwitch]){
if((lastDpadState[hatSwitch][0]==0)
&&(lastDpadState[hatSwitch][1]==0)
&&(lastDpadState[hatSwitch][2]==0)
&&(lastDpadState[hatSwitch][3]==0)){
操纵杆。设置HAT开关(HAT开关,-1);
}
if(lastDpadState[hatSwitch][0]==1){
操纵杆。设置hatSwitch(hatSwitch,0);//向上
}
if(lastDpadState[hatSwitch][1]==1){
操纵杆。设置hatSwitch(hatSwitch,90);//右侧
}
if(lastDpadState[hatSwitch][2]==1){
操纵杆。设置hatSwitch(hatSwitch,180);//向下
}
if(lastDpadState[hatSwitch][3]==1){
操纵杆。设置HAT开关(HAT开关,270);
}
}//如果值已更改
}//对于每个帽子开关
}
void updateButton(){
对于(int i=0;i
if (currentDpadState != lastDpadState[i]) {
   reset();
   switch (i) {
    ...
   }
}


void reset(){
Joystick.setXAxis(0);
Joystick.setYAxis(0);
}
#include <Joystick.h>

#define OFFSET_BUTTON 2
#define OFFSET_DPAD 18

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_GAMEPAD,
  9,1,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  pinMode(2, INPUT_PULLUP);  // Button 1
  pinMode(3, INPUT_PULLUP);  // Button 2
  pinMode(4, INPUT_PULLUP);  // Button 3
  pinMode(5, INPUT_PULLUP);  // Button 4
  pinMode(6, INPUT_PULLUP);  // Button 5
  pinMode(7, INPUT_PULLUP);  // Button 6
  pinMode(8, INPUT_PULLUP);  // Button 7
  pinMode(9, INPUT_PULLUP);  // Button 8
  pinMode(10, INPUT_PULLUP);  // Button 9

  pinMode(18, INPUT_PULLUP); // D-pad Up
  pinMode(19, INPUT_PULLUP); // D-pad Right
  pinMode(20, INPUT_PULLUP); // D-pad Down
  pinMode(21, INPUT_PULLUP); // D-pad Left
  
  Joystick.begin();
}

// Last state of the pins
int lastDpadState[2][4] = {{0,0,0,0}, {0,0,0,0}};
int lastButtonState[10] = {0,0,0,0,0,0,0,0,0,0};  // Button 1 - 10


void updateDpad(){
  bool valueChanged[2] = {false, false};
  int currentPin = 18;

  // Read pin values
  for (int hatSwitch = 0; hatSwitch < 2; hatSwitch++){
    for (int index = 0; index < 4; index++){
      int currentDpadState = !digitalRead(currentPin++);
      if (currentDpadState != lastDpadState[hatSwitch][index]){
        valueChanged[hatSwitch] = true;
        lastDpadState[hatSwitch][index] = currentDpadState;
      }
    }
  }

  for (int hatSwitch = 0; hatSwitch < 2; hatSwitch++)
  {
    if (valueChanged[hatSwitch]) {
      if ((lastDpadState[hatSwitch][0] == 0)
        && (lastDpadState[hatSwitch][1] == 0)
        && (lastDpadState[hatSwitch][2] == 0)
        && (lastDpadState[hatSwitch][3] == 0)) {
          Joystick.setHatSwitch(hatSwitch, -1);
      }
      if (lastDpadState[hatSwitch][0] == 1) {
        Joystick.setHatSwitch(hatSwitch, 0); // up
      }
      if (lastDpadState[hatSwitch][1] == 1) {
        Joystick.setHatSwitch(hatSwitch, 90); // right
      }
      if (lastDpadState[hatSwitch][2] == 1) {
        Joystick.setHatSwitch(hatSwitch, 180); // down
      }
      if (lastDpadState[hatSwitch][3] == 1) {
        Joystick.setHatSwitch(hatSwitch, 270);
      }
    } // if the value changed
  } // for each hat switch
}

void updateButton() {
  for (int i = 0; i <= 9; i++) {
    int currentButtonState = !digitalRead(i + OFFSET_BUTTON);
    if (currentButtonState != lastButtonState[i]) {
      Joystick.setButton(i, currentButtonState);
      lastButtonState[i] = currentButtonState;
    }
  }
}

void loop() {
  updateDpad();
  updateButton();
  delay(50);
}