Построение контроллеров на Raspberry Pi #3: управление двигателем постоянного тока и обнаружение объектов
Введение
В предыдущей статье серии «Построение контроллеров на Raspberry Pi» мы изучили, как реализовать программируемую светодиодную мигалку. Для запуска цикла мигания светодиода должна быть нажата кнопка. Несмотря на то, что кнопка является базовым способом, обеспечивающим входной управляющий сигнал для RPi, для обработки и выдачи соответствующего выходного отклика, автоматический подход к управлению может быть достигнут с помощью использования датчиков. Фотоэлементы или фоторезисторы (LDR) часто используются для автоматического включения и выключения освещения. Обычный ночник имеет фотоэлемент, который детектирует наступление темноты, основываясь на изменении его сопротивления. И при обнаружении наступления темноты фотоэлементом включается освещение. Применяя тот же принцип, аналогичным образом мы можем управлять небольшим двигателем постоянного тока. В данном проекте мы соберем контроллер двигателя постоянного тока с функцией обнаружения объектов, структурная схема и перечень компонентов которого приведены ниже.
Список компонентов
- Raspberry Pi (Model A+,B, B+, Pi 2 или Pi 3);
- (Q1) NPN транзистор 2N2222 или аналог;
- (R1) резистор 220 Ом (красный, красный, коричневый, золотой), 0,25 Вт, 5%;
- (D1) выпрямительный диод 1N4001 или аналог;
- (M1) двигатель постоянного тока, 3-6 вольт;
- (Pi 1) переходник для Raspberry Pi или аналог;
- (R2) фотоэлемент;
- беспаечная макетная плата;
- мультиметр;
- перемычки;
- (VCC1) батарейный отсек для четырех элементов AA;
- 4 аккумулятора размера AA;
- кнопка.
Обнаружение света и фотоэлемент
Фотоэлемент – это светочувствительный резистор, он же фоторезистор или LDR (light dependent resistor). На рисунке ниже показаны его внешний вид и условное обозначение.
Электрический «отклик» фотоэлемента на свет заключается в изменении его сопротивления. Чем больше света получает фотоэлемент на светочувствительную свою поверхность, тем сильнее уменьшается его сопротивление до нескольких сотен ом. В темноте сопротивление фотоэлемента составляет мегаомы. Можно провести простой эксперимент, чтобы увидеть, как изменяется сопротивление фотоэлемента в зависимости от уровня освещенности. Во-первых, возьмите мультиметр и установите режим измерения на 20 кОм. Приложите щупы мультиметра к фотоэлементу, как показано на рисунке ниже. Мультиметр отобразит значение сопротивления в несколько тысяч ом.
Затем выберите шкалу, соответствующую мегаомам. Поместите свою руку над фотоэлементом, и вы увидите, что значение сопротивления составляет до нескольких мегаом.
Для получения наилучших результатов сделайте коллиматор (устройство, которое сужает источник получаемого света), разрезав ручку (которой пишут) и покрасив ее внутри в черный цвет. После высыхания поместите коллиматор над фотоэлементом. Размещение коллиматора над фотоэлементом уменьшает количество окружающего света, мешающего при измерении сопротивления. Я сделал коллиматор из колпачка ручки, как показано на рисунке 5 ниже. Измеренное значение сопротивления (на рисунке 4 выше) получено с использованием самодельного коллиматора. Эти минимальное и максимальное значения сопротивления фотоэлемента позволят нам подключить к Raspberry Pi через макетную плату простой выключатель на основе датчика освещенности.
Сборка простого выключателя на основе датчика освещенности
Чтобы упростить схему датчика освещенности, мы будем использовать фотоэлемент совместно с подтягивающим резистором. На рисунке 6 показана принципиальная схема простого выключателя на основе датчика освещенности, подключенного к GPIO выводу Raspberry Pi. Падение напряжения будет пропорционально значению сопротивления фотоэлемента. Например, размещение какого-либо объекта (или своей руки) над фотоэлементом обеспечивает падение напряжения на фоторезисторе примерно 3,3 вольта. Удаление объекта (или руки) уменьшит сопротивление фоторезистора, обеспечивая пропорционально маленькое падение напряжения на нем. Падение напряжения будет считываться GPIO выводом RPi. Код на питоне будет считывать отсутствие или наличие света, как напряжение 3,3 В или 0 В. Таким образом, электрическое поведение обычной кнопки, цифрового коммутатора, будет эмулировано с помощью простой схемы датчика освещенности. Следующим этапом проекта является создание и тестирование управления двигателем постоянного тока через транзистор.
Сборка схемы транзисторного драйвера двигателя
Следующий этап сборки проекта – это подключение электронной схемы, которая будет управлять небольшим двигателем постоянного тока. Для этой цели можно использовать один биполярный транзистор с соответствующим коэффициентом усиления (бета). Вы можете легко собрать транзисторный драйвер двигателя постоянного тока, собрав схему на беспаечной макетной плате, как показано на рисунке 7. На рисунке 8 приведена принципиальная схема драйвера. После сборки схемы на беспаечной макетной плате нажатие кнопочного выключателя включает небольшой двигатель постоянного тока, подключенный к коллектору транзистора. Если двигатель не вращается, уберите из схемы батарейный отсек и перепроверьте соединения и подключение диода 1N4001 и NPN транзистора 2N2222. После того, как все ошибки будут исправлены, подключите батарейный отсек и снова проверьте схему в действии. Поздравляю со сборкой действующего транзисторного драйвера двигателя. Теперь давайте посмотрим, как работает схема драйвера двигателя, вспомнив основы теории транзисторов.
Основы теории транзисторов
Транзистор способен управлять двигателем постоянного тока, благодаря электрическому току источника, который протекает от батарейного отсека +6В через выводы коллектор-эмиттер к земле. Обмотка двигателя постоянного тока включена последовательно между коллектором и батарейным отсеком +6В. Электрический ток протекает от батарейного отсека +6В через обмотку двигателя постоянного тока, позволяя ему вращаться. Для того, чтобы электрический ток протекал через выводы коллектор-эмиттер и обмотку двигателя постоянного тока, транзистор должен быть включен. Для включения транзистора должен быть использован такой способ управления электронной схемой, как прямое смещение. Прямое смещение транзистора означает входное напряжение, приложенное к переходу база-эмиттер, величиной более 0,7В (700 мВ). Кроме того, транзистор должен быть правильно подключен в зависимости от его типа (PNP или NPN). Транзистор 2N2222 – это транзистор NPN типа.
Коллектор и эмиттер состоят из полупроводника N-типа, а база – из полупроводника P-типа. Рисунок 9 показывает обозначение и тип корпуса NPN транзистора 2N2222. Как показано на рисунке 8, база подключается к положительному выводу батарейного отсека +6В (красный провод) через последовательно включенные кнопку и ограничивающий резистор 220 Ом, а эмиттер подключен к земле (черный провод). Резистор 220 Ом подключен к базе транзистора, чтобы уменьшить ток батареи и степень нагрева. Сопротивление 220 Ом – это подходящее значение сопротивления, чтобы обеспечить достаточное значение тока базы, чтобы транзистор включился должным образом. Кроме того, диод 1N4001 предотвращает появление скачка обратного тока от обмотки двигателя постоянного тока, повреждающего транзистор при выключении. Для более подробной информации о биполярных транзисторах прочитайте статью из учебника схемотехники «Биполярные транзисторы». Давайте перейдем к окончательной сборке проекта.
Окончательная сборка проекта
Теперь, с правильно работающей схемой транзисторного драйвера двигателя, мы готовы завершить сборку проекта. Окончательное сборка контроллера двигателя постоянного тока с функцией обнаружения объектов – это подключение схемы драйвера к Raspberry Pi. В проекте светодиодной мигалки мы использовали переходник для GPIO Raspberry Pi, чтобы подключить оптоизолятор и вспомогательные компоненты схемы к соответствующим GPIO выводам RPi. Переходник для GPIO контактов Raspberry Pi обеспечивает удобство с точки зрения доступности GPIO выводов Raspberry Pi на беспаечной макетной плате для электрического подключения электронных схем. Таким образом, та же технология сборки схемы будет использоваться и в этом проекте. Рисунок 10 показывает разводку макетной платы для котроллера двигателя постоянного тока с функцией обнаружения объектов. Принципиальная схема показана на рисунке 11.
Ниже показаны фотография собранного контроллера двигателя постоянного тока с функцией обнаружения объектов и демонстрационное видео его работы. Последним этапом проекта является написание скрипта на питоне, заставляющего наш контроллер работать должным образом.
Python код обнаружения объектов
Python код, показанный ниже, это повторное использование программы из проекта светодиодной мигалки. Имена переменных были изменены, чтобы соответствовать физическим компонентам, подключенным к RPi. Программа включает двигатель постоянного тока при размещении объекта над фотоэлементом. Повторное размещение объекта над датчиком выключает двигатель постоянного тока. Как говорилось ранее, подтягивающий резистор – это программируемый компонент, использующий следующую строку кода на питоне:
GPIO.setup(photocell_pin, GPIO.IN, pull_up_down = GPIO.PUD_UP)
Полный код программы detection.py на Python может быть напечатан в LXTerminal после открытия редактора nano командой sudo nano
.
# *********** Программа обнаружения объектов *****************
#
# Помещение объекта над фотоэлементом включит двигатель постоянного тока.
# Помещение объекта над фотоэлементом во второй раз выключит двигатель.
# Добавить библиотеки в скрипт
import RPi.GPIO as GPIO
import time
# Включить I/O выводы BCM в скрипт и определить номера выводов
GPIO.setmode(GPIO.BCM)
photocell_pin = 4
motor_pin = 18
# Создать вывод фотоэлемента, как выключатель с активным низким уровнем
# (использовать внутренний подтягивающий резистор RPi)
# и определить вывод двигателя, как выход.
GPIO.setup(photocell_pin, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(motor_pin, GPIO.OUT)
# Определить и установить (инициализировать) состояния выхода двигателя как False
# и старое событие вывода как True
motor_state = False
old_input_event = True
# Цикл мониторинга события фотоэлемента: проверить вывод фотоэлемента
# и включить/выключить двигатель в зависимости от входных событий (True или False)
while True:
new_input_event = GPIO.input(photocell_pin)
if new_input_event == False and old_input_event == True:
motor_state = not motor_state
old_input_event = new_input_event
GPIO.output(motor_pin, motor_state)
time.sleep(0.1) # обеспечивает 100 мс времени работы/отключения двигателя
После ввода кода обнаружения объектов в LXTerminal, наберите команду sudo python object_detection.py
. Возьмите объект и поместите его над фотоэлементом: двигатель постоянного тока должен закрутиться. Поместите этот же объект над фоторезистором, чтобы выключить двигатель. Поздравляю, всё работает! Теперь у вас есть работающий контроллер двигателя постоянного тока с обнаружением объектов. Применением устройства обнаружения объектов является бесконтактный пусковой выключатель для конвейерной системы. Вместо того, чтобы использовать обычный кнопочный выключатель для запуска конвейера, это можно выполнить простым движение руки. Изучите другие применения вашего контроллера двигателя постоянного тока с функцией обнаружения объектов. В следующий раз мы рассмотрим, как средствами Raspberry Pi считывать данные с аналоговых устройств.