Получение данных с аналоговых датчиков, подключенных к Raspberry Pi
-
Информация, снимаемая с аналогового датчика, представляет собой напряжение сигнального выхода датчика. Это напряжение может изменяться от 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 появляется напряжение, когда значение измеряемой величины (в нашем случае концентрации паров этилового спирта в воздухе) достигает некоторой критической величины. Критическая величина задаётся подкруткой подстроечного резистора на плате датчика.
Далее переходим к программной части. Для получения значения датчика будем использовать популярную библиотеку для работы с GPIOwiringPi:
sudo apt-get install git-core git clone git://git.drogon.net/wiringPi cd wiringPi ./build
Напишем небольшую программу, которая будет каждые полсекунды выводить на экран значение датчика:
#include <wiringPi.h> #include <pcf8591.h> 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, в этой статье я этот вопрос рассматривать не буду.
-
Добрый вечер. Не смог по вашей инструкции сделать тоже самое. Я не программист, могли бы вы по-подробнее изложить инструкцию, начиная с пункта "Напишем небольшую программу, которая будет каждые полсекунды выводить на экран значение датчика". Как это сделать. Я создал папку 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)) ;
Подскажите, пожалуйста.
-
Очень странно, что из кода выборочно пропали ссылки на библиотеки, оставив #includ'ы.OLEGTSSS,Замените обе строчки #include на:#include <wiringPi.h>
#include <pcf8591.h> -
Thank you!
-
Кстати рекомендую использовать i2c ЦАП ADS 1115, он поинтереснее будет
больше разрядность, c RasPi работает чётко