Практика. Вращение двигателя

Для того, чтобы вращать мотором, давайте посмотрим на схему DC драйвера.

Обратите внимание на правый верхний угол. Тут находится описание пинов драйвера Allegro A4955 для управления мотором.

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

На первой же странице дается схема драйвера

А на пятой странице таблица, из которой видно, что если мы хотим, чтобы мотор вращался вперед на пин IN1 нужно подать 1, а на пин IN2 0. В обратном режиме - наоборот. При этом пин SLEEPn всегда должен быть установлен в режиме HIGH.

Зная, что IN1, IN2, SLEEPn это PA8, PA9 и PB3 соответственно, давайте напишем небольшую программу на ардуино.

#include <VBCoreG4_arduino_system.h>


#define IN1 PA8
#define IN2 PA9
#define SLEEPn PB3
#define USR_BTN PC13

int forward = HIGH; // по умолчанию - вращение вперед
int prev_btnSt;
int buttonState;
int is_stopped = LOW;

void setup() {
 
  pinMode(PB3, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(USR_BTN, INPUT_PULLUP);
 
 // пин SLEEPn устанавливаем в HIGH, IN1 и IN2 - LOW
  digitalWrite(SLEEPn, HIGH);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);

// предыдущее состояние кнопки = считываем состояние кнопки во время инициализации
  prev_btnSt = digitalRead(USR_BTN);

  Serial.begin(115200);
  delay(1000);
}

void loop() {
//читаем состояние кнопки 
  buttonState = digitalRead(USR_BTN);
  
  // если она не была нажата, а сейчас ее нажали
  if(buttonState == LOW && prev_btnSt == HIGH){
  
  //то меняем направление вращения мотора
    forward = !forward;
    prev_btnSt = buttonState;
  }
  //если кнопка нажата, то присвоим предыдущему ее состоянию текущее
  if(buttonState == HIGH) {prev_btnSt = buttonState;}
  
  // если вращение мотора должно идти вперед
  if (forward == HIGH && is_stopped == LOW){
  
  //подаем HIGH на IN1
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  }

// иначе если вращение мотора должно быть в противоположную сторону
  else if (forward == LOW && is_stopped == LOW){
  
  // подаем HIGH на IN2
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  }
  
// если мотор необходимо остановить
  else{
  // на IN1 и на IN2 подается LOW
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
  }
  
  // через сериал порт считываем команду на остановку мотора
  if (Serial.available() > 0) {
    is_stopped = Serial.readString().toInt();
    
  }
}

Last updated