Триггер нажатия кнопки на аналоговом входе 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);
}
}
@the flash, 👍0
Обсуждение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
- Вопрос о различных способах подключения платы драйвера двигателя L298N к Arduino и двигателям и их питания.
- Как заставить сервопривод вращаться на угол больше 180°
- Почему Adafruit motor shield не крутит моторы?
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- В чем разница между драйвером двигателя (motor driver) и щитом двигателя?
- Контроллер двигателя для двигателя 24 В, Arduino Uno
- Привод двигателя работает только в одну сторону
- Двигатель не работает при подключении к shield драйвера двигателя?
Почему вы используете
analogWrite()
на входе?, @Ignacio Vazquez-AbramsЯ думал, что это будет аналоговый вход в motorshield, @the flash
Так почему же вы все равно рассматриваете его как результат?, @Ignacio Vazquez-Abrams
Может быть, он имеет в виду "digitalWrite", чтобы настроить внутренние подтягивания. Выполнение аналоговой записи 1 не имеет большого смысла., @Nick Gammon