1

Подключение АЦП ADS1115 к Raspberry pi

Недавно мне понадобилось подключить инфракрасный дальномер GP2Y0A710K0F к Raspberry pi. Выход у датчика аналоговый. Вот тут-то и начались поиски хорошего АЦП. В этой статье речь пойдет про АЦП ADS1115.  Если вы читаете эту статью, то вы наверняка уже знаете зачем он нужен.

Я расскажу о том, что я узнал про АЦП вцелом и про ADS1115 в частности. Важно заметить, что я не профессионал в данной сфере. Повторяя что-либо из этой статьи вы действуете на свой страх и риск:)

Аналоговый и Цифровой сигналы

Цифровой и аналоговый сигнал, это всего лишь напряжение (или его отсутствие). Такое напряжение можно померить вольтметром или осциллографом.
Для аналогового сигнала важна величина этого напряжения, а для цифрового — его отсутствие или наличиеАналоговый и цифровой сигналы (график)

Цифровой сигнал представляет собой промежутки времени когда некое напряжение находится выше определенной отметки или ниже ее. Например колебания от 0 до 5 вольт. Эти крайние состояни называются High и Low или 1 и 0. Цифровой сигнал более устойчив к помехам. Наиболее частой помехой (для Arduino или Raspberry) бывают скачки напряжения питания. Поэтому всегда разделяйте питание платы и периферии.

Аналоговый сигнал может принимать любое значение в заданном промежутке. Строго говоря, в диапазоне от 0 до 5 вольт может быть бесконечное число значений напряжения (зависит то того, с какой точностью мы измеряем). Ни Raspeberry pi, ни Arduino не работают непосредственно с аналоговым сигналом. Его нужно оцифровать. То есть, сигнал нужно измерить, а число передается «в наш код» уже в виде единиц и нулей.

АЦП (Аналого-цифровой преобразователь)

Устройство для преобразования аналогового сигнала в цифровой называется АЦП (Аналого-цифровой преобразователь, или ADS). В Arduino есть встроенный АЦП  с точностью 10 бит. Чем больше бит, тем более точный преобразователь при прочих равных. 10 бит, это 10 единиц и нулей (210) чтобы передать значение напряжения. Для Arduino, напряжение от 0 до опорного (обычно 5в, но можно выставить другое значение) передается числом от 0 до 1023. При этом: 0 = 0 вольт, 1023 = 5 вольт.

Rapsberry pi нет встроенного АЦП. Но можно использовать внешний по I2C. Одним из таких является 16-битный ADS1115.

ADS1115

ADS1115

Datasheet можно сказать здесь (.pdf). Основные особенности:

  • Точность: 16бит
  • Частота дискретизации (то как часто считываются значения): 8-840Гц (программируется)
  • Энергопотребление: 150 мкА (в стандартном режиме)
  • Напряжение питания: 2 — 5.5 в.
  • Интерфейс I2C для обмена данными с возможностью изменения адреса (пин ADDR)
  • Имеет 4 регистра памяти по 2 байта в каждом для записи настроек и чтения результатов.
  • 4 аналоговых пина (могут работать как 2 дифференциальных).

По умолчанию, адрес устройства на I2C 0x48 или 0b01001000*. Чтобы его поменять, необходимо соединить выход ADDR с одним из 4 контактов.

*Для перевода из шестнадцатеричной в двоичную систему я использую следующий код на javascript:

Number(0xc1).toString(2) //"11000001"

 Двоичная система визуально проще для понимания бит. 

Подключение ADDR I2C адрес в 16-й системе I2C адрес в двоичной системе
GND 0x48 0b1001000
VDD 0x49 0b1001001
SDA 0x4a 0b1001010
SCL 0x4b 0b1001011

Память устройства состоит из 4х регистров.

Адрес регистра Предназначение
0b00000000 Conversion reginster — отсюда читаем значение 2 байта
0b00000001 Config register — сюда записываем конфигурацию (по умолчанию 0b1000010110000011)
0b00000010 Lo_thresh register — регистр установки для компаратора, минимальное значение (по умолчанию 0b1000000000000000)
0b00000011 Hi_thresh register — регистр установки для компаратора, максимальное значение (по умолчанию 0b111111111111111)

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

0b1000010110000011

Биты Называние Описание
15 OS Статус преобразования или одиночные преобразования. Две функции:

  1. При чтении вернет статус преобразования
    • 1 — в процессе
    • 0 — завершено
  2. При записи можно включить режим одиночного преобразования. Для этого нужно записать 1.
14-13-12 MUX Конфигурация мультиплексора. Управляет тем, между какими пинами считываем напряжение.  В конкретный промежуток времени плата может сравнивать напряжение только между какими-то двумя контактами. В нашем распоряжении A0, A1, A2, A3 и GND.

  • 000 : между A0 и A1  (по умолчанию) ADS1115 мультиплексор
  • 001 : между A0 и A3
  • 010 : между A1 и A3
  • 011 : между A2 и A3
  • 100 : между A0 и GND
  • 101 : между A1 и GND
  • 110 : между A2 и GND
  • 111 : между A3 и GND
11-10-9 PGA Коэффициент усиления внутреннего усилителя. Чем меньше значение, тем точнее измерение, но меньше предел. Подаваемое напряжение не должно быть выше заданного порога для усилителя.

  • 000 : FSR = ±6.144 V
  • 001 : FSR = ±4.096 V
  • 010 : FSR = ±2.048 V (по умолчанию)
  • 011 : FSR = ±1.024 V
  • 100 : FSR = ±0.512 V
  • 101 : FSR = ±0.256 V
  • 110 : FSR = ±0.256 V
  • 111 : FSR = ±0.256 V
8 MODE Режим преобразования

  • 0 — непрерывное преобразование
  • 1  — одиночное преобразование с переходом в энергосберегающий режим
7-6-5 DR Частота преобразования (дискретизации).

  • 000 : 8 ГЦ
  • 001 : 16 ГЦ
  • 010 : 32 ГЦ
  • 011 : 64 ГЦ
  • 100 : 128 ГЦ (по умолчанию)
  • 101 : 250 ГЦ
  • 110 : 475 ГЦ
  • 111 : 860 ГЦ
4 COMP_MODE Тип компаратора

  • 0 — компаратор с гистерезисом (по умолчанию)
  • 1 — компаратор без гистерезиса
3 COMP_POL Полярность компаратора. Задает полярность пина ALERT

  • 0 — активный нижний уровень (по умолчанию)
  • 1 — активный высокий уровень
2 COMP_LAT Режим работы компоратора

  • 0 — не запоминает значение при достижении порога (по умолчанию)
  • 1 — запоминает значение
1-0 COMP_QUE У этой настройки 2 функции. Если установить 11, то можно выключить компаратор. Остальные значение задают то, при каком количестве превышений верхнего или нижнего порогов компаратора значение пина ALERT будет выставлено в логическую единицу.

  • 00 : Срабатывание после 1 достижения верхней или нижней границ
  • 01 : Срабатывание после 2х
  • 10 : Срабатывание после 4х
  • 11 :  Отключение компоратора. Выставляет пин ALERT в 1 (по умолчанию)

Подключение ADS1115 к Raspberry pi 3

Подключаем ADS1115 к Rasbperry pi. В качестве примера, подключим к АЦП пальчиковую батарейку (можно любой другой источник напряжения до 6 вольт).

Raspberry pi 3 ads1115

На Raspberry pi можно работать с большим количеством языков программирования. Я использую JavaScript.

const Raspi = require('raspi-io');
const five = require('johnny-five');
const board = new five.Board({
  io: new Raspi()
});

const pga = 6114; //берем из таблицы  

board.on('ready', function() {
  const virtual = new five.Board.Virtual(new five.Expander({ controller: 'ADS1115' }));
  // virtual.io.REGISTER.PIN[0]= 0b11000001; // первый байт конфига 
  virtual.io.REGISTER.PIN_DATA = 0b10100011; // второй байт конфига

  const sensor = new five.Sensor({
    pin: 0,
    board: virtual,
    freq: 250
  });

  sensor.on('data', function() {
    const voltage = this.value * pga / 32768;
    console.log(voltage / 1000);
  });
});

Для запуска этого кода нам понадобится Nodejs установленный на Raspberry pi.

Данный пример с кодом я залил на гитхаб. Чтобы его запустить нужно скачать или склонировать репозиторий:

git clone https://github.com/MichaelKostin/ads1115-raspberrypi.git

Перейти в папку с кодом:

cd ads1115-raspberrypi

Установить зависимости (johnny-five и raspi-io):

npm i

Запустить код:

sudo node ads1115.js

Если к вашей плате подключена пальчиковая батарейка, как показано на картинке выше, то в консоле вы увидите что-то в этом роде:

Результат выполнения кода для запуска ADS1115

Значения измерений АЦП приведены в вольтах. Мой вольтметр показывал напряжение 1,57в. Показания вольтметра для пальчиковой батарейки

Результат измерения напряжения через АЦП я считаю успешным. Данный код запускал чип с величиной усилителя FSR = ±6.144 V.

Библиотеку на питоне можно найти здесь.

Впереди подключение инфракрасного дальномера.

Михаил Костин

1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.