【问题标题】:how to make to joysticks work at once on Arduino如何使操纵杆在 Arduino 上立即工作
【发布时间】:2019-05-02 15:37:36
【问题描述】:

我正在使用 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
  }
}

【问题讨论】:

  • 你能提供这两个功能的实现吗?某处可能有阻塞元素
  • 现在我已经把所有的代码都放进去了。

标签: arduino joystick


【解决方案1】:

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

您也可以尝试使用 FreeRTOS,它可以让您一次读取两个操纵杆。​​p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多