Формирование цветного tv сигнала на ардуино. Установка ТВ библиотеки
Что можно приготовить из кальмаров: быстро и вкусно
Небольшой урок в котором вы узнаете, как подключить Arduino к телевизору (ТВ) для отображения текста, информации и графики.
Ардуино может быть подключена ко многим устройствам, включая датчики, электромеханические детали и даже простые дисплеи. Но представьте, что вы можете подключить Arduino к телевизору и использовать его для отображения текста, информации и даже грубой графики.
По традиции начинаем с деталей, которые нам нужны будут для проекта:
- 1x – 470 Ом резистор
- 1x – 1 кОм резистор
- 1x – ТВ с композитным видеовходом
- 1x – Композитный видеокабель (разъем RCA)
Схема подключения Ардуино к ТВ
Принципиальная схема довольно простая, которую вы можете увидеть на рисунке ниже. Не забывайте, что на резисторах есть перпендикулярные полоски, которые говорят о величине сопротивления резистора.
Как это работает?
Теперь поговорим о том, как работают композитные телевизионные сигналы.
Композитные телевизионные сигналы довольно сложны и запутанны, поэтому мы рассмотрим только основы. Следует также отметить, что мы будем рассматривать только PAL, а не NTSC, поскольку у них несколько разные тайминги, и мы большей частью живем в Европе, которая использует PAL.
Скорость, с которой телевизоры показывают серию изображений для формирования движущегося изображения, называется кадрами в секунду (также известными как FPS). Поскольку каждый кадр является неподвижным изображением, и эти изображения на телевизоре рисуются по строкам, изображения отправляются на телевизор последовательно, каждый пиксель отправляется по одному за раз. Но если линия изображения является последовательными данными, как определяется яркость? В отличие от цифрового последовательного соединения сигналы PAL являются аналоговыми, а напряжение на последовательной линии определяет, насколько ярким является пиксель. На приведенном ниже графике показан график PAL и значения разных напряжений.
Если входной сигнал равен 0 В, телевизор видит это как сигнал синхронизации. В зависимости от того, как выполняется синхронный сигнал, его можно использовать для передачи ТВ одной из двух вещей:
- Горизонтальная синхронизация – готовность отобразить следующую строку на нашей картинке
- Вертикальная синхронизация – готовность к совершенно новому изображению
Напряжение между 0,3 В и 1 В – это пиксели изображения, где 0,3 В представляет черный пиксель, 1 В представляет белый пиксель, а напряжения между ними являются серыми. Цветные пиксели не будут покрываться, так как цвет очень сложный, используя сигналы фазового сдвига и цветовой синхронизации. Итак, как мы можем достичь этих уровней напряжения, если у нас нет аналогового выхода на Arduino Uno? Вот зачем наши два внешних резистора!
Arduino Uno при использовании в сочетании с библиотекой TV Out имеет два контакта: видео и синхронизацию. Вывод видеосигнала используется для передачи видеоданных (отдельные пиксели), а синхросигнал используется для синхронизации телевизора. Эти два контакта соединены вместе через R1 и R2, которые образуют простой делитель потенциалов, который дает следующие уровни напряжения.
Установка ТВ библиотеки
Начните с загрузки , затем нажмите:
Sketch → Include Library → Manage Libraries
(Эскиз → Включить библиотеку → Управление библиотеками)
В открывшемся окне библиотеки выберите строку поиска и введите «TV Text».
Когда поиск будет завершен, выберите библиотеку ТВ-текста «TV Text» и нажмите «установить» (англ. – install).
Последний шаг будет включать в себя открытие встроенного примера, чтобы мы могли проверить его. Нажмите:
File → Examples → TV Out → Demo PAL
(Файл → Примеры → TV Out → Demo PAL)
Сборка устройства
Этот проект использует макет, чтобы помочь подключить Arduino Uno к двум резисторам и композитному видеокабелю. Ардуино подключен к компьютеру для легкого программирования, а также для обеспечения питания, и как только настройка будет выполнена (как показано ниже), вы можете запрограммировать Arduino и включить телевизор.
Если все идет по плану, у вас должно быть что-то похожее на экране телевизора, показанном ниже:
Это был первый урок из серии взаимодействия Ардуино и ТВ. Если мы получим хорошую обратную связь мы продолжим публикации уроков в данном направлении. Все отличных проектов.
Если вы когда-нибудь почувствуете, что вашему Arduino-проекту стало тесно на алфавитно-цифровом дисплее 1602, обязательно обратите внимание на проект TellyMate Shield . Он позволяет выводить ту же алфавитно-цифровую информацию на обычный телевизор, через видео-вход.
При определенном везении можно заполучить весьма внушительных размеров дисплей (если телевизор имеет прилично дюймов в диагонали), работающий в режиме телетайпа 38 x 25 знакомест. Впрочем, бросив первый взгляд на схему, ловишь себя на мысли о розыгрыше. В самом деле:
Обычный ATmega8 на тактовой частоте 16 МГц формирует два компонента видеосигнала, которые смешиваются нехитрой схемой из двух резисторов и двух диодов. Группой переключателей S1 устанавливаются режимы работы; согласующий резистор 75 Ом подключается через перемычку и добавлен, скорее, для универсальности (думаю, в большинстве случаев не понадобится).
Arduino выводит информацию для отображения через последовательный порт – пины RX/TX. Если вас смущает, что по ним же происходит загузка скетча и во время этого процесса на экране появляется некая “ерунда”, можно уйти на любой пин с помощью библиотеки SoftwareSerial. Поддерживаются разные скорости, а также есть возможность автоопределения. Простейший скетч выглядит так:
Serial . begin (57600 ); //57k6 baud Serial . println (“Hello, world!” );
К сожалению, изображение формируется исключительно черно-белое. Зато внутри имеем полноценный знакогенератор кодовой страницы 437, в котором есть псевдографика:
Вы, наверное, заметили, что для вывода видео использован аудио-разъем 3,5мм. На самом деле, это не казус, а вполне осознанный выбор, ограничивающий высоту элементов и делающий возможным стекирование шилдов:
Кроме вывода обычных символов, поддерживаются так называемые ESCAPE-последовательности, которые управляют курсором, удваивавают высоту и/или ширину символов и даже переключают банки шрифтов и переопределяют символы (что, впрочем, возможно только на ATmega328P, где памяти гораздо больше, чем у ATmega8). Таким же образом можно получить версию прошивки и прочую диагностическую информацию.
Поскольку все материалы доступны и открыты для доработки, мы решили немного поэкспериментировать и создать на базе этого шилда русифицированный вариант. Имя “TellyMate”, подобно Arduino, является торговой маркой – поэтому пришлось назвать наш вариант Freeduino Teleсhat :
Все детали – PTH, поскольку шилд задумывался изначально в формате кита для самостоятельной сборки – и что может быть лучше, чем собрать всё самостоятельно? 😉 Пины RX/TX имеют перемычки под пайку с обратной стороны платы, так что при желании их можно перерезать и подпаять к любым другим пинам. Аналогичным способом отключается и кнопка сброса – если не хотите, чтобы МК шилда сбрасывался синхронно со скетчем Arduino.
Краткое руководство по сборке шилда:
Русифицированный шрифт мы разместили точно таким же способом, что и автор – в виде ссылки на документ в GDocs, копию которого при необходимости можно сохранить у себя. В открытом документе надо зайти на последнюю закладку, генерирующую hex, и скопировать ее содержимое в файл fontbank0.c , подменив его в исходниках (можно скачать со страницы проекта). После компиляции получите прошивку c поддержкой кодовой страницы 866. Именно она и зашивается в ATmega8, входящие в комплект наборов Freeduino TeleChat.
Для вывода русского текста потребуется еще кое-что сделать. Как известно, ArduinoIDE хранит все символы в кодировке UTF-8, и для нормальной работы потребуется их транслировать в кодировку 866. Делать это в оригинальной прошивке нам показалось святотатством – авторы очень скрупулезно рассчитали все задержки в коде. Предлагаем самый простой вариант перекодирующей функции:
byte c1 = 0; void tele_print_char(char cd) < byte c = cd; if (c >= 0x80) < // UTF-8 handling if (!c1) < c1 = c; >else < if (c1 == 0xd0) < if (c == 0x81) Serial .print (char (0xf0)); // Ё else Serial .print ((char ) (c – 0x10)); > if (c1 == 0xd1) < if (c == 0x91) Serial .print (char (0xf1)); // ё else Serial .print ((char ) (c + 0x60)); > c1 = 0; > > else Serial .print (cd); > void tele_print_str(char *s) < for (int i=0;i TVout TV; unsigned char x, y; void setup () < TV.start_render(_NTSC); >void loop ()
Предполагается, что базовые принципы работы и программирования Arduino – подобных микроконтроллеров вам известны, так что автор решил не растекаться мыслью по древу, порекомендовав ознакомится с командами библиотеки ниже:
- begin(mode) Начало вывода информации на экран. Разешение стандартное — 128х96
- begin(mode,x,y) Начало вывода информации на экран. Разешение определяется пользователем аргументами x,y
- end() Очистка видеобуфера
- force_vscale(sfactor) Force the number of times to display each line.
- force_outstart(time) Force the time to start outputting on an active line.
- force_linestart(line) Force line to start outputting on.
- set_vbi_hook(func) Set the function to be called once per vertical blanking period.
- set_hbi_hook(func) Set the function to be called once per horizontal blanking period.
- hres() Команда возвращает значение горизонтального разрешения,
- vres() Команда возвращает значение вертикального разрешения,
- char_line() Команда возвращает значение количества символов, которые поместятся в строку.
- set_pixel(x,y,color) Установка цвета пикселя по заданным координатам
- get_pixel(x,y) Установка пикселя с заданными координатами в качестве точки отсчета.
- fill(color) Заливка экрана заданным цветом.
- clear_screen() Очистка экрана.
- invert() Инвертирование изображение на экране.
- shift(distance,direction) Прокрутка экрана на заданную дистанцию в любом из 6 направлений.
- draw_line(x0,y0,x1,y1,color) Создание прямой с координат (x0,y0) до координат (x1,y1).
- draw_row(row,x0,x1,color) Заполнение строки с координатами от x0 to x1 заданным цветом.
- draw_column(column,y0,y1,color) Заполнение столбца с координатами от у0 до у1 заданным цветом.
- draw_rect(x,y,w,h,color,fillcolor) Отображение прямоугольника с началом в координатах (x,y) с размерами(h,w), и заполнение заданным цветом.
- draw_rect(x,y,w,h,color) Отображение прямоугольника с началом в координатах (x,y) с размерами(h,w).
- draw_circle(x,y,radius,color,fillcolor) Отображение окружности с центором в координатах (x,y) с радиусом (RADIUS) и его заполнение заданным цветом
- draw_circle(x,y,radius,color) Отображение окружности с центором в координатах (x,y) с радиусом (RADIUS).
- bitmap(x,y,bmp,i,width,height) Отображение заданного изображения в координатах..
- print_char(x,y,c) Печать символа в координатах (x,y).
- set_cursor(x,y) Установка позиции для вывода слеующего символа.
- select_font(font) Установка шрифт для вывода текста.
- print() Вывод текста.
- println() Вывод пстой строки.
- printPGM() Вывод строки с текстом из памяти программы.
- tone(frequency) Тональный сигнал с заданной частостой.
- tone(frequency,duration) Тональный сигнал заданной частоты и длительности.
- noTone() Прикращение вывода тонового сигнала.
Arduino и TV
Слово от переводчика: когда-то, когда страна и деревья были большими, а воображение просто безграничным, была у меня мечта – возможность выводить изображение с моего программируемого микрокалькулятора Электроника МК-61 (ну, там графики всякие, кривые, картинки ) на экран телевизора. Времена были дикие позднесовковые, и не то что игровая приставка и очень персональный МИКРОкомпьютер («Правец 8Д» или «Специалист» или «Сикнклер»), но и видеомагнитофоны были в диковинку. В общем, народ требовал зрелищ и те, кто помнит цикл учебно – развлекательных публикаций для программируемых калькуляторов под общим названием «Путь к Земле» (журнал «Техника – Молодежи») меня поймут.
Если кратко, то в виде научно-фантастического романа с неплохим сюжетом описывалось путешествие двух идиотов случайных знакомых – профессионального космонавта и мажора кибернетика с Луны на Землю. Отдельной остроты всему сюжету придавало то, что путешествовали они на т.н. «Лунолете», то есть малом космическом судне с химическим двигателем, предназначенным для передвижения в условиях прямой видимости над лунами и прочими небесными телами похожими на биллиардный шар с простым рельефом. В каждом выпуске цикла присутствовало упрощенное правда, но вполне обоснованное математическое описание каждого маневра как в условиях сильной (относительно) гравитации близкого небесного тела, так и при влиянии на небесный снаряд героев гравитаций Земли и Луны, а также программа для расчета очередного этапа полета. В общем, глядеть на циферки на экране калькулятора не то чтоб доставало, но хотелось красивых кривых на экран (как в ЦУПе).
С другой стороны, не будем забывать что даже примитивные микроконтроллеры семейства Arduino на порядок превосходят по производительности не только микропроцессоры тогдашних флагманов – МК-52 и МК-61, но и вычислительные возможности некоторых 8-битовых игровых приставок поздних времен (Atary 2600 и прочих Рембо так точно).
В общем, вступление вышло слегка затянутым, так что перейдем к теме сегодняшнего занятия – выводе видеоизображения с Arduino на экран телевизора.
К сожалению, конструктивные особенности Arduino позволяют выводить только монохромное (черно – белые) изображения, хотя и это может быть полезным в некоторых проектах, а ЧСВ поднимет у нубов так точно…
Шаг первый. Детали и ПО
Вам понадобятся:
Детали и агрегаты:
- Микроконтроллер Arduino
- Телевизор (без него точно никуда)
- Макетная плата или шилд для Arduino
- 2 резистора номиналом 470 Ом и 1 Ком
- 2 двухпиновых монтажных переходника папа-папа
- Экранированный телевизионный кабель с тюльпаном на конце
Программное обеспечение:
Шаг второй. Сборка
От имени автора прошу прощение за пахабное низкое качество изображения готового ТВ – переходника. Поясняется это тем, что при написании инструкций, сначала надо их писать, а потом уже приступать к сборке с тщательным фотофиксированием всех этапов. В нашем же случае, получилось все с точностью до наоборот, так что из мутного изображения готового переходника понять что-либо просто невозможно.
Гораздо лучше, что куда и как паять, поясняет принципиальная схема, к тому же состоящая всего из нескольких деталей.
Sync — цифровой вывод 9 микроконтроллера
Video — цифровой вывод 8 микроконтроллера
GND — вывод GND микроконтроллера
Шаг третий. Программирование
Самая веселая часть – программирование.
В принципе, уже вышла новая версия ТВ – библиотеки, однако она еще более глючна нестабильна чем R5.91, которую использует автор, так что лучше качайте библиотеку по приведенной выше ссылке.
Текс программы для ленивых тех, кому лень перенабирать код с копии экрана:
Предполагается, что базовые принципы работы и программирования Arduino – подобных микроконтроллеров вам известны, так что автор решил не растекаться мыслью по древу, порекомендовав ознакомится с командами библиотеки ниже:
- begin(mode) Начало вывода информации на экран. Разешение стандартное — 128х96
- begin(mode,x,y) Начало вывода информации на экран. Разешение определяется пользователем аргументами x,y
- end() Очистка видеобуфера
- force_vscale(sfactor) Force the number of times to display each line.
- force_outstart(time) Force the time to start outputting on an active line.
- force_linestart(line) Force line to start outputting on.
- set_vbi_hook(func) Set the function to be called once per vertical blanking period.
- set_hbi_hook(func) Set the function to be called once per horizontal blanking period.
- hres() Команда возвращает значение горизонтального разрешения,
- vres() Команда возвращает значение вертикального разрешения,
- char_line() Команда возвращает значение количества символов, которые поместятся в строку.
- set_pixel(x,y,color) Установка цвета пикселя по заданным координатам
- get_pixel(x,y) Установка пикселя с заданными координатами в качестве точки отсчета.
- fill(color) Заливка экрана заданным цветом.
- clear_screen() Очистка экрана.
- invert() Инвертирование изображение на экране.
- shift(distance,direction) Прокрутка экрана на заданную дистанцию в любом из 6 направлений.
- draw_line(x0,y0,x1,y1,color) Создание прямой с координат (x0,y0) до координат (x1,y1).
- draw_row(row,x0,x1,color) Заполнение строки с координатами от x0 to x1 заданным цветом.
- draw_column(column,y0,y1,color) Заполнение столбца с координатами от у0 до у1 заданным цветом.
- draw_rect(x,y,w,h,color,fillcolor) Отображение прямоугольника с началом в координатах (x,y) с размерами(h,w), и заполнение заданным цветом.
- draw_rect(x,y,w,h,color) Отображение прямоугольника с началом в координатах (x,y) с размерами(h,w).
- draw_circle(x,y,radius,color,fillcolor) Отображение окружности с центором в координатах (x,y) с радиусом (RADIUS) и его заполнение заданным цветом
- draw_circle(x,y,radius,color) Отображение окружности с центором в координатах (x,y) с радиусом (RADIUS).
- bitmap(x,y,bmp,i,width,height) Отображение заданного изображения в координатах..
- print_char(x,y,c) Печать символа в координатах (x,y).
- set_cursor(x,y) Установка позиции для вывода слеующего символа.
- select_font(font) Установка шрифт для вывода текста.
- print() Вывод текста.
- println() Вывод пстой строки.
- printPGM() Вывод строки с текстом из памяти программы.
- tone(frequency) Тональный сигнал с заданной частостой.
- tone(frequency,duration) Тональный сигнал заданной частоты и длительности.
- noTone() Прикращение вывода тонового сигнала.
Шаг четверый. Завершение
Или все же старт? Возможностей и способов использования ТВ – вывода Arduino на самом дела масса, не говоря уже про простое использование Arduino в качестве игровой приставки.
MRETV – набор библиотек для Arduino, реализующий видеовыход, вывод стереозвука и работу с устройствами ввода
Обычно для получения от Arduino видеосигнала применяют либо внешнее аппаратное устройство TellyMate, либо библиотеку arduino-tvout. Во втором случае дополнительный микроконтроллер становится не нужен, но разрешающая способность изображения мала. Набор библиотек MRETV, о котором рассказывает автор Instructables под ником Mr. E, сочетает преимущества обоих способов: микроконтроллер один, как во втором случае, а разрешение – такое же, как в первом. Но и это ещё не всё: одновременно с решением в фоне каких-либо задач можно выводить не только изображение, но и стереозвук, а также работать с устройствами ввода.
Для подключения внешних устройств мастер собирает несложные схемы на резисторах, диодах и конденсаторах. Начинает он со схемы для снятия видеосигнала. Это простейший микшер, смешивающий сигналы яркости и синхронизации в определенной пропорции. Схемы для различных видов плат отличаются только номерами выводов для снятия этих сигналов.
Мастер собирает эту схему в вариантах для “тюльпана” и S-Video. Во втором случае вход для сигнала цветности по понятной причине не задействуется.
Чтобы проверить видеовыход в действии, мастер устанавливает библиотеки (архивы с ними и примерами лежат здесь, более новая версия – здесь) в Arduino IDE вручную, автоматическая установка не подойдёт. Для этого он закрывает все окна, относящиеся к IDE, после чего помещает библиотеки из архива в папку libraries этой среды программирования, а примеры – в её же папку Examples. И для начала запускает такой скетч:
Убедившись, что фраза “Hello world” на телевизор выводится, мастер экспериментирует с примерами:
SimpleDisplay.ino – интерфейс ввода-вывода к существующим проектам
TVText.ino – Arduino в качестве внешней видеокарты
TestPattern.ino – испытательная таблица
Bounce.ino – работа с движущимися и растровыми изображениями
Наступает очередь выхода стереозвука. Здесь смешивать сигналы не требуется, но если подключать динамические головки или наушники не непосредственно, а через усилитель, не обойтись без ФНЧ. И снова – схема в двух вариантах, в зависимости от того, на каком микроконтроллере выполнена плата:
Это устройство мастер тоже собирает:
И пробует примеры:
Arudion.ino – секвенсер
ScreenTool.ino – многофункциональная утилита, требует клавиатуры (см. далее) или эмулятора терминала на ПК
Ponguino.ino – клон Pong, со звуком, требует клавиатуры (также см. далее).
Следующая задача – подключить клавиатуру или мышь (но не то и другое одновременно) устаревшего стандарта PS/2. Их осталось ещё довольно много.
С этим мастер тоже справляется:
Примеры – в основном те же самые, но новая периферия открывает и новые возможности:
TVText.ino – теперь терминал позволяет не только выводить информацию, но и вводить её
ShootEmUp.ino – игра, управление клавишами со стрелками, только ATmega328 и 2560
Ponguino.ino – теперь можно и сыграть: нажать j, затем управлять клавишами WASD, потом, когда придёт пора подключать датчики, можно будет изготовить аналоговые контроллеры
KeyboardTool.ino – развитие утилита ScreenTool
Bounce.ino – подключив клавиатуру, можно попробовать больше эффектов
Arudion.ino – с клавиатурой можно попробовать больше функций, а также сыграть самому как на синтезаторе
Всё это замечательно, но после примеров хочется попробовать пользоваться функциями MRETV и в своих программах. Мастер рекомендует пользоваться не монитором последовательного порта Arduino IDE, а эмулятором терминала с более развитым набором функций. Далее показано, как обращаться к функциям библиотек из своих программ. Можно пользоваться всеми упомянутыми выше интерфейсами одновременно, по одному или в любых сочетаниях.
Работа с видеовыходом:
Работа с аудиовыходом:
Работа с клавиатурой или последовательным вводом:
Мастер пробует подключать к Arduino различные аналоговые датчики, также поддерживаемые MRETV. Например, переменный резистор, термистор, делитель для измерения напряжения, датчик влажности, диод в качестве термодатчика, фоторезистор:
Датчики должны быть такими, чтобы напряжение на входе попадало в диапазон от 0 до +1 В, при этом достигается наилучшая точность измерения. Примеры:
Ponguino.ino – теперь можно сыграть и аналоговым контроллером
KeyboardTool.ino – см. функцию считывания с аналоговых входов
Из шлейфа жёсткого диска с интерфейсом IDE мастер изготавливает “сенсорбаторий” – переходник для удобного подключения аналоговых датчиков:
Примеры для работы с ним:
KeyboardTool.ino – пользоваться так же, как при подключении датчиков без “сенсорбатория”
DiodeCalibration.ino – автоматическая калибровка при применении диодов в качестве точных термодатчиков
1. Подключить термистор к A0, резистор на 10 кОм к C0
2. Сделать делитель напряжения: резистор на 2 кОм ровно (можно из двух резисторов на 1 кОм) к A1, резистор на 10 кОм к C1
3. Подключить от одного до четырёх диодов в качестве датчиков температуры к A2 – A5, резисторы на 10 кОм к C2 – C5.
Теперь можно приступать к калибровке.
Файл MRETV.S написан на ассемблере, он будет компилироваться только при нахождении в папке для библиотек. Файл MRETV.extensions необходим для принятия решений о том, какие расширения задействовать при компиляции.
MRETV использует для генерации видео последовательный выход, при этом на монитор последовательного порта может поступать поток случайных данных. Переключатель позволяет выбирать между аппаратной и программной передачей данных. Во втором случае одновременно с генерацией видео реализуется полный дуплекс.
Название набора библиотек происходит от ника разработчика Mr. E, а также одновременно означает Master Raster (Extended) Transmission Vision.
Источник
Подключаем Ардуино к ТВ
Небольшой урок в котором вы узнаете, как подключить Arduino к телевизору (ТВ) для отображения текста, информации и графики.
Ардуино может быть подключена ко многим устройствам, включая датчики, электромеханические детали и даже простые дисплеи. Но представьте, что вы можете подключить Arduino к телевизору и использовать его для отображения текста, информации и даже грубой графики.
Комплектующие
По традиции начинаем с деталей, которые нам нужны будут для проекта:
- 1x — Arduino Uno
- 1x — 470 Ом резистор
- 1x — 1 кОм резистор
- 1x — ТВ с композитным видеовходом
- 1x — Композитный видеокабель (разъем RCA)
Схема подключения Ардуино к ТВ
Принципиальная схема довольно простая, которую вы можете увидеть на рисунке ниже. Не забывайте, что на резисторах есть перпендикулярные полоски, которые говорят о величине сопротивления резистора.
Как это работает?
Теперь поговорим о том, как работают композитные телевизионные сигналы.
Композитные телевизионные сигналы довольно сложны и запутанны, поэтому мы рассмотрим только основы. Следует также отметить, что мы будем рассматривать только PAL, а не NTSC, поскольку у них несколько разные тайминги, и мы большей частью живем в Европе, которая использует PAL.
Скорость, с которой телевизоры показывают серию изображений для формирования движущегося изображения, называется кадрами в секунду (также известными как FPS). Поскольку каждый кадр является неподвижным изображением, и эти изображения на телевизоре рисуются по строкам, изображения отправляются на телевизор последовательно, каждый пиксель отправляется по одному за раз. Но если линия изображения является последовательными данными, как определяется яркость? В отличие от цифрового последовательного соединения сигналы PAL являются аналоговыми, а напряжение на последовательной линии определяет, насколько ярким является пиксель. На приведенном ниже графике показан график PAL и значения разных напряжений.
Если входной сигнал равен 0 В, телевизор видит это как сигнал синхронизации. В зависимости от того, как выполняется синхронный сигнал, его можно использовать для передачи ТВ одной из двух вещей:
- Горизонтальная синхронизация — готовность отобразить следующую строку на нашей картинке
- Вертикальная синхронизация — готовность к совершенно новому изображению
Напряжение между 0,3 В и 1 В — это пиксели изображения, где 0,3 В представляет черный пиксель, 1 В представляет белый пиксель, а напряжения между ними являются серыми. Цветные пиксели не будут покрываться, так как цвет очень сложный, используя сигналы фазового сдвига и цветовой синхронизации. Итак, как мы можем достичь этих уровней напряжения, если у нас нет аналогового выхода на Arduino Uno? Вот зачем наши два внешних резистора!
Arduino Uno при использовании в сочетании с библиотекой TV Out имеет два контакта: видео и синхронизацию. Вывод видеосигнала используется для передачи видеоданных (отдельные пиксели), а синхросигнал используется для синхронизации телевизора. Эти два контакта соединены вместе через R1 и R2, которые образуют простой делитель потенциалов, который дает следующие уровни напряжения.
Установка ТВ библиотеки
Начните с загрузки Arduino IDE, затем нажмите:
Sketch → Include Library → Manage Libraries
(Эскиз → Включить библиотеку → Управление библиотеками)
В открывшемся окне библиотеки выберите строку поиска и введите «TV Text».
Когда поиск будет завершен, выберите библиотеку ТВ-текста «TV Text» и нажмите «установить» (англ. — install).
Последний шаг будет включать в себя открытие встроенного примера, чтобы мы могли проверить его. Нажмите:
File → Examples → TV Out → Demo PAL
(Файл → Примеры → TV Out → Demo PAL)
Сборка устройства
Этот проект использует макет, чтобы помочь подключить Arduino Uno к двум резисторам и композитному видеокабелю. Ардуино подключен к компьютеру для легкого программирования, а также для обеспечения питания, и как только настройка будет выполнена (как показано ниже), вы можете запрограммировать Arduino и включить телевизор.
Если все идет по плану, у вас должно быть что-то похожее на экране телевизора, показанном ниже:
Это был первый урок из серии взаимодействия Ардуино и ТВ. Если мы получим хорошую обратную связь мы продолжим публикации уроков в данном направлении. Все отличных проектов.
Arduino и TV выход
В этом проекте Arduino будем использовать как TV выход для вывода изображения на телевизор, при помощи библиотеки TVout. Платформа Arduino способна выводить только черно-белую картинку. Этого может оказаться достаточно для некоторых проектов и в качестве знакомства с платформой Arduino.
Нам понадобится
- Плата Arduino — 1шт.
- Резистор 470 Ом — 1шт.
- Резистор 1кОм -1шт.
- AV-разъём (RCA) — 1шт.
- Мини-макетка — 1шт.
Принципиальная схема
Макет схемы TvOUT для Arduino
Как подключить Arduino к телевизору
Для начала сделаем RCA переходник для подключения к AV входу телевизора. Необходимо подключить 2 резистора 1 кОм и 470 Ом к центральному контакту коннектора.
Для сборки схемы я использовал мини-макетную плату, которая шла в наборе заказанного на Алиэкспресс. Рекомендую заказывать не отдельно компоненты а сразу наборы, никогда не знаешь, что может пригодится в следующем проекте.
После чего резистор 470 Ом подключить к 7 пину, чтобы подать сигнал Video. Резистор 1 кОм подключить к 9 пину Arduino, чтобы подать сигнал Sync.
Корпус коннектора «тюльпан» подключаем к пину GND на плате Arduino.
Я сделал небольшой удлинитель из проводов папа-мама.
Осталось залить скетч и подключить разъем RCA к входу AV телевизора.
Библиотека TVout для Arduino
Перед тем как писать код программы, необходимо скачать и подключить библиотеку TVout. Скачать ее можно с сайта code.google.com или в прикрепленных файлах ниже. Рекомендую скачивать последнюю библиотеку.
Перед тем как писать код, рекомендую ознакомится с библиотекой.
Описание библиотеки TVout для Arduino
Описание библиотеки TVout для Arduino
Функции установки режима
Функция begin() инициализирует вывод видеосигнала (разрешение экрана по умолчанию 128×96).
Синтаксис:
TVOut.begin(mode);
TVOut.begin(mode, x, y);
Параметры:
mode – стандарт видеосигнала:
_PAL – режим PAL;
_NTSC – режим NTSC.
Возвращаемое значение:
0 – в случае удачного соединения, 4 – в случае неудачи (недостаточно памяти для буфера вывода).
Функции задержки
Функция delay() осуществляет задержку выведенного изображения.
Синтаксис:
ms – задержка в мс с точностью: 20 мс для PAL и 16 мс для NTSC.
Функция delay_frame() осуществляет задержку выведенного изображения.
Синтаксис:
frames – количество кадров для задержки…
Функция полезна для сведения к минимуму или устранения на мерцание экрана, вызванные обновлением экрана.
Функции получения параметров
Функция hres() возвращает горизонтальное разрешение экрана.
Синтаксис:
нет.
Возвращаемое значение:
unsigned char – горизонтальное разрешение экрана.
Функция vres() возвращает вертикальное разрешение экрана.
Синтаксис:
нет.
Возвращаемое значение:
unsigned char – вертикальное разрешение экрана.
Функция char_line() возвращает максимально возможное количество символов в одной строке при выводе текстовой информации.
Синтаксис:
TVOut. char_line();
Параметры:
нет.
Возвращаемое значение:
unsigned char – количество символов.
Основные графические функции
Функция set_pixel() устанавливает цвет пикселя экрана в точке с заданными координатами.
Синтаксис:
x,y – координаты пикселя;
color – цвет пикселя:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция get_pixel() получает цвет пикселя экрана из точки с заданными координатами.
Синтаксис:
x,y – координаты пикселя.
Возвращаемое значение:
color – цвет пикселя:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция fill() заполняет экран заданным цветом.
Синтаксис:
color – цвет заполнения:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция clear_screen() очищает экран, заполняя заданным цветом.
Синтаксис:
color – цвет заполнения:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция invert() инвертирует содержимое экрана.
Синтаксис:
нет.
Функция shift_direction() сдвигает содержимое экрана.
Синтаксис:
TVOut.shift_direction(distance, direction);
Параметры:
distance – расстояние для сдвига содержимого экрана.
direction – направление сдвига:
UP=0 – вверх;
DOWN=1 – вниз;
LEFT=2 – влево;
RIGHT=3 – вправо.
Функция draw_line() соединяет на экране линией две точки.
Синтаксис:
x0,y0 – координаты первой точки;
x1,y1 – координаты второй точки;
color – цвет заполнения:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция draw_row() заполняет строку указанным цветом между двумя точками строки.
Синтаксис:
row – вертикальная координата строки;
x1,x2 – горизонтальный координаты точек строки;
color – цвет заполнения:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция draw_column() заполняет строку указанным цветом между двумя точками столбца.
Синтаксис:
column – горизонтальная координата столбца;
y1,y2 – вертикальные координаты точек столбца;
color – цвет заполнения:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция draw_rect() рисует на экране прямоугольник.
Синтаксис:
TVOut.draw_rect(x,y,w,h,color);
TVOut.draw_rect(x,y,w,h,color,fillcolor);
Параметры:
x,y – координаты левой верхней точки;
w,h – ширина и высота рисуемого прямоугольника;
color – цвет границ прямоугольника:
0 – черный;
1 – белый;
2 – инвертировать цвет.
fillcolor – цвет заполнения прямоугольника:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция draw_circle() рисует на экране круг.
Синтаксис:
TVOut.draw_ circle(x,y,r,color);
TVOut.draw_ circle(x,y,r,color,fillcolor);
Параметры:
x,y – координаты центра круга;
r – радиус круга;
color – цвет границ круга:
0 – черный;
1 – белый;
2 – инвертировать цвет.
fillcolor – цвет заполнения круга:
0 – черный;
1 – белый;
2 – инвертировать цвет.
Функция bitmap() выводит на экран растровое изображение.
Синтаксис:
x,y – координаты левого верхнего угла точки вывода;
bmp – указатель на массив памяти, где хранится картинка;
w,h – ширина, высота выводимого изображения;
Ниже рассмотрим процесс создания кода выводимых растровых изображений.
Функции вывода текстовой информации
Для применения функций вывода текстовой информации требуетя подключение файлов с включенными в библиотеку или пользовательскими шрифтами. Для подключения пользовательского набора шрифтов необходимо в скетче подключить заголовочный файл:
#include
В состав библиотеки включены следующие наборы шрифтов:
font4x6;
font6x8;
font8x8;
font8x8ext.
Функция select_font() выбирает шрифт для вывода текстовой информации.
Синтаксис:
font – шрифт, подключенный в скетче.
Функция print_char() выводит символ на экран.
Синтаксис:
x,y – позиция на экране для вывода символа;
char – символ из текущего шрифта.
Функция set_cursor() устанавливает позицию курсора для вывода текстовой информации на экран.
Синтаксис:
x,y – координаты для курсора.
Функция print() выводит на экран строку, символ или число.
Синтаксис:
TVOut.print(x,y,string);
TVOut.print(x,y,char,base);
TVOut.print(x,y,int,base).
Параметры:
x,y – координаты курсора.
base – формат вывода:
BYTE = 0;
DEC = 10 (default);
HEX = 16.
Функция println() выводит на экран строку, символ или число и в конце символ перевода строки:
Синтаксис:
TVOut.println(x,y,string);
TVOut.println(x,y,char,base);
TVOut.println(x,y,int,base).
Параметры:
x,y – координаты курсора.
base – формат вывода:
BYTE = 0;
DEC = 10 (default);
HEX = 16.
Функции вывода аудио
Функции вывода звука позволяют отправлять на телевизор через аудиовыход сигнал определенной частоты.
Функция tone() выдает аудиосигнал определенной частоты.
Синтаксис:
TVOut.tone(frequency,duration);
TVOut.tone(frequency).
Параметры:
frequency – частота аудиосигнала;
duration – длительность сигнала.
Функция noTone() прекращает выдачу аудиосигнала.
Синтаксис:
Arduino и TV выход
Программа поддержки TV входит в библиотеку Arduino , написана Майлсом Метцером, для создания монохромного композитного видео с одним чипом AVR . Очень хорошо расписана здесь .
Все аппаратные проекты , основанные на TVout с открытым исходным кодом совместимы с библиотекой TVOUT поэтому я решил сделать простой проект по дизайну Hackvision . Моя версия использует одностороннюю печатную плату. В результате, она немного больше, чем версия Hackvision . Я должен был объединить две панели в одну с 6-штырьками. С самого начала, включен USB -последовательный преобразователь, чтобы легко можно было перепрограммировать, но схема по-прежнему включает в себя свой собственный регулятор 5 вольт вместо использования питания 5 Вольт устройства USB .
- ATmega328 с Arduino Bootloader.
- 1 х 28-контактный разъем IC.
- ByVac BV 104 USB -последовательный преобразователь.
- Пять 12мм х 12мм тактильные переключатели. Technobots .
- Один 6 мм х 6 мм Тактильный переключатель.
- 2 х 1N4148 диоды.
- 1 х 1N4001 диод.
- Регулятор напряжения 1 х 78 L 05 100мА.
- 3 х 330 Ом 1/8 ватт резисторы.
- 1 х 1 k 1 / 8 Вт резистор.
- 1 х 10 K 1 / 8 Вт резистор.
- 2 х 100nF керамических конденсатор а .
- 2 х 22pF керамических конденсатор а .
- 1 х 16МГц кристалл .
- 1 х 100 uF 16 v электролитический конденсатор.
- 1 х 47 UF 16 v электролитический конденсатор.
- 2 х Гнезда.
- 1 х 2,1 мм разъем питания постоянного тока.
- 1 х 6- контактный разъем (разъем манипулятор).
- 1 х 2-контактный разъем (дополнительный разъем Wii Nunchuk ).
Прошивка Hackvision использует Arduino digital Pin 12, чтобы определить, является ли стандартный телевизор NTSC или PAL . На схеме Hackvision этот вывод связан непосредственно на массу в PAL областях. Библиотека TVout имеет специфические функции программного обеспечения – начать (режим) и начать (режим, х, у) – установить NTSC или PAL , поэтому есть некоторая гибкость при использовании digital Pin 12. По этой причине, подсоединил вывод через 330оМ; резистор вместо того, чтобы привязать его непосредственно к земле. Это может избавить вывод от раннего выхода из строя. Аудио выход на digital Pin 11. Так же добавил 330ом; резистор последовательно с выходом..
330 ом; резистор последовательно с видеовыходом на digital Pin 7, чтобы сформировать делитель на75 оМ. Будет восприниматься как «белый». На digital Pin 9, резистор 1 K обеспечивает около 300 мВ от делителя, который идет к телевизору, как уровень «черный». А ‘низкий’ на этом выводе и на digitalPin 7 вместе (то есть 0 вольт) будет приниматься телевизором в качестве сигнала синхронизации.