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

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

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


Черновик


Управление направлением вращения вала электродвигателя постоянного тока c помощью микросхемы L293D

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

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

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

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

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

enable_pin = 18

Выводы 1A и 2A микросхемы L293D отвечают за направление вращения двигателя, их мы соединяем с 16 и 18 выводом GPIO(23ий и 24ый номер BCM соответсвенно):

in1_pin = 23
in2_pin =24

Назначение контактов драйвера моторов L293D(SN754410):

  • GND(4, 5, 12, 13) - выводы для подключения к земле;
  • Vcc2(8) - вывод для подключения напряжения питания нагрузки;
  • Vcc1(16) - вывод для подключения питания микросхемы драйвера моторов;
  • 1Y и 2Y(3, 6) - вывод для подключения первого двигателя;
  • 1A и 2A(2, 7) - выводы для управления первым двигателем;
  • 1,2EN(1) - вывод для включения и отключения первого двигателя;
  • 3Y и 4Y(11, 14) - вывод для подключения второго двигателя;
  • 3A и 4A(10, 15) - выводы для управления первым двигателем;
  • 3,4EN(9) - вывод для включения и отключения второго двигателя;

Таблица состояний входов и выходов драйвера моторов L293D(SN754410)

Вход Выход
A EN Y
H H H
L H L
X L Z

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

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В


Обратите внимание! Микросхема L293D расположена зазубриной слева!


Все манипуляции по подключению производите только при отключенном питании платы 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)

См.также

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