Получение данных с аналоговых датчиков, подключенных к Raspberry Pi

  • Автор
Информация, снимаемая с аналогового датчика, представляет собой напряжение сигнального выхода датчика. Это напряжение может изменяться от 0 до напряжения питания датчика (грубо говоря, чем больше измеряемая датчиком величина, тем выше напряжение сигнального выхода)
Чтобы считать это напряжение и преобразовать его к осязаемому цифровому значению используется аналого-цифровой преобразователь (AЦП).
В Raspberry Pi отсутствует встроенный АЦП, поэтому для подключения к RasPi аналоговых датчиков потребуется внешний АЦП.

Я использовал АЦП на основе чипа PCF8591 - http://rspmarket.com/viewproduct/49/

Это 4-канальный 8-битный АЦП, который передаёт считываемые с датчика значения напряжения по i2c. Соответственно подключаем его к пинам 5V, GND, SDA, SCL GPIO разъёма Raspberry Pi. Также нам потребуется подгрузить модули ядра для работы с i2c:
sudo modprobe i2c-dev
sudo modprobe i2c-bcm2708

Чтобы постоянно не подгружать их постоянно вручную рекомендую добавить строчки в /etc/modules:
i2c-dev
i2c-bcm2708


Как я уже выше писал, разрешающая способность PCF8591 8-бит. Это значит, что величина цифрового значения, в которое будет преобразовано напряжение сигнального выхода датчика будет лежать в диапазоне от 0 до 2^8-1=255. Это значение высчитывается по формуле -
напряжение сигнального выхода датчика/напряжение АЦП * разрешающую способность АЦП

Таким образом для 3V с датчика: value=3/5*255=153

К АЦП мы будем подключать аналоговый датчик MQ-3, который определяет концентрацию паров этилового спирта в воздухе.

У MQ-3 4 выхода - AD, DO, Vcc, GND. Vcc и GND подключаем к пинам GPIO 5V и GND. AD (выход сигнального напряжения датчика) подключаем к одному из 4 входов АЦП (я подключил к А0). DO не подключаем никуда. На выходе DO появляется напряжение, когда значение измеряемой величины (в нашем случае концентрации паров этилового спирта в воздухе) достигает некоторой критической величины. Критическая величина задаётся подкруткой подстроечного резистора на плате датчика.


Далее переходим к программной части. Для получения значения датчика будем использовать популярную библиотеку для работы с GPIO wiringPi
sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build


Напишем небольшую программу, которая будет каждые полсекунды выводить на экран значение датчика:
#include 
#include

main ()
{
wiringPiSetup () ;
pcf8591Setup (200, 0x48) ;

for (;;)
{
delay (500);
printf ("%4d \n", analogRead (200)) ;
}
}


В функцию pcf8591Setup передаётся число большее 64, которое будет служить номером "виртуального" пина для библиотеки wiringPi и адрес АЦП на интерфейсе i2c. analogRead возвращает преобразованное значение напряжения датчика (число от 0 до 255), подключённого к АЦП.

Компилируем нашу программу:
gcc -o ./analogread ./analogread.c -lwiringPi

Запускаем скомпилированный analogread - на экране побегут значения датчика, обновляемые каждые полсекунды.
Если к датчику поднести открытую бутылку с алкоголем, то значения будут в реальном времени увеличиваться.

Чтобы это значение преобразовать в реальное значение концентрации паров этилового спирта нужно обратиться к даташиту на MQ-3, в этой статье я этот вопрос рассматривать не буду.

Комментарии:

Для написания комментариев необходимо зарегистрироваться