Raspberry Pi:Примеры/Библиотека WiringPi/Quick2Wire и WiringPi/Плата-расширитель с 16 GPIO-контактами

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

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



Quick2Wire и WiringPi: Плата-расширитель на 16 GPIO-контактов[1]

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

Цифровая плата-расширитель Quick2Wire c 16 GPIO-контактами; контакт 0 на порте A через 220-омовый резистор подключен к светодиоду

Эта плата-расширитель GPIO-контактов использует чип MCP23017. Он оснащен 16 дополнительными IO-контактами, которые вы можете использовать в своих программах аналогично тому, как используете GPIO-контакты на Raspberry Pi.

Примечание: В отличие от 8 GPIO-контактов на главной плате Quick2Wire, эти контакты не имеют добавочных резисторов или другой защиты от перегрузок по напряжению, поэтому подключайте их только к 3,3-вольтовм устройствам.

Чтобы сделать пару тестов, давайте сначала подключим светодиод к 0-ому контакту на порте A. В цепи выше светодиод подключен к этому контакту через 220-омовый резистор, а другая его ножка подключена к GND (т.е. 0 вольтам) на главной плате.

Далее пишем следующие команды:

gpio -x mcp23017:100:0x20 mode 100 out
gpio -x mcp23017:100:0x20 write 100 1
gpio -x mcp23017:100:0x20 write 100 0

Они должны включить и выключить светодиод. Если этого не произошло, проверьте, все ли настроено правильно – правильной ли стороной подключен светодиод, а также правильный ли адрес для MCP23017 выдает команда gpio i2cd (он должен быть «0x20»). Если адрес другой, то поставьте его вместо «0x20» в командах выше.

Что делают эти команды gpio:

  • Флаг -x говорит gpio использовать модуль-расширитель – в данном случае это MCP23017.
  • Параметры (разделены двоеточиями) для модуля MCP23017 – это базовый номер для нового контакта (в данном случае это «100») и I2C-адрес чипа (в данном случае это «0x20»).
  • С этого момента вы можете использовать все стандартные команды gpio.

Здесь также можно воспользоваться вариацией скрипта для кнопки, который мы использовали при проверке главной платы:

gpio mode 0 in
while true; do gpio -x mcp23017:100:0x20 write 100 `gpio read 0`; done

Программа для мигания светодиодом (Blink)

В папке «examples» > «q2w» есть программа «blink-io.c» – это все та же программа для мигания светодиодом, адаптированная под плату-расширитель с 16 GPIO-контактами. Она будет мигать светодиодом при подключении к плате-расширителю.

Сравните между собой две этих программы (обычный «blink.c» и «blink-io.c» для платы-расширителя), чтобы понять, чем они отличаются. Затем скомпилируйте и запустите их:

gcc -Wall -oblink-io blink-io.c -lwiringPi
sudo ./blink-io

Тест с 10 светодиодами и 1 кнопкой

Для дополнительного теста я смастерил маленькую плату, к которой подключил блок с 10 светодиодами и одну маленькую кнопку.

Ниже – программа для проверки того, работает ли WiringPi с чипом-расширителем MKCP27013:

/*
 * binary.c:
 * Использование платы-расширителя Quick2Wire с 16 GPIO-контактами 
 *
 * Копирайт (c) 2012-2013 Гордон Хендерсон. <projects@drogon.net>
 ***********************************************************************
 */

#include <stdio.h>
#include <wiringPi.h>
#include <mcp23017.h>

#define Q2W_BASE        100

int main (void)
{
  int i, bit ;

  // включаем встроенные GPIO-контакты:
  wiringPiSetup () ;

  // подключаем к плате Quick2Wire чип MCP27013:
  mcp23017Setup (Q2W_BASE, 0x20) ;

  printf ("Raspberry Pi - Quick2Wire MCP23017 Test\n") ;
  //  "Тест для Raspberry Pi и Quick2Wire с чипом MCP23017"

  // задаем контакту для кнопки режим INPUT: 
  pinMode (0, INPUT) ;

  // задаем первым 10 контактам на Quick2Wire режим OUTPUT:
  for (i = 0 ; i < 10 ; ++i)
    pinMode (Q2W_BASE + i, OUTPUT) ;

  // задаем последнему контакту режим INPUT 
  // и включаем внутренний подтягивающий резистор:
  pinMode         (Q2W_BASE + 15, INPUT) ;
  pullUpDnControl (Q2W_BASE + 15, PUD_UP) ;

  for (;;)
  {
    for (i = 0 ; i < 1024 ; ++i)
    {
      for (bit = 0 ; bit < 10 ; ++bit)
        digitalWrite (Q2W_BASE + bit, i & (1 << bit)) ;

      while (digitalRead (0) == HIGH)           // пока кнопка нажата
        delay (1) ;

      if (digitalRead (Q2W_BASE + 15) == HIGH)  // пока кнопка не нажата
        delay (100) ;
    }
  }
  return 0 ;
}

Это программа «binary.c», и она находится в папке «examples» > «q2w». Компилируем ее и запускаем:

gcc -Wall -o binary binary.c -lwiringPi
sudo ./binary

Нажимаем на главную кнопку, чтобы остановить счетчик, а затем жмем на кнопку, подключенную к светодиодной плате, чтобы он заработал быстрее. Светодиодная плата – это просто 10 светодиодов, добавочные резисторы и одна кнопка, через-провод-перемычку подключенные к GND (0 вольтам) на главной плате.

Обратите внимание, что эта программа использует обе кнопки: одна из них находится на главной плате Quick2Wire, а другая – на маленькой тестовой плате с 10 светодиодами. Та, что на главной плате, будучи нажатой, возвращает «0» (т.е. LOW), а отпущенной – «1». Та, что на маленькой плате, работает наоборот: будучи нажатой, возвращает «0», а отпущенной – «1».

Итого

Использование чипа-расширителя GPIO-контактов MCP23017 – это просто. Нужно лишь сообщить WiringPi об использовании GPIO-расширителя, назначить базовые номера для 16 GPIO-контактов чипа-расширителя, а затем воспользоваться, как и раньше, функциями digitalRead(), digitalWrite() и pinMode().

См.также

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