Arduino проект Servo глюк (игра на память) - PullRequest
0 голосов
/ 26 апреля 2018

Я недавно попал в Arduino с Rex Qualis Arduino Uno R3, и я пытаюсь создать проект, который побил бы игру памяти Simon (или Repeat the Beat).

Он ожидает ответа пользователя через одну из четырех кнопок, затем добавляет его в список, выполняет список, а затем ожидает ввода пользователя при следующем перемещении.

Все работает так, как положено, но самые странные вещи случаются при исполнении:

  • В первом цикле после полного выполнения серво 1 выполнит свою функцию перемещения без авторизации.
  • Во втором цикле после полного выполнения серво 2 выполнит свою функцию перемещения и т. Д.
  • После четвертого цикла, выполнения и серво 4, выполняющих свою функцию перемещения, это больше не происходит. Я не знаю, почему он циклически перебирает все сервоприводы один за другим в первых четырех циклах, а потом все в порядке, но это как бы ломает мой проект.

Есть ли проблема в моем коде, который перенаправляет на функции перемещения или что-то? Вся помощь приветствуется. Вот код для справки:

//Simon killer
//Da Cube

#include <Servo.h>

//Declare buttons
int button1 = 4;
int button2 = 5;
int button3 = 6;
int button4 = 7;

//Declare servos
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

int moves[100]; //Memory up to 100
int x = 0;
int y = 1;

void setup() {
  pinMode(button1, INPUT_PULLUP); //Button setup
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);

  servo1.attach(8); //Servo setup
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);

  moveServo1();//System check
  moveServo2();
  moveServo3();
  moveServo4();
}

//move functions
void moveServo1() {
  servo1.write(5);
  delay(500);
  servo1.write(45);
  delay(500);
}

void moveServo2() {
  servo2.write(5);
  delay(500);
  servo2.write(45);
  delay(500);
}

void moveServo3() {
  servo3.write(175);
  delay(500);
  servo3.write(135);
  delay(500);
}

void moveServo4() {
  servo4.write(5);
  delay(500);
  servo4.write(45);
  delay(500);
}

void loop() {
  //Read Input by button
  while (x < y) {
    if (digitalRead(button1) == LOW) {
      moves[x] = 1;
      x++;
    } else if (digitalRead(button2) == LOW) {
      moves[x] = 2;
      x++;
    } else if (digitalRead(button3) == LOW) {
      moves[x] = 3;
      x++;
    } else if (digitalRead(button4) == LOW) {
      moves[x] = 4;
      x++;
    }
  }
  y++;

  //Decode Memory Array
  for (int i = 0; i < (sizeof(moves)); i++) {
    switch (moves[i]) {
      case 1:
       moveServo1();
       break;
      case 2:
       moveServo2();
       break;
      case 3:
       moveServo3();
       break;
      case 4:
       moveServo4();
       break;
    }
  } 
}

1 Ответ

0 голосов
/ 27 апреля 2018

Сначала я бы проверил, не является ли код, который заставляет сервоприводы двигаться 1-4, не тем, что находится в цикле установки.

  moveServo1();//System check
  moveServo2();
  moveServo3();
  moveServo4();

Здесь вы делаете проверку системы серво, что означает, что каждый раз, когда вы включаете arduino, первый сервопривод будет двигаться, затем второй и так далее, и только тогда начинается цикл void ... закомментируйте эти строки и посмотрите, помогает

...