【问题标题】:Arduino Nano and analog joystickArduino Nano 和模拟操纵杆
【发布时间】:2018-05-25 23:40:53
【问题描述】:

我有一个包含 4 个运动方向的游戏(上下左右) 使用 Arduino Nano 和模拟操纵杆,看起来代码在其他帖子之前是正确的。

这是 Arduino 代码:

byte x_axis = A3;
byte y_axis = A1;
byte btn1 = 8;
byte btn2 = 9;
byte btn3 = 10;
byte btn4 = 11;
byte btn5 = 12;
byte led = 13;

void setup(){
  pinMode(x_axis, INPUT);
  pinMode(y_axis, INPUT);

  pinMode(btn1, INPUT);
  pinMode(btn2, INPUT);
  pinMode(btn3, INPUT);
   pinMode(btn4, INPUT);
   pinMode(btn5, INPUT);

  digitalWrite(btn1, HIGH);
  digitalWrite(btn2, HIGH);
  digitalWrite(btn3, HIGH);
  digitalWrite(btn4, HIGH);
  digitalWrite(btn5, HIGH);

  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  Serial.begin(9600);
}
void loop(){

  Int read_x = analogRead(x_axis);
  int read_y = analogRead(y_axis);

  if(read_x > 600){
    Serial.println("R");
    digitalWrite(led, HIGH);
  }
  if(read_x < 400){
    Serial.println("L");
    digitalWrite(led, HIGH);
  }
  if(read_y > 600){
    Serial.println("D");
    digitalWrite(led, HIGH);
  }
  if(read_y < 400){
    Serial.println("U");
   digitalWrite(led, HIGH);
  }

  if(digitalRead(btn1) == LOW){
    Serial.println("1");
    digitalWrite(led, HIGH);
  }
  if(digitalRead(btn2) == LOW){
    Serial.println("2");
    digitalWrite(led, HIGH);
   }
  if(digitalRead(btn3) == LOW){
    Serial.println("3");
    digitalWrite(led, HIGH);
   }
  if(digitalRead(btn4) == LOW){
    Serial.println("4");
    digitalWrite(led, HIGH);
  }
   if(digitalRead(btn5) == LOW){
    Serial.println("5");
    digitalWrite(led, HIGH);
   }

   delay(10);
   digitalWrite(led, LOW); 
}

但是当我使用串口监视器检查它时,它不停地显示UL,即使没有触摸操纵杆。​​p>

我该如何解决这个问题?

【问题讨论】:

  • 修复你的电路。
  • 要修复您的电路,直接打印出在两个轴上读取的值会有所帮助。从那里,您将能够判断您的电路是否错误,或者您选择的值是否关闭。
  • 我只尝试了没有任何电路的 Arduino,但它仍然显示随机值
  • @Emadmohseny 这是意料之中的。如果您没有连接任何东西,模拟输入的值将是由于存在任何噪声和随机波动。如果不连接输入,您将无法获得任何有意义的信息。

标签: arduino


【解决方案1】:

我感觉很慷慨,所以您的代码中存在一些抖动问题,您真的可以使用一些清理方法。此代码编译。好的,现在当操纵杆在 x/y 中为 0,0 时,它会在代码中抖动。您可以做的一件事是重新映射抖动以提供更宽的中心。将原始模拟值打印到串行监视器,然后用一点填充将它们映射到您的 0 点。参考:https://www.arduino.cc/reference/en/language/functions/math/map/

byte x_axis = A3;
byte y_axis = A1;
byte btn[] = {8, 9, 10, 11, 12}; // 2,3,4,5,6
byte stat[] = {1, 2, 3, 4, 5};
byte led = 13;
int dval = 50;

void setup() {
  pinMode(x_axis, INPUT);
  pinMode(y_axis, INPUT);

  for (int i = 0; i < 5; i++) {
    pinMode(btn[i], INPUT);
    digitalWrite(btn[i], HIGH);
  }
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);
}

void loop() {

  int read_x = analogRead(x_axis);
  delay(dval);
  int read_y = analogRead(y_axis);
  delay(dval);

  if (read_x > 600) {
    Serial.println("R");
    digitalWrite(led, HIGH);
  }
  if (read_x < 400) {
    Serial.println("L");
    digitalWrite(led, HIGH);
  }
  if (read_y > 600) {
    Serial.println("D");
    digitalWrite(led, HIGH);
  }
  if (read_y < 400) {
    Serial.println("U");
    digitalWrite(led, HIGH);
  }

  for (int i = 0; i < 5; i++) {
    if (digitalRead(btn[i]) == LOW) {
      Serial.println(stat[i]);
      digitalWrite(led, HIGH);
    }
  }
  delay(10);
  digitalWrite(led, LOW);
}

【讨论】:

    【解决方案2】:

    埃马德琼: 1- 检查你的操纵杆的接地和 Vdd 是否连接到你的 arduino。

    2- 将操纵杆的 x 和 y 连接到 arduino 模拟输入。

    使用此代码作为启动器:

    #define X_AXIS A1
    #define Y_AXIS A3
    
    
    void setup() {
     Serial.begin(9600);
    
    }
    
    void loop() {
      Serial.print("X = ");
      Serial.println(analogRead(X_AXIS);
      Serial.print("Y = ");
      Serial.println(analogRead(Y_AXIS);
      delay(150);
    
    }
    

    查看当您的操纵杆处于初始位置时获得的值。您可以在此代码的基础上构建按钮。 另外,不要忘记对按钮读数使用去抖动功能:

    if(digitalRead(Button1)==0){
      delay(40);
      if(digitalRead(Button1==0){
        buttonPressed=true;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多