Подключение дисплея от телефона к ардуино
Разбираемся с подключением жидкокристаллического монохромного дисплея с разрешением 84×48 точек от Nokia 5110 к Arduino.
Инструкция по подключению ЖК экрана Nokia 5110 к Arduino
- Arduino (или совместимая плата);
- ЖК дисплей для Nokia 5110/3310 (покупаем здесь);
- соединительные провода (типа таких).
1 Схема подключения ЖК экрана Nokia 5110 к Arduino
Будьте внимательны, некоторые модификации экрана имеют другую нумерацию выводов. Также на некоторых модификациях экрана вывод подсветки подключается к GND, а не Vcc.
Заказать недорого экран Nokia 5110 можно, например, в Китае.
2 Библиотека для работы с LCD дисплеем Nokia 5110
Для работы с этим LCD экраном написано много библиотек. Предлагаю воспользоваться вот этой библиотекой. Скачаем и разархивируем скачанный файл в директорию Arduino IDE/libraries/.
Библиотека поддерживает следующие возможности.
Функция | Назначение |
---|---|
LCD5110(SCK, MOSI, DC, RST, CS) | объявление ЖК экрана с указанием соответствия пинам Arduino; |
InitLCD([contrast]) | инициализация дисплея 5110 с опциональным указанием контрастности (0-127), по умолчанию используется значение 70; |
setContrast(contrast) | задаёт контрастность (0-127); |
enableSleep() | переводит экран в спящий режим; |
disableSleep() | выводит экран из спящего режима; |
clrScr() | очищает экран; |
clrRow(row, [start], [end]) | очистка выбранной строки номер row, от позиции start до end; |
invert(true), invert(false) | включение и выключение инверсии содержимого LCD экрана; |
print(string, x, y) | выводит строку символов с заданными координатами; вместо x-координаты можно использовать LEFT, CENTER и RIGHT; высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8; |
printNumI(num, x, y, [length], [filler]) | вывести целое число на экран на заданной позиции (x, y); length – желаемая длина числа; filler – символ для заполнения «пустот», если число меньше желаемой длины; по умолчанию это пустой пробел " "; |
printNumF(num, dec, x, y, [divider], [length], [filler]) | вывести число с плавающей запятой; dec – число знаков после запятой; divider – знак десятичного разделителя, по умолчанию точка "."; |
setFont(name) | выбрать шрифт; встроенные шрифты называются SmallFont и TinyFont; вы можете определить свои шрифты в скетче; |
invertText(true), invertText(false) | инверсия текста вкл./выкл.; |
drawBitmap(x, y, data, sx, sy) | вывести картинку на экран по координатам x и y; data – массив, содержащий картинку; sx и sy – ширина и высота рисунка. |
3 Скетч для вывода текста на ЖК экран Nokia 5110
Напишем такой скетч.
Сначала подключаем библиотеку, затем объявляем экземпляр класса LCD5110 с назначением выводов. В процедуре setup() инициализируем ЖК экран. В процедуре loop() очищаем экран и пишем маленьким шрифтом произвольный текст, под ним – средним шрифтом выводим счётчик секунд.
Вывод текстовых данных на LCD экран Nokia 5110 с помощью Arduino
4 Скетч для вывода изображения на ЖК экран Nokia 5110
Давайте к тексту на экране добавим картинку. Для этого подготовим монохромное изображение, которое хотим вывести на экран Nokia 5110. Помните, что разрешение экрана Nokia 5110 составляет 48 на 84 точек, и картинка должна быть не больше. Воспользуемся онлайн-инструментом для преобразования изображения в массив битов. Скачаем полученный файл с расширением "*.c" и добавим его к проекту через меню: Эскиз Добавить файл… или просто поместим файл в директорию скетча, а затем перезагрузим среду разработки Arduino IDE.
Добавление файла к проекту Arduino
Дополним наш скетч работой с изображением.
Теперь нужно в коде программы объявить массив с данными изображения (у меня в коде это строка extern uint8_t mysymb[];, а в файле изображения массив называется mysymb[]), а затем используем функцию drawBitmap() для вывода изображения в нужном месте экрана.
Загрузим скетч в Arduino. Теперь текст сменяется картинкой, и счётчик каждый раз увеличивает своё значение.
Вывод изображения на ЖК экран Nokia 5110 с помощью Arduino
Графический дисплей на контроллере PCD8544
Должен сразу сказать, что для русификации дисплея я использовал кодировку CP866, и сделал я это удобным для Linux-пользователей способом. В Windows это получится использовать разве что из CYGWIN (понадобится утилита iconv).
Также должен упомянуть, что у меня были сложности с управлением дисплеем через аппаратный SPI. Она заключается в том, что и USBasp, и дисплей используют SPI порт ATmega8, и чтобы загрузить прошивку в микроконтроллер, дисплей приходится отключать. Это просто неудобно. Поэтому почти во всех примерах используется подключение дисплея по программному SPI. Подключение через аппаратный SPI используется только во втором и в последнем (финишном) примере (там не сложно, лишь нужно поменять пару строчек в коде и переподключиться к нужным пинам).
В целом, говоря про графические дисплеи, скажу, что эти штуки быстро "съедают" оперативную и флеш память и легко занимают всю пропускную способность SPI шины ;)
-
Содержание статьи:
- Основные характеристики дисплея на контроллере pcd8544;
- Подключение дисплея к Arduino;
- Пишем HelloWorld для ATmega8+PCD8544 в Proteus;
- Переподключение дисплея на аппаратный SPI в Proteus;
- Функции масштабирование шрифта в два и три раза;
- Создание проекта для реального микроконтроллера ATmega8, чтение таблицы ASCII из флеш-памяти;
- Добавляем кириллицу в кодировке CP866
- Добавление фреймбуфера. Программа рисования фрактала.
- Делаем скринсейвер "сквозь звездное небо"
- Функции рисования прямых линий, и окружностей
- Интерфейс для метеостанции
- Интерфейс для FM-радиоприемника
- Финальная версия библиотеки на аппаратном SPI
1) Основные характеристики дисплея на контроллере pcd8544
Нужно осознавать, что дисплеи покупаемые на али или ибэе, это не оригинальные дисплеи на контроллере pcd8544, а совместимые с ним noname девайсы(подробности здесь). По крайней мере в продаже на mouser я их не нашел. Это не плохо, но параметры устройства могут не соответствовать документации на оригинальный чип, что как бы уже нехорошо.
Далее немного справочной информации.
Распиновка. Модули с экраном от Nokia 5110/3310 продаются в двух вариантах: красные и синие. Синий модуль имеет следующий ряд контактов:
Здесь:
Gnd - это "земля",
BL - подсветка +3.3 Вольта,
Vcc - питание +3.3 Вольта,
Clk - линия тактирования,
Din - линия данных "Data input",
DC или D/ C - выбор между регистрами данных или команд, аналогичен RS в HD44780,
CE или SCE - Chip Enable, он же CS / SS , Chip Select,
RST - это линия сброса контроллера PCD8544.
Мой экземпляр экрана имеет красную расцветку, от синего он отличается тем, что подсветка LIGHT включается подключением к "земле", а не к питанию. В остальном все тоже самое.
Стрелочкой обозначен верх дисплея.
Начало координат располагается в верхнем левом углу. Очередность байтов при линейном заполнении видеопамяти такая:
Также хочется сказать пару слов о подключении дисплея с 3.3 вольтовой логикой к микроконтроллеру ATmega8. Все знают, что в частности Аrduino - это 5 вольтовая логика. Однако микроконтроллеры ATmega могут работать на 3.3 Вольтах.
Я лично использовал такую самодельную DevBoard:
Линейный стабилизатор LM1117 3.3 позволяет переключать внешнее питание с 5 Вольт на 3.3Вольт. Однако при подключении программатора USBasp линейный стабилизатор не задействуется, вместо этого на самом программаторе переключается джампик питания микроконтроллера на 3.3V.
На моей DevBoard установлен кварц на 16MHz, хотя по документации на ATmega8, при напряжении питания 3.3Вольт частота clkcpu не должна превышать 10МГц. И хотя при комнатной температуре это будет работать скорее всего без проблем, технически это является overclocking'ом.
2) Подключение экрана Nokia 5110 к Arduino
Для проверки дисплея на работоспособность, можно попробовать подключить его к Arduino.
На официальном сайте Arduino имеется небольшой скетч - HelloWorld, с помощью которого можно проверить работоспособность дисплея. Этот скетч не требует установки каких-либо библиотек для своей работы.
При успешном подключении, на экране дисплея появится строка: Hello World!
Данный скетч я буду использовать как образец для написания кода под ATmega8.
3)Пишем HelloWorld для ATmega8+PCD8544 в Proteus
В Proteus 8.5 дисплей на контролере pcd8544 уже имеется в библиотеке, так что ничего искать и скачивать не надо, нужно просто добавить его в проект:
После статьи о сдвиговых регистрах, у меня в Proteus остался проект с ATmega8 настроенный на работу на 2МГц, его я и буду продолжать использовать:
Код для микроконтроллера я пишу в самом Proteus, и вариант приведенного выше кода для ATmega8 будет выглядеть так: показать код
Начало положено, начнём добавлять функционал. Что мы можем сделать на этом этапе? Первое, что хотелось бы сделать, это чтение ASCII таблицы из флеш-памяти, и поддержку кириллицы. Но Proteus такие штуки не осилит. Поэтому начнем с малого, установка курсора на определенную позицию экрана, сейчас это нам вполне по силам.
Добавляем функцию установки курсора:
Чтобы каждый раз не вызывать эту функцию, добавим функцию печати строки с определенной позиции:
Теперь можно написать на дисплее уже что-то более осмысленное:
4) Переподключение дисплея на аппаратный SPI в Proteus
Теперь мы можем переподключить дисплей на аппаратную SPI шину ATmega8.
Для использования SPI, дисплей нужно будет переподключить следующим образом:
Обращаю внимание, что вывод D/ C - дисплея я переподключил с PD5 на PD7. В этом нет особой необходимости, просто мне удобнее использовать крайние пины.
В функции инициализации дисплея void pcd8544_init(void), строка:
Ну и последнее, в функции void pcd8544_send(uint8_t dc, uint8_t data), программный SPI:
заменяется на аппаратный:
Это все. Полный исходник под спойлером.
5) Функции масштабирование шрифта в два и три раза
Пока отбросим аппаратный SPI в сторону и продолжим работать с программным.
Т.к. дисплей маленький, одной из самых востребованных функций является алгоритмическое увеличение шрифта.
Для увеличения шрифта в два раза добавим такую функцию:
А увеличение в три раза будет делать такая функция:
Чтобы можно было печатать строки нужным размером шрифта, недавно введенную функцию void pcd8544_print_at() приведем к такому виду:
И последнее, что нам нужно от шрифтов, это печать небольшого целого числа.
Для теста, в функции main() сделаем печать шрифта крупным шрифтом:
Результат работы, без анимации:
Полный листинг программы под спойлером:
6) Создание проекта для реального микроконтроллера ATmega8, чтение таблицы ASCII из флеш-памяти
К сожалению, это все на был способен Proteus, поэтому переходим к реальному железу. Сейчас мы создадим проект и заодно перепишем код на хранение ascii-таблицы в флеш-памяти, с последующим чтением ее оттуда. Так следовало бы сделать с самого начала, если бы не Proteus :(
Итак, предполагаем, что используется Linux или CYGWIN в случае с Windows. Т.к. работа с флеш-памятью может меняться в зависимости от то ли версии avr-gcc то ли версии avr-libc, скажу что avr-libc у меня версии 1.8.1, а версия avr-gcc:
Создаем структуру каталогов будущего проекта:
Создаем Makefile такого содержания:
Не забывайте, что в Makefile отступы формируются табуляцией, а не пробелами, как будет если скопировать из браузера(ну нету в HTML табуляции).
Теперь создадим файл ./inc/ascii.h с нашей табличкой:
А также заголовочный файл библиотеки pcd8544 ./scr/pcd8544_soft.h
В функции pcd8544_send_char(uint8_t ch):
- нужно будет добавить чтение из флеш-памяти(тема рассматривалась здесь)
Тоже самое нужно будет сделать в функциях void pcd8544_send_char_size2(uint8_t ch, uint8_t x, uint8_t y) и void pcd8544_send_char_size3(uint8_t ch, uint8_t x, uint8_t y).
Все функции мы скинем в библиотечный файл /src/pcd8544_soft.c
В итоге остается непосредственно сама программа в main.c
По-моему гораздо, лучше, чем все в одном файле.
7) Добавляем кириллицу в кодировке CP866
Я выбрал кодировку CP866 из-за того, что там есть псевдографика. В свое время с ее использованием много чего делали: Лексикон, Дос Навигатор, Нортон Командер и т.д. Однако пока псевдографику трогать не будем, а будем заниматься непосредственно кириллицей. Кодовую таблицу CP866 можно посмотреть например здесь Таблица CP 866 DOS — Kvodo
Обращаю внимание, что строчными буквами "п" и "р" имеется разрыв на 48 символа псевдографики. В своей ASCII таблице мы все символы запишем единым массивом, соответственно индекс символа нужно будет корректировать.
Это значит, что вместо строки:
нужно будет использовать:
Для преобразования кодировок, в Makefile добавим новую цель:
Теперь для того чтобы перекодировать и сразу скомпилировать программу достаточно будет ввести команду:
Осталось табличный файл c ASCII дополнить русскими буквами:
Ну и теперь, мы можем вывести на экран что-то осмысленное. main.c:
8) Добавление фреймбуфера. Программа рисования фрактала.
Фреймбуфер - это буфер в оперативной памяти микроконтроллера, размер которого равен размеру видеопамяти дисплея.
Фреймбуфер нужен для того чтобы нарисовать на экране точку. Т.к. вся видеопамять дисплея pcd8544 упакована в 504 байта, для того чтобы нарисовать точку на экране, нужно определить номер байта к которому относится данная точка, прочитать этот байт, изменить в нем нужный бит относящийся к точке, и записать этот байт обратно. Однако с нашего дисплея ничего читать нельзя, дисплей доступен только для записи. Поэтому нужен фреймбуфер, чтобы поставить простую точку.
Микроконтроллер ATmega8 имеет 1 Kбайт оперативной памяти, и фреймбуфер будет занимать почти половину этой памяти. Но например такие микроконтроллеры как MSP430G2553 с 512 байтами SRAM, оказываются уже не у дел.
Для организации фреймбуфера, в файле pcd8544_soft.c объявим массив:
Так же пригодиться переменная pos которая будет служить позицией виртуального курсора во фреймбуфере.
Для работы с фреймбуфер ом, понадобятся дополнительные функции для очистки содержимого фреймбуфера:
и для вывода его содержимого на дисплей:
Ну и само собой, потребуется небольшая работа по переписываю существующих функций для обеспечения поддержки работы с фреймбуфером.
Например в void pcd8544_send_char_fb(uint8_t ch) меняется всего одна строчка:
После завершения всей работы хорошо было бы проверить что все работает как надо. К примеру main.c из предыдущего примера у меня получился таким:
Теперь для работы с дисплеем нужно сначала очищать содержимое фреймбуфера, а в конце выводить его содержимое на экран функцией pcd8544_display_fb();
Теперь мы можем добавить функцию для ради которой все и затевалось, т.е. для рисования точки:
Выглядит гадко, но это работает.
Ок. Теперь можно что-либо нарисовать. Я адаптировал программу из старой книжки по ZX Spectrum для отрисовки простенького фрактала:
Результат работы выглядит так:
9) Делаем скринсейвер "сквозь звездное небо"
Фрактал штука интересная, но абсолютно бесполезная. Попробуем сделать что-нибудь более полезное. Допустим, что у нашего устройства имеется ждущий режим, во время которого на дисплее будет запускаться простая анимационная заставка.
На мой взгляд самая простая заставка это - "полет сквозь звездное небо".
Наиболее простой алгоритм этой заставки работает так: a) случайным образом формируется звездное небо для первой четверти координатной плоскости; б) картинка из первой четверти зеркалится на остальные четверти; в) при каждой итерации к х и у координатам "звезд" прибавляется по единице; г) при выходе "звезды" за пределы дисплея, случайно генерируется новая "звезда".
В итоге у меня получилась такая программа:
На мой взгляд, за счет симметрии выглядит несколько странно.
Второй вариант алгоритма отличается от первого тем, что "звезды" не зеркалятся, а генерируются случайным образом по всей плоскости дисплея.
Теперь выглядит получше, но все-равно не так как я ожидал. Звездное небо хорошо смотрится на черном фоне 14-дюймового ЭЛТ монитора, а здесь, не то не сё. Ну да ладно.
10) Функции рисования прямых линий, и окружностей
Целочисленные алгоритмы рисования прямых линий и окружностей можно скопировать из википедии Реализации алгоритмов/Алгоритм Брезенхэма
Т.о. функция рисования прямой линии получается такой:
А функция рисования окружности такой:
Какого-то впечатляющего примера для проверки этих функций я не нашел, поэтому предлагаю проверить их сразу в деле.
11) Интерфейс для метеостанции
Теперь собственно о том, ради чего всё это делалось. Для начала попробуем сделать интерфейс для самодельной метеостанции. Допустим, что у нас имеется уличный датчик DS18B20, и комнатный DHT11. Информация с уличного датчика будет более приоритетна, поэтому она будет выводиться крупным шрифтом, а вся остальная сопутствующая информация - мелким.
Но для начала, чтобы рисовать интерфейсы, нам понадобиться еще одна функция для рисования иконок размером 7х8. Функция для рисования букв нам не подойдёт, т.к. она рисует растр 5x8, т.е. с межбуквенным интервалом по краям. В целях оптимизации иконки будем выводить построчно, т.е. в пределах одного банка.
Здесь y - это номер строки или банка, x - это номер пикселя в пределах от 0 до 83. num - это ширина изображения в знакоместах, т.е. в пикселях ширина будет равна num*7.
В итоге программа для отрисовки интерфейса у меня получилась такой:
12) Интерфейс для FM-радиоприемника
Еще одна распространенная задача - дисплей для FM-приемника. Я не стал изобретать велосипед и попытался скопировать интерфейс со своего старенького плеера iRiver ifp-180tc. Там тоже монохромный дисплей, правда не квадратный, а прямоугольный.
В итоге у меня получилась такая программа:
Когда происходит нажатие на кнопки регулировки громкости, то шкала FM диапазона на пару секунд меняется на шкалу регулировки громкости.
Здесь можно видеть, что цифры налезают на статусную строку, хотя внизу есть пустое место. Вцелом, я бы для больших цифр сделал персональные шрифты, примерно как на HD44780.
13) Финальная версия библиотеки на аппаратном SPI
Ну и в завершение, можно перевести библиотеку на аппаратный SPI. Напомню, что для корректной работы устройства при заливке прошивки через ISP-программатор, дисплей нужно отключать от микроконтроллера.
В библиотечном файле нужно будет задать переменную, в которой будет храниться номер CS пина:
Соответственно функция инициализации дополниться одним входным параметром:
Инициализацию SPI я предпочитаю делать в main() функции, или через библиотеку SPI.
Функция void pcd8544_send(uint8_t dc, uint8_t data) примет в таком случае следующий вид:
Сегодня я расскажу как подключать дисплей от некогда очень известного телефона НОКИА – 5110.
Мы научимся выводить текст и рисовать различную графику.
Вот примеры того, что будет в этом уроке.
Для подключения к Ардуино была написана библиотека, а для отображения кириллицы создан русификатор.
Он переводит UTF-8 в Windows-1251. Вот его мы и сможем увидеть на экране.
Нам потребуется две библиотеки от компании Adafruit
- Adafruit_GFX
- Вторая, Adafruit_PCD8544
Для подключения у него 8 посадочных мест, как сверху, так и снизу. Это сделано для удобства расположения дисплея в устройствах.
В комплекте так же идут штырьки для распайки.
На этом экране можно выводить как графику, так и просто текст или цифры. Очень простое подключение к платам Ардуино.
Важно не забыть, что питание дисплея 3,3 вольта. НЕ 5 ВОЛЬТ.
Тоже относится и для питания подсветки дисплея.
Подключение оставшихся выводов так же рассчитано на питание 3,3 вольта.
Я уже давно использую такие дисплеи и у меня на канале есть несколько видео где показаны разные устройства с выводом информации на Nokia-5110.
Подключаю напрямую к выводам Ардуино, БЕЗ РЕЗИСТОРОВ, и всё работает уже долгое время. Как будете делать вы я не знаю.
Можете подключать через дополнительные резисторы, или использовать преобразователи, которые получая на вход 5 вольт преобразуют его в 3,3 вольта.
Есть различные варианты дисплеев. Например, отличаются по цветам платы. Если у вас красная плата, и вывод обозначается как LIGHT - то он подключается к + 3,3 вольта.
Если синяя, и вывод обозначается как BL - то он подключается к земле.
Но лучше уточнить у продавца. Всегда могут быть исключения.
Так же я всегда устанавливаю подстроечный резистор на 10 кОм, чтобы регулировать яркость дисплея вручную. Вывод подсветки подключается к центральному контакту резистора, а два крайних – это +3,3 и GND.
Теперь давайте попробуем загрузить скетч из примера библиотеки и посмотрим, как он работает. Это довольно сложный пример для того, чтобы обучаться.
Я в своих примерах показываю, как сделать проще.
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
void setup() display.begin();
display.setContrast(50); // установка контраста
display.clearDisplay();
>
void loop() display.setTextSize(1); // размер шрифта 1
display.setTextColor(BLACK); // цвет текста темный
display.println("Hello, world!"); // отображаем надпись
display.setTextSize(2); // увеличиваем шрифт на 1
display.println(random(1,10000)); // выводим число от 1 до 10000
display.setTextSize(3);
display.print(random(1,10000));
display.display();
delay(1000); // задержка в секунду
display.clearDisplay(); // очищаем дисплей
>
Теперь попробуем вывести русский текст.
Загружаем скетч-2
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
void setup() display.begin();
display.cp437(true);
display.setContrast(50); // установка контраста
display.clearDisplay();
>
void loop() display.clearDisplay();
// Рисуем квадрат
display.drawRect(0, 0, 84, 48, BLACK); // отступ - Слева Сверху Ширина Высота
display.setTextSize(2); // размер шрифта 2
display.setTextColor(BLACK); // цвет текста чёрный
display.setCursor(8,5); // Устанавливаем курсор в то место откуда будем писать Лево-Верх
display.println(utf8rus("Привет"));
display.setTextSize(2); // размер шрифта 2
display.setTextColor(BLACK); // цвет текста чёрный
display.setCursor(8,25);
display.println(utf8rus("народ!"));
display.display();
delay(1000); // задержка в секунду
display.clearDisplay(); // очищаем дисплей
>
/* Функция перевода UTF-8 to Windows-1251 */
String utf8rus(String source)
int i,k;
String target;
unsigned char n;
char m[2] = < '0', '\0' >;
k = source.length(); i = 0;
while (i < k) n = source[i]; i++;
if (n >= 0xC0) switch (n) case 0xD0: n = source[i]; i++;
if (n == 0x81) < n = 0xA8; break; >
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
break;
>
case 0xD1: n = source[i]; i++;
if (n == 0x91) < n = 0xB8; break; >
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
break;
>
>
>
m[0] = n; target = target + String(m);
>
return target;
>
Теперь попробуем вывести русский текст.
И-и-и-и-и, ничего у нас не получилось.
Вместо русских букв получаются кракозябры.
Но не переживайте. Сейчас исправим.
Скопируем файл glcdfont.c в папку с библиотеками Ардуино.
Обычно это находится по адресу
Admin - Documents - Arduino – libraries - Adafruit-GFX-Library
копируем туда файл glcdfont.c с заменой
В setup добавляем строчку
void setup() display.begin();
display.cp437(true);
И в самый конец, после функции loop() копируем функцию перевода UTF-8 в Windows-1251
/* Функция перевода UTF-8 to Windows-1251 */
String utf8rus(String source)
И,… вуаля, теперь можно работать с русским шрифтом.
Нарисуем окружность.
Заполним весь экран кругами.
Раньше мы всегда писали чётными чернилами, а что если белыми?
Посмотрим?
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
void setup() // инициализация и очистка дисплея
display.begin();
display.clearDisplay();
display.display();
display.setContrast(50); // установка контраста
delay(1000);
>
// окружность в центре
display.clearDisplay();
display.drawCircle(display.width()/2, display.height()/2, 20, BLACK);
display.display();
delay(5000);
display.clearDisplay();
for (int16_t i=0; i<display.height(); i+=2) display.drawCircle(display.width()/2, display.height()/2, i, BLACK);
delay(300);
display.display();
>
delay(2000);
for (int16_t i=0; i<display.height(); i+=2) display.fillCircle(display.width()/2, display.height()/2, i, WHITE);
delay(300);
display.display();
>
>
В видео рассмотрены примеры как нарисовать квадрат, треугольник,окружность. Также я показываю как вывести на экран дисплея свой рисунок, это может быть логотип или что-нибудь другое.
Дисплей Nokia 5110 имеет разрешение 84×48 точек. Поэтому и картинки должны быть не больше этого размера. В принципе здесь нет ничего нового.
Как делать массивы из картинок .bmp, я подробно рассказывал в видео про матрицу 16*16. Если не смотрели, то обязательно посмотрите.
Здесь нас интересует только 2 строчки.
static const unsigned char PROGMEM leoBmp[]
Где мы пишем название нашего массива
2. где мы его вызываем.
Цифры – это размер картинки.
display.drawBitmap(0, 0, leoBmp, 84, 48, BLACK);
А теперь выведем какой-нибудь логотип.
Например, льва.
Смотрите в видео.
Не забываем подписываться на канал, если вам интересно что я делаю.
Ставим лайк и оставляем комментарии – этим вы покажете мне, что я не просто так делаю обучающие уроки.
До встречи.
В настоящее время для радиолюбителей стали весьма доступны недорогие и качественные дисплеи от (для) мобильных телефонов. Для конкретной возможности применения одного из них в различных радиолюбительских конструкциях автором создан модуль, описание которого приведено в этой статье. Автор не считает свою разработку идеальной, но надеется, что этот модуль будет востребован радиолюбителями. Советы и рекомендации по его улучшению принимаются.Чтобы использовать в своей конструкции миниатюрное цветной дисплей, совсем не нужны особо мощные процессоры или дорогостоящие дисплеи. Если нужен размер экрана порядка 2.5”, то можно применить дисплеи от телефона. Например, LS022-LS024 от телефонов NOKIA N76, N82, N73, 6303, 6500. Подойдет и самый большой дисплей от N95 (2.6”).
Все эти дисплеи оснащены котроллером, имеющим небольшой, но достаточно полный, набор команд. Даташит на контроллер дисплея MC2PA8201, который является аналогом LS022-LS024 прилагается. Правда, не все функции 100% работают, как описано.
Дисплей имеет разрешение 240х320 пикселей и цветовую гамму 24 бит. Стоимость от 200 рублей. Разъём со шлейфом стоит столько же. Оборванный шлейф в ремонте могут отдать бесплатно. Известную трудность представляет только его пайка и изготовление под него платы.
Дисплей имеет три напряжения питания: 1,8 В, 2,5 В и 12 В. Последнее подается на подсветку через ограничивающий резистор. Ток подсветки примерно равен 20 мА. Распиновка разъёма N76 показана рис.1.
Сам этот разъем выглядит так:
Примеров работы с этим дисплеем в сети имеется достаточно много. Используя их, я разработал и собрал модуль как заготовку для создания своего графического интерфейса. Схема модуля приведена на рис.2.
Основой модуля является распространенный микроконтроллер PIC18F452. Программа для него написана на Си.
Для питания дисплея я применил два стабилизатора LM1117 на соответствующее напряжение. Номинальное напряжение на сигнальных линиях 1,8 В.
При упрощённом подключении (через делитель на резисторах), которое я использовал для согласования уровней выходных сигналов МК и входных дисплея, невозможно чтение из памяти дисплея, но это и не понадобилось. Однако, при желании, можно применить более правильное согласование этих уровней.
Индуктивности в цепях питания, использованные в схеме телефона, думаю, можно проигнорировать, так как в телефоне применены импульсные преобразователи питания, а у меня линейные.
Достоинство рассматриваемого дисплея, как и его проблема, заключается в 24-битном цвете. То есть для вывода 1 пикселя надо передать 5 байт, что снижает скорость вывода и требует приличных объёмов для хранения изображений. Поэтому тактовую частоту процессора надо стараться выбирать как можно выше. Я использовал 40 МГц. При этом скорость рисования вполне устраивает, а скорость вывода картинки маловата. Как вариант, можно на время прорисовки больших заставок гасить экран.
Изображения, заставки, значки решил хранить на microSD-карточке. Небольшие сейчас мало где продаются, но стоят совсем копейки, объёма хватит с запасом, а удобство заключается в лёгкости редактирования отображаемых элементов прямо на компьютере в виде .bmp файлов. В последующем, карточку можно использовать также для записи, например, лога каких-нибудь событий.
В прилагаемой программе имеется библиотека необходимых графических функций (описанная в файле LS_driver.h):
- вывод точки;
- вывод символа;
- вывод текста;
- вывод байта значения;
- рисование линии;
- рисование прямоугольника (с заливкой или без нее);
- рисование круга;
- рисование окошка типа WINDOWS;
- чтение из карточки и вывод рисунка .BMP 24bit/pix
Детальные инструкции по функциям расписаны в файле LS_driver.h, и особо не требуют пояснений, за исключением 2-х моментов.
- При выводе картинки следует придерживаться вертикальной ориентации экрана (сам файл картинки предварительно развернуть в редакторе).
- При выводе файлов и рисовании картинок следует учитывать размеры экрана. Значения Х и Y меняются местами при изменении текущей ориентировки вывода с горизонтальной на вертикальную и наоборот, поэтому проверка на превышение размеров не производится (не известен текущий максимум Х или Y).
Всё это, конечно, давно известно, но я попробовал собрать в кучу.
Получился более-менее универсальный модуль, который можно встроить в готовую или разрабатываемую конструкцию.
В интерфейсе карточки заблокированы необязательные, на мой взгляд, функции: работа с директориями, запись, поддержка FAT32, но их можно включить в любой момент.
В качестве примера приведено рисование вертикальной шкалы в зависимости от значения АЦП (см. заглавное фото). В верхней части экрана выведена картинка – заставка.
Читайте также: