Advertisement
  1. Business
  2. Computer Skills

Управление моторами постоянного тока с помощью Python на Raspberry Pi

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

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

Задача

Мы планируем подключить один или два мотора к Raspberry Pi с минимальным количеством компонентов. Когда мы соберём электронику на макете, я покажу, как ей управлять, используя Python, чтобы сначала запустить двигатель, а затем добавить управление для изменения направление вращения, чтобы мы могли вернуться назад.

Во время урока потребуется внимание и немного смелости, особенно если вы новичок в коннекторах GPIO. Хочу подчеркнуть, что я не несу ответственности за любой ущерб, причинённый вашему Raspberry Pi и/или компонентам.

ВАЖНО: не подключайте двигатель, независимо от того, насколько он мал, прямо на Raspberry Pi, он повредит вашу Raspberry Pi.

Основной процессор может подавать мощность, достаточную только для освещения светодиода, примерно 20 мА. Мотор будет потреблять ток не менее 400 мА, чтобы начать вращение.

Требования

Чтобы запустить двигатель, вам понадобятся:

  •  Raspberry Pi  с SD-картой, предварительно установленной с помощью Raspbian
  • Breadboard для сборки всего  
  • Микросхема драйвера двигателя L293 или SN755410 (в данном руководстве я буду упоминать как L293D)
  • Кабели-перемычки, чтобы всё соединить (мужское к мужскому и мужское к женскому)
  • Один или два DC двигателя, рассчитаных на 6 В
  • 4x AA батареи и футляр

GPIO пины

Если вы ещё не присматривались к Raspberry Pi раньше, теперь, возможно, лучшее время его разглядеть. Имеется 26 выводов, сгруппированных в два ряда по 13 и они называются General Purpose Input Output header или GPIO для краткости. Это сочетание четырех силовых контактов, пяти контактов заземления и 17 пинов данных.


Рисунок 1. Макет GPIO с нумерацией выводов. Контакт 1 - верхний левый знак 3V3

Некоторые из этих pins данных имеют дополнительные функции, такие как i2c bus, SPI bus и последовательные разъемы UART, все из которых могут подключаться к другому оборудованию, чтобы позволить Raspberry Pi общаться с такими элементами, как Arduino, Analogue to Digital Convertor (ADC) или дополнительные платы, такие как PiGlow или PiFace.

СОВЕТ: работайте с выводами GPIO, когда Pi отключен, так как любое случайное соединение (или короткое замыкание) 2 контактов может привести к повреждению Raspberry Pi.

Сборка контура

Подключение питания и заземления

Это важно сделать, пока питание Raspberry Pi отключено, поскольку вы хотите избежать короткого замыкания каких-либо разъёмов по ошибке.

Во-первых, подключаем силовые и заземляющие провода. Как и в большинстве проектов в электронике, всё, что соединяется между собой, потребует общей основы. Это показано чёрными проводами.


Рисунок 2: Подключите провода питания и заземления

Земля на Raspberry Pi - физически pin 6.  На рисунке 1, начиная с верхнего левого угла с pin 3V3, считать слева направо, так что 5V - это pin 2, GPIO 2 (обозначен 2) - это pin 3, и далее.

Чтение контактов на микросхемах Integrated Circuit (IC) легко сделать, установив метку или точку слева, так что, начиная с нижнего левого угла будет pin 1.

Рисунок 3. Pin 1  в левом нижнем углу

Добавление проводов данных

Теперь добавьте три провода от контактов GPIO к L293D.

  • GPIO 25–Pin 22 > L293D–Pin 1
  • GPIO 24–Pin 18 > L293D–Pin 2
  • GPIO 23–Pin 16 > L293D–Pin 7

Рисунок 4. Добавьте три провода GPIO для управления двигателем

Добавим двигатель:

  • Motor–wire 1 > L293D–pin 3
  • Motor–wire 2 > L293D–pin 6
Рисунок 5. Соединение батарейки с мотором

Чрезвычайно важно, чтобы вы дважды проверили каждое соединение перед установкой батарей. Только когда вы уверены, что всё на месте, подключите провода батареи к электрическим шинам макета.

Добавить второй двигатель (дополнительно)

Одна из замечательных особенностей L293D состоит в том, что он может обрабатывать два двигателя независимо, и каждый может работать на разных скоростях или направлениях. Используя этот IC, можно создать двухколесный робот, способный поворачиваться, легко перемещаясь вперёд и назад.

Добавление второго двигателя включает всего три дополнительных провода и сам двигатель.

  • GPIO 11–Pin 23 > L293D–Pin 9
  • GPIO 9–Pin 21 > L293D–Pin 10
  • GPIO 10–Pin 19 > L293D–Pin 15
Готовая комплектация для робототехники

Включение

Важно проверить все проводки перед добавлением любого источника питания, так как некоторые провода могут немного запутаться, поэтому легко пропустить соединение и отправить 5V на 3.3V Raspberry Pi.

Всегда проверяйте электропроводку снова и снова!

Если вы ещё не установили SD-карту для своего Pi, то сначала стоит понять, как это делается, прочитав How to Flash an SD Card for Raspberry Pi.

Со свежеприготовленной SD-картой Raspbian подключите Raspberry Pi как обычно и загрузитесь.

Добавьте батареи, следя за направлениями (длинные полосы сверху и снизу, если есть), поскольку вы хотите, чтобы чёрный провод соединялся с землей, а красный провод - с плюсом или источником только чипа.

Следующая задача - сказать Raspberry Pi , что мотор или два, был подключен. Для этого я использую язык под названием Python. Он устанавливается на Raspbian бонусом. Если вы используете другую операционную систему, такую как Arch или PiDora, проверьте, доступен ли RPi.GPIO.

Тестирование

Чтобы заставить двигатели работать, дважды щёлкните LXTerminal на рабочем столе, чтобы открыть окно терминала. Здесь вы будете писать код Python, используя программу под названием Nano. Nano - это текстовый редактор, похожий на Notepad или TextEdit, я научу вас некоторым командам, если вы с ними не знакомы.

Чтобы включить двигатель в течение двух секунд, используйте следующий код:

1
import RPi.GPIO as GPIO
2
from time import sleep
3
4
GPIO.setmode(GPIO.BOARD)
5
6
Motor1A = 16
7
Motor1B = 18
8
Motor1E = 22
9
10
GPIO.setup(Motor1A,GPIO.OUT)
11
GPIO.setup(Motor1B,GPIO.OUT)
12
GPIO.setup(Motor1E,GPIO.OUT)
13
14
print "Turning motor on"
15
GPIO.output(Motor1A,GPIO.HIGH)
16
GPIO.output(Motor1B,GPIO.LOW)
17
GPIO.output(Motor1E,GPIO.HIGH)
18
19
sleep(2)
20
21
print "Stopping motor"
22
GPIO.output(Motor1E,GPIO.LOW)
23
24
GPIO.cleanup()

Первые две строки говорят Python, что необходимо в программе.

В первой строке вы задаёте доступ к модулю RPi.GPIO. Этот модуль выполняет всю тяжёлую работу, связанную с поворотом контактов GPIO on и off на Raspberry Pi.

Вторая строка выводит модуль time в sleep, чтобы сделать pause, давая script время выполнить определённое действие и оставляя мотор включенным на несколько секунд.

Функция setmode указывает RPi.GPIO нумерацию на плате  Raspberry Pi. Цифры 16, 18 и 22 сообщают Python номера pins, связанных с двигателями.

Вы можете указать L293D повернуться в одном направлении через pin A, в другом - pin B. Чтобы включить on, используйте pin Enable, обозначенный E в тестовом сценарии - это pin 22. Я расскажу об этом чуть позже.

Наконец, укажите Raspberry Pi все выходы, которые делаются с GPIO.OUT.

Когда скрипт настроен, Raspberry Pi готова включить моторы. Он включит несколько выводов, подождет две секунды, затем выключит их, как показано в оставшейся части script.

Сохраните и выйдите, нажав CTRL-X, в нижней части сообщения появится запрос подтвердить изменения. Нажмите Y и Enter для подтверждения. Теперь вы снова в командной строке, чтобы запустить script и увидеть, как вращается двигатель.

sudo python motor.py

Если двигатель не вращается, проверьте проводку или батареи. Отладка и выяснение причин могут раздражать, но это полезный шаг в изучении нового!

Теперь поворачиваем

Блестяще, когда мотор  крутится, но ещё лучше заставить его повернуть, я покажу вам, как это сделать.

Ничего не делаем с проводкой, чисто Python. Это достигается путём создания нового script по имени motorback.py. Чтобы создать script в Nano, введите команду:

nano motorback.py

Введите следующий код:

1
import RPi.GPIO as GPIO
2
from time import sleep
3
4
GPIO.setmode(GPIO.BOARD)
5
6
Motor1A = 16
7
Motor1B = 18
8
Motor1E = 22
9
10
GPIO.setup(Motor1A,GPIO.OUT)
11
GPIO.setup(Motor1B,GPIO.OUT)
12
GPIO.setup(Motor1E,GPIO.OUT)
13
14
print "Going forwards"
15
GPIO.output(Motor1A,GPIO.HIGH)
16
GPIO.output(Motor1B,GPIO.LOW)
17
GPIO.output(Motor1E,GPIO.HIGH)
18
19
sleep(2)
20
21
print "Going backwards"
22
GPIO.output(Motor1A,GPIO.LOW)
23
GPIO.output(Motor1B,GPIO.HIGH)
24
GPIO.output(Motor1E,GPIO.HIGH)
25
26
sleep(2)
27
28
print "Now stop"
29
GPIO.output(Motor1E,GPIO.LOW)
30
31
GPIO.cleanup()

CTRL-X, затем Y, затем Enter для сохранения.

Сценарий очень похож на предыдущий, но если вы заметили, для поворота мы сделали Motor1A low и Motor1B high.

High и low  - это названия программ для включения и выключения.

Чтобы остановить двигатель, вы выключите lowMotor1E.

Enable - это переключатель для включения и выключения двигателя, независимо от того, что делают A и B.

Если вы находите это запутанным, посмотрите Truth Table, чтобы увидеть, что происходит.

Truth table

Есть только два состояния, которые позволяют двигателю вращаться, когда Enable включено или high и либо A, либо B должны быть high, но не оба.

Для двух двигателей посмотрите на следующий script.. Всё, что отличается, - это еще пара линий для установки второго двигателя.

1
import RPi.GPIO as GPIO
2
from time import sleep
3
4
GPIO.setmode(GPIO.BOARD)
5
6
Motor1A = 16
7
Motor1B = 18
8
Motor1E = 22
9
10
Motor2A = 23
11
Motor2B = 21
12
Motor2E = 19
13
14
GPIO.setup(Motor1A,GPIO.OUT)
15
GPIO.setup(Motor1B,GPIO.OUT)
16
GPIO.setup(Motor1E,GPIO.OUT)
17
18
GPIO.setup(Motor2A,GPIO.OUT)
19
GPIO.setup(Motor2B,GPIO.OUT)
20
GPIO.setup(Motor2E,GPIO.OUT)
21
22
print "Going forwards"
23
GPIO.output(Motor1A,GPIO.HIGH)
24
GPIO.output(Motor1B,GPIO.LOW)
25
GPIO.output(Motor1E,GPIO.HIGH)
26
27
GPIO.output(Motor2A,GPIO.HIGH)
28
GPIO.output(Motor2B,GPIO.LOW)
29
GPIO.output(Motor2E,GPIO.HIGH)
30
31
sleep(2)
32
33
print "Going backwards"
34
GPIO.output(Motor1A,GPIO.LOW)
35
GPIO.output(Motor1B,GPIO.HIGH)
36
GPIO.output(Motor1E,GPIO.HIGH)
37
38
GPIO.output(Motor2A,GPIO.LOW)
39
GPIO.output(Motor2B,GPIO.HIGH)
40
GPIO.output(Motor2E,GPIO.HIGH)
41
42
sleep(2)
43
44
print "Now stop"
45
GPIO.output(Motor1E,GPIO.LOW)
46
GPIO.output(Motor2E,GPIO.LOW)
47
48
GPIO.cleanup()

Заключение

В этом уроке я показал  основы подключения моторов к Raspberry Pi. Придётся глубоко вздохнуть и сделать это, если вы не занимались подключением чего-либо к вашему новому Pi, но вскоре, как только вы начнете играть с контактами GPIO, будет трудно остановиться.

Этот урок открывает двери в мир созидания роботов с мигающими LED lights и ультразвуковыми датчиками, даёт почувствовать его среду.

Найдите шасси для сборки с аккумулятором сотового телефона, чтобы ваш Raspberry Pi стал мобильным.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Business tutorials. Never miss out on learning about the next big thing.
Advertisement
One subscription. Unlimited Downloads.
Get unlimited downloads