> For the complete documentation index, see [llms.txt](https://voltbro.gitbook.io/upravlenie-elektrodvigatelem/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://voltbro.gitbook.io/upravlenie-elektrodvigatelem/kollektornyi-dvigatel/praktika.-vrashenie-dvigatelya.md).

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

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

&#x20;

<figure><img src="/files/LGwrRyXpDD7RtGVZZqc6" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/senT9PIXX2L3PUQNwySZ" alt=""><figcaption></figcaption></figure>

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

{% file src="/files/U2I0hSdrz5svA8pfMvfM" %}

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

<figure><img src="/files/8hk3vRqEEWP2mwNzBoxt" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/wYMTDRJaJTGXtLrHBsXF" alt=""><figcaption></figcaption></figure>

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

```arduino
#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();
    
  }
}
```
