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

Урок 12. Чтение аналоговых входов

В отличие от цифровых входов, которые могут быть только включены или выключены, аналоговые входы используются для считывания значений в некотором диапазоне.

На Arduino Uno напряжение на аналоговом входе находится в диапазоне от 0 до 5 В. Соответствующие датчики используются для измерения физических величин, таких, например, как расстояния. Эти датчики отвечают за кодирование этих физических величин в надлежащем диапазоне напряжения, чтобы они могли считываться Arduino.

Для считывания аналогового напряжения Arduino использует аналого-цифровой преобразователь (АЦП), который преобразует входное напряжение в цифровое число с фиксированным числом битов. Это определяет разрешение преобразования. Arduino Uno использует 10-разрядный АЦП и может определять 1024 различных уровня напряжения.

Диапазон напряжения для аналогового входа кодируется числами от 0 до 1023. Когда подается напряжение 0 В, Arduino кодирует его в число 0. Когда подается напряжение 5 В, кодированное число равно 1023. Все значения промежуточного напряжения кодируются пропорционально.

Потенциометр - это переменный резистор, который можно использовать для установки напряжения, подаваемого на аналоговый вход Arduino. Вы подключите его к аналоговому входу для управления частотой мигания светодиода:

В схеме выше светодиод настроен так же, как и раньше. Клеммы потенциометра подключены к заземлению (GND) и контактам 5V. Таким образом, центральный терминал может иметь любое напряжение в диапазоне от 0 до 5 В в зависимости от его положения, которое подключено к Arduino на аналоговом выводе A0.

Используя макет, вы можете собрать эту схему следующим образом:

Перед тем, как управлять светодиодом, вы можете использовать схему для проверки различных значений, которые Arduino считывает в зависимости от положения потенциометра. Для этого запустите на компьютере следующую программу Python:

import pyfirmata
import time

board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()

analog_input = board.get_pin('a:0:i')

while True:
    analog_value = analog_input.read()
    print(analog_value)
    time.sleep(0.1)

В строке 8 вы устанавливаете analog_input в качестве аналогового входного вывода A0 с аргументом 'a:0:i'. Внутри бесконечного цикла while вы читаете это значение, сохраняете его в analog_value и выводите вывод на консоль с помощью print(). Когда вы изменяете потенциометр во время работы программы, вы должны увидеть примерно следующее:

0.0
0.0293
0.1056
0.1838
0.2717
0.3705
0.4428
0.5064
0.5797
0.6315
0.6764
0.7243
0.7859
0.8446
0.9042
0.9677
1.0
1.0

Полученные значения изменяются в диапазоне от 0, когда потенциометр находится в одном положении, до 1, когда он находится в противоположном состоянии. Обратите внимание, что все значения выводятся с плавающей запятой, что может потребовать преобразования в зависимости от приложения.

Чтобы изменить частоту мигания светодиода, вы можете использовать analog_value для контроля того, как долго светодиод будет гореть или выключаться:

import pyfirmata
import time

board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()

analog_input = board.get_pin('a:0:i')
led = board.get_pin('d:13:o')

while True:
    analog_value = analog_input.read()
    if analog_value is not None:
        delay = analog_value + 0.01
        led.write(1)
        time.sleep(delay)
        led.write(0)
        time.sleep(delay)
    else:
        time.sleep(0.1)

Здесь вы вычисляете задержку как analog_value + 0.01, чтобы избежать задержки равной нулю.

В противном случае, в течение первых нескольких итераций обычно получается analog_value как none. Чтобы избежать появления ошибки при запуске программы, вы используете условное выражение в строке 13, чтобы проверить, является ли analog_value значением none. Затем вы контролируете период мигания светодиода.

Попробуйте запустить программу и изменить положение потенциометра. Вы заметите смену частоты мигающего светодиода:

К настоящему моменту вы уже видели, как использовать цифровые входы, цифровые выходы и аналоговые входы в своих цепях. В следующем уроке вы увидите, как использовать аналоговые выходы.