Raspberry Pi. Урок 9. Управление электромотором постоянного тока.

В этом уроке Вы узнаете, как контролировать скорость и направление электромотора постоянного тока с помощью Python и чипа L293D.

learn_raspberry_pi_overview.jpg

В уроке 8 мы использовали Pi для генерации импульсов, чтобы управлять сервоприводом. В этом уроке мы будем использовать импульсы, чтобы контролировать скорость обычного электромотора постоянного тока, и чип контроля мотора L293D, чтобы изменять направление тока мотора и, как следствие, направление вращения мотора.

Детали

Для этого проекта Вам понадобятся следующие детали:

learn_raspberry_pi_pi.jpg

Raspberry Pi

learn_raspberry_pi_cobbler.jpg

Модульная плата для кабеля

learn_raspberry_pi_jumpers_web.jpg

Набор двухсторонних штекерных джамперов

learn_raspberry_pi_breadboard_half_web.jpg

Макетная плата половинного размера

learn_raspberry_pi_motor.jpg

Электромотор постоянного тока 6В

learn_raspberry_pi_L293d.jpg

Интегрированная схема регулятора электромотора мотора L293D

learn_raspberry_pi_occidentalis.png

Adafruit Occidentalis 0.2 или более новый дистрибутив этой операционной системы.

learn_raspberry_pi_batterybox.jpg

Обойма для четырех АА или ААА батареек и сами батарейки

ШИМ

Широтно-импульсная модуляция (или ШИМ) — это способ контролирования питания. Мы будем ее использовать, чтобы контролировать количество тока, который проходит через мотор и, как следствие, скорость вращения мотора.

На диаграмме ниже изображен сигнал разъема ШИМ Raspberry Pi.

learn_raspberry_pi_how_pwm_works.jpg

Каждую 1/500 секунды разъем ШИМ подает импульс. Длина этого импульса контролирует количество энергии, которое получает мотор. Если импульс не поступает, мотор не будет вращаться. Если импульс короткий, мотор будет вращаться медленно. Если импульс длиной в половину промежутка между импульсами, мотор получит половину от энергии, которую он мог бы получить, если бы импульс длился весь промежуток между импульсами.

Модуль ядра ШИМ

Adafruit и Sean Cross разработали модуль ядра со встроенным дистрибутивом Occidentalis. Подробнее про создание Occidentalis здесь. Если Вы хотите использовать модуль с Raspbian или каким-либо другим дистрибутивом, Вы найдете информацию об установке модуля ядра для своей среды здесь.

Вы использовали модуль ядра «ШИМ и Серво», чтобы контролировать сервопривод в уроке 8. В этот раз мы будем использовать тот же модуль, чтобы контролировать скорость мотора.

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

Список файлов, которые модуль использует, чтобы приводить в действие сервопривод, приведен ниже. Все эти файлы находятся в каталоге /sys/class/rpi-pwm/pwm0/ Вашего Raspberry Pi.

Файл

Описание

active Будет иметь значение 1 для активного состояния, 0 — для неактивного. Прочитав этот файл можно узнать активен ли выходной разъем, а записав его — сделать активным или неактивным.
delayed Если значение 1, то любые изменения в других файлах не будут иметь никаких последствий, пока Вы не активируете выходной разъем с помощью файла выше.
mode Записывайте этот файл, чтобы перевести разъем в режим ШИМ, серво или аудио. Конечно же, в данном случае нам нужен режим серво. Обратите внимание, что разъем также используется разъемом Pi для аудио, поэтому Вы не сможете одновременно использовать звук и контролировать сервопривод.
frequency Количество импульсов генерируемых за секунду.
duty Это значение должно быть от 0 до 100, что означает процент импульса, в течении которого в мотор поступает питание. Чем выше эта цифра, тем быстрее вращается мотор.

L293D

Это очень полезный чип. Он может контролировать 2 мотора вне зависимости друг от друга. Мы будем использовать только половину чипа в этом уроке. Большинство разъемов на правой стороне чипа — для управления вторым чипом, но у Raspberry Pi только один разъем ШИМ.

learn_raspberry_pi_L293D.jpg

В L293D есть 2 разъема +V (8 и 16). Разъем +Vmotor (8) подает питание моторам, а +V (16) — логическому уровню чипа. Мы подключили разъем 16 к 5В разъему Pi, а разъем 8 — к обойме для батареек.

Аппаратное обеспечение

Чип L293D в этом проекте нужен нам по двум причинам. Первая: мощности Raspberry Pi совершенно недостаточно для питания мотора напрямую и это может повредить Pi.

Вторая: в этом уроке мы будем управлять направлением вращения мотора и его скоростью. Это возможно только если изменять направление движения тока через мотор. Это именно то, что делает L293D вместе с управляющими выводами.

learn_raspberry_pi_breadboard.png

Все это хорошо вмещается на макетной плате половинного размера.

Программное обеспечение

Поскольку нам нужно два управляющих вывода (чтобы подсоединить к разъемам GPIO 4 и 17), нам также понадобится библиотека GPIO. Подробнее о ней в Уроке 4.

Есть много способов получить результат, как на картинке ниже. Но самый простой — это подключить Pi через SSH (смотрите Урок 6) и открыть редактор с помощью этой команды:

nano motor.py

Затем вставьте нижеприведенный код и сохранитесь (CTRL-x).

learn_raspberry_pi_ssh_edit.png

Вот код:

import RPi.GPIO as io

io.setmode(io.BCM)

 

in1_pin = 4

in2_pin = 17

 

io.setup(in1_pin, io.OUT)

io.setup(in2_pin, io.OUT)

 

def set(property, value):

try:

f = open(«/sys/class/rpi-pwm/pwm0/» + property, ‘w’)

f.write(value)

f.close()

except:

print(«Error writing to: « + property + » value: « + value)

 

set(«delayed», «0»)

set(«mode», «pwm»)

set(«frequency», «500»)

set(«active», «1»)

 

def clockwise():

io.output(in1_pin, True)

io.output(in2_pin, False)

 

def counter_clockwise():

io.output(in1_pin, False)

io.output(in2_pin, True)

 

clockwise()

 

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]) * 11

set(«duty», str(speed))

Сначала программа задает 2 разъема GPIO, как выводы. Затем задает той же вспомогательной функции (“set”), которую мы использовали в Уроке 8, записать модуль ядра ШИМ, который позже используется для того, чтобы задать параметры ШИМ,

Есть еще две другие функции, “clockwise” и “counter_clockwise”, которые контролируют направление вращения двигателя переключая два входных контакта.

Если оба управляющих вывода в позиции HIGH или оба в позиции LOW, мотор будет неподвижен. Но если IN1 в позиции HIGH, а IN2 в позиции LOW, мотор вращается в одном направлении, а если наоборот — то в обратном.

Основной цикл программы ожидает от Вас введения команд в формате буквы (“f” или “r”) и цифры от 0 до 9. Буква задает направление вращения мотора, а цифра — скорость, которая рассчитывается умножением этой цифры на 11, что дает результат от 0 до 99, который совместим с библиотекой ШИМ.

Тестируем и настраиваем

Запустить программу можно только от имени суперпользователя, потому что только у него есть доступ к разъемам GPIO. Поэтому введите следующее:

sudo python motor.py

Затем появится запрос ввести команду. Попробуйте ввести несколько двухбуквенных команд, как показано ниже:

$sudo python motor.py

Command, f/r 0..9, E.g. f5 :f9

Command, f/r 0..9, E.g. f5 :r4

Command, f/r 0..9, E.g. f5 :