Ардуино не читает состояния контактов
Кажется, у меня есть невероятная вещь. Мой код отлично работал на одном Arduino, когда я загружаю тот же скетч на другой, он ведет себя странно, кажется, что он не читает ни одно из моих состояний контактов:
Код предназначен для управления простым шаговым двигателем с драйвером. в зависимости от состояния нескольких штифтов, в какую сторону он двигается или двигается вообще.
Сейчас происходит то, что когда я загружаю скетч, двигатель начинает вращаться, независимо от того, какой контакт имеет любой из входных контактов, двигатель просто включает загрузку, и даже если я подаю 5 В на любой из контактов, он просто продолжает работать. поворот в том же направлении.
Соблюдение кода. Я надеюсь, что кто-нибудь может сказать мне, что я делаю неправильно, я новичок в программировании:
int PUL=7; //определяем выход Pulse
int DIR=8; //определить пин направления
//целое значение ENA=5; //определяем контакт включения
int up = 2;
int down = 3;
int limitpin=1;
int limitpinup=4;
int i=0;
int buttonupstate = 0;
int buttondownstate = 0;
int limitstate=0;
int limitstateup=0;
void setup() {
pinMode(PUL, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(up, INPUT);
pinMode(down, INPUT);
pinMode(limitpin, INPUT);
pinMode(limitpinup, INPUT);
}
void loop() {
buttonupstate = digitalRead(up);
buttondownstate = digitalRead(down);
limitstate = digitalRead(limitpin);
limitstateup = digitalRead(limitpinup);
i = 0;
switch (limitstateup){
case LOW:
switch (limitstate){
case LOW:
if (buttondownstate==HIGH){
do
{
digitalWrite(DIR,LOW);
// цифровая запись(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(20);
digitalWrite(PUL,LOW);
delayMicroseconds(20);
buttondownstate = 0;
buttondownstate = digitalRead(down);
limitstate == 0;
limitstate = digitalRead(limitpin);
limitstateup == 0;
limitstateup = digitalRead(limitpinup);
} while (buttondownstate == HIGH && limitstate == 0 && limitstateup == 0);
}
if (buttonupstate == HIGH){
do
{
digitalWrite(DIR,HIGH);
// цифровая запись(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(20);
digitalWrite(PUL,LOW);
delayMicroseconds(20);
buttonupstate = 0;
buttonupstate = digitalRead(up);
limitstate == 0;
limitstate = digitalRead(limitpin);
limitstateup == 0;
limitstateup = digitalRead(limitpinup);
} while (buttonupstate == HIGH && limitstate == 0 && limitstateup == 0);
}
break;
case HIGH:
do{
digitalWrite(DIR,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(20);
digitalWrite(PUL,LOW);
delayMicroseconds(20);
limitstate = 0;
limitstate = digitalRead(limitpin);
}while (limitstate == HIGH );
break;
}
break;
case HIGH:
do{
digitalWrite(DIR,LOW);
digitalWrite(PUL,HIGH);
delayMicroseconds(20);
digitalWrite(PUL,LOW);
delayMicroseconds(20);
limitstateup = 0;
limitstateup = digitalRead(limitpinup);
}while (limitstateup == HIGH );
break;
}
}
@Stephane, 👍2
Обсуждение1 ответ
Спасибо всем вам,
Действительно, в моем коде нет ничего плохого. Проблема действительно в подтягивающих резисторах, перестроил соединение на макетке и работает отлично. Мне нужно проверить мою плату, которая содержит все реле и резисторы, проблема должна быть на этой плате, плохой контакт или что-то в этом роде.
Однако я хотел бы заявить, что на плате Osoyoo Uno все работало идеально, поэтому между платой Osoyoo Uno и другой платой Arduino должно быть что-то другое.
Вот схема моей печатной платы. Я проверил это еще раз, но я думаю, что на всех цифровых выводах на самом деле активны подтягивающие резисторы.
Нет, не должно быть ничего другого. Код *казалось* работал на другой плате. Но в любой случайный момент один из этих входов мог прочитать ложную печать, если бы уловил правильный шум. Единственная разница заключалась в удаче. Плавающие входные контакты почти никогда не бывают хорошей идеей., @Delta_G
Выложите схему подключения. Похоже, вы не совсем понимаете, о чем мы здесь говорим. И если теперь кажется, что это работает, это не признак того, что это исправлено. Если мои путы все еще плавают, значит, у вас все еще есть проблема., @Delta_G
Кстати, у ардуино есть внутренние подтяжки. Более нормальный способ упорядочить вещи - это подключить кнопку так, чтобы при нажатии она читалась как НИЗКИЙ, и тогда вы можете использовать внутренние подтяжки и не нуждаться во внешних резисторах., @Delta_G
Я вижу подтягивания реле. Но я не вижу входов в ардуино. Трудно сказать, потому что на картинке нет Arduino, но я думаю, что вижу, где линии возвращаются к входным контактам, и в них нет подтягиваний., @Delta_G
Или реле это входы? Обычно реле находится на выходе. Я больше смущен твоим рисунком, чем раньше. Как все это подключается к ардуино?, @Delta_G
Мне жаль. Это было сделано с помощью Circuitmaker, чтобы создать для него мою собственную печатную плату. На самом деле контакт номер 10 на каждом реле ведет к входу на Arduino. Вы можете видеть, что в середине схемы есть 4 контакта, каждый из которых ведет к цифровому входу и подключен к резистору и к контакту 10 каждого реле., @Stephane
Резисторы подключаются к контакту 10 реле и какое заземление? Он подключен к земле Arduino?, @Delta_G
Да, все идут на землю Arduino. Они сгруппированы все вместе. (Также земля от моего драйвера шагового двигателя. Dir- и PUL-), поэтому есть один кабель для земли, идущий от этой печатной платы к земле Arduino., @Stephane
- NodeMCU - Vin контакт как выход 5V?
- Использовать все контакты как цифровые входы/выходы
- Что такое ICSP pin (разъём)?
- Сколько датчиков может поддерживать один модуль Arduino?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Какой тип разъема использует система GROVE?
- Как я могу использовать степпер для определенной степени?
- Неиспользуемые контакты в Arduino L293D motor shield?
У вас есть подтягивающие или подтягивающие резисторы на входах? Если они плавают, когда кнопка не нажата, то они могут свободно считывать нажатия всякий раз, когда улавливают шум., @Delta_G
Ну, если честно, на данный момент к входным контактам ничего не подключено. Если они в низком состоянии, они не должны ничего делать правильно? Когда я загрузил на оригинальный Arduino и подключил контакты к остальной части проводки, все заработало отлично. Когда я загружаю его сейчас в клон Arduino, он начинает вращаться без остановки., @Stephane
Wenn ничего не подключено к входному контакту, он не находится в низком состоянии. Он плавает. Плавающий контакт Google Arduino. Вам нужно подключить либо подтягивающий, либо подтягивающий резистор. Arduino имеет внутренний подтягивающий резистор, который вы можете активировать., @chrisl
На самом деле, я только что посмотрел на схемы моей платы реле. Все входные контакты имеют подтягивающие резисторы. При подключении к этому двигатель также просто начал вращаться. Без остановки. Это +5В к реле к резистору к земле. Так что я думаю, что это правильный способ работы для вытягивания вниз. Когда реле активировано, оно должно получить высокое состояние. Правильный?, @Stephane
Мы не говорим о ваших реле. Вам нужно подтянуть или опустить входной контакт для кнопок и переключателей. Когда к контакту ничего не подключено, он находится в случайном состоянии, иногда считывается как высокий, а иногда как низкий. Вам нужно что-то, чтобы держать его в определенном состоянии, пока кнопка не нажата. Погуглите «плавающий ввод Arduino», и вы должны получить много информации по этой теме., @Delta_G