Raspberry Pi:Примеры/Управление направлением вращения вала электродвигателя постоянного тока с помощью модуля драйвера двигателя

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Управление направлением вращения вала электродвигателя постоянного тока с помощью модуля драйвера двигателя

Данный пример демонстрирует как изменять не только скорость вращения, но и направление вращения вала электродвигателя постоянного тока, используя мостовую схему управления.

Для примера на рисунке внизу представлена мостовая схема управления двигателем на простых выключателях. Изменяя путь прохождения тока вы меняете полярность выводов драйвера, а значит и направление вращения. Замыкая для примера переключатели S1 и S4 и оставляя разомкнутыми S2 и S3, левая сторона двигателя имеет положительную полярность,а правая отрицательную и вращение двигателя будет в одну сторону. Замыкая переключатели S2 и S3 и оставляя разомкнутыми S1 и S4, правая сторона двигателя имеет положительную полярность,а левая отрицательную и вращение двигателя будет в противоположную сторону.

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

Схематичное изображение принципа работы драйвера моторов

Рассматриваемый модуль драйвера двигателя позволяет подключить 2 двигателя. Каждый канал оснащается тремя управляющими выводами. Вывод PWMA/PWMB - отвечает за включение и выключение канала(им же мы и регулируем скорость вращения двигателя, благодаря подачи ШИМ-сигнала), его мы соединяем с 12-мы выводом GPIO(18ый BCM):

enable_pin = 18

Выводы AIN1/AIN2 модуля драйвера отвечают за направление вращения двигателя, их мы соединяем с 16 и 18 выводом GPIO(23ий и 24ый номер BCM соответсвенно):

in1_pin = 23
in2_pin =24


Входы драйвера:

  • PWMA - Вход ШИМ управления двигателем А
  • AIN2 - Вход 2 управления двигателем А
  • AIN1 - Вход 1 управления двигателем А
  • STBY - Вход перевода драйвера обоих двигателей в ждущий режим
  • BIN1 - Вход 1 управления двигателем В
  • BIN2 - Вход 2 управления двигателем В
  • PWMB - Вход ШИМ управления двигателем В
  • GND - Общий

Выходы драйвера:

  • VM - Вход напряжения питания силовых ключей драйвера
  • VCC - Вход напряжения питания логической части драйвера
  • GND - Общий
  • A01 - Выход 1 двигателя А
  • A02 - Выход 2 двигателя А
  • B02 - Выход 2 двигателя В
  • В01 - Выход 1 двигателя В
  • GND - Общий

В программе за изменение направления двигателя отвечают две функции:

def clockwise():
    GPIO.output(in1_pin, True)    
    GPIO.output(in2_pin, False)
 
def counter_clockwise():
    GPIO.output(in1_pin, False)
    GPIO.output(in2_pin, True)

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

Программа из раздела код после запуска запрашивает у пользователя направление и скорость. При вводе f - вал вращается вперед, а при вводе r - назад. Скорость вращения задается цифрами(от 0 до 9).

Необходимое оборудование

Схема

Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В


Все манипуляции по подключению производите только при отключенном питании платы Raspberry Pi


Код

Python 2.X

import RPi.GPIO as GPIO
import time

enable_pin = 18
in1_pin = 23
in2_pin =24

GPIO.setmode(GPIO.BCM)
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in1_pin, GPIO.OUT)
GPIO.setup(in2_pin, GPIO.OUT)

pwm = GPIO.PWM(enable_pin, 500)
pwm.start(0)

def clockwise():
    GPIO.output(in1_pin, True)    
    GPIO.output(in2_pin, False)
 
def counter_clockwise():
    GPIO.output(in1_pin, False)
    GPIO.output(in2_pin, True)
 
while True:
    cmd = raw_input("Command, f/r 0..9, E.g. f5 :")
    direction = cmd[0]
    if direction == "f":
        clockwise()
    else: 
        counter_clockwise()
    speed = int(cmd[1]) * 10
    pwm.ChangeDutyCycle(speed)

Python 3.X

import RPi.GPIO as GPIO
import time

enable_pin = 18
in1_pin = 23
in2_pin =24

GPIO.setmode(GPIO.BCM)
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in1_pin, GPIO.OUT)
GPIO.setup(in2_pin, GPIO.OUT)

pwm = GPIO.PWM(enable_pin, 500)
pwm.start(0)

def clockwise():
    GPIO.output(in1_pin, True)    
    GPIO.output(in2_pin, False)
 
def counter_clockwise():
    GPIO.output(in1_pin, False)
    GPIO.output(in2_pin, True)
 
while True:
    cmd = input("Command, f/r 0..9, E.g. f5 :")
    direction = cmd[0]
    if direction == "f":
        clockwise()
    else: 
        counter_clockwise()
    speed = int(cmd[1]) * 10
    pwm.ChangeDutyCycle(speed)

См.также

Внешние ссылки