Как подключить LCD дисплей для Nokia 5110 к Arduino
Вам понадобится
- – Arduino;
- – ЖК дисплей для Nokia 5110/3310;
- – соединительные провода.
Инструкция
Подключим ЖК экран от Nokia 5110 к Arduino по приведённой схеме.
Для работы с этим LCD экраном написано много библиотек. Предлагаю воспользоваться этой: http://www.rinkydinkelectronics.com/library.php?id=44 (скачивание файла LCD5110_Basic.zip).
Для установки разархивируем файл в директорию 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 – ширина и высота рисунка.
Напишем такой скетч. Сначала подключаем библиотеку, затем объявляем экземпляр класса LCD5110 с назначением выводов.
В процедуре setup() инициализируем ЖК экран.
В процедуре loop() очищаем экран и пишем маленьким шрифтом произвольный текст, под ним – средним шрифтом выводим счётчик секунд.
Давайте выведем на экран картинку. Для этого подготовим монохромное изображение, которое хотим вывести на экран Nokia 5110. Помните, что разрешение экрана 48 на 84 точки, и картинка должна быть не больше. На странице http://www.rinkydinkelectronics.
com/t_imageconverter_mono.php преобразуем изображение в массив битов. Скачаем полученный файл с расширением “*.c” и добавим его к проекту через меню: Эскиз -> Добавить файл…
или просто поместим файл в директорию скетча, а затем перезагрузим среду разработки Arduino IDE.
Теперь нужно в коде программы объявить массив с данными изображения (у меня в коде это строка extern uint8_t mysymb[];), а затем используем функцию drawBitmap() для вывода изображения в нужном месте экрана.
Загрузим скетч в Arduino. Теперь текст сменяется картинкой, и счётчик каждый раз увеличивает своё значение.
Источники:
- Спецификация на LCD дисплей для Nokia 5110
- Подготовка массива бит из файла изображения
- Купить дисплей Nokia 5110 LCD с белой подсветкой по цене 85 грн
Источник: https://www.kakprosto.ru/kak-918983-kak-podklyuchit-lcd-displey-dlya-nokia-5110-k-arduino
Куплен был как то на Aliexpress дисплей Nokia 5110, совместимый с дисплеем от Nokia 3310, в которых используются одинаковые контроллеры.
Таким образом, можно было предположить, что этот дисплей должен быть полностью совместим с родным дисплеем от Nokia3310, в принципе, все так и есть. Разрешение дисплея составляет 48х84 пикселя.
Основой является контроллер PCD8544 выполненный по технологии COG – Chip On Glass, чип на стекле, по этому дисплей очень хрупкий, это следует учитывать при установки, пайки и креплении.
Кстати наши китайские братья научились клепать такие дисплейчики, на оригинальном дисплее металлизированные контакты а на китайском металлические штырьки или ещё хуже – резинка.
Тот дисплей, который «заведется» с использованием библиотек дисплея (размещенных на сайте) для Bascom’а, без какой – либо их доработки, можно будет считать соответствующим оригиналу.
Собственно, задача состояла не только в этом, а просто хотелось выяснить, какие изменения надо (если надо!) внести в библиотеки, чтобы каждый из имеющихся дисплеев работал как оригинальный.
Дисплей 5110 заказанный с китая:
Если смотреть на лицевую сторону дисплея контактами к вверху то выводы считаются с права на лево от 1 до 8. Работает дисплей от 3 вольт (я про оригинал), модули заказанные с китая работают от 5вольт.
Бывает иногда косяк с отображением а именно, не выводятся все пиксели, в этом случае рекомендую плотней прижать резинку между дисплеем и платой.
Хочу заметить, что распиновка и название некоторых выводов 5110 от 3310 отличается! Вариантов подключения 3310 на других ресурсах полно, а вот работы с 5510 мною замечено не было…
Порядок подключения дисплея к микроконтроллеру следующий:
Вывод din – portb.4, Вывод scl – portb.3 , Вывод dc – portb.5, Вывод ce – portc.0 , Вывод reset – vcc
Код программы:
Компилируем, прошиваем и радуемся:
Вдруг если дисплей ничего не показывает при условии что монтаж правильный, попробуйте передернуть ногу RESET или просто питание (выключить и заново включить). Более подробная информация по работе с данным дисплеем есть на сайте cxem.net, так что углубляться не буду.
Видео работы:
Команды для работы с 5110(3310):
Все файлы с архива размещайте в одной папке, нужно чтобы код программы в BASCOM и библиотеки были в одной папке, иначе работать не будет.
Скачать файлы проекта (~20кб.)
Источник: http://cxema21.ucoz.ru/publ/mikrokontrollery/bascom_avr/rabota_s_displeem_nokia_5110/23-1-0-227
Подключение дисплея на базе контроллера PCD8544 к микроконтроллеру AVR
Автор: Погребняк Дмитрий
Самара, 2014.
О дисплеях
Популярные в своё время сотовые телефоны фирмы Nokia, такие модели, как 3210 3310 3315 3330 3350 3410 5110 5120 5130 5160 6150 6210, обладали монохромными графическими дисплеями, с экраном 84×48 точек, на базе контроллера PCD8544.
Модуль с дисплеем Nokia 5110 |
Времена этих телефонов прошли, но дисплеи не канули в Лету, они оказались чрезвычайно удобным и дешёвым вариантом для вывода графической и текстовой информации, при использовании в сочетании с микроконтроллерами.
Сейчас на ebay можно за порядка 100 рублей (вместе с доставкой) купить такой дисплей, установленный на печатную плату 45х45мм, которая также обеспечивает подсветку.
О подключении таких дисплеев, на базе контроллера PCD8544, и пойдёт речь ниже.
О контроллере
Контроллер PCD8544 разработан фирмой PHILIPS. Документацию на него можно скачать здесь
Одной из особенностей этого контроллера является то, что информация может быть только выведена на дисплей, но не считана с него. В частности, это накладывает два ограничения:
– Нет возможности узнать состояние дисплея, в т.ч. и вообще факт его присутствия программными средствами. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой.
– Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений.
В то же время, контроллер обеспечивает крайне низкое энергопотребление: менее 300мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1.5мкА в режиме отключения.
Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется.
Сам же контроллер работает при напряжении 2,7 – 3,3 Вольта.
Подключение
Подключение модуля дисплея на базе PCD8544 |
Как упоминалось выше, контроллер работает на напряжении 2,7 – 3,3 Вольта. Это значит что сопряжённый микроконтроллер должен либо работать на том же напряжении, либо же как-то согласовать уровни на выводах, например, при помощи делителей.
Кроме «земли» и «питания», к контроллеру дисплея должны идти 5 линий:
* SCLK – тактовый импульс для передачи данных.
* SDIN – передаваемые данные.
* D/C̅ – выбор типа передаваемых данных: высокий уровень – графические данные, низкий – инструкция.
* S̅C̅E̅ – выбор чипа. Передача данных осуществляется при низком уровне на этой линии. При высоком уровне данные игнорируются.
* R̅E̅S̅ – сброс. При низком уровне происходит аппаратный сброс контроллера.
Поскольку, согласно спецификации (см п.8.1) аппаратный сброс является необходимым для инициализации дисплея, линия R̅E̅S̅ также должна быть подключена.
В принципе, линия S̅C̅E̅ может быть притянута постоянно к земле, но в этом случае, если по какой либо причине контроллер дисплея потерял синхронизацию с МК, это никак не удастся обнаружить. При подключении к МК, рекомендую притягивать эту линию к высокому уровню подтягивающим резистором 100-500кОм, чтобы исключить реакцию контроллера на помехи, пока МК находится в состоянии сброса.
Обратная сторона модуля |
Передача осуществляется по протоколу SPI, но только в одном направлении. При работе с микроконтроллерами AVR, удобно использовать UART в режиме SPI-master, когда включен только передатчик. Режим SPI-3 (CPHA=1, CPOL=1).
Это значит, что пока обмен отсутствует, на линии SCLK должен присутствовать высокий уровень, а чтение данных с линии SDIN контроллер осуществляет по нарастающему фронту на линии SCLK в течение 100нс.
При этом они должны быть выставлены минимум за 100 нс до нарастания фронта. Передача осуществляется по 8 бит, сначала старший.
Уровень на линии D/C̅ определяет, как трактовать полученные данные. Высокий уровень означает, что переданные данные должны быть выведены на дисплей, низкий уровень – что передана команда.
Контроллер читает значение на этой линии вместе с последним (младшим) битом каждого переданного байта данных. При использовании асинхронной аппаратной передачи с этим могут возникнуть трудности.
Перед установкой уровня необходимо дождаться завершения передачи предыдущего байта.
Максимальная частота, на которой может осуществляться обмен с PCD8544 – 4 МГц. При программном формировании импульсов это, обычно не является проблемой, но при использовании аппаратной передачи, в случае если частота работы МК превышает 8МГц, следует ограничить максимальную скорость передачи.
Кроме линий передачи данных, на модуле с дисплеем обычно присутствует вход управления подсветкой, соединённый с катодом светодиодов. Аноды же через ограничивающие резисторы подключены к линии питания.
Для постоянно работающей подсветки можно данный вход подключить напрямую, или через резистор к «земле». Для управления от МК подсветка может быть подключена через транзистор.
Поскольку подсветка потребляет менее 20мА, при подключении к МК AVR возможно также подключать её напрямую к выводу МК.
Пример кода взаимодействия с дисплеем
#include #define PCD8544_SCK (1
Источник: http://aterlux.ru/article/pcd8544
Подключение дисплея к микроконтроллеру
Опыта в программировании не имею и библиотеки для работы с дисплеем писал не я. Они скопированы с одного проекта в интернете. Там прописаны все нужные функции и есть шрифт 5*8 латинские буквы и кириллица.
Есть так же пару символов 12*16 и 24*32, которые использовал автор библиотек в своем устройстве. Если их удалить, то шрифт 5*8 будет занимать около 700 байт флеша микроконтроллера. Поэтому микроконтроллер для проекта надо брать “пожирней”.
В моем случае использована Atmega8. Вполне достаточно. Все файлы – исходники, библиотеку и так далее, качаем здесь.
Принципиальная схема подключения ЖК дисплея к МК
Нарисовал схему подключения. Для питания дисплея нужно напряжение 3,3V. Если запитывать микроконтроллер от 5V, то ставим резисторные делители и микросхему 78L33. В случае питания всей схемы от 3,3V резисторные делители не нужны. Вроде Atmega8A может работать от 3,3V при условие, что частота не выше 8 МГц. Лично я не пробовал.
У меня все собрано на отладочной плате с питанием от 5V. Перед самим дисплеем ставить по питанию электролит большой емкости ни в коем случае не надо. В самом начале работы контроллер подает на дисплей команды инициализации. Для заряда конденсатора нужно время. Пока он зарядится и дисплей начнет работать пройдет некоторое время, и команды инициализации он не получит.
Конечно это миллисекунды, но в даном случае эффект ощутим.
Схема распиновки дисплея
У дисплея Nokia 1202 9-ти битный SPI интерфейс. У выбранного нами микроконтроллера такой роскоши нет. По этому для связи с дисплеем мы используем не аппаратный, а программный SPI, так сказать “ногодрыг”. Как создавать новые проекты в CodeVision рассказывать не буду – думайте сами. Скажу только, что все выводы PORTB надо настроить на выход. В настройках проекта нужно поставить галочку на “Store Global Constants in FLASH Memory”. Данное действие нужно для того, чтоб массивы шрифтов и наших картинок хранились во флеше.
Итак, проект мы создали. Выбрали микроконтроллер, задали тактовую частоту, настроили проект. Что дальше? А дальше нужно добавить библиотеки для работы с дисплеем и библиотеки задержек. Распаковываем архив. Там есть два файла. Их нужно скопировать в определенные папки. Надеюсь CodeVision вы установили прямо на диск C:. Если да, то файлы копируем по соответствующим путям: C:cvavrevalinc для файла 1100.inc, и C:cvavrevallib для файла 1100.h .
Еще хочу сказать, что назначение пинов микроконтроллера можно изменять в файле 1100.h. Тогда и схема подключения изменится. Начинаем кодить. Просто выведем какую-то надпись на дисплей основным шрифтом 5*8. В самом начале добавим библиотеки.
#include < 1100.h> // библиотека дисплея
#include // библиотека задержек
В самом низу до основного цикла while(1){} делаем инициализацию дисплея и его очистку.
lcd_init(); // инициализация дисплея
lcd_clear(); // очистка дисплея
Нашу надпись поставим так же до основного цикла. Пусть сперва контролер выведет послание на дисплей, а после крутится в основном цикле. Пишем вот это:
print_string(“Выводим надпись”,5,0); print_string(“Какую сами хотим”,0,1);
print_string(“БУХАРЬ”,10,2);
Думаю здесь все понятно. Первая цифра – координата по оси x на дисплее. Она может принимать значение от 0 до 96. Вторая – строка. Она от 0 до 7. В принципе там помещается 8 с половиной строк, но на пол строки мы читать не будем. Компилируем и прошиваем. Смотрим результат. Можно так же установить Proteus, и протестировать в нем. Контроллер можно настроить для работы от внутреннего генератора на частоту заданную в проекте с задержкой при старте 64 мсек. Добавляю архив с скомпилированным проектом. Частота 8 Мгц.
Но как уже писал в начале, в библиотеке есть еще и другие символы. Правда там нет букв, а только цифры. Теперь немного усложним задачу. Пусть надпись не будет инертной, а изменяется. Допустим считает от 0 до 9 с интервалом в 1 секунду. Когда дойдет до 9, после обнулится и снова наново. Возьмем цифры большие размером 24*32. Ну чтож приступим. Можно взять предыдущий проект и удалить три строки “print_string”. Сразу после добавления библиотек объявим некую глобальную переменную m.
char m = 0;
Можно и просто написать:
char m;
В даном случае ей автоматически присвоится значение 0. В основном цикле пишем вот это:
char_24_32(m,35,2); //функция вывода символа 24*32 delay_ms(1000); // ждем 1 секунду m++; // добавляем 1 к переменной m
if(m>9)m=0; // Условие. Если переменная m больше 9, то m равняется 0.
В следующей статье попробую рассказать как рисовать картинки и выводить их на экран дисплея. Как создавать массивы и функции к их выводу и как инвертировать изображение. Библиотеки позаимствовал с сайта cxem.net. Материал подготовил Бухарь.
Форум по микроконтроллерным схемам
Источник: http://radioskot.ru/publ/mk/podkljuchenie_displeja_k_mikrokontrolleru/9-1-0-702
nokia 5110 LCD дисплей AVR
Теперь я расскажу как работать с дисплеем от Нокии 5110.
Матрица состоит из 48 × 84 пикселей. 48 строчек, 84 столбца.
Но питать микросхему отвечающую за работу дисплея нужно от 2.7 В до 3.3 В. Подсветка также питается от 3.3 В или можно от 5 В через резистор 1К.
Также советуют ставить резисторы 10К на все остальные выводы, если МК питается от 5 В. Можно работать и с 5 В, но могут быть проблемы с отображением и дисплей быстрее придёт в негодность.
Я заказывал с Ебея и в моём случае для того чтобы включить подсветку нужно было заземлить вывод LED.
Есть несколько вариантов расположения выводов:
Питание | |
Земля | |
Выбор чипа | можно просто заземлить |
RESET | активно при лог 0 |
выбор режима | команды лог 0дата лог 1 |
Дата | передаётся байт данных |
Serial clock,линия синхронизации | |
Подсветка | 3.3V |
Теперь, как же работать с дисплеем. Каждый раз когда нужно общаться с дисплеем необходима на SCE подать лог 0, я его просто заземлил.
Когда на SCE лог 0, нужно определиться мы передаем данные D/C = 0 или
команду D/C = 1. На самом деле это считывается когда мы передаём последний бит данных, но нет разницы когда мы выберем работаем ли мы с данными или командами, главное чтобы при передаче последнего (0) бита стояло нужное нам значение.
Передача данных происходит следующим образом: Мы передаём байт данных по выводу DN, начиная с последнего 7 бита.
Нужно выставить этот бит и установить на SCLK лог 1, в этот момент начинает передаваться информация к контроллеру, затем нужно сбросить SCLK, выставить 6 бит на DN, снова выставить 1 на SCLK и продолжать так до тех пор пока не передадим целый байт.
Рис. 1. Передача 1 байта
После этого можно сразу передавать следующий байт, если произошла ошибка и вы передали не тот бит или просто нужно отменить команду последний бит которой ещё не отправлен, то для этого нужно подать лог 0 на RST. Команда не передастся и можно сразу начать передачу новой команды.
Рис. 2. Передача нескольких байт
Рис. 3. Отмена передачи
Не позже чем через 30 мс после подачи питания, необходимо подать отрицательный импульс на RESET длиной 100 нс, иначе можно испортить дисплей ! Таким образом происходит начальная инициализация дисплея.
В принципе ширина всех импульсов<\p>
Источник: http://4a4ik.blogspot.com/2014/07/nokia-5110-lcd.html
Как подключить экран Nokia 3110
В этой записи хочу поделиться опытом и готовыми библиотеками для работы с графическим дисплеем от Nokia 3110 (5110) для подключения к микроконтроллерам STM32, а, в частности, к STM32F100. Однако, не составит труда переделать для работы с микроконтроллерами семейства STM32F4. Давайте для начала разберемся Как работает графический дисплей.
Экран от Nokia 3110 представляет собой графический жидко-кристаллический дисплей с размером видимой части 84 на 48 точек. Управляется матрица контроллером PCD8544, даташит на него в конце статьи. Связь с контроллером осуществляется через последовательный интерфейс, что-то на подобии SPI.
Для управления дисплеем необходимо подключить следующие линии:
1) RST – Reset – линия сброса. Для сброса необходимо подать сюда 0. В рабочем режиме линия должна быть подтянута к Vcc.
2) CE – Chip Enable – линия выбора устройства на шине данных. При передачи данных дисплею – опустить к общему (лог.0). В режиме ожидания – к Vcc.
3) DC – Data/Command – выбор типа данных – передача команды (лог.0) или информации в память дисплею (лог.1).
4) Din – Data in – линия данных.
5) Clk – Clock – линия для такта.
6) Vcc и Gnd – линии для питания.
Хочу обратить внимание, что дисплею и уровни на входе должны быть 3.3В, хотя встречаются и на 5В. Этот момент необходимо уточнять в каждом конкретном случае.
Итак, подключаем согласно этому к отладочной плате STM32F100: RST – PA0, CE – PA1, DC – PA2, Din – PA3, Clk – PA4.
Вся матрица экрана разделена на 6 строк (банков) и 84 столбца, т.е. получается 84 байта в ряду. Передача информации происходит побайтно. Передается вначале старший бит.
А вот так выглядит адресация в памяти дисплея:
И, конечно, контроллер поддерживает автоматическое смещения указателя адреса при непрерывной передачи данных. Есть два варианта: горизонтальное смещение и вертикальное. Будем использовать горизонтальное (в клеточках – номер байта при непрерывной передачи):
Теперь перейдем к разбору как оживить дисплей. Я использовать буду CooCox IDE, но это не принципиально. Как обычно, для удобства, я сделал структуру, в которой указываются линии подключения дисплея, внешняя функция задержки и указатель на переменную, где хранится информация о точках на экране.
N5110_TypeDef LCD = { {GPIOA, GPIO_Pin_0}, {GPIOA, GPIO_Pin_1}, {GPIOA, GPIO_Pin_2}, {GPIOA, GPIO_Pin_3}, {GPIOA, GPIO_Pin_4}, Delay_US, &m}; |
где m это матрица для хранения информации о точках экрана:
Для инициализации интерфейса необходимо вызвать N5110_Init() и передать указать на структуру:
Хочу обратить внимание, что все настройки портов и пинов выполнятся автоматически. При использовании других контроллеров (не F100), необходимо будет переделать эту функцию.
https://www.youtube.com/watch?v=LkZCG-THmsg
Ну и все, дисплей готов к работе. Опишу небольшое API моей библиотеки:
1234567891011121314151617181920212223242526 | Нарисовать символ размером 6*8 точек. Для добавления символов см. font.h N5110_WriteChar(N5110_TypeDef* lcd, uint8_t x, uint8_t y, uint8_t c);Тоже самое, что и предыдущая функция, только выводит инверсно символ N5110_WriteCharInv(N5110_TypeDef* lcd, uint8_t x, uint8_t y, uint8_t c);Очищает экран N5110_Clear(N5110_TypeDef* lcd);Переход к произвольной точке на экране. Отсчет от 0 N5110_GotoXY(N5110_TypeDef* lcd, uint8_t X, uint8_t Y);Вывести на экран строку N5110_WriteString(N5110_TypeDef* lcd, uint8_t x, uint8_t y, uint8_t *s);Выводит число на экран N5110_WriteDec(N5110_TypeDef* lcd, uint8_t x, uint8_t y, uint16_t buffer);Перерисовать экран N5110_Refresh(N5110_TypeDef* lcd);Нарисовать произвольную точку N5110_DrawPixel(N5110_TypeDef* lcd, uint8_t X, uint8_t Y);Очищает произвольную точку на экране N5110_ClearPixel(N5110_TypeDef* lcd, uint8_t X, uint8_t Y);Рисует линию N5110_DrawLine(N5110_TypeDef* lcd, uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2);Рисует окружность N5110_DrawCircle(N5110_TypeDef* lcd, uint8_t X, uint8_t Y, uint8_t R);Рисует прямоугольник N5110_DrawRect(N5110_TypeDef* lcd, uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2);Рисует “часовую стрелку” N5110_DrawClock(N5110_TypeDef* lcd, uint8_t X, uint8_t Y, uint8_t r, uint8_t ang); |
Стоит уделить внимание N5110_Refresh(). Эта функция перерисовывает экран по той информации, что содержится в переменной m. Поэтому, можно напрямую изменять ее и потом перерисовывать экран, так можно немного оптимизировать анимацию.
В заключении хочу сказать, что эта библиотека не является панацеей, и скорее всего часть функций можно будет выкинуть в реальном проекте, либо, наоборот, добавить. Ну и, конечно, там есть куча мест, где стоит оптимизировать алгоритм, но это уже я оставляю на читателя. Если есть вопросы по работе, то прошу их задавать не стесняясь 🙂
Файлы:
1) Проект в CooCox IDE Nokia 5110 LCD vs STM32
2) Даташит на контроллер дисплея PCD8544
3) Видео на YouTube Nokia 5110 LCD vs STM32
Источник: http://www.how.net.ua/2014/10/kak-podklyuchit-ekran-nokia-3110/
LCD дисплей от nokia 5110 и Arduino
В данном примере будем подключать LCD дисплей от Nokia 5110 к Arduino. Данный дисплей очень удобно использовать для вывода различного рода информации, в нашем случае мы будем выводить изображение формата BMP. LCD экран имеет очень удобные выводы (пины) для подключения, все что вам нужно сделать это взять провода и подключить дисплей к нашей Arduino, и ничего паять не придется.
С подключение проблемвозникнуть не должно, нижи приведена таблица соответствия выводов. Важно помнить что экран питается от напряжения в 3.3 Вольта.
Изображение для вывода рисуется в обычном ворде.
В нашем примере мы выводим изображение – эллипс, размер 84 на 48 пикселей. После того как рисунок нарисован его необходимо перевести в код, для этого используется программа LCD Assistant для windows.
После того как мы в программе сгенерирован код изображения, нам необходимо преобразовать его к определенному виду (пример ниже) и сохранить в файл “thename.c”.
#include const unsigned char graphic [] PROGMEM= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xF8, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xC0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
После это в среде Arduino создаем новый проект и сохраняем его по нужной дериктории, в эту дерикторию копируем ранее созданный файл”thename.c”
Источник: http://www.radio-magic.ru/arduino-projects/247-nokia5110-arduino
Red-Resistor.ru/library/mc/lcd_nokia_5110
Подключение LСD дисплея Nokia 5110 к микроконтроллеру ATtiny25
Эти дисплеи я собираюсь использовать в своих поделках и поэтому решение не применять готовые громоздкие библиотеки, а самостоятельно во всем разобраться продиктовано самой необходимостью.
А чтобы не было желания увеличивать код до безобразия, я усложнил себе задачу и подключил дисплей не к Меге8 у которой 8 Кбайт флэш и 1 Кбайт оперативки, а к Тини 25 которая имеет более чем скромные объемы памяти.
Да еще в довесок и обрезанный SPI.
Забегая вперед скажу, что на мой взгляд с поставленной задачей по подключению я справился. В итоге у меня получилась небольшая библиотека основных подпрограмм, которая позволяет делать простейшие манипуляции с дисплеем, а также организовать вывод данных на экран.
Конечно с помощью неё, написать «Hello World» в коде программы и вывести сточку на экран не получится, но с другой стороны, когда пишется программа под какое-то конкретное устройство на МК, работа со строковыми переменными в явном виде это скорей редкое исключение, которое должно иметь очень серьезное обоснование. Но, все по порядку.
Даташиты, как на PCD8544, так и на ATtiny25 можно свободно скачать из интернета, поэтому я опущу технические характеристики этих устройств и начну с того, что для освоения принципов работы дисплея мне пришлось сделать специальную платку. На которую в последствии имею большие виды. .
Подключение дисплея к МК я проводил по классической схеме к ногам встроенного USI интерфейса. Чтобы не делать плату сопряжения я запитал всё устройство от стабилизатора 3,3V.
Это сильно облегчает подключение дисплея и практически не ограничивает работу МК.
Также я оставил одну линию контроллера для возможности подключить к нему какое-либо устройство, например, датчик температуры, для того чтобы из собранного модуля можно было бы сделать нечто большее чем просто «часы».
Для тех, кто только делает первые шаги в освоении электроники необходимо знать, что LСD дисплей – это не просто ЖК матрица, это ещё и контроллер, который управляет выводимым на экран изображением. То есть мы подключаем наш МК к другому контроллеру, который понимает команды, обеспечивает хранение данных и выводит их на ЖК экран.
Для полного подключения дисплея необходимо задействовать шесть линий связи, не включая VCC – питание и GND – землю:
1. CE (SCE) – Включение дисплея.
Эта линия, как я понял, нужна для указания контроллеру дисплея на то, что данные передаваемые по линии DIN предназначаются именно ему. Активный уровень низкий.
2. RST (RESET) – Сброс. Линия необходима при инициализации дисплея в начале его работы.
3.
DC (D/C) – Флаг данные/команда. Линия указывает контроллеру дисплея как надо интерпретировать входящие данные. Низкий уровень (0) – команда, высокий (1) – данные.
4. DIN (SDIN) – Вход интерфейса. Линия приема данных.
5. CLC (SCLC) – Тактовый сигнал.
Линия тактирования принимаемых данных.
6. BL (LED) – подсветка. Линия включения подсветки дисплея.
Я изначально не планировал какие-либо дополнительные подключения к МК кроме LСD дисплея. Поэтому немного упростил как само подключение, так и программное обеспечение.
Если подключать по упрошенной схеме, то можно линию BL либо вообще не подключать, либо подключить через кнопку или выключатель, а линию CE замкнуть на землю (GND) указывая тем самым, что дисплей должен находится всегда в рабочем режиме.
Если совсем заморочится, то и на линии Reset можно сделать небольшую схему задержки, которая будет ненадолго сажать ее на землю при запуске устройства. Но стоит ли усложнять схему ради одной дополнительной линии? Не знаю. Поэтому считаю, что о специальной схеме для линии сброса надо задумываться только в крайнем случае.
К тому же после подключения дисплея к Тини25 у МК осталась одна свободная линия на которую, как я уже говорил, у меня большие планы.
LCD модули, которые я купил, были с интегрированными навесными элементами поэтому ичего припаивать в цепи управления мне не пришлось.
Но для того, чтобы подключить дисплей, вынутый из старого телефона, требуется небольшая доработка, информацию о которой можно легко найти в интернете.
А также необходимо обратить внимание на наличие ограничительного резистора на линии подсветки. И поставить, если вдруг китайские товарищи решили на нем сэкономить.
Итак, собрав схему, я приступил к изучению передачи данных по SPI. Надо сказать о том, что в МК семейства Tiny нет полноценного последовательного периферийного интерфейса (SPI) его замещает модуль универсального последовательного интерфейса (USI).
Это сильно упрощённый SPI предоставляющий минимально необходимые аппаратные ресурсы для осуществления последовательного обмена данными.
Поначалу это сильно напрягает, но затем, когда вникаешь в тонкости передачи данных становится ясно, что разработчики выкинули все навороты оставив только самое необходимое.
Обязательно надо упомянуть о том, что наименование выводов MOSI и MISO не имеют к модулю USI никакого отношения. Для подключения надо ориентироваться на название выводов DO и DI. Надо быть внимательным потому как там, где у Тини25 вход данных (MISO – мастер вход / подчиненный выход) у модуля USI выход (DO – данные выход).
Я, начитавшись описания работы SPI, подключил линию MOSI к DIN и потом долго не мог понять почему ни чего не работает. Только после того как были подключены светодиоды к выходам контроллера и пошагово пройдена подпрограмма пересылки данных с фиксацией состояния выводов МК ко мне пришло понимания того, что я плохо разобрался в описании работы модуля.
Потом пришлось немного скорректировать дорожки и все встало на свои места.
Теперь о подпрограмме пересылки данных из МК в контроллер дисплея.
//Подпрограмма пересылки данных через USI attiny 25 1. void usi_send (unsigned char data, unsigned char dc){ 2. LSD_PORT.LSD_DC = dc; 3. USIDR = data; 4. USISR |= (1
Источник: http://red-resistor.ru/library/mc/lcd_nokia_5110.html
Сломанный дисплей Nokia 5110. Как подключать?
Сегодня небольшой пост о том, как я чинил дисплей для Nokia с Али-экспресса. Кому-то может пригодиться, хотя явление неприятное, особенно, если дисплейчик такой приходит первый раз, и понятия не имеешь, что с ним делать. Мне повезло, у меня один уже был, так что неисправность была очевидной.
В то же время, если ваш не работает, то не надо сразу впадать в панику и всё разбирать, проблема может быть и в программном коде.
А может быть в замыкании или плохо пропаянных ножках, их надо прозвонить в первую очередь, благо, что точек для пайки две для пайки каждой ножки – сверху и снизу платы, надо всё между собой прозвонить – может припаяли плохо?
Запустить мне свой экранчик, кстати, удалось в своё время далеко не с первой попытки, а всё дело, конечно же, крылось в библиотеках и очень похоже, что моей конкретной версии программы-компиллятора, но обо всём по порядку.
Классика жанра 🙂 |
Началось всё с того, что я очень ленивый, и мне было лень отложить дисплейчик в сторону от места, где я работал. В результате я на него всё-таки уронил пинцет, и хоть он лежал экраном вниз, я умудрился поставить на экран пару царапин. Обидно.
Вывод: поверхность экранчика очень уязвима к царапкам, лучше её заклеивать специальной плёнкой. Хотя да, защита на него, кстати, была наклеена ещё с завода – она не спасла 🙂 Хотел потереть тряпочкой, думал, удастся отполировать царапины.
В результате на середине экрана появилось ещё в добавок потемнение непонятного цвета. Давить эти дисплеи тоже оказалось нельзя 🙂 Дисплей от неубиваемой Нокии сам по себе оказался не таким уж и неубиваемым.
Понимая, что я конкретно накосячил, в холодном поту (ладно, утрирую) экстренно втыкаю его в другой свой проект на макетке вместо заведомо исправного дисплея и… тишина. Ничего не работает. Всё. Сломал.
Ну, неужели так запросто сломал? Неужели вот прямо так сломал, что ни единого пикселя не работает? Это были следующие, уже более более здравые мысли 🙂
Начал гуглить, кто такой дисплей ломал ещё до меня 🙂 Не нашёл, но нашёл, как его разбирать.
Сначала сзади надо отжать четыре металлические защёлки и выщелкнуть вот эту железку |
Разбирается всё достаточно просто. Отщёлкнул эту железку. Вероятно, экранчик останется в ней. Надо аккуратно из неё всё расщёлкать и вытолкать.
Я отковыривал прямо ногтем, специально не задействовал отвёртку, чтоб уж точно ничего не отколоть. С моей аккуратностью это вполне вероятно 🙂 Вам тоже советую действовать решительно, но очень деликатно.
Можно взять что-то пластиковое для отковыривания, но экран хрупкий.
Внутри оказываются вот такие коннекторы:
И коннекторы эти – фуфло 🙂 |
Крайний правый оказался гнутый. Выправить пинцетом не получилось, выгибать с большой силой не стал. Да, панелька эта с зубчиками маленькая, ничем не прикреплена и хорошо вытаскивается, во всяком случае у меня. Если у вас нет – то выдирать ничего не надо.
Под ней оказываются контактные пластинки на самом экранчике. Их-то я и решил почистить. Собственно, лучше этого не делать, но раз я убедился, что экран не работает (пока что я был уверен, что по моей вине) я решил: или доломать его окончательно, или починить. Потому протёр всё спиртом и поскоблил отвёрткой.
Площадки царапаные – это уже я отвёрткой специально постарался 🙂 |
С противоположной стороны коннектор соединяет контактную плату с экраном, её я тоже поскрёб отвёрткой.
Контактная плата экрана 5110 для Ардуино – вид изнутри |
И вот когда я всё пошкрябал, разобрал и собрал, да ещё и не один раз, а потом попробовал включить в разобранном состоянии, прижав контакты посильнее пальцами, то раза с двадцатого на экране вдруг всё заработало!
На радостях я собрал всё обратно, надел металлический кожух, всё защёлкнул… а экран снова не работает…
Но всё же, теперь было понятно, что я ничего не ломал, а дело в плохих контактах. В Интернете пишут, что на десяток дисплеев может приходиться один сломанный. Дисплеи классные, но пишут, что их больше не производят, и мы сейчас скупаем старые запасы, которые китайцы приспособили к подключению для Ардуино. В общем, дисплейчики классные, но брак идёт.
В моём случае брак оказался в коннекторе. Я ещё помучился, пытаясь прочистить контакты или как-то получше закрепить площадку с коннектором – экран мигал, текст то появлялся, то исчезал. Я плюнул на это дело и решил, что надо решать проблему кардинально, то есть пайкой. Недолго думая, я решил просто соединить проводками соответствующие контактные площадки.
Обратите внимание, что пины идут не в той последовательности, в которой расположены площадки! Экранчику вряд ли по душе пайка, но я решил идти до конца. Паяльник, всё же я взял на 25 ватт. Но мне повезло – медные площадки лудились идеально, хватало мгновенного касания жалом.
Я не стал их пролуживать качественно по всей поверхности, решил, что главное – ничего не перегреть. Очевидно, где-то внутри к ним подпаяны контакты от самого дисплея, и если они отпаяются от температуры, будет уже ничего не восстановить. А дальше такими же короткими пайками я припаял проводки. Две площадки случайно слил оловом вместе.
Чтобы их разъединить – приложил между ними стальную иглу и коснулся жалом. Олово не смачивает сталь без специальных флюсов, так что припой сразу растёкся и площадки разъединились.
В итоге, когда всё спаял и собрал, получилось как-то так:
Просьба: увести от экранов перфекционистов |
Проверив, что ничего не коротит, разогнув все проводки, я наконец решил подключить дисплей и… о, чудо: всё заработало! Дисплей работает, и где-то неделю уже с ним проблем нет.
Паять или не паять – это личный выбор каждого 🙂 Думаю, когда всё не работает, как у меня, то рискнуть стоит, если есть какие-то навыки пайки smd и микро-пинцет. Работа небольшая, но требующая аккуратности.
Думаю, если вы это читаете, это может быть и ваш первый дисплей, так что, если ничего не работает, не надо отчаиваться, может быть проблема и просто в самом коде. Вернее скорее всего – в библиотеках. Библиотеки к дисплеям очень прожорливые, хуже только с прожорливостью (из того что я встретил) у sd.
h для работы с картой памяти, но о ней как-нибудь потом. А прожорливость библиотек для Nikia 5110 обусловлена всякими графическими прибамбасами, которые часто нам совсем и не нужны.
В библиотеку могут быть вшиты функции графических примитивов, ещё много всякой ерунды, а нам, может, надо всего-навсего данные с датчика вывести.
В общем, для задач вывода текста, экономии памяти Arduino и для тестирования работоспособности по принципу вывода “Hello, world!”, я рекомендую библиотеку pcd8544:
https://github.com/carlosefr/pcd8544
Мне её оказалось достаточно для проекта метеостанции, которую я ещё не доделал, но которая из-за кучи датчиков и записи данных на карту оказалась очень прожорливой, так что библиотеки Адафрут оказались непозволительной роскошью.
Итак, для начала соединим всё на макетке. Подозреваю (я только подозреваю, но я не стал рисковать дисплеем (да, я паранойщик :))) – можно всё подключать напрямую и подавать пять вольт, но не надо так! Возможно, это сократит срок службы дисплея.
Мой вариант подключения:
На счёт килоомов: строжайше следовать рецепту не так важно. В моём (уже не новом) дозиметре на микроконтроллере PIC – там я подключал аналогичный дисплей через 3,3 килома. В общем, 10 к дано скорее, как наиболее распространённый номинал, и понятно, что речь идёт просто о килоомах, не сотнях ом, не мегомах – вот и всё.
Теперь текст прошивки для библиотеки pcd8544.
Сейчас по-быстрому скомпиллировал этот текст в Ардуину – всё работает. А вот если у вас не работает, то надо думать.
Перепроверить все соединения, возможно, всё-таки поискать другие библиотеки, совместимые с вашим компиллятором, а уж если и там всё глухо, то начинать копать сам экран. Всё же, я вижу простейшим решением не мучиться с первым дисплеем – сразу купить хотя бы пару.
Второй пригодится для другого проекта, а может и поможет сэкономить кучу времени по выявлению неисправности первого. Но мой первый оказался целым, не повезло на второй 🙂
А на сегодня это всё. Исправных вам деталей и творческих успехов!
Источник: http://dmitry-emelyanov.blogspot.com/2018/08/nokia-5110.html
Подключение дисплея Nokia 5110 к Arduino Uno
12 июня 2015 в 12:12 (МСК)
Доброго времени суток уважаемые хабравцы! Эта небольшая статья для начинающих, тех кто только начал осваивать Arduino и её программирование.
Я искал информацию о том, как подключить дисплей от Nokia 5110 к Arduino Uno, но как-то все было не до конца понятно. После поисков и экспериментов решил написать свою простую инструкцию, надеюсь тебе понравится.Итак, будем делать все в Windows.
Для начала нам надо скачать библиотеку https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
Теперь распаковываем это все в папку C:Program Files (x86)Arduinolibraries или C:Program FilesArduinolibraries в зависимости от того где у вас программа Arduino.
В папке C:Program Files (x86)ArduinolibrariesAdafruit-PCD8544-Nokia-5110-LCD-library-master должны после всех манипуляций появится следующие файлы:Теперь надо правильно подключить ардуинку к дисплейчику. Вот правильная распиновка: RST -> D3 CE -> D4 DC -> D5 Din -> D6 Clk -> D7 Vcc -> 3.
3V BL -> 5V Gnd -> GND Слева контакты дисплея, справа ардуино. После того как все подключили можно запустить пример из папки examples и сразу залить его на Arduino Uno. После окончания можем созерцать красивую анимацию. Всё это конечно красиво, но много чего бесполезного.
Что если нам надо просто выводить какой-то текст и показания в виде цифр? Ниже обрезанный код-шаблон для ваших последующих разработок. В нём убрано все лишнее, отображается на дисплее только текст и цифры меняются в цикле loop(). Можете выводить какую угодно информацию теперь в цикле.
В данном случае задержка итерации цикла составляет 1 секунду. Код:#include
#include Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); void setup() { display.begin(); 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(); // очищаем дисплей
}
Источник статей: Хабр.
Время указано в том часовом поясе, который установлен на Вашем устройстве.
Версия сайта: 0.8.
Об ошибках, предложениях, пожалуйста, сообщайте через Telegram пользователю @leenr, по e-mail [email protected] или с помощью других способов связаться.
Источник: https://sohabr.net/post/260165/
Отображение графики на дисплее Nokia 5110
Освоить принципы вывода графики на типовой LCD-дисплей используемый в телефонах Nokia 5110 с помощью микроконтроллера
Решение задачи разделяется на две части – микроконтроллер и его программирование, дисплей LCD Nokia 5110 и особенноти его использования.
В данный момент, на рынке существует богатый ассортимент микроконтроллеров (МК) с различными характеристиками: от PIC-контроллеров, до МК, программируемых на высокоуровневых языках с платами, на которых уже присутствует всё для работы.
Одими из подобных контроллеров являются контроллеры выпускаемые под маркой Arduino и их “клоны''.
Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей.
Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями.
Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Ардуино [wikiArd].
В нашей стране Ардуино имеет широкое распространение и большое сообщество.
Кроме того, в открытых источниках доступны различные примеры кода готового к использованию, что и повлияло на выбор Arduino как платформы для управления дисплеем.
Компания Arduino имеет несколько готовых вариантов плат.
Для использования в данной работе была выбранна плата Arduino UNO, как плата широко распространенная и обладающая применимостью в других проектах.
Рис.1: Внешний вид платы Arduino UNO |
Технически плата Arduino Uno (рис. 1) построена на базе микроконтроллера ATmega328. Платформа имеет 14 цифровых вход/выходов (6 из которых могут использоваться как выходы ШИМ), 6 аналоговых входов, кварцевый генератор 16 МГц, разъем USB, силовой разъем, разъем ICSP и кнопку перезагрузки. Для работы необходимо подключить платформу к компьютеру посредством кабеля USB, либо подать питание при помощи адаптера AC/DC или батареи[ArdSpec].
Рис. 2: Две различимые модификации дисплеев Nokia 5110 из Китая |
Дисплей от телефона Nokia 5110 доступен в различных вариантах: из старых телефонов и от китайских производителей. Первый вариант имеет сложности, т.к. телефон этой модели уже не выпускается, и даже если заполучить такой телефон, то дисплей подключен к плате с помощью специфичной контактной группы, которая затрудняет его монтаж и использование. Но у дисплеев фирмы Nokia есть неоспоримое преимущество: они сделаны на контроллере Philips PCD8544.
Дисплеи от китайских производителей более доступны, они продаются перекупщиками и доступны для заказа из Китая. Существует две отличимые внешне модификации: на синем и на красном текстолите (рис. 2).
Эти две модификации отличаются порядком вывода контактов и у “красной'' модификации есть возможность подключения контактов сверху. Но, несмотря на доступность этих модулей, существует один неизвестный элемент: контроллер дисплея.
До сих пор не известно, какой контроллер находится в китайских дисплея. С некоторыми исправлениями программный код совместим.
Подробнее о дисплее: контроллер PCD8544 разработан компанией Philips и спецификация находитя в открытом доступе. Дисплей обладает рядом особенностей[aterlux]:
- Контроллер работает только в режиме отображения. Что значит нельзя узнать в каком состоянии диплей находится сейчас. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой.
- Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений.
- В то же время, контроллер обеспечивает крайне низкое энергопотребление:
менее 300~мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1,5~мкА в режиме отключения. - Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется.
Несмотря на то, что рабочим напряжением является напряжение 2,7-3,3 Вольта и все вводы необходимо подключать через делители (как в случае с Arduino, где рабочее напряжение 5 В) – вводы дисплея лояльны к 5 В, но питание мк дисплея все равно надо подключать к допустимому напряжению. Скорее всего, это может сказываться на сроке службы дисплея, но в рамках этой курсовой работы и простоты подключения к Arduino – делители напряжения будут отсутствовать.
Дисплей обладает 8 контактами: землей (GND), питанием (GND), питание подсветки (Light) и 5 контактами для обмена данными.
- SCLK – тактовый импульс для передачи данных.
- SDIN – передаваемые данные.
- D/C – выбор типа передаваемых данных: высокий уровень – графические данные, низкий – инструкция.
- SCE – выбор чипа. Передача данных осуществляется при низком уровне на этой линии. При высоком уровне данные игнорируются.
- RES – сброс. При низком уровне происходит аппаратный сброс контроллера.
Фирменному дисплею соответствует Область отображения 84х48 точек (что позволяет разместить 6 строк текста по 14 символов 5×7 в каждой), интерфейс SPI с пропускной способностью до 4 Mbit/s. Но надо учитывать, что в китайских дисплеях той же области экрана соответствует блок памяти для 102х64 точки[radiokot29]. Так же, стоит учитывать случай, если частота работы МК превышает 8МГц, следует ограничить максимальную скорость передачи. Кроме линий передачи данных, на модуле с дисплеем обычно присутствует вход управления подсветкой, соединённый с катодом светодиодов. Аноды же через ограничивающие резисторы подключены к линии питания. Для постоянно работающей подсветки можно данный вход подключить напрямую, или через резистор к «земле». Для управления от МК подсветка может быть подключена через транзистор. Поскольку подсветка потребляет менее 20мА, при подключении к МК AVR возможно также подключать её напрямую к выводу МК. Команды передаются контроллеру дисплея, когда на линии D/C̅ низкий уровень. Контроллер работает с двумя наборами команд: обычным и расширенным. Обычный абор команд задает режим работы дисплея и положение вывода изображения. В расширенном наборе команд присутствует выбор режима температурной коррекции напряжения.
Инициализация
Перед работой дисплей должен быть инициализирован в течении 30~мс после появления питания.
- Выполнить аппаратный сброс, установив на линии RES низкий уровень минимум на 100нс;
- Включить дисплей и выбрать расширенный набор команд, послав 0x21;
- Установить схему смещения напряжения, команда 0x13;
- Установить режим температурной коррекции, команда 0x04;
- Включить генератор повышенного напряжения на уровне 6.42 Вольта, команда 0xB8;
- Вернуться в стандартный набор команд, послав 0x20;
- Включить вывод графической информации на дисплей командой 0x0C.
Пример кода инициализации:
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
const uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color) { int16_t i, j, byteWidth = (w + 7) / 8; for(j=0; j (i & 7))) {
drawPixel(x+i, y+j, color);
}
}
}
}
Вывод графической информации
Дисплей имеет размер 84х48 пикселей. Информация выводится Информация выводится вертикальными блоками высотой 8 пикселей, значения которых определяются значениями бит в выводимом байте. Младший бит кодирует верхний пиксель (рис. 3).
Рис.
3: Схема соответствия памяти и пикселей дисплея |
Таким образом, графическая область дисплея представлена в виде шести строк, каждая по 8 пикселей в высоту. Команды 1xxxxxxx и 01000yyy определяют координаты курсора – строку и позицию, в которых будет отображены следующие 8 бит данных.
После того как байт выведен, курсор смещается на соседнюю позицию. Если командой 00100PVH выбран горизонтальный режим адресации (V = 0), то курсор смещается вправо и следующий байт данных будет отображён на соседней позиции справа. Когда достигнут правый край экрана, курсор перемещается на начало следующей строки.
Если же выбрана вертикальная адресация (V = 1), то курсор смещается вниз, на следующую строку, а после последней строки курсор смещается на одну горизонтальную позицию вправо и устанавливается на верхнюю строку.Программирование платы Arduino происходит в специальной среде Arduino IDE.
Для работы дисплея используетя готовая библиотека – Adafruit\_GFX\_Librarycite{adafruit}. Библиотека свободно распространяется по BSD-лицензии. Она реализует общение между ардуино и дисплеем по протоколу SPI.
В библиотеки реализован ряд функций необходимых для работы с дисплеем (такие как инициализация дисплея, сброс) и функции облегчающие труд разработчика (попиксельное рисование, рисование линий, латинский шрифт и другие).
Для вывода попиксельного изображения на дисплей в данной курсовой используется функция drawBitmap.
Код функции drawBitmap:
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
const uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color) { int16_t i, j, byteWidth = (w + 7) / 8; for(j=0; j (i & 7))) {
drawPixel(x+i, y+j, color);
}
}
}
}
С использованием этой библиотеки, реализация программы для Arduino сводится к объявлению попиксельного изображения, команд инициализации и команды вывода изображения.
// pin 3 – Serial clock out (SCLK)
// pin 4 – Serial data out (DIN)
// pin 5 – Data/Command select (D/C)
// pin 6 – LCD chip select (CS)
// pin 7 – LCD reset (RST)
#include
#include
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7); const static unsigned char PROGMEM logoBmp[] =
{B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 }; void setup() {
Serial.begin(9600);
display.begin(); // Инициализация дисплея
display.setContrast(60); // Устанавливаем контраст
display.setTextColor(BLACK); // Устанавливаем цвет текста
display.setTextSize(1); // Устанавливаем размер текста
display.clearDisplay(); // Очищаем дисплей
display.display();
delay(1000); } void loop() {
// Рисуем заранее подготовленное лого
// Подготовлен массив из 16 пар байтов
// каждый байт состоит из 8 битов, соответсвенно
// получаем матрицу 16х16 битов, 1-черный цвет, 0-белый цвет
// drawBitmap(x, y, logo, w, h, color )
display.drawBitmap(10, 10, logoBmp, 24, 16, BLACK);
display.display();
delay(2000);
// Очищаем дисплей
display.clearDisplay();
display.display();
delay(1000); }
Источник: http://binarysmile.blogspot.com/2016/09/nokia-5110.html