Серводвигатель не работает должным образом с Arduino

У меня возникла проблема с моим режимом работы — автоматической подачей еды с помощью поезда.

У меня есть 4 серводвигателя, функция первого серводвигателя — подключить направляющую к столу №1, второго — к столу №2, а третьего и четвертого — к столу №3.

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

Я проверил все основания и полномочия. они все хороши.

Пожалуйста, помогите мне, так как через два дня я получу окончательный вариант.

Код приведен ниже.. Пожалуйста, проверьте и сообщите мне, есть ли у меня логическая ошибка в моем коде или какая-либо другая проблема, связанная с оборудованием, а также сообщите мне, есть ли у них какой-либо кеш в Arduino, который мне нужно очистить, или что-то в этом роде.

#include <Servo.h>

Servo motor;  // создаем объект сервопривода для управления сервоприводом
// двенадцать сервообъектов можно создать на большинстве плат

const int button1 = A1; 
const int button2 = A2;
const int button3 = A3; 

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;


void setup() {

  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);

  servo1.attach(9);
  servo2.attach(11);
  servo3.attach(6);
  servo4.attach(5);  

  Serial.begin(9600);
}


void loop() {   

  buttonState1 = digitalRead(button1);
  buttonState2 = digitalRead(button2);
  buttonState3 = digitalRead(button3);

  if (buttonState1 == HIGH) {
    int pos1 = 180;
    int pos2 = 180;
    int pos3 = 90;
    int pos4 = 90;

    for (int pos2=90; pos2 <= 180; pos2 += 1) {
      servo2.write(pos2);
      delay(0);
    }
    for (int pos1=90; pos1 <= 180; pos1 += 1) {
      servo1.write(pos1);
      delay(50);
    }

    while (pos1 >= 0 && pos2 >= 0 && pos3 >= 0 && pos4 <= 180) {
// servo1.writeMicroсекунды (1000);

// servo1.write(pos1);
// servo2.write(pos2);
      servo3.write(pos3); 
      servo4.write(pos4);
      delay(200000);                // задержка 500 мс
    }

  }
  else if (buttonState2 == HIGH) {

    int pos5 = 90;
    int pos6 = 0;

    for (int pos5=90; pos5 >= 0; pos5 -= 1) {
      servo1.write(pos5);
      delay(0);
    }
    for (int pos6=90; pos6 >= 0; pos6 -= 1) {
      servo2.write(pos6);
      delay(50);
    }

    while ( pos6 <= 180 && pos5 <= 180) {

// servo2.write(pos6);
// servo1.write(pos5);
      delay(200);              
    } 
// while ( pos5 <= 180) {
// servo1.write(pos5);
// задержка(200);
// }

  }
  else if (buttonState3 == HIGH) {
    int pos9 = 90;
    int pos10 = 180;
    int pos11 = 0;
    int pos12 = 180;

    for (int pos10=90; pos10 <= 180; pos10 += 1) {
      servo2.write(pos10);
      delay(0);
    }
    for (int pos9=90; pos9 >= 0; pos9 -= 1) {
      servo1.write(pos9);
      delay(0);
    }
    for (int pos11=90; pos11 >= 0; pos11 -= 1) {
      servo3.write(pos11);
      delay(30);
    }
    for (int pos12=90; pos12 <= 180; pos12 += 5) {
      servo4.write(pos12);
      delay(50);
    }

    while ( pos9 <= 180 && pos10 >= 0 && pos11 >= 0 && pos12 >= 0) {

// servo1.write(pos9);
// servo2.write(pos10);
// servo3.write(pos11);
// servo4.write(pos12);
// задержка(200);
    } 
// while ( pos9 <= 180) {
// servo1.write(pos9);
// задержка(200);
// }
  }

}

, 👍-1

Обсуждение

Попробуйте написать минимальный пример, который работает только для одного из ваших «треков», и тогда вы увидите, в чем заключается проблема., @MichaelT


1 ответ


1

Я думаю, что причина, по которой вы не получаете ожидаемого результата, заключается в том, что вы используете циклы while в if условии.

Поскольку у вас циклы не имеют условий завершения. В случае нажатия первой кнопки вы получите то, что хотите, потому что у вас есть только один не завершающийся цикл while, а в случае с кнопкой 2 и кнопкой 3 их два. циклы и оба не завершаются.

В этом случае, если ваша логика входит в первый цикл while, она никогда не выходит из него и не переходит во второй цикл.

Я не знаю, что вы задумали, поэтому не могу предлагать изменения в логике, но добавление завершения в цикл while может дать ожидаемые результаты.

,