Raspberry Pi:Примеры/Библиотека WiringPi/Quick2Wire и WiringPi/Плата с аналоговым интерфейсом

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Quick2Wire и WiringPi: Плата с аналоговым интерфейсом[1]

Если у вас нет I2C-модулей для Quick2Wire, эту статью можно пропустить.

Плата 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 порций данных в секунду, а на выходном канале – примерно вдвое больше. Не слишком подходит для передачи звуковых данных, но достаточно для считывания данных с аналоговых датчиков и т.д.

См.также

Внешние ссылки