Arduino Nano и аналоговый джойстик - PullRequest
0 голосов
/ 24 мая 2018

У меня есть игра, которая состоит из 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); 
}

Но когда я использую последовательный монитор для проверки, он непрерывно показывает мне U и L даже без прикосновения к джойстику.

Как я могу решить эту проблему

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Emad joon: 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);

}

Посмотрите, какие значения вы получаете, когда ваша Joy Stick находится в исходном положении.Вы можете использовать этот код для кнопок.Кроме того, не забудьте использовать debouncing для ваших показаний кнопок:

if(digitalRead(Button1)==0){
  delay(40);
  if(digitalRead(Button1==0){
    buttonPressed=true;
  }
}
0 голосов
/ 25 мая 2018

Я чувствую себя щедрым, поэтому у вас есть некоторые проблемы с джиттером в коде, и вы действительно можете использовать некоторую очистку.Этот код компилируется.Хорошо, теперь, когда джойстик равен 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...