Триггер нажатия кнопки на аналоговом входе L293D motorshield

Я пытаюсь управлять двигателем постоянного тока 12 В, используя три кнопки: одну для поворота по часовой стрелке, другую против часовой стрелки и третью для полной остановки двигателя.

Однако приведенный ниже код не работает, видимо, мне кажется, что я делаю что-то не так в коде на кнопках подключения аналоговой части щита двигателя L293D.

Arduino питается от батареи 9 В и моторного щита ** L293D с внешним питанием.

#include <AFMotor.h>

    AF_DCMotor motor(1);

    int val; 

    #define btnleft A0 
    #define btncenter A1 
    #define btnright A2 


    void setup() 
    { 
      pinMode(btnleft, INPUT);      
      analogWrite(btnleft, HIGH);  
      pinMode(btncenter, INPUT);
      analogWrite(btncenter, HIGH);
      pinMode(btnright, INPUT);
      analogWrite(btnright, HIGH);
    } 

    void loop() 
    { 
     val=digitalRead(btnleft);  
       if(val!=1) 
        {
        Serial.print("LEFT: ");
        motor.setSpeed(255); 
        motor.run(FORWARD); 
        delay(3800); 
        }

     val=digitalRead(btncenter);
       if(val!=1)
        {
        Serial.print("CENTER"); 
        motor.setSpeed(255); 
        motor.run(BACKWARD);
        delay(3800); 
        }

     val=digitalRead(btnright);
       if(val!=1)
        {
        Serial.print("RIGHT"); 
        motor.run(RELEASE);
        delay(3000);    
        }
    }

, 👍0

Обсуждение

Почему вы используете analogWrite() на входе?, @Ignacio Vazquez-Abrams

Я думал, что это будет аналоговый вход в motorshield, @the flash

Так почему же вы все равно рассматриваете его как результат?, @Ignacio Vazquez-Abrams

Может быть, он имеет в виду "digitalWrite", чтобы настроить внутренние подтягивания. Выполнение аналоговой записи 1 не имеет большого смысла., @Nick Gammon


1 ответ


1

Как отмечалось в комментарии Ника Гэммона, digitalWrite(btnleft, INPUT) (и т. Д.) Будет иметь гораздо больше смысла, чем analogWrite(btnleft, INPUT) (и т. Д.).


Edit: INPUT-это константа, определенная в файле wiring.h (как показано в следующем отрывке), и предназначена для использования в вызовах pinMode(), которые устанавливают режим ввода-вывода на один из INPUT, OUTPUTили INPUT_PULLUP. Неумело использовать его в вызове digitalWrite() или analogWrite().

    #define HIGH 0x1
    #define LOW  0x0    
    #define INPUT 0x0
    #define OUTPUT 0x1
    #define INPUT_PULLUP 0x2

Обратите внимание, что digitalWrite на вывод входного режима оставляет вывод в режиме ввода, в то время как analogWrite на вывод входного режима переводит вывод в режим вывода.

Если вы хотите, чтобы выход был в режиме ввода с помощью pullup, проще использовать INPUT_PULLUP в качестве параметра mode, а не использовать два отдельных вызова. То есть вместо того, чтобы говорить pinMode(pin, INPUT); за которым следует digitalWrite(pin, HIGH);, просто скажите

pinMode(pin, INPUT_PULLUP);
,

На самом деле "digitalWrite (btnleft, INPUT)" неверно. Вы должны вызывать "digitalWrite" только с параметром "HIGH" или "LOW", чтобы избежать недоразумений. Хорошо, для arduino INPUT = LOW = 0x0 и OUTPUT = HIGH = 0x1, но... Я не думаю, что кто-то, пишущий "digitalWrite (btnleft, INPUT)", хочет, чтобы вывод был установлен на 0, @frarugi87