Raspberry Pi:Примеры/Библиотека WiringPi/Quick2Wire и WiringPi/Плата-расширитель с 16 GPIO-контактами: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Quick2Wire и WiringPi: Плата-расширитель на 16 GPIO-контактов<ref>[http://wiringpi.com/examples/quick2wire-and-wiringpi/the-16-pin-gpio-expansion-board/ wiringpi.com - The 16-pin GPIO expansion board]</ref>= | =Quick2Wire и WiringPi: Плата-расширитель на 16 GPIO-контактов<ref>[http://wiringpi.com/examples/quick2wire-and-wiringpi/the-16-pin-gpio-expansion-board/ wiringpi.com - The 16-pin GPIO expansion board]</ref>= | ||
Строка 19: | Строка 19: | ||
Далее пишем следующие команды: | Далее пишем следующие команды: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
gpio -x mcp23017:100:0x20 mode 100 out | gpio -x mcp23017:100:0x20 mode 100 out | ||
gpio -x mcp23017:100:0x20 write 100 1 | gpio -x mcp23017:100:0x20 write 100 1 | ||
Строка 34: | Строка 34: | ||
Здесь также можно воспользоваться вариацией скрипта для кнопки, который мы использовали при проверке главной платы: | Здесь также можно воспользоваться вариацией скрипта для кнопки, который мы использовали при проверке главной платы: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
gpio mode 0 in | gpio mode 0 in | ||
while true; do gpio -x mcp23017:100:0x20 write 100 `gpio read 0`; done | while true; do gpio -x mcp23017:100:0x20 write 100 `gpio read 0`; done | ||
Строка 45: | Строка 45: | ||
Сравните между собой две этих программы (обычный '''«blink.c»''' и '''«blink-io.c»''' для платы-расширителя), чтобы понять, чем они отличаются. Затем скомпилируйте и запустите их: | Сравните между собой две этих программы (обычный '''«blink.c»''' и '''«blink-io.c»''' для платы-расширителя), чтобы понять, чем они отличаются. Затем скомпилируйте и запустите их: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
gcc -Wall -oblink-io blink-io.c -lwiringPi | gcc -Wall -oblink-io blink-io.c -lwiringPi | ||
sudo ./blink-io | sudo ./blink-io | ||
Строка 58: | Строка 58: | ||
Ниже – программа для проверки того, работает ли WiringPi с чипом-расширителем MKCP27013: | Ниже – программа для проверки того, работает ли WiringPi с чипом-расширителем MKCP27013: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
* binary.c: | * binary.c: | ||
Строка 118: | Строка 118: | ||
Это программа '''«binary.c»''', и она находится в папке '''«examples» > «q2w»'''. Компилируем ее и запускаем: | Это программа '''«binary.c»''', и она находится в папке '''«examples» > «q2w»'''. Компилируем ее и запускаем: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
gcc -Wall -o binary binary.c -lwiringPi | gcc -Wall -o binary binary.c -lwiringPi | ||
sudo ./binary | sudo ./binary |
Текущая версия от 13:15, 18 июня 2023
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Quick2Wire и WiringPi: Плата-расширитель на 16 GPIO-контактов[1]
Если у вас нет I2C-модулей для Quick2Wire, эту статью можно пропустить.
Эта плата-расширитель 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().