В этом эксперименте мы воспользуемся микросхемой L293D, разместив ее на макетной плате. Схема эксперимента в сборе: макетная плата с микросхемой L293D,
Raspberry Pi, двигатель постоянного тока, источник питания - показана на рисунке
- Схема эксперимента по управлению скоростью и направлением вращения электродвигателя. с помощью Raspberry Pi в сборе
Комплектующие
В этом эксперименте для работы с Arduino и Raspberry Pi понадобятся следующие комплектующие:
IC1 - Микросхема с Н-мостом L293D
С1 - Конденсатор 100 нф
C2 - Конденсатор 16 В 100 мкФ
М1 - Небольшой двигатель постоянного тока с напряжением питания 6 В
Батарейный отсек 4 АА (6 В)
400-точечная беспаечная макетная плата
Перемычки "папа-папа"
Перемычки "мама-папа" (только для Рі)
Схема эксперимента
Схема этого эксперимента показана на рисунке ниже. Raspberry Pi или Arduino подают управляющее напряжение 5 В на логический контакт 16 микросхемы L293D. Питание для двигателя поступает от 6-вольтового комплекта батареек на ее контакт 8.
Практически здесь используется всего один из Н-мостов микросхемы, поэтому ее контакт EN2 подключается к заземлению, чтобы деактивировать неиспользуемую ее часть.
Контакты ENI, INI и IN2 подключаются к цифровым выходным контактам Raspberry Pi или Arduino.
- Электрическая схема подключения Н-моста микросхемы L293D
КОНДЕНСАТОРЫ
Как уже отмечалось, использовать в эксперименте конденсаторы не обязательно если мы собираемся всего лишь поэкспериментировать с этой цепью несколько часов, то нас не слишком интересует та надежность, которую могли бы обеспечить конденсаторы
Показанное на схеме, положение конденсаторов весьма типично для интегральной схемы с Н-мостом. Конденсатор С1 называется развязывающим. Его следует располагать максимально близко к микросхеме - между логическим сигналом и заземлением. Емкость конденсатора С1 может не превышать 100 нФ (это очень мало), однако он поможет избавиться от всяческих электрических помех, которые могут по- вредить логике микросхемы.
Конденсатор С2 представляет собой как бы резервуар энергии, которого может хватить на какое-то время, но эта энергия питает именно двигатель, а не тратится на логику переключения. Емкость этого конденсатора обычно гораздо выше, чем у С1, - как правило, 100 мкФ или более.
Компоновка макетной платы
Прежде чем подключать Н-мост к Arduino или Raspberry Pi, можно поэкспериментировать со схемой в автономном режиме: проверить и двигатель, и логику переключения, взяв для них питание от одного и того же 6-вольтового комплекта батареек. Такой вариант отлично подходит, если вы хотите опробовать работу микросхемы без подключения к Arduino или Raspberry Pi, но когда дело доходит до использования Н-моста с Arduino или Raspberry Рі, лучше разграничить питание двигатель должен получать энергию от комплекта батареек, а логика микросхемы обеспечиваться энергией от Arduinо или Raspberry Pi.
На рисунке ниже продемонстрирована компоновка макетной платы для автономного эксперимента. Для работы с Arduino или Raspberry Рі эту компоновку переделывать практически не придется вам потребуется просто переставить некоторые перемычки.
- Компоновка макетной платы для автономной проверки Н-моста
Размещая на макетной плате компоненты, особое внимание уделите микросхеме. Ее обязательно нужно расположить правильно: маленький вырез с одной ее стороны должен быть направлен к верхней части макетной платы в ряду 10. Левее и выше этого выреза должен располагаться контакт 1.
Теперь можно подключить батарею. Изначально двигатель вращаться не должен.
ПО ЧАСОВОЙ СТРЕЛКЕ И ПРОТИВ ЧАСОВОЙ СТРЕЛКИ
Когда у меня написано, что мой двигатель вращается по часовой стрелке или против часовой стрелки, ваш двигатель может вращаться как раз в противоположном направлении. И если ваш двигатель вращается против часовой стрелки, когда у меня сказа но, что он должен вращаться по часовой, то это не проблема, т. к. он будет вращаться по часовой, когда у меня написано «против часовой».
Если вы хотите, чтобы вращение вашего двигателя совпадало с описываемым, можете поменять местами подводящие провода
Иногда бывает сложно определить, в каком направлении вращается двигатель, - ведь это просто голый металлический вал. Вы можете его просто пощупать если аккуратно зажать вал большим и указательным пальцами, то станет понятно, куда он крутится Можно также отрезать короткую полоску цветной клейкой ленты и приклеить ее на шпиндель, чтобы она послужила своеобразным флажком.
Автономный эксперимент
Независимо от того, в каком направлении должен вращаться двигатель, - по часовой стрелке или против нее, контакт Enable должен быть подключен к +Ѵ. Что- бы двигатель начал вращаться, например, по часовой стрелке, подключите к +Ѵ свободный конец той перемычки, которая уже подсоединена к IN1, а IN2 подключите к ряду GND, расположенному по правому краю макетной платы.
- Запускаем двигатель по часовой стрелке
Теперь мы собираемся обратить направление вращения двигателя. Соединение с Enable можно не трогать, но нужно поменять подключение к IN1 и IN2, так, чтобы IN1 теперь соединялся с GND, a IN2 - с +V, как показано на рисунке.
Обратите внимание: на рисунках перемычки IN1 и IN2 показаны более толстыми, чтобы их было проще отличать от других перемычек.
Теперь, когда мы убедились, что Н-мост как таковой работает, можно подключить нашу схему к Arduino (либо, если вы предпочитаете работать с Raspberry Pi, можете сразу перейти к разд. «Экспериментируем с Raspberry Pi»).
- Запускаем двигатель против часовой стрелки
Подключение Arduino
На рисунке показано, как следует с помощью перемычек подключать макетную плату к Arduino Uno.
Контакт Arduino под номером
11, используемый в качестве Enable, поддерживает ШИМ, и мы воспользуемся контактом Enable микросхемы L293D, чтобы управлять скоростью двигателя. К IN1 и IN2 можно подключать любые цифровые контакты Arduino контакты
10 и
9 были выбраны по той простой причине, что они расположены рядом с контактом
11, и когда все провода лежат рядом, это выглядит аккуратнее.
Arduino подает напряжение 5 В на логическую часть L293D, но, что важно, при этом мы не запитываем от Arduino двигатель, питание двигателя по-прежнему осуществляется от батареек.
Макетная плата, подключенная к Arduino перемычками "папа-папа", показана на рисунке и готовая к работе.
- Подключение макетной платы с микросхемой Н-моста к Arduino
- Схема управления двигателем с помощью Arduino в сборе
Программа для Arduino
В той программе для Arduino, которую мы использовали в разд. «Эксперимент: управление скоростью двигателя постоянного тока» (на основе ШИМ), мы пользовались монитором последовательного интерфейса, позволявшим отправлять двигателю команды на изменение скорости. В этом эксперименте та программа дополнена теперь она отправляет команды, регулирующие не только скорость, но и направление вращения.
Скетч Arduino для этого эксперимента:
Код: Выделить всё
const int enablePin = 11; // (1)
const int in1Pin = 10;
const int in2Pin = 9;
void setup() { // (2)
pinMode(enablePin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
Serial.begin(9600);
Serial.println("Enter s (stop) or f or r followed by Duty Cycle (0 to 255). E.g. f120");
}
void loop() { // (3)
if (Serial.available()) {
char direction = Serial.read(); // (4)
if (direction == 's') { // (5)
stop(); // (6)
return;
}
int pwm = Serial.parseInt(); // (7)
if (direction == 'f') { // (8)
forward(pwm);
}
else if (direction == 'r') {
reverse(pwm);
}
}
}
void forward(int pwm) // (9)
{
digitalWrite(in1Pin, HIGH);
digitalWrite(in2Pin, LOW);
analogWrite(enablePin, pwm);
Serial.print("Forward ");
Serial.println(pwm);
}
void reverse(int pwm) // (10)
{
digitalWrite(in1Pin, LOW);
digitalWrite(in2Pin, HIGH);
analogWrite(enablePin, pwm);
Serial.print("Reverse ");
Serial.println(pwm);
}
void stop() // (11)
{
digitalWrite(in1Pin, LOW);
digitalWrite(in2Pin, LOW);
analogWrite(enablePin, 0);
Serial.println("Stop");
}
Этот скетч относительно длинный, но он хорошо структурирован с помощью функций, на основе которых код удобно видоизменять и заново использовать в собственных проектах. Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. Скетч начинается с определения констант для трех управляющих контактов.
2. Функция
setup() задает эти контакты в качестве выводов, а затем запускает последовательную передачу со скоростью 9600 бод и посылает сообщение- инструкцию монитору последовательного интерфейса, напоминая вам о форма те сообщений, применяемых для управления двигателем.
3. Функция
loop() бездействует, пока
Serial.available не «доложит», что поступило новое входящее сообщение от монитора последовательного интерфейса.
4. Первый символ сообщения считывается как буква, обозначающая направление, это может быть s (стоп), f (вперед) или r (обратно).
5. Если первая буква s, то вызывается функция
stop, и команда
return гарантирует, что никакой последующий код из функции loop() выполняться не будет.
6. Команда s не требует параметра
pmw, поэтому и мы не пытаемся прочитать его из сообщения - его там просто не будет.
7. Если код направления f или r (не s), то параметр извлекается из оставшейся части сообщения при помощи
parseInt.
8. Затем вызывается одна из функций:
forward или
reverse, в зависимости от того, каков символ
direction.
9. Функция
fоrward устанавливает
in1Pinв значение
HIGH, а
in2Pin - в значение том, чтобы указать направление вращения двигателя, а затем использует функцию
analogWrite для управления скоростью двигателя при этом задействуется
enablePin и параметр
pwm, сообщаемый
forward. Наконец, сообщение с подтверждением действия отправляется обратно на монитор последовательного интерфейса.
10. Функция
reverse практически аналогична
fоrward , за исключением того, что
in1Pinполучает значение
LOW, а
in2Pin -
HIGH, и поэтому двигатель вращается в противоположном направлении.
11. Функция
stop сбрасывает все управляющие контакты в состояние LOW.
Загружаем и выполняем программу
Чтобы проделать эксперимент с Arduino, подключите к Arduino USB-кабель и 23. грузите скетч. Откройте монитор порта, введите команду
f100 в верхней части окна и нажмите кнопку
Send(Отправить) - двигатель должен начать очень Медленно вращаться в каком-то направлении.
- Управление двигателем при помощи команд последовательного интерфейса
Затем попробуйте ввести команду f255 - двигатель начнет вращаться на полной скорости. Команда s остановит двигатель, команда r100 медленно запустит его в противоположном направлении, а команда r255 разгонит двигатель в обратном направлении на полную скорость.
Подключение Raspberry Pi
Преимущество использования интегральной микросхемы с Н-мостом такой, как L293D, - в том, что ее управляющим контактам для регулирования работы двигателя требуется очень слабый ток. В ее спецификации указано, что ток неизменно должен оставаться ниже 100 мкА (0,1 мА), а это значит, что можно безо всяких проблем использовать выводы Raspberry Pi, рассчитанные на малые токи.
Если у вас есть и Raspberry Pi, и Arduino, и вы только что закончили часть эксперимента, связанную с Arduino, то, чтобы подготовить макетную плату для работы с Raspberry Pi, потребуется всего лишь заменить перемычки «папа-папа» (ими мы подключали к макетной плате Arduino) на провода «мама-мама» и подключать их к GРІО-колодке Raspberry Pi.
На рисунке показано, как подключить Raspberry Pi к макетной плате, а готовая к работе система управления двигателем с помощью Raspberry Pi была показана выше
- Подключение макетной платы с микросхемой Н-моста к Raspberry Pi
Программа для Raspberry Pi
Код: Выделить всё
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
enable_pin = 18 # (1)
in_1_pin = 23
in_2_pin = 24
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in_1_pin, GPIO.OUT)
GPIO.setup(in_2_pin, GPIO.OUT)
motor_pwm = GPIO.PWM(enable_pin, 500)
motor_pwm.start(0)
def forward(duty): # (2)
GPIO.output(in_1_pin, True)
GPIO.output(in_2_pin, False)
motor_pwm.ChangeDutyCycle(duty)
def reverse(duty): # (3)
GPIO.output(in_1_pin, False)
GPIO.output(in_2_pin, True)
motor_pwm.ChangeDutyCycle(duty)
def stop():
GPIO.output(in_1_pin, False)
GPIO.output(in_2_pin, False)
motor_pwm.ChangeDutyCycle(0)
try:
while True: # (4)
direction = raw_input('Enter direction letter (f - forward, r - reverse, s - stop): ')
if direction[0] == 's':
stop()
else:
duty = input('Enter Duty Cycle (0 to 100): ')
if direction[0] == 'f':
forward(duty)
elif direction[0] == 'r':
reverse(duty)
finally:
print("Cleaning up")
GPIO.cleanup()
Этот код в значительной мере основан на примерах кода Руthon из других экспериментов. Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. В верхней части текста программы находится типичный код с установкой GPIO и определениями контактов. Контакт Enable на L293D служит для управления скоростью двигателя, поэтому подключенный к нему контакт 18 конфигурируется как ШИМ-вывод.
2. Функция forward настраивает контакты IN1 и IN2 таким образом, чтобы они контролировали направление движения, а затем устанавливает заполнение для ШИМ-канала.
3. Если сравнить ее с функцией
reverse, то заметно, что значения контактов IN1 и 12 поменялись местами. Функция
stop останавливает работу направляющих контактов (оба переходят в значение
LOW), а коэффициент заполнения становится равен 0.
4. Главный цикл
while предлагает пользователю ввести команду, а затем, в зависимости от нее, вызывает функцию
stop, forward или
reverse.
Загружаем и выполняем программу
Запустите программу в режиме администратора при помощи команды
sudo - и сможете убедиться, что она функционирует практически как аналог на Arduino, предлагая вам задавать скорость и направление вращения двигателя.
Код: Выделить всё
$ sudo python full_motor_control.py
Enter direction letter (f - forward, r - reverse, s - stop) : f
Enter Duty Cycle (0 to 100) : 50
Enter direction letter (f - forward, r - reverse, s - stop) : f
Enter Duty Cycle (0 to 100) : 100
Enter direction letter (f - forward, r - reverse, s - stop) : s
Enter direction letter (f - forward, r - reverse, s - stop) : r
Enter Duty Cycle (0 to 100): 50
Enter direction letter (f - forward, r - reverse, s - stop) : r
Enter Duty Cycle (0 to 100) : 100
Enter direction letter (f - forward, r - reverse, s - stop) : s
Enter direction letter (f - forward, r - reverse, s - stop) :
АККУРАТНО ОБРАЩАЙТЕСЬ С ДВИГАТЕЛЕМ
Представьте себе, что случится, если машина едет на полной скорости, а затем водитель вдруг дает задний ход. В случае с небольшими двигателями, к которым не подключены никакие массивные детали, это обычно проблем не вызывает. Но вы, возможно, обнаружите, что если работать с Arduino или Raspberry Pi, запитанными от того же источника, что и сам двигатель, то Raspberry Pi может аварийно прекратить работу, а Arduino - сброситься. Это происходит потому, что при резкой смене направлений через устройства идет очень сильный ток, из-за чего электропитание резко падает.
В случае с крупными двигателями резкая смена скорости или направления вращения массивной детали, обладающей сильной инерцией, может привести к крупным неприятностям. Мало того, что резко возросшие токи могут повредить Н-мост, так еще и подшипники двигателя подвергнутся механическому сотрясению.
Это необходимо учитывать при разработке управляющего ПО для сравнительно крупных двигателей. Чтобы бережно обращаться с двигателем, перед каждой сменой на правления его лучше останавливать (делать паузу, в течение которой он действительно успеет остановиться) и лишь затем вновь запускать уже в противоположном направлении. Если в Arduinо вы применяете вспомогательные функции
forward и
reverse[/i ]из разд."Эксперимент: управление направлением и скоростью вращения двигателя", у вас может получиться примерно такой код:
forward(255);
delay(200);
reverse (255);