Raspberry Pi:Примеры/Библиотека WiringPi/Quick2Wire и WiringPi/Плата с аналоговым интерфейсом
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Quick2Wire и WiringPi: Плата с аналоговым интерфейсом[1]
Если у вас нет I2C-модулей для Quick2Wire, эту статью можно пропустить.
Расширительная плата Quick2Wire с аналоговым интерфейсом использует интерфейсный чип PCF5891. У нее 1 выходной ЦА-канал и 4 входных АЦ-канала. Разрешения всех каналов – 8 бит.
Для начала я подключил между контактами AREF (3,3 вольт) и GND (0 вольт) потенциометр на 10 кОм. Движок (т.е. подвижный контакт) потенциометра я подключил к 0-ому входному аналоговому контакту.
Далее делаем пару тестов при помощи команды gpio. Например, такой:
gpio -x pcf8591:120:0x48 aread 120
Или запускаем эту команду по циклу и смотрим, какие приходят значения (они должны быть в диапазоне от «0» до «255»), когда мы двигаем ручку потенциометра от одного края к другому.
while true; do gpio -x pcf8591:120:0x48 aread 120 ; done
Что делает эта команда gpio:
- Флаг -x говорит gpio использовать расширительный модуль – в данном случае это PCF8591.
- Параметры (разделены двоеточиями) – это базовый номер нового контакта (в данном случае это «120») и I2C-адрес чипа (в данном случае это «0x48»).
- С этого момента вы можете использовать большинство стандартных команд gpio, но в данном случае применимы только aread и awrite.
Таким образом можно проверить все 4 входных канала, а также использовать их для управления различными действиями на Pi. К примеру, программка ниже позволяет управлять яркостью светодиода на главной плате при помощи ШИМ, идущей от потенциометра.
/*
* bright.c:
* Изменение яркости светодиода на Quick2Wire
* при помощи аналоговой платы
*
* Копирайт (c) 2012-2013 Гордон Хендерсон. <projects@drogon.net>
***********************************************************************
*/
#include <stdio.h>
#include <wiringPi.h>
#include <pcf8591.h>
#define LED 1
#define Q2W_ABASE 120
int main (void)
{
int value ;
// включаем встроенные GPIO-контакты:
wiringPiSetup () ;
// подключаем к плате Quick2Wire чип PCF8591:
pcf8591Setup (Q2W_ABASE, 0x48) ;
printf ("Raspberry Pi - Quick2Wire Analog Test\n") ;
// "Тест для Raspberry Pi и аналоговой платы Quick2Wire\n"
// задаем параметры для светодиода:
pinMode (LED, PWM_OUTPUT) ;
pwmWrite (LED, 0) ;
for (;;)
{
value = analogRead (Q2W_ABASE + 0) ;
pwmWrite (LED, value * 4) ;
delay (5) ;
}
return 0 ;
}
Эта программа называется «bright.с» и ее можно найти в папке «examples» > «q2w», находящейся в дистрибутиве WiringPi, который вы скачивали по этой ссылке. Далее компилируем и запускаем эту программу:
gcc -Wall -o bright bright.c -lwiringPi
sudo ./bright
Расчет входного напряжения
У входных и выходных контактов – 8-битное разрешение, т.е. значения, передаваемые по ним, будут в диапазоне от «0» до «255». Таким образом, если в качестве опорного напряжения будет использоваться обычный 3,3-вольтовый источник питания, формула для расчета входного напряжения будет следующей:
Vвх = значение * 3.3 ÷ 255
Здесь «значение» – это значение, считанное с конвертера при помощи функции analogRead(). То есть, если мы получим от конвертера значение «172», то водным напряжением будет:
172 x 3.3 ÷ 255 = 2,23 вольта
Считывание напряжения
Эта программа считывает и показывает напряжение для всех 4 контактов:
/*
* volts.c:
* Считывание данных со всех 4 аналоговых контактов
* на аналоговой плате Quick2Wire.
*
* Копирайт (c) 2012-2013 Гордон Хендерсон. <projects@drogon.net>
***********************************************************************
*/
#include <stdio.h>
#include <wiringPi.h>
#include <pcf8591.h>
#define Q2W_ABASE 120
int main (void)
{
int value, pin ;
// включаем встроенные GPIO-контакты:
wiringPiSetup () ;
// подключаем к плате Quick2Wire чип PCF8591:
pcf8591Setup (Q2W_ABASE, 0x48) ;
printf ("Raspberry Pi - Quick2Wire Voltmeter\n") ;
// "Тест для Raspberry Pi – вольтметр Quick2Wire\n"
for (;;)
{
for (pin = 0 ; pin < 4 ; ++pin)
{
value = analogRead (Q2W_ABASE + pin) ;
printf (" %5.2f", (double)value * 3.3 / 255.0) ;
}
printf ("\r") ;
fflush (stdout) ;
delay (100) ;
}
return 0 ;
}
Эта программа называется «volts.c», и ее можно найти в папке «examples» > «q2w», находящейся в дистрибутиве WiringPi, который вы скачивали по этой ссылке. Далее компилируем и запускаем эту программу:
gcc -Wall -o volts volts.c -lwiringPi
sudo ./volts
Те входные контакты, которые никуда не подключены, скорее всего, будут выдавать случайные значения. К ним можно подключить, помимо потенциометра, температурный датчик LM35 – вы будете видеть данные о температуре, но в вольтах (поделенных на «100»).
Вывод аналоговых данных
Простейший способ протестировать выходной аналоговый контакт – это подключить к нему вольтметр и вручную отправить несколько значений при помощи команды gpio:
gpio -x pcf8591:120:0x48 awrite 120 127
Это передаст на выходной контакт значение из середины диапазона 0-255, поэтому вольтметр, подключенный к выходному контакту, должен показать 1,65 вольт. В моем случае это 1,63 вольта – почти в яблочко!
Расчет выходного напряжения
Выходное напряжение рассчитывается по следующей формуле:
Vвых = значение ÷ 255 х 3,3
Исходя из этого, значение можно рассчитать по этой формуле:
значение = Vвых ÷ 3,3 х 255
Здесь «значение» – это значение, которое мы задаем при помощи функции analogRead(). К примеру, чтобы задать выходное напряжение на 3 вольта, нам понадобится следующее значение:
3 ÷ 3,3 х 255 = 232
Таким образом, чтобы задать выходное напряжение в 3 вольта, нам нужно написать в коде:
analogWrite (pin, 232);
Итого
Аналоговая плата является полезным дополнением к главной плате Quick2Wire. Во-первых, ее входные контакты можно использовать для считывания данных с различных датчиков – от простых фоторезисторов и джойстиков до аналоговых температурных датчиков. Во-вторых, ее выходной контакт можно использовать для генерации волнообразного сигнала для осциллоскопа или управления аналоговыми устройствами (через подходящие буферы/усилители) вроде моторов, светодиодов и пр.
Впрочем, это не самая быстрая система: максимальная скорость передачи данных составляет около 200 порций данных в секунду, а на выходном канале – примерно вдвое больше. Не слишком подходит для передачи звуковых данных, но достаточно для считывания данных с аналоговых датчиков и т.д.