Ардуино плюс Python

Урок 11. Чтение цифровых входов

Цифровые входы могут иметь только два возможных значения. В схеме каждое из этих значений представлено различным напряжением. В таблице ниже показано представление цифрового входа для стандартной платы Arduino Uno:

Значение Уровень Напряжение
0 Low 0V
1 High 5V

Для управления светодиодом вы будете использовать кнопку для отправки значений цифрового ввода в Arduino. Кнопка должна подать 0 В на плату, когда она отпущена, и 5 В на плату, когда она нажата. На рисунке ниже показано, как подключить кнопку к плате Arduino:

Вы можете заметить, что светодиод подключен к Arduino на цифровом выводе 13, как и раньше. Цифровой контакт 10 используется в качестве цифрового входа. Чтобы подключить кнопку, вы должны использовать резистор 10 кОм, который действует как понижающий в этой цепи. Понижающий резистор гарантирует, что цифровой вход получает 0 В, когда кнопка отпущена.

Когда вы отпускаете кнопку, вы открываете соединение между двумя проводами на кнопке. Поскольку через резистор ток не течет, контакт 10 просто подключается к земле (GND).

Цифровой вход получает 0 В, что представляет состояние 0 (или низкий уровень). Когда вы нажимаете кнопку, вы подаете 5 В на резистор и на цифровой вход. Ток протекает через резистор, и цифровой вход получает 5 В, что представляет состояние 1 (или высокий уровень).

Вы также можете использовать макет для сборки вышеуказанной схемы:

Теперь, когда вы собрали схему, вам нужно запустить программу на ПК, чтобы управлять ею с помощью Firmata. Эта программа включит светодиод в зависимости от состояния кнопки:

import pyfirmata
import time

board = pyfirmata.Arduino('/dev/ttyACM0')

it = pyfirmata.util.Iterator(board)
it.start()

board.digital[10].mode = pyfirmata.INPUT

while True:
    sw = board.digital[10].read()
    if sw is True:
        board.digital[13].write(1)
    else:
        board.digital[13].write(0)
    time.sleep(0.1)

Давайте пройдемся по этой программе:

  • Строка 1 и 2 импортируют pyfirmata и time (время).
  • В строке 4 используется pyfirmata.Arduino() для установки соединения с платой Arduino.
  • Строка 6 назначает итератор, который будет использоваться для считывания состояния входов схемы.
  • Строка 7 запускает итератор, который поддерживает цикл, работающий параллельно с вашим основным кодом. Цикл выполняет board.iterate() для обновления входных значений, полученных с платы Arduino.
  • Строка 9 устанавливает вывод 10 как цифровой вход с pyfirmata.INPUT. Это необходимо, поскольку в конфигурации по умолчанию используются цифровые контакты в качестве выходов.
  • Строка 11 запускает бесконечный цикл while. Этот цикл считывает состояние входного контакта, сохраняет его в sw и использует это значение для включения или выключения светодиода путем изменения значения контакта 13.
  • Строка 17 ожидает 0,1 секунды между итерациями цикла while. Это не является строго необходимым, но это хороший прием, чтобы избежать перегрузки процессора, который достигает 100% нагрузки, когда в цикле нет команды ожидания.

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

import pyfirmata
import time

board = pyfirmata.Arduino('/dev/ttyACM0')

it = pyfirmata.util.Iterator(board)
it.start()

digital_input = board.get_pin('d:10:i')
led = board.get_pin('d:13:o')

while True:
    sw = digital_input.read()
    if sw is True:
        led.write(1)
    else:
        led.write(0)
    time.sleep(0.1)

В этой версии вы используете board.get_pin() для создания двух объектов. digital_input представляет состояние цифрового входа, а led представляет состояние светодиода. Когда вы запускаете этот метод, вы должны передать строковый аргумент, состоящий из трех элементов, разделенных двоеточиями:

  1. Тип контакта (a для аналогового или d для цифрового);
  2. Номер контакта;
  3. Режим вывода (i для ввода или o для вывода).

Поскольку digital_input - это цифровой вход, использующий вывод 10, вы передаете аргумент 'd:10:i'. Состояние светодиода устанавливается на цифровой выход с помощью контакта 13, поэтому аргумент светодиода 'd:13:o'.

Когда вы используете board.get_pin() нет необходимости явно устанавливать вывод 10 в качестве входа, как вы делали раньше с pyfirmata.INPUT. После того, как контакты установлены, вы можете получить доступ к статусу цифрового входного контакта, используя read(), и установить статус цифрового выходного контакта с помощью write().

Цифровые входы широко используются в проектах электроники. Несколько датчиков обеспечивают цифровые сигналы, такие как датчики присутствия или двери, которые можно использовать в качестве входов для ваших цепей. Однако в некоторых случаях вам необходимо измерить аналоговые значения, такие как расстояние или физические величины. В следующем уроке вы узнаете, как читать аналоговые входы, используя Arduino и Python.