Почему команды выполняются сами по себе?

Вот программа, которую я использовал. Она работает нормально. Но я не знаю, почему иногда она работает сама по себе. Она используется для управления сварочным аппаратом (Arduino изолирован от заземления). Когда есть небольшая вибрация, код выполняет команду. Вот код:

int a = 9;  //правый привод переднего реле 1
int b = 12; //правый актуатор, реле реверса 2 (оранжевый 10)
int c = 10; //левый привод вперед реле 4
int d = 11; //левый актуатор обратного реле 3
int x = 0;
int y = 0;
const int stepPin = 8; // HIGH =DOWN; LOW == UP
const int dirPin = 7;

void setup() {
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(4, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600);
  digitalWrite(b, HIGH);
  digitalWrite(d, HIGH);
  delay(2000);
  digitalWrite(b, LOW);
  digitalWrite(d, LOW);
  delay(1000);
  Serial.println("press the foot swtich"); // Последовательный монитор для отладки
}

void loop() {
  int Val = digitalRead(5); // Зажим привода 1
  int ValR = digitalRead(6);// Зажим привода 2
  int ValS = digitalRead(4);//Шаговый двигатель против часовой стрелки
  int ValM = digitalRead(2);//Шаговый двигатель по часовой стрелке
  if (Val == LOW && x == 0  ) {
    Serial.print("Val000=");
    Serial.println(Val);
    digitalWrite(c, HIGH);
    delay(1750);
    digitalWrite(c, LOW);
    x = 1;
    Val = digitalRead(5);
    Serial.println("fwd");
    Serial.print("Val=");
    Serial.println(Val);
    delay(500);
  }
  if (Val == LOW && x == 1  ) {
    digitalWrite(d, HIGH);
    digitalWrite(b, HIGH);
    delay(2000);
    digitalWrite(d, LOW);
    digitalWrite(b, LOW);
    x = 0;
    Val = digitalRead(5);
    Serial.println("fwd");
    y = 0;
    Serial.print("Val=");
    Serial.println(Val);
    delay(500);
  }
  if (ValR == LOW && y == 0 ) {
    digitalWrite(a, HIGH);
    delay(1350);
    digitalWrite(a, LOW);
    y = 1;
    ValR = digitalRead(6);
    Serial.println("fwd");
    Serial.print("Val=");
    Serial.println(Val);
    delay(500);
  }
  if (ValR == LOW && y == 1 ) {
    digitalWrite(b, HIGH);
    delay(1200);
    digitalWrite(b, LOW);
    y = 0;
    ValR = digitalRead(6);
    Serial.println("fwd");
    Serial.print("Val=");
    Serial.println(Val);
    delay(500);
  }
  if (ValS == HIGH) {
    Serial.println(Val);
    Serial.println("up");
    digitalWrite(dirPin, HIGH);
    // Позволяет двигателю двигаться в определенном направлении
    // Создает 100 импульсов для совершения полупериода вращения
    for (int x = 0; x < 100; x++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(1000);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(1000);
    }
    // Позволяет двигателю двигаться в определенном направлении
    // Создает 200 импульсов для совершения одного полного цикла вращения
  }
  if (ValM == LOW) {
    Serial.println("down");
    Serial.println(ValR);
    digitalWrite(dirPin, LOW);
    // Позволяет двигателю двигаться в определенном направлении
    // Создает 200 импульсов для совершения одного полного цикла вращения
    for (int x = 0; x < 100; x++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(1000);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(1000);
    }
    // Позволяет двигателю двигаться в определенном направлении
    // Создает 200 импульсов для совершения одного полного цикла вращения
  }
}

, 👍1

Обсуждение

1. Под «работает сам по себе» вы подразумеваете, что он действует так, как будто нажаты кнопки, включая печать отладочного вывода? 2. Внутренние подтяжки, включаемые INPUT_PULLUP, довольно слабые (около 30 кОм). В шумной среде вам, скорее всего, захочется использовать более сильные внешние подтяжки (т. е. меньшее сопротивление)., @Edgar Bonet

да, это действует так, как будто кнопка нажата, при последовательной отладке также и машина тоже работает. Может ли устранение дребезга решить эту проблему, если да, то как я могу добавить ее?, @Karan Shete

Устранение дребезга может помочь если оно также устраняет сбои. Но, вероятно, безопаснее начать с чистого сигнала. Поэтому я бы сначала попробовал слабую подтяжку. Какое расстояние между кнопками и платой Arduino?, @Edgar Bonet

Что именно происходит? Какие сообщения вы видите на последовательном мониторе? Может быть, это оторвавшиеся провода или соприкасающиеся провода? Дополнительная информация поможет нам помочь вам., @sa_leinad

любой из цикла if() запускается случайным образом. Есть реле, которое используется для включения сварочного пистолета.. оно не управляется arduino, оно независимое... но всякий раз, когда реле активируется, arduino выполняет оператор if.... никакие провода не отсоединены, @Karan Shete

Достаточно ли резистора 10 кОм для более сильных сигналов?, @Karan Shete

Я бы сразу перешел на 1 кОм. Кроме того, если ваши кнопки находятся дальше, скажем, 10 см от платы Arduino, я бы подключил их витой парой (сигнал и земля на одной паре), чтобы предотвратить индуктивные наводки., @Edgar Bonet

@EdgarBonet Пожалуйста, не отвечайте в комментариях. Это полностью противоречит модели Stack Exchange. **Сделайте ответ**., @Nick Gammon

Комментарии под вопросами предназначены для прояснения вопроса. Они **не предназначены для создания мини-ответов**., @Nick Gammon

Можете ли вы дать подробную информацию о вашей схеме оборудования, в плане того, спаяна ли проводка или макетная плата/плотная сборка. Если у вас было неплотное соединение, это могло бы быть подвержено вибрациям., @MichaelT

ПАЯНО. реле сварочного пистолета создает сильное электромагнитное поле, @Karan Shete


1 ответ


Лучший ответ:

0

Пытаюсь написать правильный ответ...

По вашему описанию, похоже, вы стали жертвой индуктивного Шумоподавитель. Схема [MCU → заземляющий контакт Arduino → педаль → [Цифровой входной контакт Arduino → MCU] представляет собой контур, который может улавливать магнитное поле. поток. Если этот поток меняется, либо потому, что меняется магнитное поле (окружающий электромагнитный шум) или из-за геометрии схемы изменения (вы перемещаете провода), это вызовет электромагнитную силу который может заставить ваш Arduino считывать LOW даже когда кнопка не нажата нажат.

Есть две вещи, которые вы можете попробовать преодолеть этот эффект:

  1. Замените слабый внутренний подтягивающий резистор Arduino на гораздо более сильный внешний подтягивающий резистор. Что-то около 1 кОм должно сделать его довольно трудным для шум, чтобы понизить уровень сигнала.
  2. Подключите педаль к плате Arduino с помощью витой пары проводов, как те, что находятся в телефонных или сетевых кабелях. Этот вид кабель хорошо справляется с минимизацией индуктивных наводок.
,

Я попробую с резистором 1k. Кнопка на самом деле является ножным переключателем на расстоянии 10 футов от ардуино, @Karan Shete

Проблема та же самая с резистором 1 кОм. Провода экранированы должным образом., @Karan Shete

Это происходит только при активации реле сварочного пистолета., @Karan Shete

Сварочный пистолет может быть источником сильного электромагнитного шума., @Edgar Bonet

что я могу сделать сейчас?, @Karan Shete