Raspberry Pi:Примеры/Библиотека WiringPi/Дисплей Adafruit RGB LCD и WiringPi

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

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



Дисплей 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().

Это демо использует кнопки для циклического переключения между разными цветами светодиодов – от «выкл» до красного, зеленого, желтого, синего, фиолетового, голубого и, наконец, белого.

LCD-дисплей Adafruit на Raspberry Pi в корпусе Pibow

См.также

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