Чтение аналоговых датчиков на Raspberry Pi без встроенного АЦП
У Raspberry Pi нет встроенных аналоговых входов, но это не мешает считывать аналоговые датчики. Комбинируя несколько резисторов и конденсатор, можно использовать простую технику ступенчатого отклика (step-response) для определения сопротивления — идеально для потенциометров, фоторезисторов, термисторов и других.
Основы
Этот подход, популяризированный туториалами Adafruit и адаптированный в Raspberry Pi Cookbook, измеряет время заряда конденсатора до порогового напряжения. GPIO-пины Raspberry Pi могут зафиксировать момент, когда напряжение превышает ~1,65 В, позволяя судить о сопротивлении подключенного переменного резистора.
Что понадобится
- Стандартная макетная плата и перемыточные провода
- Подстроечный резистор 10 кОм (потенциометр)
- 2 × резистора 1 кОм
- Конденсатор 220 нФ
Код на Python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# Назначение пинов
A_PIN = 18 # Управление разрядом/зарядом конденсатора
B_PIN = 23 # Детекция порогового напряжения
def discharge():
GPIO.setup(A_PIN, GPIO.IN)
GPIO.setup(B_PIN, GPIO.OUT)
GPIO.output(B_PIN, False)
time.sleep(0.005)
def charge_time():
GPIO.setup(B_PIN, GPIO.IN)
GPIO.setup(A_PIN, GPIO.OUT)
count = 0
GPIO.output(A_PIN, True)
while not GPIO.input(B_PIN):
count += 1
return count
def analog_read():
discharge()
return charge_time()
try:
while True:
print(analog_read())
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
Запуск скрипта дает вывод подобный:
$ sudo python pot_step.py
101
210
101
623
435
367
728
610
512
314
317
0
Показания колеблются примерно от 10 до 170 при вращении ручки потенциометра, отражая переменное сопротивление.
Как это работает
Метод основан на кривой заряда RC. Когда конденсатор подключен к переменному резистору, его напряжение растет экспоненциально. GPIO-пин фиксирует логическую единицу, как только напряжение на конденсаторе превышает входной порог (~1,65 В). Прошедшее время — подсчитанное в итерациях цикла — прямо коррелирует с сопротивлением: меньшее сопротивление означает быстрейший заряд, давая меньший счетчик.
Поскольку у Pi нет аналого-цифрового преобразователя, этот тайминговый метод обходит это ограничение, предлагая дешевый и надежный способ считывать широкий спектр аналоговых датчиков.
Производственный процесс
- Профессиональный мониторинг температуры на Raspberry Pi с датчиком DS18B20
- Компактный breakout для DHT температуры и влажности на Raspberry Pi — ATtiny85 и DHT22/DHT11
- Как подключить однопроводный датчик температуры DS1820 к Raspberry Pi через GPIO
- Интеграция данных сенсоров в Raspberry Pi: практическое руководство
- Подключение ультразвукового датчика HC‑SR04 к Raspberry Pi 3 — полное руководство
- Измерение аналоговых датчиков на Raspberry Pi с одним GPIO-пином
- Raspberry Pi: логирование фоторезистора и система оповещений — низкопотребительный световой датчик на Python
- Создание IoT с Java ME 8 на Raspberry Pi: Часть 1 — интеграция GPIO-датчиков
- Чтение линейного Холловского датчика с Raspberry Pi: руководство по Java и особенности ADC0832
- Чтение нажатий кнопки через GPIO на Raspberry Pi: пошаговое руководство