Загрузка данных


// Контакты драйвера 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--;
  }
}