VGA на Arduino

  • Час 29-07-2015, 18:13
  • Автор admin
  • Коментарів 0 Комент.
  • Силка url

VGA це скорочення від Video Graphics Array, протоколу відображення відео, який часто зустрічається в світі електроніки. У VGA використовується одна "частота проходження пікселів" і встановлена частота виведення відео даних горизонтально, рядок за рядком, поки весь кадр не буде відображений, а потім все починається знову.

У минулому я побудував багато проектів заснованих на VGA, але ніколи не використовував його з Arduino, тому в цьому проекті ми будемо використовувати платформу Arduino UNO для імітації VGA сигналу за допомогою безпосередньо З коду. Це абсолютно не схоже на те, як це реалізовано у відеокартах, але це цікава задача, щоб побачити, наскільки добре ми знаємо і розуміємо Arduino і мікроконтролери AVR, а також VGA протокол. Робота пристрою показана на відео.

VGA на Arduino

Мета і огляд цього проекту

Метою даного проекту є використання Arduino UNO для стандартного виводу зображення з червоним, зеленим і синім кольором на комп'ютерний VGA монітор. Крім Arduino UNO я використовував невелику плату з роз'ємом VGA, яку я зробив для свого попереднього проекту «Відеокарта для мазохіста», щоб легше підключати монітор.

Для того, щоб вивести червоний, зелений і синій кольори на комп'ютерний VGA монітор, ми повинні домовитися про дозвіл, який ми будемо намагатися імітувати. Наприклад, 800x600 зручно, оскільки використовуються цілі круглі числа, і частота проходження пікселів становить 40МГц. І можна імітувати VGA дозвіл 800x600 і виводити 200 ліній червоного, 200 ліній зеленого і 200 ліній синього кольорів. Оскільки Arduino UNO працює на частоті 16МГц, неможливо отримати доступ до кожного пікселя, тому ми будемо виводити цілком лінії.

Елементи:
Arduino UNO
Плата з роз'ємом VGA
Перемички (проводу)
Комп'ютерний монітор VGA
Роз'єм для батареї +9В
Роз'єм для батарей

Докладний список елементів

Всі елементи, використовувані в цьому проекті перераховані вище, але основні елементи описані більш детально.

Arduino UNO
Arduino Uno це мікроконтролер, який робить всю роботу в цьому проекті, виконує наш код і видає VGA сигнали, які відповідають тому, що ми хочемо вивести на монітор без особливих проблем.

Плата з роз'ємом VGA
Ця плата спочатку була зроблена для мого проекту Відеокарта для мазохіста, щоб легко підключати монітор, але я пишу все більше і більше статтею на тему VGA, тому він надзвичайно корисний.

VGA на Arduino

Перемички
Звичайні перемички. Ми будемо використовувати їх для підключення Arduino до VGA монітор. Також можна використовувати дроти з штирькамі або крокодилами.

Огляд схеми

Це один з тих випадків, коли схема проекту дуже мала, тому що велика частина роботи відбувається в програмі. Кілька необхідних з'єднань показані на схемі.

VGA на Arduino

Особливості схеми

RGB з'єднання
У VGA використовується змішування червоного, зеленого і синього кольорів для отримання всіх кольорів веселки. Параметри на кожному з цих контактів показують монітора, наскільки інтенсивно повинен горіти цей колір. Ми не регулюємо інтенсивність кольору, тому у нас завжди для кожного з кольорів 100% червоного, 100% зеленого або 100% синього.

Hsync і Vsync з'єднання
Для того щоб знати, яка лінія зараз відображається і завершений кадр, використовується два сигналу синхронізації: ??горизонтальна синхронізація H-SYNC і вертикальна синхронізація V-SYNC. Це найважливіші сигнали, і якщо їх таймінги будуть порушені, то VGA вихід не буде працювати як треба.

GND з'єднання
У VGA роз'ємі є багато GND висновків для розробників, щоб зробити професійний VGA контролер. Але для того, що ми робимо, потрібно всього лише підключити до GND 5 контакту. Всі!

Основи теорії VGA

У специфікації VGA описується відображення колірних даних, горизонтальної і вертикальної синхронізації, і про певного часу на кожну дію, яку не можна пропускати.
Arduino UNO тактується кварцовим генератором 16МГц і одна інструкція виконуватися за один цикл, що означає, що кожна інструкція в нашій програмі буде виконуватися точно за (1/16000000) секунди або приблизно 62,5 наносекунди.

VGA на Arduino

Так як кожна інструкція виконується 62,5 наносекунди, і ми повинні проводити синхронізацію в певний час, важливо, що кожен час з картинки вище ділитися на 62,5 наносекунди, а це значить, що ми можемо використовувати інструкції з затримкою, щоб отримати ідеальний час для синхронізації.

VGA на Arduino

При використанні 800x600VGA, кожний рядок закінчується горизонтальним імпульсом синхронізації, який повідомляє монітора дані наступного рядка. Після синхронізації 601 лінії, монітор очікує імпульс вертикальної синхронізації тривалістю 4 лінії. В цей момент є пауза в 23 лінії. Завдяки вертикальної синхронізації і задньої площадки рядкового гасить імпульсу, лінії з'являються, але інформація про колір не використовується.

Апаратна частина

Це напевно одна з найпростіших зібраних схем, про які я писав. Беріть Arduino UNO, перемички і VGA роз'єми і починайте збірку!

Складання схеми
На фотографії ви можете бачити всі деталі, необхідні для складання схеми, наведеної раніше. Спочатку підключіть до GND 5 контакту VGA роз'єми. Потім підключіть контакти червоного, зеленого і синього кольорів. Нарешті, з'єднання Hsync і Vsync виконані, і монітор може зрозуміти, в якому дозволі і у будь-який момент ви хочете показати щось на ньому. Я використовую плату від свого попереднього проекту. Про її виготовленні можна дізнатися тут.

VGA на Arduino

Апаратна частина готова. Давайте перейдемо до програмної частини і подивимося, як все це реалізовано.

Програмна частина

Є дві основних частини коду, які ви побачите, пояснити і докладно описані нижче:
   - Колір для циклів + Hsync
   - Вертикальна синхронізація

3 цикли використовуються для створення трьох різних кольорів, що відображаються на екрані. Ось витяг з коду для генерації 200 ліній червоного кольору. Час вказано в коментарях, і ви можете легко перевірити відповідність.

while(i lt; 200){ //Green Color High GREEN_ON; //2.2 uS Back Porch delayMicroseconds(2); __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); //20uS Color Data delayMicroseconds(20); // 1uS //Green Color Low GREEN_OFF; //Low //1uS Front Porch delayMicroseconds(1); // 1uS i++; //3.2 uS Horizontal Sync HSYNC_HIGH; //HSYNC High delayMicroseconds(3); __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); HSYNC_LOW; //HSYNC Low //26.4 uS Total }

В наступному уривку коду видно, що вертикальна синхронізація виглядає майже так само, як висновок звичайних горизонтальних ліній. Різниця в тому, що замість того, що б вважатися в пікселях, як Hsync (128 пікселів), вертикальна синхронізація вважається в лініях (4 лінії).

//VSYNC High VSYNC_HIGH; //4 Lines Of VSYNC while(ilt;4){ //2.2 uS Back Porch delayMicroseconds(2); __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); //20 uS Of Color Data delayMicroseconds(20);// 20uS //1uS Front Porch delayMicroseconds(1); // 1uS i++; //HSYNC for 3.2 uS HSYNC_HIGH; //High delayMicroseconds(3); __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); HSYNC_LOW; //Low //26.4 uS Total } //Clear The i counter i=0; //VSYNC Low VSYNC_LOW;

Це основна частина коду, але його більше, і ви можете ознайомитися з ним, завантаживши исходник. Ми написали програму, зібрали апаратну частину, і тепер настав час перевірити пристрій і подивитися на його роботу!

Результат роботи і примітки

На відео показаний висновок VGA сигналу з Arduino UNO на комп'ютерний VGA монітор. Ніяких хитрощів та трюків, просто робота програми, і сигнали синхронізації.

Червоний, зелений і синій кольори з'являються на моніторі відразу після включення живлення без спотворень. Сподіваюся, цього достатньо, щоб переконати вас, що ця система дійсно працює, і ми виводимо VGA 800x600 @ 60 Гц.

Огляд VGA на основі Arduino

Як ви вже зрозуміли, VGA досить важко виводити за допомогою Arduino в дозволі 800x600, а отримання повноцінної картинки використовуючи тільки Arduino в принципі неможливо, але ми використовуємо гнучкість VGA в нашу користь і виводимо спрощені речі. На екран виводяться червоний, зелений і синій кольори, доводячи, що ми можемо виводити спрощений VGA.

Що тепер робити?
Я не рекомендував би витрачати занадто багато часу на висновок VGA сигналів за допомогою Arduino, так як це виходить набагато складніше із-за вимог до таймінгів. В кінцевому рахунку ви, ймовірно, розчаруєтеся в цьому методі. Є багато VGA контролерів, з якими Arduino може взаємодіяти, що сильно спрощує висновок речей на VGA монітор. Я впевнений, що є Arduino shield, дає таку можливість.

Висновок
Якщо ми перечитаємо мети даної статті, то ми зрозуміємо, що у нас все вийшло. Три кольори на екрані, як і очікувалося. Програма була досить складною, але реалізується. Однак, динамічний VGA вихід набагато цікавіше...

Прикріплені файли:
  • VGA.rar (1 Кб)
Tags

Коментарі до новини