Raspberry Pi:Примеры/Библиотека WiringPi/Дисплей Adafruit RGB LCD и WiringPi
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Дисплей Adafruit RGB LCD и WiringPi[1]
Плата Adafruit RGB LCD – это маленький дисплей с 5 кнопками, который подключается поверх Raspberry Pi. Слово «RGB» в названии отвечает за подсветку, ее можно настроить на разные цвета, комбинируя значения красного, зеленого и синего светодиодов.
Помимо прочего, я использовал этот дисплей и в качестве тестовой площадки – чтобы убедиться, что один из драйверов devLib (если точнее, драйвер для символьных LCD-дисплеев) работает не только с GPIO-контактами Pi, но и с GPIO-контактами чипа-расширителя. Дисплей Adafruit как раз использует I2C-чип для расширения GPIO-контактов MCP23017.
Затем я спаял дисплей и проверил, нет ли где припойных «мостиков» (т.е. перемычек из припоя между линиями, которые могут случайно образоваться при пайке). Далее я подключил дисплей и загрузил I2C-драйвер, чтобы проверить, видит ли система дисплей.
gpio load i2c
gpio i2cd
В результате я увидел и MCP23017, и его адрес по умолчанию, который был «0x20». Если нужно, его можно поменять, припаяйте перемычки на задней стороне платы.
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Я сверялся с этой схемой, чтобы узнать, за что отвечают контакты дисплея. В итоге выяснилось, что дисплей подключен в 4-битном режиме, а средства, которыми дисплей управляет сигналами, кнопками и светодиодами, занимают почти все 16 GPIO-контактов.
Небольшой тест с помощью команды gpio, чтобы проверить, что все интерпретируется правильно:
gpio -x mcp23017:100:0x20 mode 106 out
gpio -x mcp23017:100:0x20 write 106 0
В итоге у дисплея загорелся светодиод, отвечающий за красную подсветку (по всей видимости, подсветка использует негативную логику). То же самое для зеленого и синего светодиодов:
gpio -x mcp23017:100:0x20 mode 107 out # Green
gpio -x mcp23017:100:0x20 write 107 0
gpio -x mcp23017:100:0x20 mode 108 out # Blue
gpio -x mcp23017:100:0x20 write 108
Далее я быстренько модифицировал свою тестовую программу «lcd.c». Она запустилась почти сразу же и безо всяких багов.
Итак, чтобы все это заработало с WiringPi v2, нужно настроить MCP23017 как модуль-расширитель, а затем использовать новые контакты для того, чтобы задать дисплей:
// задаем контакты для дисплея Adafruit:
#define AF_BASE 100
#define AF_RED (AF_BASE + 6)
#define AF_GREEN (AF_BASE + 7)
#define AF_BLUE (AF_BASE + 8)
#define AF_E (AF_BASE + 13)
#define AF_RW (AF_BASE + 14)
#define AF_RS (AF_BASE + 15)
#define AF_DB4 (AF_BASE + 12)
#define AF_DB5 (AF_BASE + 11)
#define AF_DB6 (AF_BASE + 10)
#define AF_DB7 (AF_BASE + 9)
#define AF_SELECT (AF_BASE + 0)
#define AF_RIGHT (AF_BASE + 1)
#define AF_DOWN (AF_BASE + 2)
#define AF_UP (AF_BASE + 3)
#define AF_LEFT (AF_BASE + 4)
Настройка:
mcp23017Setup (AF_BASE, 0x20) ;
lcd = lcdInit (2, 16, 4, AF_RS, AF_E, AF_DB4,AF_DB5,AF_DB6,AF_DB7, 0,0,0,0) ;
Этого достаточно для того, чтобы дисплей начал работать, однако нам нужно также включить подсветку и, включив внутренние подтягивающие резисторы, перевести кнопки во входной режим – в итоге кнопки будут замкнуты на 0 вольтах.
О том, как настроить подсветку и считывать данные с кнопок, смотрите в коде программы. Впрочем, в считывании данных с кнопок нет ничего мудреного – я модифицировал код таким образом, что теперь он ждет, когда вы нажмете кнопку Select на дисплее (в оригинале нужно было нажимать на ↵ Enter ).
static void waitForEnter (void)
{
printf ("Press SELECT to continue: ") ; // "Нажмите SELECT, чтобы продолжить"
fflush (stdout) ;
while (digitalRead (AF_SELECT) == HIGH) // ждем нажатия кнопки
delay (1) ;
while (digitalRead (AF_SELECT) == LOW // ждем, когда отпустят
delay (1) ;
printf ("OK\n") ;
}
Это, конечно, можно было сделать и получше, заодно добавив устранение дребезга, но для такого демо этого более чем достаточно. То есть для демонстрации того, что для считывания данных с кнопки через WiringPi и MCP23017 достаточно простой функции digitalRead().
Это демо использует кнопки для циклического переключения между разными цветами светодиодов – от «выкл» до красного, зеленого, желтого, синего, фиолетового, голубого и, наконец, белого.