Ардуино не читает состояния контактов

Кажется, у меня есть невероятная вещь. Мой код отлично работал на одном 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;
  }
}

, 👍2

Обсуждение

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

Ну, если честно, на данный момент к входным контактам ничего не подключено. Если они в низком состоянии, они не должны ничего делать правильно? Когда я загрузил на оригинальный Arduino и подключил контакты к остальной части проводки, все заработало отлично. Когда я загружаю его сейчас в клон Arduino, он начинает вращаться без остановки., @Stephane

Wenn ничего не подключено к входному контакту, он не находится в низком состоянии. Он плавает. Плавающий контакт Google Arduino. Вам нужно подключить либо подтягивающий, либо подтягивающий резистор. Arduino имеет внутренний подтягивающий резистор, который вы можете активировать., @chrisl

На самом деле, я только что посмотрел на схемы моей платы реле. Все входные контакты имеют подтягивающие резисторы. При подключении к этому двигатель также просто начал вращаться. Без остановки. Это +5В к реле к резистору к земле. Так что я думаю, что это правильный способ работы для вытягивания вниз. Когда реле активировано, оно должно получить высокое состояние. Правильный?, @Stephane

Мы не говорим о ваших реле. Вам нужно подтянуть или опустить входной контакт для кнопок и переключателей. Когда к контакту ничего не подключено, он находится в случайном состоянии, иногда считывается как высокий, а иногда как низкий. Вам нужно что-то, чтобы держать его в определенном состоянии, пока кнопка не нажата. Погуглите «плавающий ввод Arduino», и вы должны получить много информации по этой теме., @Delta_G


1 ответ


2

Спасибо всем вам,

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

Однако я хотел бы заявить, что на плате 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