Pull to refresh

Прототипирование в среде Python-Arduino

Reading time 5 min
Views 24K
Привет, Хабр! Хочу на примерах рассказать о самом простом способе создания чего то сложного. Суть страшного слова «прототипирование» сводится к использованию аналогий или шаблонов в проекте 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. Для наглядности примеров использованы различные датчики и шаблоны кода.

Ссылки


  1. Зуммер (Trema-модуль).
  2. Книга: «Arduino Basic Connections».
  3. Arduino и двигатели.
Tags:
Hubs:
+8
Comments 2
Comments Comments 2

Articles