Привет, Хабр! Хочу на примерах рассказать о самом простом способе создания чего то сложного. Суть страшного слова «прототипирование» сводится к использованию аналогий или шаблонов в проекте Arduino.
Не хочу пугать длинными словами начинающих пользователей Python-Arduino, по-этому идем сразу по примерам.
Зумер [1]. выдает звук, когда снабжен цифровым значением HIGH (то есть, +5 В), которое может быть обеспечено с помощью цифровых выводов Arduino [2].
Однако, вместо того, чтобы выполнять простой цифровой вывод, как было выполнено с датчиком движения реализуем трюки программирования Python для генерации различных звуковых паттернов и создания различных звуковых эффектов.
Чтобы выполнить эти действия, мы собираемся реализовать специальную функцию Python, которая будет принимать номер пина, время повторения и номер образца в качестве входных данных.
Прежде чем перейти к объяснению кода, необходимо открыть файл программы, buzzerPattern.py, из папки кода. В начале кода можно найти функцию Python buzzerPattern (), которая будет вызываться из основной программы с соответствующими параметрами. Эта функция является ядром всей программы.
Функция содержит два массива массивов с жестким кодом, pattern1 и pattern2. Каждый из них содержит время включения и выключения зуммера в течение секунды, которое является рабочим циклом шаблона.
Например, в pattern1 0,8 представляет время, в течение которого зуммер должен быть включен, а 0,2 представляет противоположное.
Функция будет повторять этот шаблон зуммера для периодов повторения, заданных аргументом функции. После запуска цикла for со значением повторения функция проверяет номер шаблона из аргумента функции и выполняет шаблон.
Как только весь цикл повторения завершен, снова полностью отключим зуммер, если он включен, и безопасно отключим плату с помощью метода exit ():
Остальная часть программы относительно проста, поскольку содержит код для им-порта библиотек и инициализации платы Arduino. Как только плата инициализируется, выполним функцию buzzerPattern () с входным аргументом (2, 10, 1). Этот аргумент попросит функцию воспроизвести pattern1 10 раз на контакте номер 2:
DC [3] широко используется в робототехнических приложениях. Они доступны в широком диапазоне характеристик напряжения, в зависимости от применения.
В этом примере используем электродвигатель постоянного тока 5 В, потому что мы хотим подавать питание с помощью самой платы Arduino. Поскольку цифровой вывод Arduino может иметь только два состояния, то есть HIGH (+ 5V) или LOW (0V), невозможно управлять скоростью двигателя, используя только режим OUTPUT.
В качестве решения мы собираемся реализовать режим PWM с помощью цифровых выводов, которые способны поддерживать PWM. При использовании pyFirmata выводы, сконфигурированные в режиме PWM, принимают любые значения ввода с плавающей точкой от 0 до 1.0, которые представляют 0 и 5 В. соответственно.
Чтобы не повредить плату Arduino из-за большой случайной потери тока, мы будем использовать транзистор в качестве переключателя, который использует только небольшое количество тока для управления большим током в двигателе постоянного тока.
Для завершения соединения цепи, как показано на следующей схеме, понадобятся NPN-транзистор (TIP120, N2222 или аналогичный), один диод (1N4001 или аналогичный) и резистор на 220 Ом с DC-двигателем.
Подключите базу транзистора к цифровому выводу 3, который также поддерживает режим PWM. Соедините остальные компоненты, как показано на схеме:
Пользовательская функция, dcMotorControl (), принимает скорость и длительность двигателя в качестве входных параметров, как описано в следующем фрагменте кода:
Используем аналогичный код для импорта необходимой библиотеки и инициализации платы Arduino.
После инициализации мы назначаем режим цифрового вывода 3 как PWM, что видно из использования метода get_pin ('d: 3: p'). Этот код отражает косвенный режим назначения пинрежима, о котором мы узнали в предыдущем разделе:
В процессе сбора ручных данных от пользователя мы запускаем комбинацию опера-тора try / except (чтобы освободить плату при выходе) и инструкцию while (чтобы получить непрерывные данные от пользователя).
Шаблон кода вводит метод input () для получения пользовательских значений (скорости двигателя и продолжительности запуска двигателя) из интерактивного терминала Python. Как только эти значения получены от пользователя, программа вызывает функцию dcMotorControl () для выполнения моторного действия: try:
try:
В предыдущем шаблоне мы контролировали скорость двигателя постоянного тока с помощью PWM. Аналогичным образом можно управлять яркостью светодиода. Вместо того, чтобы просить пользователя вводить яркость, мы будем использовать модуль Python случайным образом в этом шаблоне.
Будем использовать этот модуль для генерации случайного числа от 1 до 100, которое позже будет использовано для записи этого значения на выводе и случайного изменения яркости светодиода.
Эта функция randint () — действительно полезная функция, предоставляемая случайным модулем, и она широко используется при тестировании прототипов путем быстрой отправки случайных сигналов.
Понадобится подтягивающий резистор для подключения светодиода к контакту Arduino. Необходимо подключить анод светодиода (более длинный нож) к цифровому вы-воду 11 через один резистор с сопротивлением 220 Ом и соединить катод (более короткая нога) с землей:
Важно отметить, что цифровой контакт 11 на Arduino Uno также способен выполнять PWM вместе с цифровыми булавками 3, 5, 6, 9 и 10.
Используем код Python с названием ledBrightnessPWM.py Значение float между 0 и 1.0 выбирается случайным образом, прежде чем передавать его на вывод PWM.
Первые несколько строк кода импортируют необходимые библиотеки и инициализируют плату.
В этом примере мы используем прямой метод назначения пин-режима. В следующем фрагменте кода, цифровой пин 11 назначается для режима PWM:
После конца цикла нужно безопасно отключить плату Arduino после выключения светодиода в последний раз.
В этой публикации на простых примерах раскрыт самый распространенный подход к программированию датчиков, управляющих устройств к ним. Представлены коды Python которые легко можно использовать в собственных проектах Arduino. Для наглядности примеров использованы различные датчики и шаблоны кода.
Не хочу пугать длинными словами начинающих пользователей Python-Arduino, по-этому идем сразу по примерам.
Зуммер — генерирует звуковой сигнал тревоги
Зумер [1]. выдает звук, когда снабжен цифровым значением HIGH (то есть, +5 В), которое может быть обеспечено с помощью цифровых выводов Arduino [2].
Однако, вместо того, чтобы выполнять простой цифровой вывод, как было выполнено с датчиком движения реализуем трюки программирования Python для генерации различных звуковых паттернов и создания различных звуковых эффектов.
Соединения
Код Python
Чтобы выполнить эти действия, мы собираемся реализовать специальную функцию Python, которая будет принимать номер пина, время повторения и номер образца в качестве входных данных.
Прежде чем перейти к объяснению кода, необходимо открыть файл программы, buzzerPattern.py, из папки кода. В начале кода можно найти функцию Python buzzerPattern (), которая будет вызываться из основной программы с соответствующими параметрами. Эта функция является ядром всей программы.
Функция содержит два массива массивов с жестким кодом, pattern1 и pattern2. Каждый из них содержит время включения и выключения зуммера в течение секунды, которое является рабочим циклом шаблона.
Например, в pattern1 0,8 представляет время, в течение которого зуммер должен быть включен, а 0,2 представляет противоположное.
Функция будет повторять этот шаблон зуммера для периодов повторения, заданных аргументом функции. После запуска цикла for со значением повторения функция проверяет номер шаблона из аргумента функции и выполняет шаблон.
Как только весь цикл повторения завершен, снова полностью отключим зуммер, если он включен, и безопасно отключим плату с помощью метода exit ():
def buzzerPattern(pin, recurrence, pattern):
pattern1 = [0.8, 0.2]
pattern2 = [0.2, 0.8]
flag = True
for i in range(recurrence):
if pattern == 1:
p = pattern1
elif pattern == 2:
p = pattern2
else:
print "Please enter valid pattern. 1 or 2."
exit
for delay in p:
if flag is True:
board.digital[pin].write(1)
flag = False
sleep(delay)
else:
board.digital[pin].write(0)
flag = True
sleep(delay)
board.digital[pin].write(0)
board.exit()
Остальная часть программы относительно проста, поскольку содержит код для им-порта библиотек и инициализации платы Arduino. Как только плата инициализируется, выполним функцию buzzerPattern () с входным аргументом (2, 10, 1). Этот аргумент попросит функцию воспроизвести pattern1 10 раз на контакте номер 2:
from pyfirmata import Arduino
from time import sleep
port = '/dev/cu.usbmodemfa1331'
board = Arduino(port)
sleep(5)
buzzerPattern(2, 10, 1)
Двигатель постоянного тока — управление скоростью двигателя с использованием двигателей PWM
DC [3] широко используется в робототехнических приложениях. Они доступны в широком диапазоне характеристик напряжения, в зависимости от применения.
В этом примере используем электродвигатель постоянного тока 5 В, потому что мы хотим подавать питание с помощью самой платы Arduino. Поскольку цифровой вывод Arduino может иметь только два состояния, то есть HIGH (+ 5V) или LOW (0V), невозможно управлять скоростью двигателя, используя только режим OUTPUT.
В качестве решения мы собираемся реализовать режим PWM с помощью цифровых выводов, которые способны поддерживать PWM. При использовании pyFirmata выводы, сконфигурированные в режиме PWM, принимают любые значения ввода с плавающей точкой от 0 до 1.0, которые представляют 0 и 5 В. соответственно.
Соединения
Чтобы не повредить плату Arduino из-за большой случайной потери тока, мы будем использовать транзистор в качестве переключателя, который использует только небольшое количество тока для управления большим током в двигателе постоянного тока.
Для завершения соединения цепи, как показано на следующей схеме, понадобятся NPN-транзистор (TIP120, N2222 или аналогичный), один диод (1N4001 или аналогичный) и резистор на 220 Ом с DC-двигателем.
Подключите базу транзистора к цифровому выводу 3, который также поддерживает режим PWM. Соедините остальные компоненты, как показано на схеме:
Код Python
Пользовательская функция, dcMotorControl (), принимает скорость и длительность двигателя в качестве входных параметров, как описано в следующем фрагменте кода:
def dcMotorControl(r, deltaT):
pwmPin.write(r/100.00)
sleep(deltaT)
pwmPin.write(0)
Используем аналогичный код для импорта необходимой библиотеки и инициализации платы Arduino.
После инициализации мы назначаем режим цифрового вывода 3 как PWM, что видно из использования метода get_pin ('d: 3: p'). Этот код отражает косвенный режим назначения пинрежима, о котором мы узнали в предыдущем разделе:
# Set mode of pin 3 as PWM
pwmPin = board.get_pin('d:3:p')
В процессе сбора ручных данных от пользователя мы запускаем комбинацию опера-тора try / except (чтобы освободить плату при выходе) и инструкцию while (чтобы получить непрерывные данные от пользователя).
Шаблон кода вводит метод input () для получения пользовательских значений (скорости двигателя и продолжительности запуска двигателя) из интерактивного терминала Python. Как только эти значения получены от пользователя, программа вызывает функцию dcMotorControl () для выполнения моторного действия: try:
try:
while True:
r = input("Enter value to set motor speed: ")
if (r > 100) or (r <= 0):
print "Enter appropriate value."
board.exit()
break
t = input("How long? (seconds)")
dcMotorControl(r, t)
except KeyboardInterrupt:
board.exit()
os._exit
LED — контролируя яркость светодиода с использованием PWM
В предыдущем шаблоне мы контролировали скорость двигателя постоянного тока с помощью PWM. Аналогичным образом можно управлять яркостью светодиода. Вместо того, чтобы просить пользователя вводить яркость, мы будем использовать модуль Python случайным образом в этом шаблоне.
Будем использовать этот модуль для генерации случайного числа от 1 до 100, которое позже будет использовано для записи этого значения на выводе и случайного изменения яркости светодиода.
Эта функция randint () — действительно полезная функция, предоставляемая случайным модулем, и она широко используется при тестировании прототипов путем быстрой отправки случайных сигналов.
Соединения
Понадобится подтягивающий резистор для подключения светодиода к контакту Arduino. Необходимо подключить анод светодиода (более длинный нож) к цифровому вы-воду 11 через один резистор с сопротивлением 220 Ом и соединить катод (более короткая нога) с землей:
Важно отметить, что цифровой контакт 11 на Arduino Uno также способен выполнять PWM вместе с цифровыми булавками 3, 5, 6, 9 и 10.
Код Python
Используем код Python с названием ledBrightnessPWM.py Значение float между 0 и 1.0 выбирается случайным образом, прежде чем передавать его на вывод PWM.
Первые несколько строк кода импортируют необходимые библиотеки и инициализируют плату.
from pyfirmata import Arduino, INPUT, PWM
from time import sleep
import random
port = '/dev/cu.usbmodemfa1311'
board = Arduino(port)
sleep(5)
В этом примере мы используем прямой метод назначения пин-режима. В следующем фрагменте кода, цифровой пин 11 назначается для режима PWM:
pin = 11
Board.digital [pin] .mode = PW
После конца цикла нужно безопасно отключить плату Arduino после выключения светодиода в последний раз.
board.digital[pin] .write(0)
board.exit()
Выводы
В этой публикации на простых примерах раскрыт самый распространенный подход к программированию датчиков, управляющих устройств к ним. Представлены коды Python которые легко можно использовать в собственных проектах Arduino. Для наглядности примеров использованы различные датчики и шаблоны кода.