Начните измерять мир вокруг себя с помощью этого практичного и комплексного проекта.

Ключевые выводы

  • В Raspberry Pi отсутствует аналоговый вход, но вы можете добавить внешние АЦП для преобразования реального напряжения в цифровую форму для записи, манипулирования и управления.
  • Популярные варианты АЦП включают MCP3004/MCP3008 для достижения компромисса между скоростью и точностью или ADS111x для 16-битных показаний с более низкой частотой дискретизации.
  • ADS1115 от Adafruit — это простой вариант с усилителем с программируемым усилением (PGA), который позволяет обнаруживать небольшие разницы напряжения и регулировать усиление во время программы. Подключить его к Raspberry Pi с помощью I2C очень просто.

Изначально у Raspberry Pi отсутствует аналоговый вход. Это ставит его в невыгодное положение по сравнению с платами на базе микроконтроллеров, такими как Arduino.

Но не отчаивайтесь: есть много вариантов, которые стоит рассмотреть. Приступайте к работе с Raspberry Pi и внешним АЦП.

Зачем добавлять входы?

instagram viewer

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

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

Варианты АЦП

Итак, какой АЦП лучше всего подойдет новичкам?

Среди наиболее популярных и простых вариантов можно назвать MCP3004MCP3008) чипы от Microchip. Вы получите четыре (или восемь) каналов по 10 бит каждый, которые могут считывать данные со скоростью до 200 kSPS. С другой стороны, есть устройства ADS111x от Texas Instruments, которые читают 16 бит со скоростью 860 SPS. Итак, существует компромисс между скоростью и точностью (и, естественно, ценой).

Многие микроконтроллеры оснащены встроенными АЦП. ATMega, которую можно найти в обычном Arduino. помимо всего прочего предложит несколько 10-битных каналов. Это то, что позволяет Arduino предоставлять аналоговые входы там, где Raspberry Pi не может. Если в вашей настройке уже используется Arduino и 10 бит достаточно для точности, то это может быть самый простой путь.

Здесь мы поступим проще и воспользуемся ADS1115 от Adafruit.

Что такое усилитель с программируемым усилением?

Этот чип имеет несколько интересных функций, включая усилитель с программируемым усилением (PGA). Это позволит вам установить желаемый диапазон значений в цифровом виде, вплоть до долей вольта. Учитывая количество значений, которые могут представлять 16 бит, это позволит вам обнаружить разницу всего в несколько микровольт.

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

А как насчет мультиплексирования?

Мультиплексор (или мультиплексор) — это переключатель, который позволяет считывать множество входных сигналов с помощью одного АЦП. Если ваш чип АЦП имеет много входных контактов, значит, происходит внутреннее мультиплексирование. Мультиплексор ADS1115 имеет четыре входа, которые можно выбрать через внутренние регистры.

Работа с регистрами

ADS1115 предоставляет эти возможности, а также некоторые другие. Разобраться с мультиплексором, отрегулировать усиление, активировать встроенный компаратор, изменить частоту дискретизации и перевести устройство в режим энергосбережения можно, щелкнув несколькими переключателями.

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

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

Например, биты с 14 по 12 управляют мультиплексором. Используя эти три бита, вы можете выбрать одну из восьми конфигураций. Здесь вам понадобится «100», что даст разницу между входным нулем и землей. С другой стороны, биты с 7 по 5 управляют частотой дискретизации. Если вам нужно максимум 860 выборок в секунду, вы можете установить для них значение «111».

Как только вы узнаете, какие параметры установить, у вас будет два байта для отправки в АЦП. Если позже вы захотите установить один бит здесь или там, вы можете работать с ними индивидуально, используя побитовые операторы.

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

Подключение

Вы можете подключить это устройство прямо к макетной плате. Вход положительного напряжения принимает напряжение от 2 до 5,5 В, а это означает, что шина 3,3 В на Raspberry Pi будет работать нормально.

Подключите входы SDA и SCL к аналогам на RPi и проделайте то же самое с землей и 3,3 В. Установите потенциометр между линией земли и напряжением и подключите средний провод к первому входу АЦП. Это все, что вам нужно, чтобы начать работу!

Работа с I2C

Разные АЦП работают по разным протоколам. В случае с нашим ADS1115, мы собираемся использовать I2C.

В следующем примере взаимодействие с АЦП будет осуществляться с использованием Python. Но прежде чем это сделать, вам нужно его настроить. Последние версии ОС Raspberry Pi сделали это очень просто. Отправляйтесь в Настройки > Конфигурация Raspberry Pi. Затем из Интерфейсы вкладка, переключатель I2C на.

Чтобы проверить, что все работает, откройте терминал и запустите:

sudo i2cdetect -y 1

Эта команда выведет сетку. Предполагая, что все работает и вы все подключили правильно, вы увидите новое значение в таблице. Это адрес вашего АЦП. Имейте в виду, что это шестнадцатеричное значение, поэтому вам нужно добавить к нему префикс «0x» когда вы используете его в коде ниже. Вот это 0x48:

Получив адрес, вы можете использовать библиотеку SMBus для отправки команд I2C. Здесь вы будете иметь дело с двумя методами. Первое - это write_word_data(), который принимает три аргумента: адрес устройства, регистр, в который вы записываете, и значение, которое вы хотите записать.

Второй read_word_data(), который принимает только адрес устройства и регистр. АЦП будет непрерывно считывать напряжения и сохранять результат в регистре преобразования. С помощью этого метода вы можете получить содержимое этого регистра.

Вы можете немного украсить результат, а затем распечатать его. Прежде чем вернуться к началу цикла, введите небольшую задержку. Это гарантирует, что вы не перегружены данными.

from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)

# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0

# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))

# define the top of the range
TOP = 26300

whileTrue:
# read the register
b = bus.read_word_data(addr, CONVERSIONREG)

# swap the two bytes
b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)

# subtract half the range to set ground to zero
b -= 0x8000

# divide the result by the range to give us a value between zero and one
b /= TOP

# cap at one
b = min(b, 1)

# bottom is zero
b = max(b, 0)

# two decimal places
b = round(b, 2)
print(b)
time.sleep(.01)

Вы почти закончили. Сопоставьте диапазон значений, которые вы получаете, с тем, который вы предпочитаете, а затем усеките его до желаемого количества десятичных знаков. Вы можете настроить функцию печати так, чтобы новое значение печаталось только в том случае, если оно отличается от последнего значения. Если вы не уверены в Макс, мин, и круглый, ты можешь ознакомьтесь с нашим списком 20 наиболее важных функций Python!

Борьба с шумом

Теперь, если ваша установка не очень-очень аккуратная и опрятная, вы заметите некоторый шум. Это неотъемлемый недостаток использования 16 бит вместо десяти: небольшой шум будет более заметен.

Подключив соседний вход (вход 1) к земле и переключив режим так, чтобы вы сравнивали первый и второй входы, вы можете получить гораздо более стабильные результаты. Вы также можете заменить эти длинные шумопоглощающие соединительные кабели на маленькие и добавить несколько конденсаторов, пока вы это делаете. Значение вашего потенциометра также может иметь значение.

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

Идите дальше, выбрав множество возможных следующих шагов

Снимать показания через I2C довольно просто, и то же самое во многом справедливо и для других методов, таких как SPI. Хотя может показаться, что между доступными вариантами АЦП существуют большие различия, на самом деле, как только один из них заработает, можно легко применить полученные знания к другим.

Так почему бы не пойти дальше? Соедините несколько потенциометров вместе или попробуйте измерить свет, звук или температуру. Разверните только что созданный контроллер и создайте по-настоящему практичную установку Raspberry Pi!