Недавно мне понадобилось подключить инфракрасный дальномер 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
Datasheet можно сказать здесь (.pdf). Основные особенности:
- Точность: 16бит
- Частота дискретизации (то как часто считываются значения): 8-840Гц (программируется)
- Энергопотребление: 150 мкА (в стандартном режиме)
- Напряжение питания: 2 — 5.5 в.
- Интерфейс I2C для обмена данными с возможностью изменения адреса (пин ADDR)
- Имеет 4 регистра памяти по 2 байта в каждом для записи настроек и чтения результатов.
- 4 аналоговых пина (могут работать как 2 дифференциальных).
По умолчанию, адрес устройства на I2C 0x48 или 0b01001000*. Чтобы его поменять, необходимо соединить выход ADDR с одним из 4 контактов.
*Для перевода из шестнадцатеричной в двоичную систему я использую следующий код на javascript:
Двоичная система визуально проще для понимания бит.
Подключение 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 | Статус преобразования или одиночные преобразования. Две функции:
|
14-13-12 | MUX | Конфигурация мультиплексора. Управляет тем, между какими пинами считываем напряжение. В конкретный промежуток времени плата может сравнивать напряжение только между какими-то двумя контактами. В нашем распоряжении A0, A1, A2, A3 и GND.
|
11-10-9 | PGA | Коэффициент усиления внутреннего усилителя. Чем меньше значение, тем точнее измерение, но меньше предел. Подаваемое напряжение не должно быть выше заданного порога для усилителя.
|
8 | MODE | Режим преобразования
|
7-6-5 | DR | Частота преобразования (дискретизации).
|
4 | COMP_MODE | Тип компаратора
|
3 | COMP_POL | Полярность компаратора. Задает полярность пина ALERT
|
2 | COMP_LAT | Режим работы компоратора
|
1-0 | COMP_QUE | У этой настройки 2 функции. Если установить 11, то можно выключить компаратор. Остальные значение задают то, при каком количестве превышений верхнего или нижнего порогов компаратора значение пина ALERT будет выставлено в логическую единицу.
|
Подключение ADS1115 к Raspberry pi 3
Подключаем ADS1115 к Rasbperry pi. В качестве примера, подключим к АЦП пальчиковую батарейку (можно любой другой источник напряжения до 6 вольт).
На 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.
Данный пример с кодом я залил на гитхаб. Чтобы его запустить нужно скачать или склонировать репозиторий:
Перейти в папку с кодом:
Установить зависимости (johnny-five и raspi-io):
Запустить код:
Если к вашей плате подключена пальчиковая батарейка, как показано на картинке выше, то в консоле вы увидите что-то в этом роде:
Значения измерений АЦП приведены в вольтах. Мой вольтметр показывал напряжение 1,57в.
Результат измерения напряжения через АЦП я считаю успешным. Данный код запускал чип с величиной усилителя FSR = ±6.144 V.
Библиотеку на питоне можно найти здесь.
Впереди подключение инфракрасного дальномера.
1 комментарий