суббота, 17 сентября 2016 г.

Отображение графики на дисплее Nokia 5110

Постановка задачи

 Освоить принципы вывода графики на типовой LCD-дисплей используемый в телефонах Nokia 5110 с помощью микроконтроллера


Обзор задачи

Решение задачи разделяется на две части - микроконтроллер и его программирование, дисплей LCD Nokia 5110 и особенноти его использования.

Выбор микроконтроллера

В данный момент, на рынке существует богатый ассортимент микроконтроллеров (МК) с различными характеристиками: от PIC-контроллеров, до МК, программируемых на высокоуровневых языках с платами, на которых уже присутствует всё для работы. Одими из подобных контроллеров являются контроллеры выпускаемые под маркой Arduino  и их ``клоны''.

Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей. Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями. Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Ардуино [wikiArd].

В нашей стране Ардуино имеет широкое распространение и большое сообщество. Кроме того, в открытых источниках доступны различные примеры кода готового к использованию, что и повлияло на выбор Arduino как платформы для управления дисплеем.

Компания 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). Эти две модификации отличаются порядком вывода контактов и у ``красной'' модификации есть возможность подключения контактов сверху. Но, несмотря на доступность этих модулей, существует один неизвестный элемент: контроллер дисплея. До сих пор не известно, какой контроллер находится в китайских дисплея. С некоторыми исправлениями программный код совместим. 

Подробнее о дисплее: контроллер PCD8544 разработан компанией Philips и спецификация находитя в открытом доступе. Дисплей обладает рядом особенностей[aterlux]:
  •  Контроллер работает только в режиме отображения. Что значит нельзя узнать в каком состоянии диплей находится сейчас. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой.
  • Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений.
  • В то же время, контроллер обеспечивает крайне низкое энергопотребление:
    менее 300~мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1,5~мкА в режиме отключения.
  • Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется.
Несмотря на то, что рабочим напряжением является напряжение 2,7-3,3 Вольта и все вводы необходимо подключать через делители (как в случае с Arduino, где рабочее напряжение 5 В) -  вводы дисплея лояльны к 5 В, но питание мк дисплея все равно надо подключать к допустимому напряжению. Скорее всего, это может сказываться на сроке службы дисплея, но в рамках этой курсовой работы и простоты подключения к Arduino - делители напряжения будут отсутствовать.

 

 Работа дисплея

Дисплей обладает 8 контактами: землей (GND), питанием (GND), питание подсветки  (Light) и 5 контактами для обмена данными.
  • SCLK - тактовый импульс для передачи данных.
  • SDIN - передаваемые данные.
  • D/C - выбор типа передаваемых данных: высокий уровень - графические данные, низкий - инструкция.
  • SCE - выбор чипа. Передача данных осуществляется при низком уровне на этой линии. При высоком уровне данные игнорируются.
  • RES - сброс. При низком уровне происходит аппаратный сброс контроллера.
Фирменному дисплею соответствует Область отображения 84х48 точек (что позволяет разместить 6 строк текста по 14 символов 5x7 в каждой), интерфейс SPI с пропускной способностью до 4 Mbit/s.  Но надо учитывать, что в китайских дисплеях той же области экрана соответствует блок памяти для 102х64 точки[radiokot29]. Так же, стоит учитывать случай, если частота работы МК превышает 8МГц, следует ограничить максимальную скорость передачи.

Кроме линий передачи данных, на модуле с дисплеем обычно присутствует вход управления подсветкой, соединённый с катодом светодиодов. Аноды же через ограничивающие резисторы подключены к линии питания. Для постоянно работающей подсветки можно данный вход подключить напрямую, или через резистор к «земле». Для управления от МК подсветка может быть подключена через транзистор. Поскольку подсветка потребляет менее 20мА, при подключении к МК AVR возможно также подключать её напрямую к выводу МК.

Команды передаются контроллеру дисплея, когда на линии D/C̅ низкий уровень. Контроллер работает с двумя наборами команд: обычным и расширенным. Обычный абор команд задает режим работы дисплея и положение вывода изображения. В расширенном наборе команд присутствует выбор режима температурной коррекции напряжения.


 Инициализация
Перед работой дисплей должен быть инициализирован в течении 30~мс после появления питания.
  1. Выполнить аппаратный сброс, установив на линии RES низкий уровень минимум на 100нс;
  2. Включить дисплей и выбрать расширенный набор команд, послав 0x21;
  3. Установить схему смещения напряжения, команда 0x13;
  4. Установить режим температурной коррекции, команда 0x04;
  5. Включить генератор повышенного напряжения на уровне 6.42 Вольта, команда 0xB8;
  6. Вернуться в стандартный набор команд, послав 0x20;
  7. Включить вывод графической информации на дисплей командой 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: Схема соответствия памяти и пикселей дисплея
Таким образом, графическая область дисплея представлена в виде шести строк, каждая по 8 пикселей в высоту.

Команды 1xxxxxxx и 01000yyy определяют координаты курсора - строку и позицию, в которых будет отображены следующие 8 бит данных. После того как байт выведен, курсор смещается на соседнюю позицию.

Если командой 00100PVH выбран горизонтальный режим адресации (V = 0), то курсор смещается вправо и следующий байт данных будет отображён на соседней позиции справа. Когда достигнут правый край экрана, курсор перемещается на начало следующей строки. Если же выбрана вертикальная адресация (V = 1), то курсор смещается вниз, на следующую строку, а после последней строки курсор смещается на одну горизонтальную позицию вправо и устанавливается на верхнюю строку.

Программирование микроконтроллера

Программирование платы Arduino происходит в специальной среде Arduino IDE. Для работы дисплея используетя готовая библиотека - Adafruit\_GFX\_Library\cite{adafruit}​. Библиотека свободно распространяется по BSD-лицензии. Она реализует общение между ардуино и дисплеем по протоколу SPI. В библиотеки реализован ряд функций необходимых для работы с дисплеем (такие как инициализация дисплея, сброс) и функции облегчающие труд разработчика (попиксельное рисование, рисование линий, латинский шрифт и другие).

Для вывода попиксельного изображения на дисплей в данной курсовой используется функция 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);

}



Полезные ссылки:


Ссылки по тексту:

Ссылки по темам:

Комментариев нет:

Отправить комментарий