14 февраля 2016 г.

H-Bridge и направление вращения мотора

Эта статья посвящена направлению вращения мотора. Продумывая направление движения машинки на радиоуправлении задался вопросом - как заставить машинку двигаться вперед и назад? Заставить двигаться в одну сторону - это не проблема, подаем напряжение на мотор и все. Но вот как быть движением в обратную сторону? Не разбирать же и не перевидывать провода. Тут меня спасае так называемый H-Bridge.

H-Мост

Название появилось благодяря графическому изображению. Тут важно знать, ключи S1 и S2 или S3 и S4 никогда не должны замыкаться одновременно, иначе будет короткое замыкание. Если замыкать S1 и S4 или S3 и S2, то мотор будет вращаться в разные стороны, поскольку при такой схеме полярность в моторе будет меняться на противоположную. Понятно, что для машинок на радиоуправлении кнопками это делать нельзя. Этим должен управлять компьютер или Arduino, в нашем случае. По идее, оператор говорит "ехать вперед" или "ехать назад", а уже на уровне Arduino контролируется замыкание ключей.

Схема для работы с мотором

Итак, мы будем использовать внешний источник питания на 9V. В качестве ключей мы будем использовать транзисторы, а контролировать их базы будет Arduino, причем целых два пина: один вперед, а второй назад. Хочу заметить, что используются два типа транзисторов - p-n-p и n-p-n. Так же поставим резисторы на 10 кОм перед каждой базой транзистора для перестраховки. На схеме видно, что есть еще 4 диода. Сам мотор так же генерирует магнитное поле и в момент переключения может происходить разрядка. Такое поведение способно повредить транзисторы, а диоды этого не допустят.

Скеч

Скеч для Arduino я прокомменторовал достаточно подробно. Сама программа достаточно простая - сначала разгоняем моторчик в одну сторону, потом замедляем до полной остановки, затем снова разгоняем, но уже в другую сторону и так же замедляем. Этот процесс будет повторяться постоянно.

int led = 13;  // 13-й пин, пин светодиода на Arduino
int cwPin = 9;  // Пин для вращения вправо
int cwwPin = 6;  // Пин для вращения влево
 
// Установка
void setup() {
  // Говорим, что все пины - это вывод
  pinMode(led, OUTPUT);
  pinMode(cwPin, OUTPUT);
  pinMode(cwwPin, OUTPUT);
}
 
// Бесконечный цикл
void loop() {
  int i = 0;     // Переменная для цикла
  digitalWrite(led, HIGH);    // Включаем светодиод
  digitalWrite(cwwPin, LOW); // Отключаем вращение влево
  for(i = 0; i <= 255; i++){ // Цикл ускорения вращения
    analogWrite(cwPin, i);  // Разгоняем моторчик
    delay(15);     // Ждем 15 мкСек 
  }
  for(i = 255; i >= 0; i--){ // Цикл замедления вращения
    analogWrite(cwPin, i);  // Замедляем моторчик
    delay(15);     // Ждем 15 мкСек 
  }
  delay(1000);                // Ждем 1 сек
  digitalWrite(led, LOW);     // Выключаем светодиод
  digitalWrite(cwPin, LOW);  // Отключаем вращение вправо
  for(i = 0; i <= 255; i++){ // Цикл ускорения вращения
    analogWrite(cwwPin, i);  // Разгоняем моторчик
    delay(15);     // Ждем 15 мкСек 
  }
  for(i = 255; i >= 0; i--){ // Цикл замедления вращения
    analogWrite(cwwPin, i);  // Замедляем моторчик
    delay(15);     // Ждем 15 мкСек 
  }
 
  delay(1000);                // Ждем 1 сек
}

На последок прикладываю картинку всего собранного и ссылку, где можно все это посмотреть.

Комментариев нет:

Отправить комментарий