如何使操纵杆在Arduino上一次工作

时间:2019-05-02 15:37:37

标签: arduino joystick

我正在使用Arduino制作自己的控制器,并且正在使用2个操纵杆。第一个操纵杆是四处移动,第二个是环顾四周。因此,当我使用使我走动的第一个操纵杆然后又想环顾四周时,却不允许我同时做这两种事情。

我将两个操纵杆的“控制器”都置于一个空循环中,这就是为什么它不起作用的原因。

这是我得到的第一个视图:

#include <Mouse.h>
#include <Keyboard.h>
int Button1 = 7;  // øverste knap
int Button2 = 9;  // højre knap
int Button3 = 8;  // venstre knap
int Button4 = 10; // nederste knap

//joystick
int horzPin = A1;  // For x pin
int vertPin = A2;  // For y pin
int selPin = 2;  // For knap pin 

int vertZero, horzZero;  // Gemmer den indledende værdi for hver akse, normalt omkring 512
int vertValue, horzValue;  // Gemmer den nuværende værdi af akserne.
int mouseClickFlag = 0; // For musens knap Sprint

int MushorzPin = A3;  // For x pin
int MusvertPin = A4;  // For y pin
int MusselPin = 3;  // For knap pin

int MusvertZero, MushorzZero;  // Gemmer den indledende værdi for hver akse, normalt omkring 512
int MusvertValue, MushorzValue;  // Gemmer den nuværende værdi af akserne.
const int sensitivity = 200;  // Jo højere sensitivity der er jo langsommere er musen. Skulle være omkring 300
int MusmouseClickFlag = 0; // For musens knap


void setup() {

  Serial.begin(9600);
  pinMode(Button1,INPUT);
  joyMovSetup();
  joystickMouseSetup();


}

void loop() {
btnHIGH();
btnLOW();
joyStickMouseEngine();
joyMovEngine();

}

这是给鼠标的:

bool isPressed = false;

void joystickMouseSetup() {
  pinMode(MushorzPin, INPUT);  // Sætter pinsene til input
  pinMode(MusvertPin, INPUT);
  pinMode(MusselPin, INPUT);  // sætter knappen pin til input
  digitalWrite(MusselPin, HIGH);  // Sætter knap pin til høj fordi den ikke er trykket
  delay(1000);  // Lille kort pause for at få tingene til at fungere
  MusvertZero = analogRead(MusvertPin);  // Får start positionernes input
  MushorzZero = analogRead(MushorzPin);  // Joystikket skulle være neutralt når dette forekommer
}



void joyStickMouseEngine() {
  MusvertValue = analogRead(MusvertPin) - MusvertZero;  // Læser y aksens position
  MushorzValue = analogRead(MushorzPin) - MushorzZero;  // Læser x aksens position

  if (MusvertValue != 0)
    Mouse.move(0, MusvertValue/sensitivity, 0);  // Rykker musen på y aksen
  if (MushorzValue != 0)
    Mouse.move(MushorzValue/sensitivity, 0, 0);  // Rykker musen på x aksen

  if ((digitalRead(MusselPin) == LOW))  // Hvis joystick knappen er trykket
  {
   if (isPressed == true) {
      // Slukker knappen

    Keyboard.begin();
    Keyboard.release(KEY_LEFT_SHIFT);  // Slipper shift
    delay(300);
     isPressed = false;
     return;

   } if (isPressed == false) {

    Keyboard.begin();
    Keyboard.press(KEY_LEFT_SHIFT);  // Slipper shift
    delay(300);
     isPressed = true;
     return;
   }


    }


  } 

这是为了移动播放器:

void joyMovSetup() {

  pinMode(horzPin, INPUT);  // Sætter pinsene til input
  pinMode(vertPin, INPUT);
  pinMode(selPin, INPUT);  // sætter knappen pin til input
  digitalWrite(selPin, HIGH);  // Sætter knap pin til høj fordi den ikke er trykket
  delay(1000);  // Lille kort pause for at få tingene til at fungere
  vertZero = analogRead(vertPin);  // Får start positionernes input
  horzZero = analogRead(horzPin);  // Joystikket skulle være neutralt når dette forekommer
}


void joyMovEngine() {

  int sensorValueX = analogRead(horzPin);
  int sensorValueY = analogRead(vertPin);

 if (sensorValueY < 20){
   Keyboard.press('w');
   delay(20);
   Keyboard.release('w'); 
    }

   else if(sensorValueX < 20){
    Keyboard.press('a');
    delay(20);
    Keyboard.release('a');
     }

   else if(sensorValueY > 1000){
    Keyboard.press('s');
    delay(20);
    Keyboard.release('s');
     }

   else if(sensorValueX > 1000){
    Keyboard.press('d');
    delay(20);
    Keyboard.release('d');
     }

  if ((digitalRead(selPin) == 0) && (!mouseClickFlag))  // Hvis joystick knappen er trykket
  {
    mouseClickFlag = 1;
    Keyboard.begin();
    Keyboard.press(KEY_LEFT_CTRL);  // Trykker på shift
  }
  if ((digitalRead(selPin))&&(mouseClickFlag)) // Hvis joystick knappen ikke er trykket
  {
    mouseClickFlag = 0;
    Keyboard.begin();
    Keyboard.release(KEY_LEFT_CTRL);  // Slipper shift
  }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试使用中断。为此,点击操纵杆的模拟输出并将其连接到Arduino上的中断使能引脚。然后将中断设置为在检测到输入上升或下降时工作。

您还可以尝试使用FreeRTOS,这将使您一次读取两个操纵杆。