Обычно для получения от Arduino видеосигнала применяют либо внешнее аппаратное устройство TellyMate, либо библиотеку arduino-tvout. Во втором случае дополнительный микроконтроллер становится не нужен, но разрешающая способность изображения мала. Набор библиотек MRETV, о котором рассказывает автор Instructables под ником Mr. E, сочетает преимущества обоих способов: микроконтроллер один, как во втором случае, а разрешение — такое же, как в первом. Но и это ещё не всё: одновременно с решением в фоне каких-либо задач можно выводить не только изображение, но и стереозвук, а также работать с устройствами ввода.

Конечно, от Arduino или совместимой с ним платы для одновременной реализации всего этого требуется довольно много ресурсов. Поэтому набор библиотек работает только с платами на микроконтроллерах ATmega168, 328 и 2560. О работе, скажем, на платах с микроконтроллерами ATmega8 или ATtiny85 (например, Digispark) речь не идёт.

Для подключения внешних устройств мастер собирает несложные схемы на резисторах, диодах и конденсаторах. Начинает он со схемы для снятия видеосигнала. Это простейший микшер, смешивающий сигналы яркости и синхронизации в определенной пропорции. Схемы для различных видов плат отличаются только номерами выводов для снятия этих сигналов.

Мастер собирает эту схему в вариантах для «тюльпана» и S-Video. Во втором случае вход для сигнала цветности по понятной причине не задействуется.

Чтобы проверить видеовыход в действии, мастер устанавливает библиотеки (архивы с ними и примерами лежат здесь, более новая версия — здесь) в Arduino IDE вручную, автоматическая установка не подойдёт. Для этого он закрывает все окна, относящиеся к IDE, после чего помещает библиотеки из архива в папку libraries этой среды программирования, а примеры — в её же папку Examples. И для начала запускает такой скетч:

#include "MRETV.h"
#include "textfont.h"
char mystring[]="Hello world";
void setup(){
Screen.begin(textfont,mystring,2*fontheight,6,30,30,1);
}
void loop() {}

Убедившись, что фраза «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, а эмулятором терминала с более развитым набором функций. Далее показано, как обращаться к функциям библиотек из своих программ. Можно пользоваться всеми упомянутыми выше интерфейсами одновременно, по одному или в любых сочетаниях.

Работа с видеовыходом:

 Скетч здесь//1. parts
#include // MRETV itself
#include // a font, default fontheight is 8
uchar Screenbuf [20 * 20]={
" Use a string here to set your initial display"}; // some place to put display data, 20 rows of 20 characters

// 2. begin
void setup(){
Screen.begin(textfont,Screenbuf, 20*fontheight,20,20,20,1); // start video output
// (font, buffer, ScreenHeight (pix), ScreenWidth (chars), top (pix), left (pix), mode) top and left are centering, mode=1 for normal text
}

//3. update screen
volatile uint a,depth=0;
void loop(){
for(a=5000;a;a—);// slow us down
Screen_progstr(8,0,"Speed "); // update information as needed
Screen.dec(56-((int)depth/300));
Screen_progstr(11,0,"Depth ");
Screen.hexint(depth++);
}

Работа с аудиовыходом:

//1. parts
// MRETV uses a special file ArduinolibrariesMRETVMRETV.extensions to hold information about extended functions
// like sound generation. (To know why see the expert section.) To use sound you need to define an Audio type , we will
// '#define monoaudio' in this file. (see the 'default_extensions' in MRETV.extensions now.)

#include // MRETV itself
#include // a font, default fontheight is 8
#include "saw.h" // some sound samples
PROGMEM const char * sounds [] = { // optional array of sound samples, must be called 'sounds[]' and in progmem.
sawCo4,sawDbo4,sawDo4,sawEbo4,sawEo4,sawFo4,sawGbo4,sawGo4,sawAbo4,sawAo4,sawBbo4,sawBo4};
uchar Screenbuf [20 * 20]={
" Use a string here to set your initial display"}; // some place to put display data, 20 rows of 20 characters

// 2. begin
void setup(){
Screen.begin(textfont,Screenbuf, 20*fontheight,20,20,20,1); // start video output, sound is enabled at the same time
// (font, buffer, ScreenHeight (pix), ScreenWidth (chars), top (pix), left (pix), mode) top and left are centering, mode=1 for normal text
}

//3. update screen
volatile uint a,depth=0;
void loop(){
for(a=4000;a;a—);// slow us down
Screen_progstr(8,0,"Speed "); // update information as needed
Screen.dec(56-((int)depth/300));
Screen_progstr(11,0,"Depth ");
Screen.hexint(depth++);

//3. update sound
if (!(depth&0x07f)) switch(depth/0x80){ // beep now and then
case 1:
ssample(sawBo4,50); // play a sample directly (sample, duration (1/60sec) )
break;
case 17:
depth=0;
break;
default:
if( (depth/0x80)>5) setaudio((depth/0x80)-6,15); // play a sample from the array (sample, duration (1/60sec) )
break;
}
}

Работа с клавиатурой или последовательным вводом:

//1. parts
// in 'ArduinolibrariesMRETVMRETV.extensions' we will
// '#define monoaudio'
//'#define firmwaremultiport // keyboard and serial
// #define translatekeys // no rawkey up/down stuff
// #define mergstreams // handle both together

#include // MRETV itself
#include // a font, default fontheight is 8
#include "saw.h" // some sound samples
PROGMEM const char * sounds [] = { // optional array of sound samples, must be called 'sounds[]' and in progmem.
sawCo4,sawDbo4,sawDo4,sawEbo4,sawEo4,sawFo4,sawGbo4,sawGo4,sawAbo4,sawAo4,sawBbo4,sawBo4};
uchar Screenbuf [20 * 20]={
" Use a string here to set your initial display"}; // some place to put display data, 20 rows of 20 characters

// 2. begin
void setup(){
Screen.begin(textfont,Screenbuf, 20*fontheight,20,20,20,1); // start video output, sound, keyboard and serial extensions
// (font, buffer, ScreenHeight (pix), ScreenWidth (chars), top (pix), left (pix), mode) top and left are centering, mode=1 for normal text
}

volatile uint a,depth=0,Speed=56;
void loop(){
uchar chin; //character in from serial/keyboard stream
for(a=4000;a;a—);// slow us down

//3. update incomming information
switch(chin=Video.readS()){ // a character from serial (with keyboard merged)
case 0: // no character received from input
break;
case 's': // s from input
setaudio(0,35);
break;
case 0x0d: // from input
depth=0xfff8&(depth+0x8);
depth-=1;
break;
}

//3. update screen
if(chin){
Screen_progstr(8,0,"Speed "); // update information as needed
Screen.dec(Speed-((int)depth/3));
Screen_progstr(11,0,"Depth ");
Screen.hexint(depth++);

//3. update sound
if (!(depth&0x07)) switch(depth/0x8){ // beep now and then
case 1:
ssample(sawBo4,50); // play a sample directly (sample, duration (1/60sec) )
break;
case 17:
depth=0;
break;
default:
if( (depth/0x8)>5)setaudio((depth/0x8)-6,15); // play a sample from the array (sample, duration (1/60sec) )
break;
}
}
}

Мастер пробует подключать к 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.

Источник (Source)

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Источник: usamodelkina.ru