Arduino 阿杜伊诺操纵杆库,don';t停止操纵杆
我正在用arduino pro micro在操纵杆上制作游戏板 从控制台输入上下命令,raspberry pi的gpio将输出这些命令,arduino将接收这些命令并将其输入游戏机 我使用ArduinoJoy SticklLibrary。 我想玩一场GBA游戏,但Dpad保持打印状态。 我怎么能只按一次向上键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
此外,在下面的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);
}