Подключение графического дисплея nokia 5110

Фирмы 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 В. Информация на экран выводится вертикальными блоками. Их высота - восемь пикселей, в ширину размер экрана составляет шесть строк. На задней панели имеются обозначения каждого контакта, что не позволит пользователям ошибиться в их расположении.

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

Если выводимой инфы немного, удобно использовать семисегментные индикаторы. Они очень яркие и контрастные. Такие линейки из 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

Новые статьи

● Проект 16: Графический индикатор. Подключение дисплея Nokia 5110

В этом эксперименте мы рассмотрим графический дисплей Nokia 5110, который можно использовать в проектах Arduino для вывода графической информации.

Необходимые компоненты:

Жидкокристаллический дисплей Nokia 5110 - монохромный дисплей с разрешением 84×48 на контроллере PCD8544, предназначен для вывода графической и текстовой информации. Питание дисплея должно лежать в пределах 2.7-3.3 В (максимум 3.3 В, при подаче 5 В на вывод VCC дисплей может выйти из строя). Но выводы контроллера толерантны к +5 В, поэтому их можно напрямую подключать к входам Arduino. Немаловажный момент - низкое потребление, что позволяет питать дисплей от платы Arduino без внешнего источника питания.
Схема подключения Nokia 5110 к Arduino показана на рис. 16.1.

Рис. 16.1. Схема подключения Nokia 5110 к Arduino

Для работы с дисплеем Nokia 5110 будем использовать библиотеку Adafruit_GFX, которая имеет богатые возможности для вывода графики и текста. В нашем эксперименте мы будем получать данные освещенности с фоторезистора, подключенного к аналоговому входу Arduino A0, и выводить данные освещенности в числовом и графическом представлениях. Схема подключения показана на рис. 16.2.

Рис. 16.2. Схема подключения Nokia 5110 и фоторезистора к Arduino

Код скетча нашего эксперимента показан в листинге 16.1. Мы считываем данные с фоторезистора и отображаем числовое значение, а также в графическом виде (прогресс-бар) значение освещенности в процентах от максимального значения. Значения минимальной и максимальной освещенности берем из эксперимента 13.

// Подключение библиотеки #include #include // PIN 7 - RST Pin 1 on LCD // PIN 6 - CE Pin 2 on LCD // PIN 5 - DC Pin 3 on LCD // PIN 4 - DIN Pin 4 on LCD // PIN 3 - CLK Pin 5 on LCD Adafruit_PCD8544 display = Adafruit_PCD8544(3 , 4 , 5 , 6 , 7 ); const int LIGHT=A0; // Контакт A0 для входа фоторезистора const int MIN_LIGHT=200 ; // Нижний порог освещенности const int MAX_LIGHT=900 ; // Верхний порог освещенности // Переменная для хранения данных фоторезистора int val1,val2 = 0 ; void setup () { display.begin(); // установить контраст фона экрана // очень важный параметр! display.setContrast(60 ); display.clearDisplay(); // очистить экран delay(2000 ); } void loop () { val1 = analogRead(LIGHT); // Чтение показаний фоторезистора drawText(val1,1 ); // вывести текст // масштабирование значения потенциометра к 0-75 val2= map (val1, MIN_LIGHT, MAX_LIGHT, 0 , 75 ); // вывод черного прямоугольника в % display.fillRect(5 , 25 , val2, 10 , 1 ); // вывод белой части прямоугольника display.fillRect(5 +val2,25 , 75 -val2, 10 , 0 ); display.display(); delay(1000 ); // пауза перед новым измерением drawText(val1,2 ); // стереть текст } // процедура вывода текста void drawText (unsigned long num,int color) { display.setTextSize(2 ); // размер шрифта display.setCursor(20 ,5 ); // позиция курсора if (color==1 ) display.setTextColor(BLACK); // вывести значение else display.setTextColor(WHITE); // стереть (белым по белому) display.print(num); }
Порядок подключения:

1. Подключаем датчик дисплея Nokia 5110 и фоторезистор по схеме на рис. 16.2.
2. Загружаем в плату Arduino скетч из листинга 16.1.
3. Перекрывая рукой поток света, смотрим на экране дисплея изменение показаний освещенности.

Листинги программ

Наверное, у меня, как и у всех 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 };




Top