Постановка задачи
Освоить принципы вывода графики на типовой LCD-дисплей используемый в телефонах Nokia 5110 с помощью микроконтроллера
Обзор задачи
Решение задачи разделяется на две части - микроконтроллер и его программирование, дисплей LCD Nokia 5110 и особенноти его использования.
Выбор микроконтроллера
В данный момент, на рынке существует богатый ассортимент микроконтроллеров (МК) с различными характеристиками: от PIC-контроллеров, до МК, программируемых на высокоуровневых языках с платами, на которых уже присутствует всё для работы. Одими из подобных контроллеров являются контроллеры выпускаемые под маркой Arduino и их ``клоны''.
Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей. Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями. Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Ардуино [wikiArd].
Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей. Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями. Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Ардуино [wikiArd].
В нашей стране Ардуино имеет широкое распространение и большое сообщество. Кроме того, в открытых источниках доступны различные примеры кода готового к использованию, что и повлияло на выбор Arduino как платформы для управления дисплеем.
Компания Arduino имеет несколько готовых вариантов плат. Для использования в данной работе была выбранна плата Arduino UNO, как плата широко распространенная и обладающая применимостью в других проектах.
Компания Arduino имеет несколько готовых вариантов плат. Для использования в данной работе была выбранна плата Arduino UNO, как плата широко распространенная и обладающая применимостью в других проектах.
![]() |
Рис.1: Внешний вид платы Arduino UNO |
Технически плата Arduino Uno (рис. 1) построена на базе микроконтроллера ATmega328. Платформа имеет 14 цифровых вход/выходов (6 из которых могут использоваться как выходы ШИМ), 6 аналоговых входов, кварцевый генератор 16 МГц, разъем USB, силовой разъем, разъем ICSP и кнопку перезагрузки. Для работы необходимо подключить платформу к компьютеру посредством кабеля USB, либо подать питание при помощи адаптера AC/DC или батареи[ArdSpec].
Дисплей
![]() |
Рис. 2: Две различимые модификации дисплеев Nokia 5110 из Китая |
Дисплей от телефона Nokia 5110 доступен в различных вариантах: из старых телефонов и от китайских производителей. Первый вариант имеет сложности, т.к. телефон этой модели уже не выпускается, и даже если заполучить такой телефон, то дисплей подключен к плате с помощью специфичной контактной группы, которая затрудняет его монтаж и использование. Но у дисплеев фирмы Nokia есть неоспоримое преимущество: они сделаны на контроллере Philips PCD8544.
Дисплеи от китайских производителей более доступны, они продаются перекупщиками и доступны для заказа из Китая. Существует две отличимые внешне модификации: на синем и на красном текстолите (рис. 2). Эти две модификации отличаются порядком вывода контактов и у ``красной'' модификации есть возможность подключения контактов сверху. Но, несмотря на доступность этих модулей, существует один неизвестный элемент: контроллер дисплея. До сих пор не известно, какой контроллер находится в китайских дисплея. С некоторыми исправлениями программный код совместим.
Дисплеи от китайских производителей более доступны, они продаются перекупщиками и доступны для заказа из Китая. Существует две отличимые внешне модификации: на синем и на красном текстолите (рис. 2). Эти две модификации отличаются порядком вывода контактов и у ``красной'' модификации есть возможность подключения контактов сверху. Но, несмотря на доступность этих модулей, существует один неизвестный элемент: контроллер дисплея. До сих пор не известно, какой контроллер находится в китайских дисплея. С некоторыми исправлениями программный код совместим.
Подробнее о дисплее: контроллер PCD8544 разработан компанией Philips и спецификация находитя в открытом доступе. Дисплей обладает рядом особенностей[aterlux]:
- Контроллер работает только в режиме отображения. Что значит нельзя узнать в каком состоянии диплей находится сейчас. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой.
- Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений.
- В то же время, контроллер обеспечивает крайне низкое энергопотребление:
менее 300~мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1,5~мкА в режиме отключения. - Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется.
Работа дисплея
Дисплей обладает 8 контактами: землей (GND), питанием (GND), питание подсветки (Light) и 5 контактами для обмена данными.
- SCLK - тактовый импульс для передачи данных.
- SDIN - передаваемые данные.
- D/C - выбор типа передаваемых данных: высокий уровень - графические данные, низкий - инструкция.
- SCE - выбор чипа. Передача данных осуществляется при низком уровне на этой линии. При высоком уровне данные игнорируются.
- RES - сброс. При низком уровне происходит аппаратный сброс контроллера.
Кроме линий передачи данных, на модуле с дисплеем обычно присутствует вход управления подсветкой, соединённый с катодом светодиодов. Аноды же через ограничивающие резисторы подключены к линии питания. Для постоянно работающей подсветки можно данный вход подключить напрямую, или через резистор к «земле». Для управления от МК подсветка может быть подключена через транзистор. Поскольку подсветка потребляет менее 20мА, при подключении к МК AVR возможно также подключать её напрямую к выводу МК.
Команды передаются контроллеру дисплея, когда на линии D/C̅ низкий уровень. Контроллер работает с двумя наборами команд: обычным и расширенным. Обычный абор команд задает режим работы дисплея и положение вывода изображения. В расширенном наборе команд присутствует выбор режима температурной коррекции напряжения.
Инициализация
- Выполнить аппаратный сброс, установив на линии RES низкий уровень минимум на 100нс;
- Включить дисплей и выбрать расширенный набор команд, послав 0x21;
- Установить схему смещения напряжения, команда 0x13;
- Установить режим температурной коррекции, команда 0x04;
- Включить генератор повышенного напряжения на уровне 6.42 Вольта, команда 0xB8;
- Вернуться в стандартный набор команд, послав 0x20;
- Включить вывод графической информации на дисплей командой 0x0C.
Пример кода инициализации:
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
const uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color) {
int16_t i, j, byteWidth = (w + 7) / 8;
for(j=0; j<h; j++) {
for(i=0; i<w; i++ ) {
if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) {
drawPixel(x+i, y+j, color);
}
}
}
}
Вывод графической информации
Дисплей имеет размер 84х48 пикселей. Информация выводится Информация выводится вертикальными блоками высотой 8 пикселей, значения которых определяются значениями бит в выводимом байте. Младший бит кодирует верхний пиксель (рис. 3).
![]() | |
Рис. 3: Схема соответствия памяти и пикселей дисплея |
Команды 1xxxxxxx и 01000yyy определяют координаты курсора - строку и позицию, в которых будет отображены следующие 8 бит данных. После того как байт выведен, курсор смещается на соседнюю позицию.
Если командой 00100PVH выбран горизонтальный режим адресации (V = 0), то курсор смещается вправо и следующий байт данных будет отображён на соседней позиции справа. Когда достигнут правый край экрана, курсор перемещается на начало следующей строки. Если же выбрана вертикальная адресация (V = 1), то курсор смещается вниз, на следующую строку, а после последней строки курсор смещается на одну горизонтальную позицию вправо и устанавливается на верхнюю строку.
Программирование микроконтроллера
Программирование платы Arduino происходит в специальной среде Arduino IDE. Для работы дисплея используетя готовая библиотека - Adafruit\_GFX\_Library\cite{adafruit}. Библиотека свободно распространяется по BSD-лицензии. Она реализует общение между ардуино и дисплеем по протоколу SPI. В библиотеки реализован ряд функций необходимых для работы с дисплеем (такие как инициализация дисплея, сброс) и функции облегчающие труд разработчика (попиксельное рисование, рисование линий, латинский шрифт и другие).
Для вывода попиксельного изображения на дисплей в данной курсовой используется функция drawBitmap.
Для вывода попиксельного изображения на дисплей в данной курсовой используется функция drawBitmap.
Код функции drawBitmap:
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
const uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color) {
int16_t i, j, byteWidth = (w + 7) / 8;
for(j=0; j<h; j++) {
for(i=0; i<w; i++ ) {
if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) {
drawPixel(x+i, y+j, color);
}
}
}
}
С использованием этой библиотеки, реализация программы для Arduino сводится к объявлению попиксельного изображения, команд инициализации и команды вывода изображения.
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544>
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
const static unsigned char PROGMEM logoBmp[] =
{B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000
};
void setup() {
Serial.begin(9600);
display.begin(); // Инициализация дисплея
display.setContrast(60); // Устанавливаем контраст
display.setTextColor(BLACK); // Устанавливаем цвет текста
display.setTextSize(1); // Устанавливаем размер текста
display.clearDisplay(); // Очищаем дисплей
display.display();
delay(1000);
}
void loop() {
// Рисуем заранее подготовленное лого
// Подготовлен массив из 16 пар байтов
// каждый байт состоит из 8 битов, соответсвенно
// получаем матрицу 16х16 битов, 1-черный цвет, 0-белый цвет
// drawBitmap(x, y, logo, w, h, color )
display.drawBitmap(10, 10, logoBmp, 24, 16, BLACK);
display.display();
delay(2000);
// Очищаем дисплей
display.clearDisplay();
display.display();
delay(1000);
}
Полезные ссылки:
Ссылки по тексту:
- [wikiArd] https://ru.wikipedia.org/wiki/Arduino - свободная энциклопедия.
- [ArdSpec] http://arduino.ru/Hardware/ArduinoBoardUno
- [aterlux] http://aterlux.ru/index.php?page=article\&art=pcd8544 - Подключение дисплея на базе контроллера PCD8544 к микроконтроллеру AVR
- [LCDSpec] https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf - Спецификация на контроллер PHILIPS PCD8544
- [radiokot29] http://radiokot.ru/articles/29/ - Драйвер для LCD от Nokia 3310
- [adafruit] https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library - исходные тексты библиотеки Adafruit для подключения LCD Nokia5110 к Arduino
Ссылки по темам:
- Отображение на LCD
- http://cxem.net/mc/mc201.php
- http://4a4ik.blogspot.ru/2014/07/nokia-5110-lcd.html avr и как формируется картинка на этом LCD
- http://arduino-diy.com/arduino-graficheskiy-LCD-displey-84x48-Nokia-5110
- http://radiokot.ru/articles/29/ - Nokia 3310+Atmega8, некоторые моменты отличия китайского от оригинала
- http://we.easyelectronics.ru/lcd_gfx/biblioteka-dlya-raboty-s-displeem-nokia-3310.html - тоже что и прошлое, но с доработкой Ди Халта
- https://avrlabhttp://arduino-diy.com/arduino-graficheskiy-LCD-displey-84x48-Nokia-5110.com/node/362
- http://mcu8.ru/wp-gull/mylinks/2011/12/29/lcd-nokia-5110-samostoyatelnoe-podklyuchenie/
- LCD +Arduino
- http://arduino-diy.com/arduino-graficheskiy-LCD-displey-84x48-Nokia-5110
- http://zelectro.cc/nokia5110_module_arduino
- Прочее
- http://www.meanders.ru/delitnapr.shtml - деление напряжения
Комментариев нет:
Отправить комментарий