// Контакты драйвера L293D
const int ENA = 9;
const int IN1 = 8;
const int IN2 = 7;
// Контакты энкодера
const int ENCA = 2;
const int ENCB = 3;
// Контакты кнопок
const int BTN_FWD = 10;
const int BTN_REV = 11;
volatile long encoderPos = 0;
void setup() {
Serial.begin(9600);
// Настройка мотора
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
// Настройка кнопок (используем внутреннюю подтяжку)
pinMode(BTN_FWD, INPUT_PULLUP);
pinMode(BTN_REV, INPUT_PULLUP);
// Настройка энкодера
pinMode(ENCA, INPUT);
pinMode(ENCB, INPUT);
attachInterrupt(digitalPinToInterrupt(ENCA), readEncoder, RISING);
}
void loop() {
// Читаем состояние кнопок (LOW значит нажата)
bool forwardPressed = (digitalRead(BTN_FWD) == LOW);
bool reversePressed = (digitalRead(BTN_REV) == LOW);
if (forwardPressed) {
// Едем вперед на полной скорости
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 255);
}
else if (reversePressed) {
// Едем назад на полной скорости
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 255);
}
else {
// Стоп, если ничего не нажато
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(ENA, 0);
}
// Вывод позиции энкодера для контроля
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 100) {
Serial.print("Position: ");
Serial.println(encoderPos);
lastPrint = millis();
}
}
// Функция обработки прерывания энкодера
void readEncoder() {
if (digitalRead(ENCB) == HIGH) {
encoderPos++;
} else {
encoderPos--;
}
}