Почему команды выполняются сами по себе?
Вот программа, которую я использовал. Она работает нормально. Но я не знаю, почему иногда она работает сама по себе. Она используется для управления сварочным аппаратом (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 импульсов для совершения одного полного цикла вращения
}
}
@Karan Shete, 👍1
Обсуждение1 ответ
Лучший ответ:
Пытаюсь написать правильный ответ...
По вашему описанию, похоже, вы стали жертвой индуктивного
Шумоподавитель. Схема [MCU → заземляющий контакт Arduino → педаль →
[Цифровой входной контакт Arduino → MCU] представляет собой контур, который может улавливать магнитное поле.
поток. Если этот поток меняется, либо потому, что меняется магнитное поле
(окружающий электромагнитный шум) или из-за геометрии схемы
изменения (вы перемещаете провода), это вызовет электромагнитную силу
который может заставить ваш Arduino считывать LOW
даже когда кнопка не нажата
нажат.
Есть две вещи, которые вы можете попробовать преодолеть этот эффект:
- Замените слабый внутренний подтягивающий резистор Arduino на гораздо более сильный внешний подтягивающий резистор. Что-то около 1 кОм должно сделать его довольно трудным для шум, чтобы понизить уровень сигнала.
- Подключите педаль к плате Arduino с помощью витой пары проводов, как те, что находятся в телефонных или сетевых кабелях. Этот вид кабель хорошо справляется с минимизацией индуктивных наводок.
Я попробую с резистором 1k. Кнопка на самом деле является ножным переключателем на расстоянии 10 футов от ардуино, @Karan Shete
Проблема та же самая с резистором 1 кОм. Провода экранированы должным образом., @Karan Shete
Это происходит только при активации реле сварочного пистолета., @Karan Shete
Сварочный пистолет может быть источником сильного электромагнитного шума., @Edgar Bonet
что я могу сделать сейчас?, @Karan Shete
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
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