Графические контроллеры FTDI Bridgetek. Формирование и вывод изображения в приложении

Графические контроллеры FTDI / Bridgetek. Формирование и вывод изображения в приложении (статья)

Дисплеи Riverdi на базе графических контроллеров FTDI/Bridgetek cо склада компании "ЭФО" по специальной цене!

Сергей Долгушин, dsa@efo.ru
 
При описании методики работы с изображениями в предыдущих статьях основное внимание было уделено работе с заранее подготовленными элементами. Но иногда возникают задачи, где изображение или его часть должны быть сформированы непосредственно во время работы. В данной статье на простом примере покажем базовую методику решения такой задачи средствами графических контроллеров 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 – белый.    
Для работы будем использовать следующие компоненты. Дисплей Riverdi RVT50AQBFWC00 на базе контроллера BT815, подробная документация на него доступна на сайте производителя
В роли микроконтроллера будет выступать ПК и среда разработки 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());
 
 
Также к данному изображению будут применимы все команды, которые отвечают за прозрачность, наложение слоев, анимацию, например, как описано в статье  “Графические контроллеры FTDI FT8хx. Анимация изображений. Часть 1”.
Вот так выглядит процесс вывода на экран генерируемого в приложении изображения. Эта методика может быть востребована в таких случаях, как вывод изображения от камеры или при необходимости динамически формировать штрих- или 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 контактов, верхнее расположение контактов, защелка выдвижная  

 

 

 

 
Литература         
 
    
                                
Ваш заказ
Наверх