Для того, чтобы вращать мотором, давайте посмотрим на схему DC драйвера.
Обратите внимание на правый верхний угол. Тут находится описание пинов драйвера Allegro A4955 для управления мотором.
Давайте теперь откроем к нему документацию и найдем в ней схему встроенного H-моста, а также таблицу, в которой указано какой сигнал и на какой пин подавать для вращения мотором вперед или назад.
На первой же странице дается схема драйвера
А на пятой странице таблица, из которой видно, что если мы хотим, чтобы мотор вращался вперед на пин IN1 нужно подать 1, а на пин IN2 0. В обратном режиме - наоборот. При этом пины SLEEPn и VREF всегда должны быть установлены в режиме HIGH.
Зная, что IN1, IN2, SLEEPn, VREF это PA8, PA9, PB3 и PA4 соответственно, давайте напишем небольшую программу на ардуино.
#include <VBCoreG4_arduino_system.h>
#define IN1 PA8
#define IN2 PA9
#define SLEEPn PB3
#define VREF PA4
#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(VREF, OUTPUT);
pinMode(USR_BTN, INPUT_PULLUP);
// пин SLEEPn устанавливаем в HIGH, IN1 и IN2 - LOW
digitalWrite(SLEEPn, HIGH);
digitalWrite(VREF, 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();
}
}