Присоединяйтесь!
Авторизация
adc    ацп    pcf 8591   

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

16 March 2015 - Автор Martyn

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

Чтобы считать это напряжение и преобразовать его к осязаемому цифровому значению используется аналого-цифровой преобразователь (AЦП).

В Raspberry Pi отсутствует встроенный АЦП, поэтому для подключения к RasPi аналоговых датчиков потребуется внешний АЦП.

Я использовал АЦП на основе чипа PCF8591 - http://smartelectronika.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

Как я уже выше писал, разрешающая способность PCF85918-бит. Это значит, что величина цифрового значения, в которое будет преобразовано напряжение сигнального выхода датчика будет лежать в диапазоне от 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, в этой статье я этот вопрос рассматривать не буду.

16 March 2015
Martyn
автор статьи

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

  1. Olegtsss

    22 July 2017 - Ответить

    Добрый вечер. Не смог по вашей инструкции сделать тоже самое. Я не программист, могли бы вы по-подробнее изложить инструкцию, начиная с пункта "Напишем небольшую программу, которая будет каждые полсекунды выводить на экран значение датчика". Как это сделать. Я создал папку analogread, внутри создал файл analogread.h с точным содержанием приложенного вами листинга. Компилирую gcc analogread.c -lwiringPi. И на этом у меня все останавливается. analogread.c:1:10: error: #include expects "FILENAME" or <FILENAME>  #include           ^ analogread.c:3:10: error: #include expects "FILENAME" or <FILENAME>  #include           ^ analogread.c: In function ‘main’: analogread.c:23:5: warning: incompatible implicit declaration of built-in function ‘printf’      printf ("%4d \n", analogRead (200)) ;      ^ Подскажите, пожалуйста. 

  2. alfacom

    25 July 2017 - Ответить

    Очень странно, что из кода выборочно пропали ссылки на библиотеки, оставив #includ'ы. OLEGTSSS, Замените обе строчки #include на: #include <wiringPi.h> #include <pcf8591.h>

  3. Olegtsss

    26 July 2017 - Ответить

    Thank you!

Отправить комментарий

Авторизуйтесь для отправки комментария

Присоединяйтесь
Новые сообщения