Платы расширения (HAT) для Raspberry Pi – это платы, которые имеют примерно такой же размер, как и плата Raspberry Pi. Они непосредственно одеваются сверху на плату Raspberry Pi и при этом не требуют никаких других соединений с платой. В настоящее время на рынке доступно огромное множество плат расширения для Raspberry Pi.
В данной статье мы рассмотрим создание для Raspberry Pi платы расширения (Raspberry Pi Motor Driver HAT), позволяющей управлять двигателями постоянного тока и шаговыми двигателями. Данная плата расширения будет состоять из микросхемы драйвера двигателей L293D, ЖК дисплея 16х2, 4-х кнопок и регулятора напряжения. Данная плата расширения для управления двигателями будет весьма удобна при создании различных проектов робототехники.
Также в данной статье мы будем использовать сервис PCBWay для изготовления печатной платы для нашего проекта. Ранее на нашем сайте мы рассматривали создание платы расширения LoRa для Raspberry Pi.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- ЖК дисплей 16×2 (купить на AliExpress).
- Микросхема L293D (купить на AliExpress).
- Кнопка – 4 шт.
- SMD светодиоды – 4 шт. (купить на AliExpress).
- SMD резисторы (1×10K, 12×1K) (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Регулятор напряжения LM317 (купить на AliExpress).
- Зажимной контакт – 2 шт.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Микросхема драйвера двигателей L293D
Микросхема L293D является одной из самых популярных сейчас драйверов двигателей. Она содержит 16 контактов и используется для управления униполярными и биполярными шаговыми двигателями, электродвигателями постоянного тока и даже серводвигателями. Одна микросхема L293D может управлять двумя двигателями постоянного тока одновременно. Скорость и направление вращения этих двух двигателей могут управляться независимо.
Микросхема имеет 2 контакта питания — ‘Vcc1’ и ‘Vcc2’. Vcc1 используется для питания внутренних логических схем – на него должно подаваться напряжение 5V. Контакт Vcc2 используется для питания двигателей – напряжение на нем может быть от 4.5V до 36V.
Технические характеристики микросхемы L293:
- напряжение питания двигателей Vcc2 (Vs): 4.5V – 36V;
- максимальный пиковый ток двигателя: 1.2A;
- максимальный непрерывный ток двигателя: 600mA;
- напряжение питания на контакте Vcc1(VSS): 4.5V – 7V;
- время переключения: 300ns (при 5V и 24V);
- автоматическое отключение при перегреве.
Схема проекта
Схема платы расширения на Raspberry Pi для управления двигателями представлена на следующем рисунке. Схема нарисована с использованием редактора EasyEDA.
Плата расширения состоит из микросхемы драйвера двигателей L293D, модуля ЖК дисплея 16х2 и 4-х кнопок. Также в ее схему добавлены контакты для подключения модуля SIM800 и регулятор напряжения на микросхеме LM317 – для будущих усовершенствований проекта. Данная плата расширения будет непосредственно одеваться сверху на плату Raspberry Pi.
Изготовление печатной платы для платы расширения управления двигателями
Для проектирования печатной платы авторы проекта (ссылка на оригинал приведена в конце статьи) использовали редактор EasyEDA – в нем вы можете посмотреть спроектированную модель печатной платы со всех сторон, а также посмотреть ее 3D модель. Внешний модели данной печатной платы показан на следующем рисунке.
Также вы можете скачать Gerber файлы для изготовления печатной платы проекта по следующей ссылке – Gerber file for Raspberry Pi Motor Driver HAT.
Заказ печатной платы с сервиса PCBWay
Чтобы заказать изготовление печатной платы с сервиса PCBWay выполните следующую последовательность шагов.
Шаг 1. Зарегистрируйтесь на сайте https://www.pcbway.com/, на вкладке PCB Prototype введите размеры вашей печатной платы, число ее слоев и количество необходимых вам экземпляров печатной платы.
Шаг 2. Нажмите на кнопку ‘Quote Now’ (заказать сейчас). На открывшейся странице введите еще ряд параметров для изготовления вашей печатной платы: тип платы, слои, материал для изготовления платы, ее толщину и т.д. Для большинства этих параметров можно оставить значения по умолчанию, предлагаемые сервисом.
Шаг 3. Загрузите Gerber файлы вашей печатной платы в сервис PCBWAY – он проверит корректность ваших файлов, после этого можно будет переходить к оплате заказа.
Разумеется, вы можете заказать изготовление печатной платы в любом другом сервисе, с которым вы привыкли работать.
Сборка конструкции платы расширения управления двигателями
Спустя несколько дней после заказа авторы проекта получили изготовленную печатную плату, ее внешний вид показан на следующих рисунках.
Убедившись, что дорожки и футпринты на плате корректны, авторы проекта приступили к припаиванию на нее компонентов. В результате у них получилась конструкция следующего вида:
Подготовка платы Raspberry Pi
Для написания программы проекта нам нужно будет установить необходимые библиотеки. Но вначале необходимо установить последние обновления на плату:
1 2 |
Sudo apt-get update Sudo apt-get upgrade |
После этого установим библиотеку Adafruit_CharLCD для работы с ЖК дисплеем.
1 |
sudo pip3 install Adafruit-CharLCD |
Эта библиотека изначально была разработана для работы с ЖК дисплеями компании Adafruit, но она вполне неплохо работает и с ЖК дисплеями других производителей.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы нам необходимо одновременно управлять движениями двух двигателей постоянного тока с двухсекундным интервалом для того чтобы машина на этих двух двигателях могла двигаться прямо, назад, вправо и влево. Мы будем использовать модуль RPi.GPIO для управления контактами GPIO платы Raspberry Pi. Модуль time будет использоваться для организации задержек в программе.
1 2 3 4 |
import RPi.GPIO as GPIO import time import board import Adafruit_CharLCD as LCD |
После этого объявим контакты, к которым подключен ЖК дисплей и драйвер двигателей L293D.
1 2 3 4 5 6 |
lcd_rs = 0 lcd_en = 5 lcd_d4 = 6 Motor1A = 4 Motor1B = 17 Motor1E = 12 |
Далее сконфигурируем контакты, с которых будем управлять двигателями, в качестве цифровых выходов. Первые два из этих контактов используются для управления правым двигателем, вторые два – для управления левым двигателем. Следующие два контакта – это контакты Enable (разрешения работы) для обоих двигателей.
1 2 3 4 5 6 |
GPIO.setup(Motor1A,GPIO.OUT) GPIO.setup(Motor1B,GPIO.OUT) GPIO.setup(Motor1E,GPIO.OUT) GPIO.setup(Motor2A,GPIO.OUT) GPIO.setup(Motor2B,GPIO.OUT) GPIO.setup(Motor2E,GPIO.OUT) |
Внутри цикла while мы будем одновременно вращать оба двигателя в различных направлениях (Forward, Reverse, Left и Right). На вращение в каждом направлении будет отводиться время, равное 2-м секундам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
GPIO.output(Motor1A , 0) GPIO.output(Motor1B , 0) GPIO.output(Motor2A , 1) GPIO.output(Motor2B , 0) lcd.message ('Left') print ("Left") sleep(2) #Forward GPIO.output(Motor1A , 1) GPIO.output(Motor1B , 0) GPIO.output(Motor2A , 1) GPIO.output(Motor2B , 0) lcd.message ('Forward') print ("Forward") …………………………………… |
Тестирование работы платы расширения
После окончательной сборки конструкции платы расширения для управления двигателями закрепите ее сверху на плате Raspberry Pi и запустите код программы проекта на выполнение. Если все работает нормально, то двигатели будут вращаться в различных направлениях (с двухсекундными интервалами между ними), а направление их вращения будет отображаться на экране ЖК дисплея.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import RPi.GPIO as GPIO from time import sleep import board import Adafruit_CharLCD as LCD # Raspberry Pi pin setup lcd_rs = 0 lcd_en = 5 lcd_d4 = 6 lcd_d5 = 19 lcd_d6 = 26 lcd_d7 = 21 lcd_backlight = 2 #Define LCD column and row size for 16x2 LCD. lcd_columns = 16 lcd_rows = 2 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) # Pins for Motor Driver Inputs Motor1A = 4 Motor1B = 17 Motor1E = 12 Motor2A = 27 Motor2B = 22 Motor2E = 13 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(Motor1A,GPIO.OUT) GPIO.setup(Motor1B,GPIO.OUT) GPIO.setup(Motor1E,GPIO.OUT) GPIO.setup(Motor2A,GPIO.OUT) GPIO.setup(Motor2B,GPIO.OUT) GPIO.setup(Motor2E,GPIO.OUT) GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.output(Motor1E , 1) GPIO.output(Motor2E , 1) while True: input_state = GPIO.input(14) print (input_state) if input_state == False: #Left GPIO.output(Motor1A , 0) GPIO.output(Motor1B , 0) GPIO.output(Motor2A , 1) GPIO.output(Motor2B , 0) lcd.clear() lcd.set_cursor(6,0 ) lcd.message ('Left') print ("Left") sleep(2) #Forward GPIO.output(Motor1A , 1) GPIO.output(Motor1B , 0) GPIO.output(Motor2A , 1) GPIO.output(Motor2B , 0) lcd.clear() lcd.set_cursor(4,0 ) lcd.message ('Forward') print ("Forward") sleep(2) #Right GPIO.output(Motor1A , 1) GPIO.output(Motor1B , 0) GPIO.output(Motor2A , 0) GPIO.output(Motor2B , 0) lcd.clear() lcd.set_cursor(5,0 ) lcd.message ('Right') print ("Right") sleep(2) #Reverse GPIO.output(Motor1A , 0) GPIO.output(Motor1B , 1) GPIO.output(Motor2A , 0) GPIO.output(Motor2B , 1) lcd.clear() lcd.set_cursor(4,0 ) lcd.message ('Reverse') print ("Reverse") sleep (2) #Stop GPIO.output(Motor1A , 0) GPIO.output(Motor1B , 0) GPIO.output(Motor2A , 0) GPIO.output(Motor2B , 0) lcd.clear() |