- Главная
- Графические контроллеры FTDI / Bridgetek. Формирование и вывод изображения в приложении (статья)
Графические контроллеры FTDI / Bridgetek. Формирование и вывод изображения в приложении (статья)
При описании методики работы с изображениями в предыдущих статьях основное внимание было уделено работе с заранее подготовленными элементами. Но иногда возникают задачи, где изображение или его часть должны быть сформированы непосредственно во время работы. В данной статье на простом примере покажем базовую методику решения такой задачи средствами графических контроллеров FTDI.
Распространенными задачами в графических приложениях являются получение некоего графического объекта из внешнего источника или формирование графического объекта в процессе выполнения программы. В первом случае источником может служить внешний накопитель – например, USB-диск или видеокамера. Во втором случае графическим объектом может быть QR-код. Во обоих случаях базовые принципы работы с изображениями одинаковы, хотя задача формирования графического объекта не всегда понятна для тех, кто только начинает знакомиться с графическими контроллерами FTDI.
Основное затруднение заключается в том, что наиболее очевидным путем в данном случае кажется вариант использования готовых примитивов, поддерживаемых графическими контроллерами. Действительно, а почему бы для формирования своей картинки не использовать примитив POINT, с помощью которого на экран дисплея контроллер может отобразить точку любого размера? Но здесь вступает ограничение на количество инструкций в дисплей-листе, которое не может превышать 2048. Вывод одного примитива типа POINT требует нескольких внутренних инструкций, соответственно, изображение большого размера таким способом не отобразить. Чтобы проиллюстрировать это, попробуем вывести на экран дисплея 255 точек в одну линию с помощью такого кода:
for (x = 0; x <= 255; x++)
{
App_WrCoCmd_Buffer(phost, BEGIN(FTPOINTS));
App_WrCoCmd_Buffer(phost, VERTEX2II(0+x, 228, 0, 0));
App_WrCoCmd_Buffer(phost, END());
}
В случае с контроллерами семейств FT80x и FT81x в результате выполнения данного кода на экране появятся артефакты или изображение не отобразится корректно. А контроллеры новой серии BT81x вернут ошибку переполнения дисплей-листа “display list overflow”, что и говорит о том, что количество инструкций, требуемых для вывода 255 точек с помощью примитива POINT, превышает допустимый предел.
Каким же образом можно вывести растровое изображение на экран дисплея с помощью
графических контроллеров FTDI? Для решения этой задачи следует воспользоваться той же самой методикой, что используется для отображения заранее подготовленных элементов. Все отличие будет состоять в том, что картинку на экран мы будем загружать не из ПЗУ. Вместо этого она будет формироваться динамически. Общий подход и примеры работы с заранее подготовленными изображениями были подробно описаны в статьях
[1-3].
Базовый набор поддерживаемых графическими контроллерами FTDI форматов изображения приведен в таблице ниже.
В соответствии с выбранным форматом, нам потребуется выделить участок в ОЗУ микроконтроллера под буфер, в котором будет храниться генерируемое изображение. Аналогичный объем памяти потребуется выделить в памяти RAM G графического контроллера. По принципу работы графических контроллеров FTDI пользовательское изображение или шрифт должны быть размещены в памяти RAM G, чтобы графический контроллер мог использовать их при формировании выводимого на экран дисплея изображения. Исключением из данного правила являются изображения или шрифты, представленные в формате ASTC. Этот формат поддерживается только новым семейством контроллеров EVE 3 BT81x.
Порядок работы с генерируемым изображением покажем на примере черно-белой картинки в формате L1. Каждый пиксель изображения требует только 1 бит, где 0 определяет черный цвет, а 1 – белый.
В роли микроконтроллера будет выступать ПК и среда разработки Visual Studio (доступна бесплатно). Выбор среды разработки обусловлен тем, что именно по этому пути автор рекомендует идти всем, кто только начинает свое знакомство с графическими контроллерами FTDI. Один из наиболее частых вопросов заключается в том, где взять примеры работы для начала работы с контроллерами. Самым простым и наглядным способом для этого является экспорт проекта для Visual Studio из утилиты Screen Editor, которую дает FTDI. Пример переноса проекта из среды Visual Studio в среду разработки Atmel Studio показан в статье “
Графический контроллер EVE FT800 FTDI и микроконтроллер SAMD21 Atmel. Работаем с графическими изображениями. Часть1”.
Третий компонент – это переходник
USB-SPI Hermes Board от Riverdi. Этот переходник является аналогом кабеля MPSSE от FTDI. Hermes Board может использоваться в качестве переходника со всеми дисплеями
Riverdi с встроенными контроллерами FTDI – FT80x (EVE1), FT81x(EVE2) и BT81x(EVE3).
Итак, чтобы создать шаблон проекта для Visual Studio, откроем утилиту Screen Editor. Добавим в проект растровое черно-белое изображение, чтобы в нашей заготовке присутствовал готовый код для его отображения на экране дисплея. Изображения и шрифты, которые мы хотим использовать в будущем проекте, добавляются через меню во вкладке “Content”. Параметры для выбранного графического элемента устанавливаются во вкладке “Properties”. Графические контроллеры FTDI могут работать со сжатыми и несжатыми изображениями. Сжатие изображений может осуществляться по алгоритму deflate для контроллеров FT80x и FT81x или алгоритму ASTC, поддерживаемому новой серией контроллеров BT81x. Контроллеры могут также автоматически распаковывать изображения, представленные в форматах JPG и PNG. Мы же будем формировать изображение в нашем приложении самостоятельно, и оно будет не сжато. Поэтому надо убрать галку в чекбоксе “Compressed”, чтобы в экспортируемом проекте код был сгенерирован для работы именно с несжатыми изображениями.
Теперь, когда в проект в Screen Editor добавлено изображение и выбраны его параметры, выделяем его во вкладке “Content” и перетаскиваем в центральное окно, которое имитирует экран дисплея. Если мы его видим на экране, как на иллюстрации выше, можно приступать к экспорту проекта в Visual Studio. Это делается через меню “Export” – EVE HAL 2.0 Projects – VM816C50A_MPSSE.
Утилита Screen Editor автоматически создаст проект для Visual Studio в таком виде:
Соответственно, файл решения *.sln (Solution) нашего сгенерированного проекта размещается в папке Project – Msvc.
В качестве небольшого отступления отметим одну дополнительную возможность, которая нам доступна при экспортировании проекта из Screen Editor. Если мы откроем файл решения, находящийся в папке Msvc_Emulator, то для отладки приложения нам будет доступен эмулятор графического контроллера и дисплея. В этом случае он автоматически замещает внешние переходник и дисплей, ПК выступает в роли графического контроллера, а монитор – в роли дисплея. Это удобный и бесплатный способ оценить возможности графических контроллеров FTDI на этапе выбора решения.
Структура проекта в Visual Studio после открытия файла решения выглядит так:
Рабочие функции находятся в файле Sceleton.c, эталонное растровое изображение в файле Assets.h в папке Header Files. Функция, которая отвечает за вывод изображения на экран, также носит название Sceleton(). В исходном виде Screen Editor генерирует ее так:
void Skeleton(Gpu_Hal_Context_t *phost)
{
Gpu_Hal_WrMem(phost, RAM_IMAGES_BITMAP, images_bitmap, sizeof(images_bitmap)); \\ загрузка изображения в RAM G графического контроллера
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, BITMAP_HANDLE(0)); \\ указатель объекта
Gpu_CoCmd_SetBitmap(phost, 0, L1, 128, 32); \\ параметры объекта с указателем, объявленным выше: 0 – начальный адрес изображения в RAM G; L1 – формат; 128 и 32 – размеры изображения в пикселях
App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));
App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS));
App_WrCoCmd_Buffer(phost, VERTEX2II(331, 225, 0, 0)); \\ вывод изображения в заданных координатах х = 331, y = 225 (верхний левый угол изображения) с указателем 0, последнее значение при выводе такого изображения равно 0.
App_WrCoCmd_Buffer(phost, END());
}
Результат выполнения данного кода выглядит аналогично тому, как мы видели в утилите Screen Editor.
В таком формате функция Sceleton() будет работать с контроллерами FT81x и BT81x. Для первого семейства контроллеров FT80x набор команд можно посмотреть в статье [1], он имеет отличия по составу команд и синтаксису. Подробное описание команд контроллеров FT80x было рассмотрено в наших статьях ранее,
все они доступны на сайте MyMCU.ru или в руководствах программиста, которые
доступны на сайте производителя.
Главным в данном коде для описываемого примера является то, что, задав один раз параметры картинки, можно затем пользоваться ими по ходу выполнения программы. При этом, если в ходе выполнения программы мы сформируем новое (для описываемого примера черно-белое) изображение с параметрами, которые указаны в команде SetBitmap, и загрузим его в память RAM G по адресу, указанному в SetBitmap, то на экране отобразится вновь сформированное изображение. По аналогии с другими типами графических контроллеров, типа SSD1963, в данном случае память RAM G будет выступать аналогом видеобуфера, ограниченного заданной областью и форматом изображения (см. таблицу выше).
И в качестве иллюстрации вышесказанного сформируем новое изображение, состоящее из чередующихся черных и белых полос, и выведем его на экран дисплея. Также мы оптимизируем код, чтобы в рабочем дисплей-листе каждый раз не вызывать команды, отвечающие за параметры изображения:
uint16_t x, y;
\\ запись в массив нового изображения
for(x = 0; x <= 512; x = x + 2)
{
images_bitmap[x] = 128;
}
for(x = 1; x <= 512; x = x + 2)
{
images_bitmap[x] = 128;
}
Gpu_Hal_WrMem(phost, RAM_IMAGES_BITMAP, images_bitmap, sizeof(images_bitmap));
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, BITMAP_HANDLE(0));
Gpu_CoCmd_SetBitmap(phost, 0, L1, 128, 32);
App_WrCoCmd_Buffer(&host, DISPLAY());
Gpu_CoCmd_Swap(&host);
App_Flush_Co_Buffer(&host);
Gpu_Hal_WaitCmdfifo_empty(&host);
void Skeleton(Gpu_Hal_Context_t *phost)
{
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));
App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS));
App_WrCoCmd_Buffer(phost, VERTEX2II(331, 225, 0, 0));
App_WrCoCmd_Buffer(phost, END());
App_WrCoCmd_Buffer(&host, DISPLAY());
Gpu_CoCmd_Swap(&host);
App_Flush_Co_Buffer(&host);
Gpu_Hal_WaitCmdfifo_empty(&host);
}
/* Main entry point */
int32_t main(int32_t argc,char8_t *argv[])
#endif
#if defined(ARDUINO_PLATFORM)||defined(MSVC_FT800EMU)
void setup()
#endif
{
/* Init HW Hal */
App_Common_Init(&host);
/* Our main application */
Skeleton(&host);
/* End of command sequence */
Gpu_CoCmd_Dlstart(&host);
Gpu_Copro_SendCmd(&host, CMD_STOP);
App_Flush_Co_Buffer(&host);
Gpu_Hal_WaitCmdfifo_empty(&host);
Gpu_Hal_Sleep(1000);
/* Close all the opened handles */
App_Common_Close(&host);
#if defined (MSVC_PLATFORM) || defined (FT900_PLATFORM) || defined (FT93X_PLATFORM)
return 0;
#endif
}
В результате выполнения этого кода на экране увидим следующее изображение:
При использовании данной методики следует помнить, что RAM G в описываемом примере является аналогом видеобуфера в том смысле, что при записи нового изображения в область памяти поверх старого на экране мы также будем видеть этот процесс - замену старого изображения новым. Поэтому для таких задач лучше выделять под изображение двойной объем памяти - для текущего состояния и обновляемого.
В то же время содержимое, находящееся в RAM G, может быть использовано как угодно долго, пока мы не заменим его новым или не произведем аппаратный сброс микросхемы графического контроллера. Если речь идет об изображении, размещенном в RAM G, то оно вызывается при формировании изображения на экране с помощью команд Vertex. С этим изображением можно проводить все трансформации, доступные для указанных команд. Например, это изображение мы можем вывести в разных областях экрана таким образом:
App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS));
App_WrCoCmd_Buffer(phost, VERTEX2II(0, 0, 0, 0)); \\ первая копия
App_WrCoCmd_Buffer(phost, VERTEX2II(331, 225, 0, 0)); \\ вторая копия
App_WrCoCmd_Buffer(phost, VERTEX2II(600, 225, 0, 0)); \\ третья копия
App_WrCoCmd_Buffer(phost, END());
Вот так выглядит процесс вывода на экран генерируемого в приложении изображения. Эта методика может быть востребована в таких случаях, как вывод изображения от камеры или при необходимости динамически формировать штрих- или QR-код. И если в случае штрих-кода иногда можно обойтись использованием графического примитива Line, то в случае QR-кода воспользоваться графическими примитивами будет проблематично из-за функциональных ограничений.
Дисплеи Riverdi на базе графических контроллеров FTDI/Bridgetek со склада со скидкой
В качестве заключения к статье приведем ниже список дисплеев Riverdi, доступных с нашего склада со скидкой. В данном списке приведены модели дисплеев на базе графических контроллеров новой серии EVE 3 BT81x. При выборе 7" дисплеев из данного списка обращаем внимание на то, что в январе 2020 года производитель сменил матрицу в этих моделях,
официальное извещение доступно на сайте производителя. В связи с этим модели с нашего склада и новые модели дисплеев будут иметь небольшие отличия (в некоторых случаях они несущественны, кому-то могут быть принципиальны) в габаритных размерах. В остальном дисплеи старого и нового выпуска полностью совместимы.
Наличие моделей дисплеев на складе и цены на них можно узнать через поиск по складу:
Список дисплеев новой серии EVE3, доступных со склада, приведен в следующей таблице. В ней же даны ссылки на техническую документацию.
Во второй таблице приведен список рекомендованных отладочных средств, который пригодится на начальном этапе работы с дисплеями.
Наименование позиции для заказа |
Основные характеристики |
Наличие на складе и цена |
|
RVT35AHBFWN00
|
Разрешение: 320 x 240
Яркость, кд/м2: 540
Габаритные размеры, мм х мм х мм: 77.70×64.70×7.30
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: нет
|
Узнать цену и наличие на складе |
|
RVT35AHBFWR00
|
Разрешение: 320 x 240
Яркость, кд/м2: 450
Габаритные размеры, мм х мм х мм: 77.70×64.70×8.40
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT35AHBFWC00.
|
Разрешение: 320 x 240
Яркость, кд/м2: 480
Габаритные размеры, мм х мм х мм: 77.70 х 64.70 х 8.40
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
|
Узнать цену и наличие на складе |
|
RVT35AHBNWN00
|
Разрешение: 320 x 240
Яркость, кд/м2: 540
Габаритные размеры, мм х мм х мм: 76.90×63.90×6.58
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: нет
|
Узнать цену и наличие на складе |
|
RVT35AHBNWR00.
|
Разрешение: 320×240
Яркость, кд/м2: 450
Габаритные размеры, мм х мм х мм: 76.90×63.90×6.58
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT35AHBNWC00
|
Разрешение: 320 x 240
Яркость, кд/м2: 480
Габаритные размеры, мм х мм х мм: 76.90×63.90×7.95
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
|
Узнать цену и наличие на складе |
|
RVT43ALBFWN00
|
Разрешение: 480×272
Яркость, кд/м2: 550
Габаритные размеры, мм х мм х мм: 106.30×68.00×7.23
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: нет
|
Узнать цену и наличие на складе |
|
RVT43ALBFWR00
|
Разрешение: 480×272
Яркость, кд/м2: 440
Габаритные размеры, мм х мм х мм: 106.30×68.00×8.38
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT43ALBNWN00
|
Разрешение: 480×272
Яркость, кд/м2: 550
Габаритные размеры, мм х мм х мм: 105.50×67.20×6.95
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: нет
|
Узнать цену и наличие на складе |
|
RVT43ALBNWR00
|
Разрешение: 480×272
Яркость, кд/м2: 440
Габаритные размеры, мм х мм х мм: 105.50×67.20×7.90
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT43ALBNWC00
|
Разрешение: 480×272
Яркость, кд/м2: 500
Габаритные размеры, мм х мм х мм: 105.50×67.20×8.20
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
|
Узнать цену и наличие на складе |
|
RVT43ULBNWC01
|
Разрешение: 480×272
Яркость, кд/м2: 500
Габаритные размеры, мм х мм х мм: 120.38×79.20×8.43
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Черный
Толщина клеящей ленты, мм: 0,5
|
Узнать цену и наличие на складе |
|
RVT43ULBNWC03
|
Разрешение: 480×272
Яркость, кд/м2: 500
Габаритные размеры, мм х мм х мм: 120.38×79.20×8.43
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Белый
Толщина клеящей ленты, мм: 0,2
|
Узнать цену и наличие на складе |
|
RVT43ULBNWC04
|
Разрешение: 480×272
Яркость, кд/м2: 500
Габаритные размеры, мм х мм х мм: 120.38×79.20×8.43
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Белый
Толщина клеящей ленты, мм: 0,5
|
Узнать цену и наличие на складе |
|
RVT50AQBFWR00
|
Разрешение: 800×480
Яркость, кд/м2: 480
Габаритные размеры, мм х мм х мм: 121.50×76.60×9.00
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT50AQBNWR00
|
Разрешение: 800×480
Яркость, кд/м2: 480
Габаритные размеры, мм х мм х мм: 120.70×75.80×8.50
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT50AQBNWC00
|
Разрешение: 800×480
Яркость, кд/м2: 510
Габаритные размеры, мм х мм х мм: 120.70×75.80×9.20
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
|
Узнать цену и наличие на складе |
|
RVT50UQBNWC00
|
Разрешение: 800×480
Яркость, кд/м2: 510
Габаритные размеры, мм х мм х мм: 136.00×92.80×9.20
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Черный
Толщина клеящей ленты, мм: 0,2
|
Узнать цену и наличие на складе |
|
RVT50UQBNWC01
|
Разрешение: 800×480
Яркость, кд/м2: 510
Габаритные размеры, мм х мм х мм: 136.00×92.80×9.20
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Черный
Толщина клеящей ленты, мм: 0,5
|
Узнать цену и наличие на складе |
|
RVT50UQBNWC03
|
Разрешение: 800×480
Яркость, кд/м2: 510
Габаритные размеры, мм х мм х мм: 136.00×92.80×9.20
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Белый
Толщина клеящей ленты, мм: 0,2
|
Узнать цену и наличие на складе |
|
RVT70AQBFWR00
|
Разрешение: 800×480
Яркость, кд/м2: 350
Габаритные размеры, мм х мм х мм: 165.60×100.60×11.18
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT70AQBFWC00
|
Разрешение: 800×480
Яркость, кд/м2: 350
Габаритные размеры, мм х мм х мм: 165.60×100.60×11.34
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
|
Узнать цену и наличие на складе |
|
RVT70AQBNWN00
|
Разрешение: 800×480
Яркость, кд/м2: 400
Габаритные размеры, мм х мм х мм: 164.80×99.80×9.15
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: нет
|
Узнать цену и наличие на складе |
|
RVT70AQBNWR00
|
Разрешение: 800×480
Яркость, кд/м2: 320
Габаритные размеры, мм х мм х мм: 164.80×99.80×10.65
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: резистивный
|
Узнать цену и наличие на складе |
|
RVT70AQBNWC00
|
Разрешение: 800×480
Яркость, кд/м2: 350
Габаритные размеры, мм х мм х мм: 164.80×99.80×10.81
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
|
Узнать цену и наличие на складе |
|
RVT70UQBNWC01
|
Разрешение: 800×480
Яркость, кд/м2: 350
Габаритные размеры, мм х мм х мм: 179.96×119.00×10.81
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Черный
Толщина клеящей ленты, мм: 0,5
|
Узнать цену и наличие на складе |
|
RVT70UQBNWC03
|
Разрешение: 800×480
Яркость, кд/м2: 350
Габаритные размеры, мм х мм х мм: 179.96×119.00×10.81
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Белый
Толщина клеящей ленты, мм: 0,2
|
Узнать цену и наличие на складе |
|
RVT70UQBNWC04
|
Разрешение: 800×480
Яркость, кд/м2: 350
Габаритные размеры, мм х мм х мм: 179.96×119.00×10.81
Раб. температурный диапазон, гр С: -20~70
Тип сенсора: емкостной
Цвет окантовки: Белый
Толщина клеящей ленты, мм: 0,5
|
Узнать цену и наличие на складе |
|
Список отладочных средств и аксессуаров:
|
Наименование |
Краткое описание |
Документация |
|
Break Out Board 20 |
Переходная плата с разъема FFC под плоский шлейф на разъем IDC. Удобна для подключения дисплеев к своим отладочным средствам. Подходит для всех дисплеев с контроллерами FTDI |
Описание |
|
HERMES BOARD |
Конвертер USB-SPI для тестирования дисплеев Riverdi с помощью ПК. Подходит для работы со всеми дисплеями с контроллерами FTDI.
Данная плата будет полезна для загрузки графических объектов, аудиофайлов и другой информации во флэш-память, расположенную на новых модулях EVE 3 с помощью утилиты Assets Builder
|
Описание
|
|
FFC0520150 |
Плоский шлейф на 20 контактов. Обязателен для подключения модулей EVE3 к отладочным средствам или в конечном изделии. |
|
|
ZIF0520DH-CF25 |
Разъем под плоский шлейф на 20 контактов, нижнее расположение контактов, защелка поворотная |
|
|
ZIF0520UH |
Разъем под плоский шлейф на 20 контактов, верхнее расположение контактов, защелка выдвижная |
|