Новый дисплей new nokia 5110 3v 5v. Описание Arduino Uno

Фирмы Philips PCD8544.
Для соединения модуля с другими устройствами плата содержит вилку соединителя и отверстия для припаивания проводов. Также имеются 4 установочных отверстия, расположенные по углам платы.
Монохроматический дисплей Nokia 5110 LCD (blue screen) имеет подсветку синими светодиодами. За годы производства Nokia 5110 применялся и применяется в широком спектре приложений. Модуль дисплея облегчает подключение Nokia и установку в приборе. Благодаря модулю упрощается первое знакомство электронщика, программиста с дисплеем Nokia 5110 LCD. Изначально применявшийся как индикатор мобильного телефона дисплей распространился в другие категории приборов. Его удобно использовать в измерительных приборах: вольтметрах, амперметрах, омметрах и других. Пригодится дисплей и для индикации показаний медицинских мобильных приборов. Интересно его применить для шкалы радиоприемника или индикатора уровня сигнала в звуковоспроизводящей аппаратуре. Экран разрешением 84х48 точек позволяет выводить символьную и графическую информацию.
Если у вас есть опыт работы с Nokia 3310 LCD будет легко освоить Nokia 5110 LCD, так как эти индикаторы построены на одном контроллере PCD8544.

Характеристики модуля Nokia 5110 LCD

Питание
напряжение 2,7…3,3 В
ток
подсветка отключена 5 мА
подсветка включена 20 мА

Температура воздуха во время работы 0…50
Температура хранения -10…70

ЖКИ индикатор Nokia 5110

Основные характеристики

Главный компонент модуля Nokia 5110 LCD - ЖКИ индикатор. Имеет встроенные генераторы напряжения питания и смещения ЖК-элементов, есть светодиодная подсветка. Интерфейс SPI ввода информации. Nokia 5110 может работать в четырех режимах: нормальный, инверсия изображения, пустой экран и “все точки включены”. Так же пользователю доступно управление температурным режимом, напряжением питания и смещения.

Питание
напряжение 2,7…3,3 В
ток до 320 мкА
Частота тактирования до 4 МГц
Время сброса не менее 100 нс

Структура дисплея

Дисплей представляет собой матрицу ЖК-элементов и микросхему PCD8544 для их управления, размещенные в корпусе установленном на плате. На ней так же размещены четыре светодиода подсветки экрана. Информация о состоянии точек дисплея хранится в оперативной памяти контроллера PCD8544, каждой точке соответствует один бит памяти. Так же встроен счетчик адреса, который автоматически увеличивается при записи очередного байта информации в память.

Управление дисплеем

Осуществляется по интерфейсу SPI, дисплей является ведомым устройством. Однако, вместо обычных четырех линий управления здесь лишь три. Это линии тактирования CLK, выбора кристалла SCE и входных данных MOSI. Линия выхода MISO отсутствует. Это приводит к необходимости применять специальные методы управления, подробнее об этом далее. Работает интерфейс в режимах SPI-0 или SPI-3. В Nokia 5110 присутствует также дополнительная линия управления Информация/Команда - D/C̅. Каждый байт, передаваемый в дисплей, может быть интерпретирован как команда или информационный байт, в зависимости от уровня на линии D/C̅.
Передача информации однонаправленная, и считать данные из памяти и регистров дисплея нельзя. Поэтому, в программе необходимо предусмотреть возможность контролировать состояния дисплея. Однако, есть еще одна особенность, которая усложняет управление. Эта особенность связана с организацией памяти.

Память состоит из шести банков, в каждом из которых находится 84 ячейки емкостью 1 байт.

Адресация каждого пикселя индикатора. Всего у нас 84х48 пикселей, организованных в 6 горизонтальных банков (от нуля до пяти) и 84 столбцов.

Каждый банк содержит 8 вертикально расположенных пикселей, которые в сумме шести банков дают 48 строк. На рисунке видно, как из оперативной памяти будет отображаться заданный пиксель на дисплее, каждая строка на рисунке представляет один банк.
Запись информации в память осуществляется побайтно, а не побитно, и нет возможности управлять каждой точкой, а лишь группами по восемь точек. Это в сочетании с тем, что информация из памяти Nokia 5110 LCD не может быть считана, приводит к тому, что перед отправкой необходимо запоминать, какие данные в какой ячейке хранятся. В противном случае при отправке новых данных в дисплей можно потерять информацию. Эту особенность иллюстрирует рисунок показывающий замену символа. При написании управляющей программы необходимо предусмотреть возможность хранения данных.

Замена символа Л на символ А.

Дисплей имеет размер 84х48 пикселей. Информация выводится вертикальными блоками высотой 8 пикселей, значения которых определяются значениями бит в выводимом байте. Младший бит кодирует верхний пиксель.
Забегая вперед описания команд скажем. Команды 1xxxxxxx и 01000yyy определяют координаты курсора - строку и позицию, в которых будет отображены следующие 8 бит данных. После того как байт выведен, курсор автоматически смещается на соседнюю позицию.
Если командой 00100PDVH выбран горизонтальный режим адресации V=0, то курсор смещается вправо и следующий байт данных будет отображен на соседней позиции справа. Когда достигнут правый край экрана, курсор перемещается в начало следующей строки. Если же выбрана вертикальная адресация V=1, то курсор смещается вниз, на следующую строку, а после последней строки курсор смещается на одну горизонтальную позицию вправо и устанавливается на верхнюю строку.
В качестве промежуточной памяти можно использовать память управляющего контроллера, в которой будет храниться копия данных в дисплея. Перед отправкой необходимо корректировать данные, в зависимости от того, какая информация хранится в промежуточной памяти.

Команды управления Nokia 5110

Управление дисплеем осуществляется отправкой командного слова через интерфейс SPI. Размер слова 1 байт. Команды управления разделены на 3 категории.

Верховные функции управления

Установить тип функций - указывает, с каким типом функций будет работать модуль основными или расширенными.
Установить режим питания - включает или отключает питание.
Установить режим адресации - определяет тип адресации памяти: вертикальный или горизонтальный. В первом случае после записи байта данных будет увеличен счетчик Y-адреса, то есть, запись будет идти по столбцам. Во втором - счетчик Х-адреса, запись будет идти по строкам.
Функции передаются Nokia 5110 LCD, когда на линии D/C̅ низкий уровень. Они определяются одним командным словом. Это слово необходимо отправить в дисплей в начале работы. Формат:

0 0 1 0 0 PD V H

Бит PD определяет режим питания, установленный PD означает режим отключения (power-down).
Бит V режим адресации: 1 - вертикальная, 0 - горизонтальная.
Бит H тип функций, с которыми будет идти дальнейшая работа: 0 - обычный, 1 - расширенный.
Как видно, необходимо запоминать текущее состояние дисплея, чтобы при установке нового значения параметра не потерять информацию о значениях других. Команда 00100PDVH присутствует в обоих наборах команд.

Основные функции

Установить режим отображения 00001D0E. Определяет режим отображения: пустой экран, все точки включены, нормальное отображение, инверсное отображение. E - признак инверсии изображения, D - вывод изображения. Если D=0, то экран либо полностью очищен E=0, либо полностью черный E=1.
Установить Х-адрес команда 1xxxxxxx, или 0x80 + x выбор горизонтальной позиции в текущей строке, куда будет выводиться изображение. Где x=0 самая левая позиции, 83 - самая правая.
УстановитьY-адрес команда 01000yyy устанавливает Y-адрес ячейки, куда будет записан следующий байт. Команда, или 0x40+y выбор номера строки (страницы) на которую выводится изображение. Y=0 самая верхняя строка, 5 - самая нижняя. Строка имеет высоту 8 точек.

Расширенные функции

Расширенный набор команд выбирается после передачи команды 00100PDV1.
Установить температурный режим. Команда 000001tt, или 0x04 + t выбор одного из четырёх режимов температурной коррекции. В зависимости от режима будет по-разному изменяться напряжение дисплея при изменении температуры.
Установить напряжение смещения ЖК-элементов дисплея. Команда 00010bbb, или 0x10 + b выбор одного из восьми режимов расчета смещения уровней для управления LCD. Для обычных дисплеев от Nokia рекомендуется режим 0001011, или 0x13.
Установить напряжения питания ЖК-элементов дисплея. Команда 1vvvvvvv, или 0x80 + v выбор напряжения на генераторе повышенного напряжения для LCD. При v=0 генератор отключен. Выходное напряжение рассчитывается по формуле VLCD = 3.06 В + v * 0.06 В. В зависимости от выбора способа коррекции напряжения, это значение изменяется в зависимости от температуры. Чтобы не повредить дисплей при низких температурах, рекомендуется это значение менее 8,5 В, т. е. v<=90. Для обычных дисплеев Nokia это нормальное рабочее значение этого параметра примерно равно 56, т. е. команда принимает вид 10111000, или 0xB8.
Работа с основными и расширенными функциями проще, поскольку каждой из них соответствует отдельное командное слово.
Необходимо помнить, что для работы с определенным типом функций необходимо перевести дисплей в режим работы с этими функциями. Иначе отправка слова команды приведет к некорректному выполнению этой команды. Более подробно о командах управления можно прочитать в документации на странице 11 .

Инициализация дисплея

Должна быть выполнена в течении 30 мс после появления питания в следующей последовательности:
сбросить, установив на соответствующем входе низкий уровень на 100 нс или более,
включить дисплей и выбрать расширенный набор команд, послав 0x21,
направить команду смещения напряжения 0x13,
установить температурную коррекцию командой 0x04,
включить генератор повышенного напряжения на уровень 6,42 В командой 0xB8,
вернуться в стандартный набор команд, послав 0x20,
включить графический режим командой 0x0C.
После этих действий Nokia 5110 LCD готов к работе.

Подключение модуля Nokia 5110 LCD

Вывод сигналов на контакты модуля показан на изображении в верху страницы. Также может быть другое расположение контактов показанное на рисунке.

Один из вариантов расположения контактов.

Сигналы и линии модуля

VCC Питание 3,3 В
GND Общий провод
SCE Включение, активный низкий уровень
Reset Сброс, активный низкий уровень
D/C̅ Данные/команда: 0 - данные, 1 - команда
SDIN Вход интерфейса
SCLC Тактовый сигнал
LED Подсветка. Для модулей на красной плате соединить с общим, для синих модулей соединить с питанием. Применять в цепи подсветки резистор 330 Ом. В некоторых модификациях уже установлен резистор в некоторых нет. Для определения наличия резистора и выбора оптимального режима подсветки следует контролировать ток модуля и ток подсветки. Он не должен превышать 20 мА.

Если к интерфейсу SPI микроконтроллера не подключены другие устройства, то для экономии контактов основного управляющего модуля прибора и сокращения количества линий связи контакт выбора активного устройства SCE следует соединить на плате модуля с контактом GND. Но есть недостаток. Если контроллер Nokia потерял синхронизацию с МК, то это теперь невозможно обнаружить.
Более надежное подключение следует делать так. Притягивать эту линию к высокому уровню резистором 100-500 кОм, чтобы исключить воздействие помех на контроллер, пока МК находится в состоянии сброса.
При работе с микроконтроллерами AVR, удобно использовать интерфейс USART в режиме SPI ведущий. Режим SPI-3 (CPHA=1, CPOL=1). Это значит, что пока обмен отсутствует, на линии SCLK высокий уровень, а данные с линии SDIN контроллер читает по нарастающему фронту на линии SCLK в течение 100 нс. При этом они должны быть выставлены минимум за 100 нс до нарастания фронта. Передача осуществляется по 8 бит, сначала старший.
Уровень на линии D/C̅ определяет, как трактовать полученные данные. Высокий уровень означает, что переданные данные должны быть выведены на дисплей, низкий уровень - передана команда. Контроллер читает значение на этой линии вместе с последним (младшим) битом каждого переданного байта данных. При использовании асинхронной аппаратной передачи с этим могут возникнуть трудности. Перед установкой уровня необходимо дождаться завершения передачи предыдущего байта.

Соединение модуля Nokia 5110 LCD и Arduino UNO.

Входные сигналы модуля должны соответствовать логическим уровням схемы питаемой напряжением 3,3 В. При работе с микроконтроллером, имеющим питание 5 В, обязательно применяются цепи согласования уровней.

Графика

В начале подготовки графического изображения следует подготовить в любом графическом редакторе черно-белое изображение в формате *.bmp с разрешением 84х48 точек. Мы подготовили такую картинку в Paint, вот она:

Имя файла картинки должно быть сохранено латинскими буквами. При помощи программы

Для неопытных пользователей, желающих самостоятельно создавать системы управления роботизированными устройствами или средства автоматики, на рынке IT-услуг предлагаются различные аппаратные модули и их модификации. Как правило, такие устройства имеют простую архитектуру с правом копирования и прилагающимся к ним программному обеспечению в виде простых утилит. Подобные изделия могут использоваться как самостоятельно, так и подключаться к другим компьютерным системам через проводные или беспроводные интерфейсы.

Плюсы работы с графическими дисплеями

Ранее графические монохромные дисплеи использовались очень широко в производстве сотовых телефонов.

Компания Nokia выпустила огромное количество различных моделей, оснащенных таким экраном. Времена тех телефонов прошли, но дисплеи не исчезли с рынка и продолжают активно использоваться по настоящее время. Они оказались незаменимыми и, кроме того, дешевыми приборами для вывода текстовой и дисплеи работают за счет создания на экранах матриц точек, которые и высвечивают изображение. Они экономят ресурсы и время, при этом отображая большое количество информации и расходуя малое количество энергии. Существует огромное количество различных областей, где могут использоваться устройства Nokia 5110: фото-, видео-, телеаппаратуре, медицине, и во многих других отраслях.

Перед описанием порядка подключения дисплея Nokia к аппаратному модулю Arduino необходимо привести краткое представление данных устройств.

Преимущества использования Arduino Uno

Было создано множество платформ и микроконтроллеров, являющихся аналогами представленной в данной статье платформы Arduino. Одни из таких аналогов - Netmedia"s BX-24, Parallax Basic Stamp и многие другие. Однако остановимся на Arduino Uno, так как этот конструктор имеет ряд преимуществ перед остальными контроллерами. На них и стоит обратить внимание при выборе платформы для работы. В первую очередь это низкая стоимость данных устройств. Модели с этим программным обеспечением стоят менее 45 долларов, а при желании могут быть собраны вручную, так как обладают довольно простой конструкцией. Вторым пунктом стоит отметить, что платформы Arduino могут работать со всеми операционными системами: Windows, Linux, а также Macintosh OSX, тогда как все остальные ограничиваются работой исключительно с Windows.

Описание Arduino Uno

Arduino Uno - платформа для разработки и программирования различных устройств, которая имеет 14 цифровых входов и выходов, 6 аналоговых входов, несколько разъемов (USB, ICSP, силовой) и кнопку, которая имеет функцию перезагрузки устройства. В данную платформу встроен предохранитель, препятствующий короткому замыканию и обеспечивающий безопасную работу с USB-кабелем. Он срабатывает, когда через USB-порт проходит более 500 мА тока. По сравнению с универсальными компьютерами, Arduino Uno намного плотнее взаимодействует с окружающей физической средой. Платформа построена на печатной плате и предназначена для работы с открытым кодом. Ею могут воспользоваться как студенты и любители, так и профессионалы, которые могут расширять и дополнять модели по своему усмотрению и свободно работать с открытым кодом. Платформа спроектирована таким образом, чтобы в нее без труда можно было добавить новые компоненты. Конструкция предполагает выбор разработчиком самостоятельного использования устройства, поэтому не помещена в корпус и не имеет жесткой привязки к монтажу.

Описание дисплея Nokia 5110

Графический дисплей Nokia 5110 - бюджетный монохромный дисплей с диагональю 1.6", который позволяетт отображать не только текстовую информацию, но и рисунки. Его разрешение - 48х84 px, а напряжение, при котором он может работать - 2,7-5 В. Информация на экран выводится вертикальными блоками. Их высота - восемь пикселей, в ширину размер экрана составляет шесть строк. На задней панели имеются обозначения каждого контакта, что не позволит пользователям ошибиться в их расположении.

Наверное, у меня, как и у всех Arduino-строителей, появилась какая-то бредовая идея в голове. Заказал в Китае все необходимые детали. Ждать пришлось очень долго, но тут раньше срока был доставлен клон платы Arduino Uno и LCD-дисплей Nokia 5110 . Так как до этого с электроникой и программированием я был не знаком, решил не терять время зря и начал учиться выводить информацию на данный модуль.

Первым делом я загуглил и попал на публикацию «Arduino, модуль Nokia 5110 LCD и кириллица» от автора . И тут я понял, что всё, что раньше задумал, будет не так уже и просто сделать.

С кириллицей я разобрался, там все просто, не буду копипастить прошлый пост, а вот с картинками действительно проблема. Стоит задача: нужно нарисовать картинку и залить ее на дисплей. Столкнулся с первой проблемой, зашел в среду программирования Arduino я увидел, что там нет такой штуки как «Вставить - Изображения», а нужно картинку записать определенным кодом в hex системе исчисления . Нашел несколько редакторов, но не тут то было. Картинка адекватно не отображается. Я начал искать проблемы что может быть.

Методом кучей экспериментов, попыток и проб получился алгоритм которым я с вами поделюсь:

1) Нужно получить саму картинку, в черно-белом формате.bmp с расширением 84 х 48 пикселей.
Сделать это можно кучей способами почти у каждом графическом редакторе есть функция «Cохранить как» где указываем необходимые параметры.
Я делал в corelDRAW . Получаем что-то похожее. Нужно уточнить, что имя картинки обязательно должно сохранено латинской раскладкой клавиатуры, так как следующая программа ее не сможет открыть.

2) Если необходимо, можно отредактировать картинку в paint, как ни странно, там есть несколько простых и интересных инструментов.

3) При помощи получаем hex-код картинки.

4) Вставляем данный код в программный код Arduino и заливаем на плату:

// SCK - Pin 8 // MOSI - Pin 9 // DC - Pin 10 // RST - Pin 11 // CS - Pin 12 // #include LCD5110 myGLCD(8,9,10,11,12); extern uint8_t OKO; float y; uint8_t* bm; int pacy; void setup() { myGLCD.InitLCD(); } void loop() { myGLCD.clrScr(); myGLCD.drawBitmap(0, 0, OKO, 84, 48); myGLCD.update(); delay(2000); }

#include const uint8_t OKO PROGMEM={ //Скопированный hex-код GLCD tools };

Собирая устройства на Ардуино, мы часто сталкиваемся с необходимостью автономного вывода информации. И, как всегда, хочется чтобы решение было недорогим. И вот тут оказывается, что из недорогих устройств выбор не очень-то и богат.

Если выводимой инфы немного, удобно использовать семисегментные индикаторы. Они очень яркие и контрастные. Такие линейки из 4-х разрядов высотой в 0.36 дюйма на TM1637 продаются по 70 центов и управляются всего по 2-м пинам. Как нетрудно догадаться, заточены они, в основном, под отображение времени, хотя без труда могут отображать и, к примеру, температуру, давление и другие параметры, для которых достаточно 4-х разрядов.

Но если выводимой информации много, они не подойдут. В таких случаях чаще всего используются «народные» LCD 1602 дисплейчики, имеющие возможность вывода 2-х строк по 16 символов ценой в полтора бакса. На такой уже можно вывести информации в разы больше.

Его более продвинутый 4-х строчный собрат выведет инфы еще больше, но стоит уже заметно дороже, около 5 долларов, да и размер у него уже немаленький.

У всех этих устройств имеются свои плюсы и минусы. Из главных минусов можно отметить отсутствие поддержки русского языка, поскольку кодовая таблица зашита наглухо в микросхему, и невозможность вывода графики. Строго говоря, прошивка кириллицы в подобных устройствах бывает, но такие продаются в основном в России и по неразумным ценам.
Если эти минусы являются для применения в создаваемом устройстве решающими и разрешение в 84x48 точек в черно-белой графике вас устроит, то стоит обратить внимание на дисплейчик Nokia 5110. Когда-то на него был, но очень неполный, и местами устаревший. В частности там утверждалось о невозможности отображения кириллицы. На сегодня такой проблемы нет.

Герой нашего обзора, ценой менее пары баксов, ко мне пришел в прочной картонной коробке с защитной пленкой на экране, за что большое спасибо продавцу. Девайс имеет размеры печатной платы 45x45 мм красного текстолита и экран ЖК с разрешением 84x48 точек и размером 40x25 мм. Вес устройства 15 г. У него есть подсветка голубого цвета, которую можно отключить. У Ардуино этот дисплей откусит 5 цифровых пинов, не считая питания. На плате есть 2 ряда выводов, которые запараллелены между собой, поэтому можно использовать всего один ряд. Из них 5 – это управление, 2 питание и один на включение подсветки. Для включения подсветки нужно пин LIGHT замкнуть на землю (встречается другой вариант этого дисплея, как пишут - на плате синего цвета, где этот пин соединяется с питанием). Плата приходит нераспаянной, две гребенки прилагаются в комплекте.
Итак, подсоединяем выводы SCLK, DIN, DC, CE и RTS к пинам Ардуино, например, 3, 4, 5, 6, 7. Пин VCC к 3.3V (Именно 3.3, а не 5!), подсоединяем землю и качаем библиотеку .
Функции из этой библиотеки позволяют выводить графические примитивы (линия, круг, прямоугольник и т.д.), растровые картинки и текст. В составе библиотеки есть пример, показывающий ее возможности, советую посмотреть. А вот, чтобы текст выводился на русском, придется подшаманить фонт. Но, к счастью, добрые люди все уже сделали за нас и файл для подмены можно скачать .
Пример скетча я дам далее, а результат вывода текста на русском видим выше. Нетрудно подсчитать, что на самом маленьком размере шрифта (№ 1), можно вывести 84 символа (по 14 в 6 строк), чего вполне хватит для вывода, например, емких диагностических сообщений. Шрифт №2 вдвое крупнее.
Разрешение экрана позволяет выводить довольно неплохие растровые двухцветные картинки, которые в программе можно использовать в качестве иконок.

Создавать такие иконки очень просто. Под спойлером я покажу, как это делается.

Как быстро создать растровую картинку на примере логотипа сайта MYSKU

Для начала сделаем скрин экрана с логотипом (клавиша Print Screen).
Запустим Paint из стандартных программ и жмем Ctrl+V. Весь экран с логотипом в нашем распоряжении.


Выделяем нужный фрагмент и жмем кнопку ОБРЕЗАТЬ. Получим наш фрагмент.

Теперь нам нужно превратить этот фрагмент в двухцветный. С эти справится сам Paint. Жмем «Сохранить как» и выбираем тип «Монохромный риcунок (*.bmp)». Не обращаем внимания на предупреждение редактора и жмем Ок и видим такую картинку:

Теперь нужно превратить этот набор пикселей в массив кодов для Ардуино. Я нашел , который справляется с такой задачей.
Ему на вход нужно подать bmp файл, но обязательно 256 цветный! Поэтому мы снова жмем «Сохранить как» и выберем тип «256-цветный рисунок bmp». Теперь запомним размеры сторон получившегося файла, их будет нужно указать в скетче (смотрим или в Paint внизу в строке состояния или открыв Свойства файла - > вкладка Подробно) и перейдем в онлайн конвертер.


Выберем наш файл, поставим галочку на шестнадцатеричных числах и нажмем КОНВЕРТИРОВАТЬ.
Получим нужный нам массив:


Копируем этот массив в скетч, компилируем и смотрим, что получилось.


Теперь отключим подсветку и посмотрим, как изображения будут выглядеть без нее.


Как видим, и текст и значки читаются хорошо. Причем, чем ярче свет, тем лучше читабельность (эх, вспоминаю как было приятно пользоваться Nokia 1100 солнечным днем, в то время, как народ прятал свои трубки с цветными матрицами в тень, чтобы набрать номер). В общем, в таком режиме можно использовать дисплей, если освещения хватает или подсветка мешает или для экономии автономного питания. Если у кого изображение на экранчике будет плохо видно, поиграйтесь с контрастностью в скетче. Лучшая контрастность при подсветке и без нее получается при разных значениях, это надо учитывать.

Пример скетча для вывода текста и картинки

#include #include // 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) Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7); const static unsigned char PROGMEM ku59x39 = { 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x3, 0xf0, 0xfc, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0x87, 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xc0, 0xff, 0xe3, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x90, 0xff, 0xf1, 0xfc, 0x0, 0x7, 0xff, 0xff, 0x30, 0xff, 0xf8, 0xf0, 0x0, 0x7f, 0xff, 0xfe, 0x30, 0xff, 0xfc, 0x40, 0x3, 0xff, 0xff, 0xfc, 0x70, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, 0xf8, 0xf0, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0xf0, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xe3, 0xf0, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xc3, 0xf0, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x83, 0xf0, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0x1f, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0x0, 0x0, 0x7, 0xf0, 0xff, 0xff, 0xfc, 0x38, 0x0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xf0, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x0, 0x3f, 0xe1, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x3, 0xf0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfe, 0xf, 0x80, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xff, 0xe, 0x0, 0x3f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc, 0x3, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xc0, 0xf0, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0x88, 0xf0, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x9c, 0xf0, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0x38, 0xf0, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0x19, 0xf0, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x3, 0xf0, 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xff, 0xce, 0x7f, 0xff, 0xdf, 0xf0, 0xff, 0xff, 0xff, 0xce, 0x7f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x9e, 0x7f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xf0 }; void setup() { display.begin(); display.setContrast(50); display.setTextSize(1); display.setTextColor(BLACK); // установка цвета текста } void loop() { display.clearDisplay(); display.drawBitmap(10, 5, ku59x39, 59, 39, BLACK); display.display(); delay(2000); display.clearDisplay(); display.setCursor(0,0); display.print("ЗРС способна поражать не только баллистические, но и аэродинамические цели - самолеты"); display.display(); delay(2000); }


Ну, и, поскольку Ардуино (Процессор+Озу+Загрузчик-BIOS)+накопитель (EEPROM) + система ввода-вывода (Пульт IRDA и Nokia 5110)- это, по сути, полноценный компьютер, то почему бы не написать для него полноценной игры? Конечно, игру типа ГТА наш ардуино-комп не потянет, но простую казуальную игрушку - запросто! Напишем игру всех времен и народов - Тетрис.
Для любого программиста - это как утренняя зарядка, легкое упражение для мозга, поэтому - вперед! Да и на муське вроде такого раньше еще не было. А в игре как раз раскроется потенциал сабжа.
В качестве системы ввода я решил использовать IRDA пульт от ЛЮБОГО устройства. При таком решении нам понадобится всего лишь один , ценой 4 руб за штуку. А IR пульт найдется в любой квартире. Для озвучки мы еще применим пьезопищалку от старой материнки - это будет наш бюджетный аналог мультимедиа)). Ко мне едет сейчас более крутой , но это уже удорожание нашего суперкомпа на целый доллар! Пока обойдемся. С ним будет уже .
На макетке коммутируем устройства вывода, ввода и нашу «мультмедиа». Получилось так:


Я использовал Arduino Uno, поскольку там нужные нам 3.3V уже есть, но если использовать Mini, то придется для экрана добыть из 5 вольт нужные 3.3. Самый несложный способ из инета - поставить последовательно два кремниевых диода (подобрать).
Чтобы не рисовать электрическую схему, просто укажу задействованные мной пины Ардуино.
Подсоединение дисплея Nokia 5110:
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)
Для подсветки пин LIGHT дисплея кидаем на GND Ардуино. (Только для платы красного цвета!). Плюс питания на 3.3V. Земля на GND.
Подсоединение IR приемника:
pin 8 - IR (управляющий). Питание на +5V и GND соответственно.
Подсоединение пьезопищалки:
pin 9 - speaker, Земля на GND.
После монтажа, заливаем скетч

Скетч игры Тетрис

//// © Klop 2017 #include #include #include #include #define rk 4 // ширина квадратика #define rz 5 // ширина места #define smeX 1 #define smeY 1 #define MaxX 10 // стакан кол-во мест по гориз #define speaker 9 #define RECV_PIN 8 // нога на IRDA приемник // 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) Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7); IRrecv irrecv(RECV_PIN); decode_results results; byte mstacan; byte Lst,SmeH, center, NumNext; byte MaxY; // стакан кол-во мест по вертик int dxx, dyy, FigX, FigY, Victory, myspeed,tempspeed; unsigned long ok, levo, pravo, vniz, myrecord; unsigned long flfirst=1234; // метка первого запуска byte fig= { {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}}, {{0,1,0,0}, {0,1,0,0}, {0,1,0,0}, {0,1,0,0}}, {{0,0,0,0}, {0,1,1,0}, {0,1,1,0}, {0,0,0,0}}, {{0,1,0,0}, {0,1,1,0}, {0,0,1,0}, {0,0,0,0}}, {{0,1,0,0}, {0,1,0,0}, {0,1,1,0}, {0,0,0,0}}, {{0,1,0,0}, {0,1,1,0}, {0,1,0,0}, {0,0,0,0}}, {{0,0,1,0}, {0,1,1,0}, {0,1,0,0}, {0,0,0,0}}, {{0,0,1,0}, {0,0,1,0}, {0,1,1,0}, {0,0,0,0}}, {{0,0,0,0}, //8 {0,0,0,0}, {0,0,0,0}, {0,0,0,0}} }; //============================================== void mybeep() // звук {analogWrite(speaker, 100); delay(100); analogWrite(speaker, 0); } //============================================== void figmove(byte a, byte b) { for (byte i=0;i<4;i++) for (byte j=0;j<4;j++) fig[a][i][j]=fig[b][i][j]; } //============================================== void figinit(byte a) { for (byte i=0;i<4;i++) for (byte j=0;j<4;j++) { fig[i][j]=fig[i][j]; if (fig[a][j][i]==1) // покажем след фигуру display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK); else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE); } display.display(); NumNext=a; tempspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения; dxx=0; for (byte i=0;i0) display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, BLACK); else display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WHITE); ds(Victory,1); display.display(); } //================================================ void ds(int aa, int b) { display.fillRect(55, 10, 29, 10, WHITE); display.setCursor(55,b*10); display.println(aa); } //================================================ bool iffig(int dx, int dy) {int i,j; bool flag=true; bool pov=false; for (i=0;iMaxX-1) dx=-1;// пробуем отодвинуть от стенки справа на 1 } } } for (i=0;i<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) if (i+FigX+dx<0 || i+FigX+dx>MaxX-1 || FigY+j+dy>MaxY-1 || mstacan>0) {flag=false; break;} // проверили на новые координаты if (flag) {FigX=FigX+dx; FigY=FigY+dy;byte k=0; for (i=0;i<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) {mstacan=1; dxx=0; } } // переместили фигуру на новые координаты else { if (pov) figmove(0,8); for (i=0;i<4;i++) // восстановили фигуру for (j=0;j<4;j++) if (fig[j][i]==1) mstacan=1; } return(flag); } //================================================ void clearstacan() { for (byte i=0;imyrecord) { myrecord=Victory; EEPROM_write(16, myrecord); } display.setCursor(5,0); display.print("Рекорд"); display.setCursor(5,10); display.print(myrecord); display.display(); display.setCursor(5,20); delay(2000);irrecv.resume(); display.println("Нажмите"); tb=getbutton(" OK"); if (tb!=ok) { ok=tb; levo=getbutton("Влево"); pravo=getbutton("Вправо"); vniz=getbutton("Вниз"); EEPROM_write(0, ok); EEPROM_write(4, levo); EEPROM_write(8, pravo); EEPROM_write(12, vniz); } display.fillRect(5, 0, (MaxX-1)*rz, 40, WHITE); myspeed=800; tempspeed=myspeed; Victory=0; } //================================================ void setup() { unsigned long tr; word gg=0; randomSeed(analogRead(0)); irrecv.enableIRIn(); // Старт ресивера IRDA display.begin(); display.setContrast(50); display.setTextSize(1); display.setTextColor(BLACK); // установка цвета текста display.clearDisplay(); Lst=rz*MaxX; // ширина стакана в пикселях MaxY=display.height()/rz+4; // Высота стакана в кубиках SmeH=display.height()%rz; // смещение сверху в пикселях для отображения random(7); EEPROM_read(0, ok); EEPROM_read(4, levo); EEPROM_read(8, pravo); EEPROM_read(12, vniz); EEPROM_read(20, tr); if (tr==flfirst) EEPROM_read(16, myrecord); else { myrecord=0; EEPROM_write(16, myrecord); EEPROM_write(20, flfirst); } newgame(); } //================================================ void dvoiki() { for (byte i=0;i
И можно ирать. Игра поддерживает привязку к любому пульту. Для этого достаточно в начале игры, на вопрос «Нажмите ОК» нажать на пульте кнопку, которая будет отвечать за вращение фигуры. Если пульт игре уже знакомый, то игра сразу запустится. Если пульт новый, то код кнопки ОК не совпадет с запомненным и игра потребует последовательно нажать кнопки «Влево», «Вправо» и «Вниз». Эти кнопки будут записаны в энергонезависимую память Ардуино и впоследствии именно этот пульт будет узнаваться сразу по нажатию кнопки «ОК».


При «проваливании» на собранную строку будет воспроизводиться писк. Он реализован на особенности нескольких пинов Ардуино (в нашем случае 9) выдавать ШИМ с заданной частотой.
Игра поддерживает все атрибуты нормальной игры. Ту и подсказка следующей фигуры и текущий счет. Игра ведет учет рекордов. Это значение хранится в энергонезависимой памяти Ардуино. Чтобы сбросить рекорд, достаточно изменить в скетче значение flfirst=1234 на любое другое. В игре также идет автоувеличение скорости падения через каждые 30 списанных строчек, так что, бесконечно долго поиграть не получится). Скетч не оптимизировался и тщательно не прогонялся, а был написан на досуге в свое удовольствие. Если кто обнаружит ошибку - пишите. О ©. Скетч разрешается править для себя как угодно. Только при публикации где-либо своих вариантов ссылку на первоисточник-муську указывайте).
Для чего делал - длинные выходные + «из любви к искусству». Была бы дочка маленькой, сделал бы ей, наверное, мини игровой автомат для кукольной комнатки на 8 марта, как раз успел бы. Добавил бы несколько игр типа Змейки и Арканоида, а корпус вырезал бы из текстолита, наверное. Только дочка в этом году уже докторскую защищает, так, что мимо, но может кому еще эта идея пригодится).

Подведем итог для дисплея Nokia 5110:
Плюсы
+Возможность вывода графики;
+Отсутствие проблем с кириллицей;
+Небольшой вес;
+Отличное соотношение габариты/кол-во выводимой информации;
+Плюсы примененной технологии ЖК - малое энергопотребление и хорошая читабельность на ярком свете;
+Отключаемая подсветка;
+Цена.

Минусы
-Подсветка неравномерная;
-Изображение черно-белое (оттенков нет);
-Необходимость позаботиться о 3.3V, не на каждой Ардуино такое напряжение есть.

Вердикт: За свои деньги по совокупности характеристик уверено занимает свою нишу, недаром и является таким долгожителем среди устройств отображения для Ардуино.

Планирую купить +102 Добавить в избранное Обзор понравился +148 +269

Помните те времена, когда мобильные телефоны были "дубовые", у них была отдельная кнопочная клавиатура и маленький монохромный жидкокристаллический дисплей?

Теперь этот рынок принадлежит всяким iPhone, Galaxy и т.п., но дисплеи находят себе новое применение: diy-проекты!

Черно-белый дисплей 84х48 пикселей, который мы будем рассматривать, использовался в телефонах Nokia 3310. Основное их преимущество - легкость в управлении. Подобный дисплей отлично впишется в ваш проект для интерактивного обмена информацией с пользователем.

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

Необходимые материалы

  • Arduino или ее клон.
  • Коннекторы.
  • Монтажная плата.

Технические характеристики дисплея Nokia 5110

Перед подключением дисплея и программированием Arduino давайте рассмотрим общую информацию о нем.

Распиновка

Для подключения и передачи данных на дисплее используются два параллельных ряда 8 коннекторов. На задней части дисплея нанесены обозначения каждого пина.


Как уже было сказано, пины параллельно соединены между собой. Информация о назначении каждого коннектора приведена ниже.


Питание

Вы уже обратили внимание, что на LCD дисплее 5110 два коннектора для питания. Первый - самый важный - питание логики дисплея. В datasheet указано, что оно должно выбираться в диапазоне 2.7 - 3.3 В. В нормальном режиме работы дисплей будет потреблять от 6 до 7 мА.

Второй коннектор питания предназначен для подсветки дисплея. Если вы снимете сам дисплей с платы (это делать не обязательно, можно просто посмотреть на рисунок ниже), вы увидите, что подсветка реализована очень просто: четыре белых светодиода, которые расположены по углам платы. Обратите внимание, что токоограничивающих резисторов нет.


Так что с питанием надо быть аккуратнее. Можно использовать токоограничивающий резистор при подключении пина "LED" или использовать максимальное напряжение питания 3.3 В. Не забывайте, что светодиоды могут поглощать большие токи! Без ограничения, они потянут около 100 мА при напряжении питания 3.3 В.

Управляющий интерфейс

В дисплее встроен контроллер: Philips PCD8544, который преобразовывает массивный параллельный интерфейс в более удобный серийный. PCD8544 управляется помощью синхронным серийным протоколом, который подобен SPI. Обратите внимание, что есть пины счетчика времени (SCLK) и ввода серийных данных (DN), а также активный-low выбор чипа (SCE).

Выше рассмотренных серийных коннекторов установлен еще один коннектор – D/C, по которому поступает информация о том, могут ли быть отображены данные, которые передаются.

Для перечня команд, ознакомьтесь с разделом “Instructions” из даташита PCD8544 (страница 11). Есть команды, которые очищают дисплей, инвертируют пиксели, отключают питание и т.п.

Сборка и подключение дисплея 5110

Перед загрузкой скетча и передачей данных на дисплей, необходимо разобраться с подключением. Для этого необходимо решить вопрос его сборки и подключения к Arduino.

Сборка

Для "сборки" дисплея вам могут пригодится коннекторы. 8 штук будет достаточно. Можно использовать прямые ноги или расположенные под 90 градусов. Зависит от дальнейшего использования. Если вы планируете использовать монтажную плату, рельса с прямыми коннекторами, скорее всего, будет оптимальным выбором.

LCD дисплей от Nokia 5110, установленный на мини-монтажной плате:


Можно и напрямую запаять переходники к дисплею.

Подключение дисплея 5110 к Arduino

В данном примере мы подключим LCD дисплей к Arduino. Подобную методику можно легко адаптировать к другим платам и микроконтроллерам. Для подключения пинов передачи данных - SCLK и DN(MOSI) – мы используем SPI пины Arduino, которые обеспечивают быструю передачу данных. Выбор чипа (SCE), перезагрузка (RST), и пин данные/управление (D/C) могут быть подключены к любому цифровому пину. Выход от светодиода подключается к пину на Arduino, который поддерживает ШИМ-модуляцию. Благодаря этому возможна гибкая настройка яркости подсветки.

К сожалению, максимальное напряжение питания дисплея 5110 может достигать 3.6 вольт, так что подключать напрямую к стандартному выходу 5 V на Arduino нельзя. Напряжение надо настраивать. Соответственно, появляется не колько вариантов подключения.

Прямое подключение к Arduino

Самый простой вариант подключения к Arduino напрямую. В этом случае надо использовать платы Arduino Pro 3.3V/8MHz или 3.3V Arduino Pro Mini. Вариант, предложенный ниже работает с платами Arduino 5V. Это рабочий вариант, но срок работы дисплея может несколько сократиться.


Пины подключаются следующим образом:


Хороший и недорогой вариант для обеспечения дополнительной защиты - установка резисторов между пинами пинами передачи данных от Arduino к LCD 5110. Если вы используете Arduino Uno (или подобную 5-ти вольтовую плату), можно использовать резисторы номиналом 10 кОм и 1 кОм. Схема подключения дисплея с использованием резисторов приведена на рисунке ниже:


Подключение такое же как и в первом примере, но в каждой цепи сигнала установлен резистор. Резисторы на 10 кОм установлены между пинами SCLK, DN, D/C и RST. Резистор номиналом 1 кОм - между пинами SCE и пином 7. Ну и 330 Ом остается между пином 9 и пином со светодиодом. and pin 7.

Преобразователи уровня

Третий вариант подключения - с использованием преобразователей уровня для переключения между 5 и 3.3 В. Для этих целей можно использовать модули Bi-Directional Logic Level Converter или TXB0104.


К сожалению, на дисплее пять входов для сигнала 3.3 В, а на преобразователях уровня - четыре. Можно оставить выход RTS в состоянии high (подключив его с использованием резистора на 10 кОм). В результате вы лишаетесь возможности управления перезагрузкой дисплея, но все остальные функции будут доступны.

Первый пример скетча для Arduino: LCD Demo

После благополучного подключения можно переходить к загрузке скетча и отображения данных на дисплее!

Программа для Arduino

Комментарии в коде выше должны вам помочь разобраться в программе. Большинство действий происходит в пределах функции lcdFunTime().

Скетч в действии

После загрузки на Arduino, скетч начнет отрабатывать и запустит демо – набор стандартных анимаций и отработку графических функций. Для начала отобразим несколько пикселей. После этого мы перейдем к отображению линий, прямоугольников и кругов, прогрузим растровое изображение и т.п.


После отработки скетча, монитор перейдет в режим передачи данных по серийному протоколу. Откройте серийный монитор (со скоростью передачи данных 9600 бит в секунду). То, что вы напечатаете в серийном мониторе, отобразится на LCD мониторе.

Если вас заинтересовали возможности отображения растровых изображений, читайте дальше. Мы рассмотрим как именно можно импортировать собственное растровое изображение 84х48 и отобразить его на экране.

Второй пример скетча для Arduino: загрузка и отображение растровых изображений

В этом примере мы создадим новое растровое изображение 84х48, интегрируем его в код Arduino и отправим на LCD монитор.


Находим/Создаем/Изменяем растровое изображение

Для начала найдите изображение, которое вы хотите отобразить на LCD экране 5110. Сильно развернуться на 84х48 пикселей не получится, но все же можно. Вот некоторые примеры:

После выбора изображения, надо его подкорректировать: сделать монохромным (2-битным цветом); выдержать размер 84х48 пикселей. Для этого можно использовать большинство редакторов изображений. В том числе и Paint, если у вас Windows. Сохраните полученное изображение.

Преобразование растрового изображения в массив

Следующий шаг – преобразовать этот файл в 504-байтный массив символов. Для этого можно воспользоваться различными программами. Например, LCD Assistant.

Для загрузки изображения в LCD Assistant, перейдите в меню File > Load Image. Должно открыться окно с превью картинки. Убедитесь, что картинка правильного размера – 84 пикселя в ширину, 48 пикселей в высоту, а настройка Byte orientation установлена в режим Vertical, Size endianness в Little. Остальные настройки по умолчанию должны быть выставлены корректно (8 pixels/byte)

После этого перейдите во вкладку File > Save output, чтобы сгенерировать временный текстовый файл. Откройте этот текстовый файл, чтобы рассмотреть ваш новый замечательный массив. Измените тип массива на char (не unsigned и не const). Также убедитесь, что массив корректно назван (без тире, не начинается с числа и т.п.).

Импортируйте в скетч и рисуйте!

Скопируйте созданный массив в скетч для Arduino. Можете использовать скетч из первого примера. Вставьте ваш массив в любом месте. Теперь, чтобы отобразить ваш рисунок, замените setup() и loop() в скетче строчками, которые приведены ниже (при этом остальные функции и переменные остаются неизменными):

// ...переменные, константы и массив растрового изображения определены выше

lcdBegin(); // Настройка пинов и инициализация LCD дисплея

setContrast(60); // Настройка контраста (предпочтительный диапазон – от 40 до 60)

setBitmap(flameBitmap); // flameBitmap надо заменить названием вашего массива

updateDisplay(); // Обновление дисплея, чтобы отобразить массив

// Функции для управления и графики на LCD-дисплее определены ниже...

Правда, прикольно получилось? Помимо всего прочего, вы можете импортировать несколько изображений и создавать небольшие анимации! Попробуйте, уверен, вам понравится!

Ссылки для скачивания дополнительных программ, библиотек и даташитов

Даташиты на LCD-дисплей и драйвера
  • LCD Datasheet – Не совсем от 5110, но очень похожий по характеристикам
Библиотеки Arduino и скетчи
  • PCD8544 Arduino Library – Библиотека для работы Arduino с LCD драйвером PCD8544
Программы для создания растровых изображений
  • TheDotFactory – Отличный инструмент для создания массивов пользовательских шрифтов

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: