В данном проекте используется 3.2″ TFT дисплей с открытым исходным кодом. Для создания платы используется микроконтроллер PIC32 и 3.2″ TFT сенсорный экран (ILI9320 контроллер, использующий 16-битный PMP). Программное обеспечение состоит из двух основных частей.
Одна из них отвечает за 2D функции и графический пользовательский интерфейс GUI с различными виджетами (кнопками, независимыми переключателями, слайдерами и так далее). Принципиальная схема Описание В самом начале я решил протестировать недорогие TFT экраны доступные на аукционе eBay (отображающие графическую и текстовую информацию, и более ничего); шаг за шагом я разработал печатную плату и программное обеспечение для нее с множеством 2D основных функций и даже небольшим графическим пользовательским интерфейсом GUI. 2 сторонняя печатная плата имеет размеры 49 x 49 мм Теперь несколько слов о программном обеспечении. Сначала я пытался использовать некоторые блоки готового программного кода от компании Microchip, однако ее библиотеки, на мой взгляд, немного сложные (некоторые файлы имеют более 5 тысяч строк программного кода, и слишком много тегов #ifdef. > <«). В конечном итоге я полностью переписал программный код с нуля. Разработанное программное обеспечение состоит из двух основных частей:
Подборка домашних проекторов. Лучшие проекторы для дома
— P2D: 2D функции (прочерчивание строк, добавление текста и спрайтов, рисование заполненных полигонов, буферизация памяти . )
— GUI: небольшой графический интерфейс пользователя с некоторыми базовыми виджетами (кнопки, независимые переключатели, графики, …). Каждый виджет имеет общие атрибуты (запрещенный, уведомленный, сфокусированный, …), может группироваться и связываться с конкретными сигналами (напр., выдает сигнал, когда виджет нажат). Как обычно проект имеет открытый исходный код OSHW / GPL3 Печатная плата Макет платы выполнен в Eagle CAD
3D рендеринг печатной платы
Печатная плата с компонентами
Изготовленные печатные платы Файлы проекта можно скачать на GitHub
Список радиоэлементов
PIC32MX795F512L
Теги:
topa_biser Опубликована: 12.02.2015 0 0
Вознаградить Я собрал 0 0
Оценить статью
- Техническая грамотность
Оценить Сбросить
Средний балл статьи: 0 Проголосовало: 0 чел.
ЯРКИЙ ПРОЕКТОР С АВТОФОКУСОМ ThundeaL TDA6
Для добавления Вашей сборки необходима регистрация
Статью еще никто не комментировал. Вы можете стать первым.
Программатор Pickit3
1999-2023 Сайт-ПАЯЛЬНИК ‘cxem.net’
При использовании материалов сайта, обязательна
ссылка на сайт ПАЯЛЬНИК и первоисточник
Источник: cxem.net
Оптимизированный интерфейс и адаптер для подключения к Arduino ЖК дисплея с 16-битной шиной. Часть 1 — Схемотехническое решение
На сегодняшний день на рынке представлено множество различных модулей с цветным TFT дисплеем (TFT модуль), которые могут использоваться радиолюбителями и разработчиками в своих проектах. Все они доступны по стоимости и предназначены для непосредственного подключения к микроконтроллеру или процессору.
К сожалению, большинство этих модулей имеет 16-битный интерфейс и рассчитаны на подключение к ARM микроконтроллерам, что не позволяет использовать их в проектах на базе платформы Arduino. В общем случае, при подключении TFT модуля к Arduino усматриваются две проблемы: все TFT модули имеют рабочее напряжение 3.3 В и 16-разрядную шину данных, что потребует от микроконтроллера наличия большого количества свободных линий ввода/вывода.
Статья будет посвящена аппаратному и программному обеспечению, которые позволят решить обе проблемы, а также демонстрации некоторых приемов оптимизации программного драйвера, позволяющих достичь высокой производительности.
Аппаратная часть
Автором был разработан адаптер, подключаемый к плате Arduino и выполняющий преобразование логических уровней (из 5 В в 3.3 В) и формирование 16-битных данных из двух 8-битных последовательностей. Если не принимать во внимание преобразование логических уровней, то адаптер представляет собой регистр-защелку, который позволяет сократить количество выводов, требуемых шиной данных, с 16 до 8 за счет дополнительных выводов управления защелкой. В итоге мы экономим 7 выводов, но немного усложняем аппаратную часть (Рисунок 1).
Рисунок 1. | Внешний вид адаптера для подключения ЖК дисплея с 16-битной шиной к плате Arduino. |
Параллельный регистр-защелка работает как ячейка памяти. В «прозрачном» режиме данные, поступающие на вход, незамедлительно появляются на выходе регистра. Если включить режим защелкивания данных, то сигналы на входе регистра игнорируются, и на выходе остаются последние принятые сигналы. Именно это свойство регистра-защелки можно использовать для преобразования двух последовательных 8-битных значений в 16-битное, другими словами, с использованием защелки мы расширяем их до 16 бит (Рисунок 1).
На Рисунке 2 изображена диаграмма двух фаз работы регистра-защелки. На первом этапе микроконтроллер передает младшие 8 бит, которые одновременно поступают на 16-битную шину данных через защелку и в обход нее, формируя младший байт (как нам требуется) и старший байт (который сейчас нам не нужен). На втором этапе мы защелкиваем регистр, а затем микроконтроллер передает старшие 8 бит. Регистр в таком режиме игнорирует новые данные, поэтому старший байт, минуя защелку, формируется на выходе шины.
Еще одним важным преимуществом такого решения является прекрасная совместимость с интерфейсом внешней памяти XMEM, встроенного в некоторые микроконтроллеры Atmel AVR, в частности, в микроконтроллеры платы Arduino Mega 1280 и 2560. Использование интерфейса XMEM позволит упростить программный код для управления TFT дисплеем.
Принципиальная схема
В составе схемы (Рисунок 3) имеются преобразователи логических уровней, регистр-защелка, разъем для непосредственного подключения к плате Arduino Mega и разъем для подключения 16-разрядного TFT модуля.
Рисунок 3. | Принципиальная схема адаптера для подключения TFT модуля с 16-разрядной шиной к плате Arduino Mega. |
Выводы двухрядного штыревого разъема P2 (10×2) для подключения адаптера к плате Arduino Mega разведены так, чтобы соответствовать сигнальным линиям интерфейса XMEM, которые располагаются в блоке выводов, начинающихся с вывода 23. Символ «H» в обозначении сигналов разъема означает, что это логические сигналы с уровнем 5 В (Рисунок 4). На разъеме доступны сигналы данных и управления, включая сигнал CS (выбор кристалла), соответствующий сигналу ALE (разрешение фиксации адреса) интерфейса XMEM (хотя для управления TFT модулем он требуется очень редко и обычно просто подключен к «земле»).
Рисунок 4. | Распределение выводов двухрядного разъема для подключения адаптера к плате Arduino. |
Микросхема 8-разрядного шинного приемопередатчика SN54LVTH2245 компании Texas Instruments является идеальным выбором для преобразования логических уровней (Рисунок 5). Микросхема достаточно распространеа, имеют задержка распространения сигнала порядка 2 нс (это очень мало), а входы и выходы находятся на противоположных сторонах корпуса, что упрощает печатную плату и монтаж.
Рисунок 5. | Микросхема шинного приемопередатчика SN54LVTH2245. |
Скоростные характеристики микросхемы регистра-защелки D-типа SN74LV573APW удовлетворяют требованиям, предъявляемым интерфейсом XMEM (Рисунок 6). Регистры и шинные приемопередатчики выпускаются многими производителями, поэтому вы можете использовать другие микросхемы с аналогичными параметрами.
Рисунок 6. | Микросхема регистра-защелки SN74LV573APW. |
Штыревой разъем питания и дополнительных сигналов P3 используется для подачи питания на TFT модуль от платы Arduino. Два выхода общего назначения U1 и U2 могут использоваться для некоторого расширения функционала. Как вариант, один из них можно использовать для ШИМ управления подсветкой TFT панели.
Двухрядный разъем P1 используется для подключения TFT модуля. Автор с целью экономии места применил разъем, выводы которого загнуты под прямым углом к плате.
Проект печатной платы
Ручная трассировка платы не представила каких-либо трудностей, все элементы схемы уместились на площади 45 × 35 мм (Рисунок 7).
Рисунок 7. | Проект печатной платы адаптера. |
Загрузки
Принципиальная схема и рисунки печатной платы (PDF) – скачать
Часть 3 — Оптимизация алгоритма прорисовки линий и варианты конфигурирования драйвера
Перевод: Vadim по заказу РадиоЛоцман
Источник: www.rlocman.ru
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8″ (128х160) на ST7735
Для этого урока нам потребуется полноцветный 1.8 дюйма TFT-дисплей 128×160 px, SPI. Забираем на Али!
• Размеры модуля: 35 мм х 57 мм х 7 мм.
• Разрешение: 128×160 пикселей.
• Цветность: 65 тысяч цветов в формате RGB 5-6-5.
• Напряжение питания: 3.3В – 5В.
• Протокол обмена данными: SPI.
• Встроенный разъём для SD-карты.
Рассмотрим модуль на ST7735 поближе и разберемся с программированием под него.
↑ Назначение выводов модуля ST7735
• SCK, MOSI – линии протокола SPI. Альтернативные названия – DO/DI, SCL/SDA. Вывод MISO отсутствует.
• CS – выбор чипа. Активный уровень низкий.
• DC – выбор типа записываемого в модуль слова – данные или команда. Возможны и иные обозначения этого вывода – A0, RS.
• RESET – аппаратный сброс. В состав команд ST7735 входит команда программного сброса, так что на этом выводе можно сэкономить. Однако, следует иметь в виду, что для некоторых регистров контроллера значения по аппаратному и программному сбросу не совпадают.
• VCC, GND – линии питания контроллера. Диапазон напряжения – от 3.3В до 5В.
• LED (или BL) – питание дисплея. Максимально допустимое значение подаваемого на этот вывод напряжения – 3.3 В. В последних модификациях обычно имеется преобразователь 5В –> 3.3 В. Если вы обнаружили его на оборотной стороне своего модуля, можно соединить между собой выводы LED и VCC и подавать любое из указанного диапазона удобное для вас напряжение.
↑ Протокол обмена данными
Функции обмена для ST7735 по содержанию абсолютно такие же, как и в случае с SSD1306:
void st7735_command(uint8_t command) { cbi(ST_PORT, DC_pin); cbi(ST_PORT, CS_pin); SPI_byte(command); sbi(ST_PORT, CS_pin); > void st7735_data(uint8_t data) { sbi(ST_PORT, DC_pin); cbi(ST_PORT, CS_pin); SPI_byte(data); sbi(ST_PORT, CS_pin); >
Единственным отличием в протоколе обмена является то, что для записи параметров, следующих за командой, используется функция st7735_data () , а не st7735_command () :
st7735_command(0x37); st7735_data(parameter 1); st7735_data(parameter 2);
↑ Система команд
Если, по причине отсутствия вывода MISO, отбросить из прилагаемого даташита команды чтения, то оставшиеся команды можно разбить на две группы:
1. Оперативные команды, которые используются постоянно. Их всего три — CASET (0×2A), RASET (0×2B), RAMWR (0×2C).
2. Команды настройки – все остальные команды, которые по большому счёту используются один раз – при инициализации модуля.
Я не стал переводить на русский язык таблицы команд в силу их громоздкости и, порой, избыточности. Обращу ваше внимание лишь на некоторые особенности в структуре таблиц и приведу описание команд с подробностью, соответствующей их важности.
На рисунке ниже изображён заголовок таблицы из даташита.
Столбцы, выделенные зелёным цветом, относятся к другим протоколам, поддерживаемым ST7735, поэтому можете их игнорировать.
Значение в столбце «D/CX» определяет, какую функцию нужно использовать для записи данных из соответствующей строки:
0 – st7735_command ();
1 – st7735_data ();
Столбцы D7-D0 – побитовая расшифровка команды или параметра.
Далее в таблице идут следующие графы:
Description – описание команды.
Default – значения регистров контроллера по сбросу/подаче питания. Здесь следует обратить внимание на то, что порядок установки значений при подаче питания для некоторых команд может быть случайным (Random в строке «Power On Sequence»), а значения в строках «S/W Reset» и «H/W Reset» могут отличаться, как уже говорилось выше.
Flow Chart – блок-схема применения команды. Графа, отвратившая меня от полного перевода таблиц.
Теперь непосредственно о командах.
CASET (2Ah) – установка начального (параметр XS) и конечного (параметр XE) адресов столбцов (иначе – координаты Х) в ОЗУ контроллера и, соответственно, на дисплее. В зависимости от ориентации дисплея значения параметров варьируются в диапазоне 0-127 (вертикальная ориентация) или 0-159 (горизонтальная ориентация) в десятичном исчислении. Длина параметров XS и XE — 16 бит, поэтому запись каждого производится в два приёма. Более подробно об использовании этой и двух последующих команд мы поговорим ниже.
RASET (2Bh) – установка начального (параметр YS) и конечного (параметр YE) адресов строк (иначе – координаты Y). Значения параметров — 0-159 (вертикальная ориентация) или 0-127 (горизонтальная ориентация) в десятичном исчислении. Длина параметров YS и YE — 16 бит, запись, как и в предыдущем случае, в два приёма.
RAMWR (2Ch) – команда записи данных в ОЗУ (вывода на дисплей). Эта команда появилась, поскольку, в отличие от SSD1306, в этом контроллере функция st7735_data () используется и для записи параметров команды, и для записи данных в RAM. Количество и значение параметров, записываемых после команды RAMWR, определяют, соответственно, количество и цвет активируемых на дисплее пикселей.
NOP (00h) – пустая команда.
SWRESET (01h) – программный сброс.
SLPIN (10h) / SLPOUT (11h) – перевод в спящий режим и вывод из него узлов обслуживания дисплея – преобразователя напряжения, тактового генератора и др. По сбросу/подаче питания исполняется команда SLPIN, поэтому команда SLPOUT – обязательная при инициализации модуля.
PTLON (12h) / NORON (13h) – выбор рабочей области дисплея. Использование команды PTLON в комбинации с PTLAR (30h) активизирует только часть дисплея по высоте (остальная часть выключена). Эти команды, среди прочего, позволяют использовать контроллер ST7735 с дисплеями иной размерности. По сбросу/подаче питания включается полноэкранный режим (NORON) и именно его мы будем использовать.
INVOFF (20h) / INVON (21h) – выключение/включение инверсии дисплея.
GAMSET (26h) – выбор гаммы цветов.
DISPOFF (28h) / DISPON (29h) – выключение/включение дисплея. DISPON – ещё одна команда, которую нужно включать в процедуру инициализации, т.к. по сбросу/подаче питания дисплей отключается.
MADCTL (36h) – установка режима адресации и, соответственно, порядка вывода данных на дисплей. Говоря проще, эта команда определяет ориентацию изображения на экране. Кроме того, бит RGB параметра этой команды ответственен за распределение интенсивности между субпикселями (красным, зелёным и синим). Более подробно об это – чуть позже.
COLMOD (3Ah) – установка формата слова, определяющего цвет пикселя. С точки зрения кода эта команда определяет длину аргумента функции st7735_data () при записи данных в ОЗУ. Мы будем использовать 16-битный формат.
Группа команд с окончанием CTR (FRMCTR, PWCTR, GMCTRP и т.п.) –аппаратная настройка параметров модуля (кадровой частоты, напряжений питания, цветовой гаммы и т.д.).
↑ Вывод изображения на дисплей ST7735
После инициализации модуля для активизации на дисплее одного пикселя, к примеру, белого цвета и с координатами 64/80, достаточно следующего кода:
#define WHITE 0xFFFF #define ST7735_CASET 0x2A #define ST7735_RASET 0x2B #define ST7735_RAMWR 0x2C //команда установки адреса столбца или координаты X st7735_command(ST7735_CASET); //записываем 2 байта 16-битного значения начального адреса столбца st7735_data(0); st7735_data(64); //записываем 2 байта 16-битного значения конечного адреса столбца st7735_data(0); st7735_data(65); //команда установки адреса строки или координаты Y st7735_command(ST7735_RASET); //записываем 2 байта 16-битного значения начального адреса строки st7735_data(0); st7735_data(80); //записываем 2 байта 16-битного значения конечного адреса строки st7735_data(0); st7735_data(81); //команда записи в ОЗУ и вывода на дисплей st7735_command(ST7735_RAMWR); //записываем старший байт 16-битного значения цвета st7735_data(WHITE >> 8); //записываем младший байт 16-битного значения цвета st7735_data(WHITE);
По исполнению вы получите точку прямо по центру экрана с вертикальной ориентацией.
↑ О координатах и цвете ST7735
Давайте поговорим поподробнее о координатах и цвете изображения, а также его ориентации на дисплее.
При рисовании объектов, состоящих более чем из одной точки, совсем не обязательно задавать координаты для каждого пикселя, достаточно определить границы всего объекта. Например, нарисовать горизонтальную линию шириной в 1 и длиной в 10 пикселей можно так:
st7735_command(ST7735_CASET); //начало линии, к примеру, в координате Х = 5 st7735_data(0); st7735_data(5); //тогда конец линии - в координате Х = 5 + 10 = 15 st7735_data(0); st7735_data(15); st7735_command(ST7735_RASET); // начало линии, к примеру, в координате Y = 20 st7735_data(0); st7735_data(20); //а ширина 1 пиксель, т.е. 20 + 1 = 21 st7735_data(0); st7735_data(21); st7735_command(ST7735_RAMWR); //открываем цикл числом по количеству пикселей в линии - 10 for(uint8_t counter = 0; counter > 8); //записываем младший байт 16-битного значения цвета st7735_data(WHITE); >
Для вертикальной линии такой же длины и ширины всё будет, как вы понимаете, наоборот – начальный и конечный адреса столбцов будут отличаться на 1, а строк – на 15.
По той же схеме можно рисовать закрашенные определённым цветом прямоугольники заданного размера. Примером тому может служить функция st7735_fill_screen () из прилагаемой библиотеки, закрашивающая весь дисплей заданным цветом:
void st7735_fill_screen(uint16_t color) { st7735_command(ST7735_CASET); //границы прямоугольника совпадают с границами дисплея st7735_data(0x00); st7735_data(0x00); st7735_data(0x00); st7735_data(ST7735_TFTWIDTH - 1); st7735_command(ST7735_RASET); st7735_data(0x00); st7735_data(0x00); st7735_data(0x00); st7735_data(ST7735_TFTHEIGHT - 1); st7735_command(ST7735_RAMWR); //количество пикселей, т.е. площади прямоугольника и дисплея, также совпадают for(uint16_t counter = 0; counter < (ST7735_TFTWIDTH*ST7735_TFTHEIGHT); counter++) { st7735_data(color >> 8); st7735_data(color); > >
Что касается цвета. Как уже говорилось выше мы будем использовать 16-битное значение цвета в формате RGB 5-6-5. Означает это следующее.
Каждый пиксель дисплея состоит из трёх субпикселей – красного (R — Red), зелёного (G — Green) и синего (B — Blue). 16 битов числа, определяющего цвет, распределяются между субпикселями – 5 бит для красного, 6 бит для зелёного и 5 бит для синего – и определяют интенсивность их свечения. Если мы отправим в ОЗУ число 0хF800 (1111100000000000 в двоичном исчислении)
st7735_command(ST7735_RAMWR); st7735_data(0хF800);
то получим такое распределение интенсивностей:
красный – горит максимально ярко (все биты равны 1), а зелёный и синий выключены (все биты равны 0). На дисплее вы увидите точку красного цвета.
Таким образом, чтобы получить зелёный цвет, надо отправить число 0×07E0 (0000011111100000), а в случае синего – 0×001F (0000000000011111). Чёрный цвет достигается записью нулей во всех битах (число 0×0000), а белый – единиц (число 0хFFFF). Все остальные 65 с лишним тысяч цветов и оттенков (2^16 = 65536) располагаются в промежутках между вышеуказанными тремя. В файле st7735.h библиотеки определены следующие основные цвета:
#define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF
Следует отметить, что приведённые числа верны для случая, когда бит RGB параметра команды MADCTL (36h) ровен 0. Если RGB = 1, то из ОЗУ на дисплей число будет выводиться в обратном порядке, т.е. записанное в модуль число 1111100000000000 (красный цвет) будет отображено на экране как 0000000000011111, и вы получите синий цвет.
Без изменения останутся, в силу симметричности их бинарного представления, лишь чёрный и белый цвета. Поэтому для этого варианта значения бита RGB необходимо вычислить и прописать соответствующие значения.
Как меняется ориентация изображения по пути от вашего МК к ОЗУ модуля (а значит — и к дисплею) в зависимости от состояния битов MV, MX и MY параметра команды MADCTL (36h), вы легко поймёте из следующего рисунка даташита:
Библиотека состоит из 5 файлов следующего содержания:
1. main.c – подключение библиотек, инициализация модуля, закрашивание дисплея синим цветом и вывод на его центр точки жёлтого цвета.
2. spi.c – функции протокола SPI.
3. spi.h – назначение выводов МК, участвующих в протоколе SPI, включение/отключение аппаратного сброса.
4. st7735.с – код функций записи команд и данных, аппаратного и программного сброса, инициализации модуля, прорисовки точки и установки ориентации дисплея.
5. st7735.h – макроопределения размеров дисплея, используемых цветов, команд контроллера.
↑ Файлы
Даташит на st7735:
🎁st7735_datasheet.7z 1.64 Mb ⇣ 161
Наш файловый сервис предназначен для полноправных участников сообщества «Datagor Electronics».
Для получения файла зарегистрируйтесь и войдите на сайт с паролем.
Архив библиотеки:
🎁st7735_kod.7z 1.72 Kb ⇣ 252
Наш файловый сервис предназначен для полноправных участников сообщества «Datagor Electronics».
Для получения файла зарегистрируйтесь и войдите на сайт с паролем.
↑ Где брать дисплеи для экспериментов?
На этом вторая часть статьи завершена.
Спасибо за внимание!
Источник: datagor.ru
>»>