Генерируем изображение на телеке с помощью Arduino

Недавно пришла мысль, сделать что-нибудь связанное с выводом на обычный телевизор. Поиски навели меня на вот эту статью:

http://www.instructables.com/id/TV-Out-with-Arduino/

и соответственно библиотеку которая там используется https://code.google.com/p/arduino-tvout/downloads/detail?name=TVout_R5.91.zip&can=2&q= .

Создатели библиотеки хорошо постарались над ее созданием и написали довольно таки подробный вики: https://code.google.com/p/arduino-tvout/wiki/Useage .

Предлагаю рассмотреть сначала функции библиотеки, а затем саму начинку библиотеки.

Библиоткеа

Рассмотрим работу библиотеки сразу на простом примере:

#include <TVout.h>
#include <fontALL.h>
TVout TV;
 
void setup ( )
{
  TV.begin(NTSC,120,96);
  TV.select_font(font6x8);
  TV.println("Sainquake");
  TV.delay ( 1000 );
}
int i=0;
void loop ( )
{
  TV.clear_screen ( );
  //TV.println("Sainquake");
  TV.draw_rect(0,0,119,95,WHITE);
  TV.print(10,40,"Happy new Year!!!");
  TV.draw_line(10,50,110,50,WHITE);
  TV.print(80,1,i);
  TV.delay ( 10 );
  i++;
}

 

В проекте подключены 2 библиотеки которые скачиваются по ссылке выше. Соответственно содержимое архива надо положить в папку Arduino/libraries/

Итак. В setup у нас стандартная конструкция инициализации: begin. В ней мы указываем стандарт телевидения NTSC или PAL. PAL вам нужен будет только, если вы захотите подключиться к старому ламповому телевизору. Далее задается количество строк и столбцов в будущем изображении. Может быть я что-то каряво сделал, но изменение этих параметров не дало никаких результатов. К сожалению разрешение изображение ограничивается тактовой частотой самой Arduino.

Ну и собственно сразу после инициализации мы можем подключить шрифт и писать текст на экране.

Далее в loop у меня есть несколько функций которые скорее всего понадобятся.

TV.clear_screen ( );

Очистка экрана.

TV.draw_rect(0,0,119,95,WHITE);

Рисуем квадрат. Соответственно аргументы: x0, y0, width, height, color (WHITE || BLACK || INVERT)

TV.draw_line(10,50,110,50,WHITE);

Рисуем линию. Аргументы такие же, только не ширина и высота, а координаты конечной точки.

По большому счету больше функций то и не понадобится.

Теперь о HW части.

По сути это все что вам нужно.

У контроллера выделяетя 2 вывода которые соединяются в один через резисторы. На схеме так же показаны диоды для защиты от обратного тока, но и без них работает.

Эти 2 вывода по распиновке Arduino UNO будут 7 – Video и 9 – Sync.

Теперь самое сложное, вам нужно найти у себя на телевизоре вход под названием тюльпан.

О том как работает библиотека

При инициализации работы (begin) в памяти занимается место под буфер экрана.

А дальше идет только работа с таймером. В функции render_setup запускается таймер1.

Во момент прерывания от переполнения таймера вызывается функция по ссылке line_handler();. В свою очередь эта ссылка меняется на разные функции. Вот тут то и начинается магия.

Далее последовательно по таймеру выполняются несколько функций:

  • vsync_line() – генерирует синхроимпульс
  • blank_line() – вызывает либо синхронизацию либо прорисовку строки.
  • active_line() – прорисовывает строку вызывая функцию render_line();

Содержимое render_line(); зависит от разрешения, в инициализации выбирается соответствующая функция выполняемая здесь. Эта функция отписана на асме, чтобы точно знать момент поднятия или опускания вывода. По сути в этой функции идет подсчет тактов и дергание ногой.

 Бонус

Сделал на основе этой библиотеки следующий проект. По сути создание 3D кубика взято из примера к той же библиотеке.

Описание: Ардуинка считывает с АЦП напряжение на потенциометре и вращает кубик со скоростью пропорционально считанному значению. + идет счет времени (левый верхний угол) + выводится откалиброванное считанное значение с АЦП (Правый верхний угол).

Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

     

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>