попиксельное заполнение экрана код.

onemamba
Offline
Зарегистрирован: 09.12.2015

Здравствуйте дорогие гуру и просто форумчане. Прошу совета, т.к. новичек, причем не дочитавший умную книгу по программированию С++ г. Кернигана и Ричи. Мне необходимо создать... наверное цикл, для попиксельному заполнению экрана, где известно начало координат (ось x - x и ось y-y) - 0 и конец координат, где x=136, а y - 104. Известная библиотека TVout имет команду для заполнения пикселя одним из двух цветов. Но вот задача, если шаг в y понятен: y++, то в каждой сторке y значения х, где надо выполнить команду - разные. Желательно не полноценный код, а руским текстом, как стоится цикл и цикл ли вообще нужно делать? По сути, я прошу помощи в создании алгоритма, а я уже сам постараюсь методом проб и ошибок правильно написать код. 

Получается для каждой строки у свой масив данных, как это правильно раелизовать в коде. Картинка на экране представляет, как графику, так и цифры/буквы(кириллица). Заранее спасибо всем откликнувшимся. Для справки, если кому интересно, проект представляет OSD на ардуино и LM1881. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не понял, что именно Вас интересует.

Принцип организации видеопамяти в дисплеях, используемых в Ардуино, ничем не отличается от такового для PC.

В принципе, экран можно заполнять двумя способами:

- использовать функцию попиксельного рисования (медленно),

- писать напрямую в видеопамять (если контроллер поддерживает такой режим).

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

Не понял, что именно Вас интересует.

Принцип организации видеопамяти в дисплеях, используемых в Ардуино, ничем не отличается от такового для PC.

В принципе, экран можно заполнять двумя способами:

- использовать функцию попиксельного рисования (медленно),

- писать напрямую в видеопамять (если контроллер поддерживает такой режим).

Не совсем так. Я не использовал дисплей с контроллером. Я собрал схему по вот такому методу: http://istarik.ru/blog/arduino/46.html

Все работает нормально, я попробовал рисовать полосками, и пикселями, вот кусочек кода:

void loop() {
  
  TV.clear_screen();
  // горизонт линии
  a=15,b=48,c=54,d=48,e=1;
  TV.draw_line(a,b,c,d,e);
  
  a=74,b=48,c=113,d=48,e=1;
  TV.draw_line(a,b,c,d,e);

  a=24,b=46,c=24,d=50,e=1;
  TV.draw_line(a,b,c,d,e);
  
  a=34,b=44,c=34,d=52,e=1;
  TV.draw_line(a,b,c,d,e);
  
  a=45,b=46,c=45,d=50,e=1;
  TV.draw_line(a,b,c,d,e);
 //один
  a=54,b=73,c=54,d=77,e=1;
  TV.draw_line(a,b,c,d,e);

  x=53,y=74,z=1;
  TV.set_pixel(x,y,z);

Но это не то, что я хочу. Я бы хотел не писать команду для каждого действия, а написать цикл или как-то по другому, чтобы в команду TV.set_pixel(x,y,z); подставлялись цифры из масива, а данные масива просто внести, через запятую. Тем более, что "z" - всегда 1 (белый), а "y" - номер строки и по окончанию ее, то есть при "x" больше 136 (последний пиксель), "y" делается y++. А когда y>104 то конец цикла. Но еще раз повторюсь: значения "x" всегда разные и их много для каждой строки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

И кро Вам мешает сделать так, как Вы хотите?

byte a[] = {15, 74, 24, 34, 45, 54};
byte b[] = {48, 48, 46, 44, 46, 73};
byte c[] = {54, 113, 24, 34, 45, 54};
byte d[] = {48, 48, 50, 52, 50, 77};

void loop() {
  for(byte i = 0; i < 6; i++)
    TV.drqw_line(a[i], b[i], c[i], d[i], 1);
}

PS. Набивал прямо здесь, не проверял.

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

И кро Вам мешает сделать так, как Вы хотите?

byte a[] = {15, 74, 24, 34, 45, 54};
byte b[] = {48, 48, 46, 44, 46, 73};
byte c[] = {54, 113, 24, 34, 45, 54};
byte d[] = {48, 48, 50, 52, 50, 77};

void loop() {
  for(byte i = 0; i < 6; i++)
    TV.drqw_line(a[i], b[i], c[i], d[i], 1);
}

PS. Набивал прямо здесь, не проверял.

Дилетантский вопрос: строка byte a[] = {...} подразумевает, что пошагово этому байту присваиваются значения которые находятся в фигурных скобках? А инструкция for указывает что их последовательно нужно записывать в "byte a" ? Я правильно понял? 

Я к чему спрашиваю: я могу в скобках {} через запятую указать 50, 100 символов.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Неправильно.

2. Можете.

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

1. Неправильно.

2. Можете.

Спасибо, с первым разобрался по этой ссылке: http://arduino.ru/Reference/Array

Это обявление массива с типом переменных"byte". 

onemamba
Offline
Зарегистрирован: 09.12.2015

Совсем плохо получилось. На прорисовку 9 строк ушло 1,7 Мегабайта памяти из 2 доступных. Или надо в EEPROM загонять, или надо по другому масив делать. Я посчитал, что если зарезервировать под каждую координату один бит (1 или 0) то выйдет столько же  почти (136 точек на 104 = 14144) плюс программа. В общем есть куда стремиться.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

У Ардуино нет ни 2 Мегабайт памяти, ни 0.2, ни даже 0.02. Остальных расчетов тоже не понял.

И вообще Ардуина не расситана на работу с графикой и даже текстом. Конечно, и то и другое в различных любительских проектах присутствует, но в весьма ограниченном виде. Если хотите вменяемую графику, берите Raspberry Pi.

 

onemamba
Offline
Зарегистрирован: 09.12.2015

Реальной графики не надо. Картинка черно-белая, статическая, изредко меняются цифры. Но главное - наложение этого всего на аналоговый сигнал с видеокамеры. А с вашим предложением, можно уже и планшет дешевый и USB видеозахват. Это не наши методы. Надо сделать много дешевых изделий 5-7 штук. А дорогие платформы не докупишься, да и в случае потери будет жалко. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, вообще-то любая работа начинается с проектирования. А проектирование - с формулировки требований.

Думаю, в тех применениях, для которых создавались контроллеры AVR, используемые в Ардуино, работа с графическим экраном не подразумевалась в принципе.

Существуют дисплеи, используемые для любительских поделок Ардуино, но все они имеют собственную видеопамять, причем, зачастую объем ее в сотнит раз превосходит объем памяти Ардуино.

Так что Вы бы сначала сформулировани, что хотите сделать, тогда можно буцдет прикинуть, реально ли это вообще на Ардуино.

Да, с аналоговым видеосигналом Ардуина работать не спососбна в принципе.

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

Ну, вообще-то любая работа начинается с проектирования. А проектирование - с формулировки требований.

Думаю, в тех применениях, для которых создавались контроллеры AVR, используемые в Ардуино, работа с графическим экраном не подразумевалась в принципе.

Существуют дисплеи, используемые для любительских поделок Ардуино, но все они имеют собственную видеопамять, причем, зачастую объем ее в сотнит раз превосходит объем памяти Ардуино.

Так что Вы бы сначала сформулировани, что хотите сделать, тогда можно буцдет прикинуть, реально ли это вообще на Ардуино.

Да, с аналоговым видеосигналом Ардуина работать не спососбна в принципе.

http://www.open-electronics.org/a-video-overlay-shield-for-arduino/

Что то типа этого. Только информация другая, тоже шкалы, координаты, заряд и т.д.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Давайте отделим мух от котлет.

Есть МК Atmel, используемый в Ардуино. Контроллер обладает целым списком периферии (таймеры, контроллеры прерываний, АЦП и пр.), которая может выполнять достаточно широкий спектр действий. Кроме того, определенный спектр действий может быть выполнен программно. Т.е. контроллеро сам по себе обладает достаточно широкими возможностями. Но эти возможности не безграничны, поэтому зачакстую совместно с Ардуино используются другие аппаратные средства. При этом вряд ли целесообразно путать между собой возможности Ардуино и возможности аппаратных средств, которые с ней в принципе можно использовать.

Если Вы собираетесь использовыать какой-либо специализированный модуль, то сделует обратиться к документации на него.

Например, я уже упоминал, что если объем памяти самой Ардуино, как правило, составляет 2 Кбайта, то экраны, используемые с Ардуино, обладают собственной памятью, причем ее объем может в сотни раз превосходить объем памяти Ардуино.

 

Не нужно пытаться задавать абстрактные вопросы - получите не менее абстрактные ответы.

Сначала определитесь:

- чего Вы хотите,

- и какие средства для этого собираетесь использовать.

Определитесь хотя бы с одним их этих двух вопросов, тогда можно будет искать ответ и на другой.

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

Давайте отделим мух от котлет.

Есть МК Atmel, используемый в Ардуино. Контроллер обладает целым списком периферии (таймеры, контроллеры прерываний, АЦП и пр.), которая может выполнять достаточно широкий спектр действий. Кроме того, определенный спектр действий может быть выполнен программно. Т.е. контроллеро сам по себе обладает достаточно широкими возможностями. Но эти возможности не безграничны, поэтому зачакстую совместно с Ардуино используются другие аппаратные средства. При этом вряд ли целесообразно путать между собой возможности Ардуино и возможности аппаратных средств, которые с ней в принципе можно использовать.

Если Вы собираетесь использовыать какой-либо специализированный модуль, то сделует обратиться к документации на него.

Например, я уже упоминал, что если объем памяти самой Ардуино, как правило, составляет 2 Кбайта, то экраны, используемые с Ардуино, обладают собственной памятью, причем ее объем может в сотни раз превосходить объем памяти Ардуино.

 

Не нужно пытаться задавать абстрактные вопросы - получите не менее абстрактные ответы.

Сначала определитесь:

- чего Вы хотите,

- и какие средства для этого собираетесь использовать.

Определитесь хотя бы с одним их этих двух вопросов, тогда можно будет искать ответ и на другой.

Эта микросхема LM1881, сама по себе ничего не прорисовывает и памяти у нее нет. Она лишь выделяет из видеосигнала синхронизацию вертикальную и горизонтальную. OSD формирует Ардуино.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

onemamba пишет:

Эта микросхема LM1881, сама по себе ничего не прорисовывает и памяти у нее нет. Она лишь выделяет из видеосигнала синхронизацию вертикальную и горизонтальную. OSD формирует Ардуино.

То есть, можно поверх видео с камеры наложить например рисунок прицела?

onemamba
Offline
Зарегистрирован: 09.12.2015

Nosferatu пишет:

onemamba пишет:

Эта микросхема LM1881, сама по себе ничего не прорисовывает и памяти у нее нет. Она лишь выделяет из видеосигнала синхронизацию вертикальную и горизонтальную. OSD формирует Ардуино.

То есть, можно поверх видео с камеры наложить например рисунок прицела?

Да все, что угодно в пределах разрешения. Но главное даже не это, наложение - только первая стадия, раз уж вы о военной тематике. При помощи этой микросхемы можно производить захват видео и обработкой его при помощи Ардуино. То есть, робот может идти прямо на светящийся объект, не сбиваясь с курса. При пересеченной местности, где нет ориентиров, можно конечно воткнуть модусь ЖПС/ Глонас, но когда глобальных задач не стоит (в моем случае покатушки между грядками) этот "мискосуповый набор" - сказочный подарок. Время мало, правда. Сейчас не успеваю занятся ПО.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

onemamba пишет:

При помощи этой микросхемы можно производить захват видео и обработкой его при помощи Ардуино.

Можно чуть поподробнее, как Вы собираетесь обрабатывать видео при помощи Ардуино?

Даже уточню вопросы:

1. Каков размер обрабатываемого кадра по гиризонтали и вертикали?

2. Кадр цветной или монохромный?

3. Какова глубина цвета?

4. Сколько кадров в секунду планируется обрабатывать?

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Посмотрел библиотеку. Для анализа видео по-моему там только одна функция get_pixel(), которая выдаёт 1 или 0, без оттенков.

А по вашему случаю: если надо выводить небольшие картинки, то можно хранить в массиве не весь кадр, а только фрагмент. Первые три байта массива это начальная координата по x= массив[0], начальная координата по y = массив[1]  и длинна картинки массив[3]  в пикселях или байтах при достижении которой будет возврат к х = массив[0] и у = у +1.

Ну или SD card reader.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Трех байт заголовка недостаточно (две координаты угла + длина строки), нужно еще количество строк.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

andriano пишет:

Трех байт заголовка недостаточно (две координаты угла + длина строки), нужно еще количество строк.

Количество строк  = размер массива  / длинна строки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Среди указанных трех байтов нет "размер массива", так что четвертый параметр все равно необходим. И не важно, называется он "количество строк" или "размер массива".

Nosferatu
Offline
Зарегистрирован: 04.11.2012

andriano пишет:

Среди указанных трех байтов нет "размер массива", так что четвертый параметр все равно необходим. И не важно, называется он "количество строк" или "размер массива".

Можно конечно зарезервировать ещё один байт в массиве.  А узнать размер массива sizeof.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Этот sizeof не имеет к изображению никакого отношения. В массиве может храниться не одно изображение, а несколько. В массиве может храниться информация, которая необходима для других целей, но которую процедура отображения не использует, etc. Под массив может использоваться постоянный буфер избыточной длины.

Да и сам массив, который мы должны отобразить, может быть статическим, динамическим, может изменять свой размер между вызовами процедуры и пр. По сути это лишь адрес, который не несет в себе признака длины.

Т.е. использовать здесь размер массива идеологически неправильно: если есть 4 степени свободы, следует использовать 4 параметра, а не пытаться угадать один из них из каких-то внешних соображений.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Ваш вариант записи предпочтительней. Так  проще в одном цикле обработать весь массив.

Я предлагал для каждого фрагмента делать отдельный массив. Тогда плодятся лишни циклы или переменные.

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

onemamba пишет:

При помощи этой микросхемы можно производить захват видео и обработкой его при помощи Ардуино.

Можно чуть поподробнее, как Вы собираетесь обрабатывать видео при помощи Ардуино?

Даже уточню вопросы:

1. Каков размер обрабатываемого кадра по гиризонтали и вертикали?

2. Кадр цветной или монохромный?

3. Какова глубина цвета?

4. Сколько кадров в секунду планируется обрабатывать?

Прошу прощения, смешал два понятия: захват видео и компьютерное зрение. Вот тут я черпал информацию:

http://nootropicdesign.com/projectlab/2011/03/20/arduino-computer-vision/

Третий пункт: компьютерное зрение.

Вообще я хочу реализовать отдельно ОСД и отдельно - компьютерное зрение. 

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

Этот sizeof не имеет к изображению никакого отношения. В массиве может храниться не одно изображение, а несколько. В массиве может храниться информация, которая необходима для других целей, но которую процедура отображения не использует, etc. Под массив может использоваться постоянный буфер избыточной длины.

Да и сам массив, который мы должны отобразить, может быть статическим, динамическим, может изменять свой размер между вызовами процедуры и пр. По сути это лишь адрес, который не несет в себе признака длины.

Т.е. использовать здесь размер массива идеологически неправильно: если есть 4 степени свободы, следует использовать 4 параметра, а не пытаться угадать один из них из каких-то внешних соображений.

Вот максимальное разрешение, которое мне удалось выжать:

TV.begin(_PAL,136,104);

Я не совсем понял, как накладывается изображение. Я уже понял, что для этого нужно понять само формирование видеосигнала. Я обязательно с этим разберусь, чуть позже. Ваш вариант мне больше нравится, потому что всегда лучше четко задать рамки и в случае, если я за них выйду в дальнейшем или компилятор выдаст ошибку или программа не выполнит их. Мне кажется отлаживать программу с жесткими рамками проще, да и правильнее это.

onemamba
Offline
Зарегистрирован: 09.12.2015

Nosferatu пишет:

Ваш вариант записи предпочтительней. Так  проще в одном цикле обработать весь массив.

Я предлагал для каждого фрагмента делать отдельный массив. Тогда плодятся лишни циклы или переменные.

И ваши рассуждения тоже полезны, спасибо за участие. Читая ваши рассуждения я учусь. Истина рождается в споре.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

onemamba пишет:

Вот максимальное разрешение, которое мне удалось выжать:

TV.begin(_PAL,136,104);

Чье это разрешение: TVout или LM1881?

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

onemamba пишет:

Вот максимальное разрешение, которое мне удалось выжать:

TV.begin(_PAL,136,104);

Чье это разрешение: TVout или LM1881?

LM 1881 не формирует изображение от слова - совсем. Это разрешение с Ардуины при помощи библиотеки TVout. С таким разрешением мне удается выводить любое изображение вообще любое, хоть по пикселям, хоть линиями, чем угодно.

onemamba
Offline
Зарегистрирован: 09.12.2015

andriano пишет:

onemamba пишет:

Вот максимальное разрешение, которое мне удалось выжать:

TV.begin(_PAL,136,104);

Чье это разрешение: TVout или LM1881?

Я сейчас грубо так напишу, сец по телесигналу конечно посмеется и вполне уверен исправит меня, но как я понял: задача LM1881 выделить из входящего изображения сигналы горизонтальной и вертикальной синхронизации. Эти сигналы подаются на Ардуино. Ардуина по командам этих сигналов формирует изображение, которое смешивается с основным видеосигналом. Как-то так. Жаль, здесь нет спеца по аналоговому видеосигналу, он бы лучше пояснил.

Onkel
Offline
Зарегистрирован: 22.02.2016

получилось? а то я взялся за 1881, но в разных источника разные распиновки, у меня сама по себе генерация видео работает, не пойму, как словить ардуиной синхроимпульсы для синхронизации оверлея, ардуина текст генерит но сама по себе, с синхросигналом на D9.

 

onemamba
Offline
Зарегистрирован: 09.12.2015

Говорили умные люди - не надо на ардуинке, ну не надо, слабая она для таких вещей! Нет, я упорото лез, как бык головой... прошелся по всем граблям... потом еще раз, чтобы наверняка... и перешел с этой задачей к апельсинке ПИ. Тут конечно тяжелее реализовать все, зато ресурсы позволяют в легкую. Стоит чуть дороже, но не смертельно: от 500 до 1300 на Али. А за ардуинкой оставил ее прямы функции - получать команды и управлять переферией, с чем она прекрасно справляется. Короче: котлеты отдельно, мухи отдельно. 
Конкретно по вашему вопросу: да, получилось, не помню точно, но вроде что-то крутил для синхронизации - все работало, наверное подстроечник, схему спер где-то у поклонников квадрокоптеров бургерского происхождения (английских хреново знаю, а тут немецкий - вообще жесть), Они там по всем граблям прошлись, все опробывали и все выложили, надо просто почитать. ССылки не дам, т.к. в скоре после этого ССДшка с ситемой показала мне, как у нее все весело с ресурсом- отработала 3 гарантийных года и полтора месяца и... легла загрузочная область... теперь офигительная дискета у мну есть. Так что, извиняюсь, но тема реально рабочая! Да, вот еще какая штука выяснилась: при такой загрузке - прорисовка по точкам, в случае одновременной передаче данных, может повиснуть даже, но чаще просто проблемы с прорисовкой... Короче не заточена она под это дело.

Onkel
Offline
Зарегистрирован: 22.02.2016

Победил, нашел англоязычный нормальный ресурс на noo, вручную переделал инициализацию начала строк и кадров по сихнроимпульсам, по прерываниями по пинам D2-D3. Правда конечно маловато дури, когда идет отработка прерываний по энкодерам видео выход  немного сбивается, но терпимо.

 

onemamba
Offline
Зарегистрирован: 09.12.2015

Вот и размести сдесь ссылку, чтобы другие не искали, кто читать будет. Надо было мне тут выложить.