Komposiittividesignaalin tuottaminen Arduino-ympäristössä

Artikkelissa esitellään lyhyesti miten Arduinolla saadaan tuotettua komposiittivideota TVout kirjastoa hyväksikäyttäen.
artikkelinstarttikuva.jpg

[size=150]Lyhyesti komposiittivideo signaalista[/size]

Komposiittivideo signaali on yksi monista tavoista siirtää videokuvaa. Video signaali siirretään kahta johdinta käyttäen, siten että toinen johdin toimii maatasona ja toisessa johtimessa siirtyy videokuva. Videokuva siirtyy koodattuna analogisesti, 0voltin ja 1voltin jännitteenä. Toisin sanoen videokuva on AM-moduloitu.

Videosignaali itsessään koostuu kuvanmuodostavista vaakasuuntaisista viivoista. Nämä viivat alkavat vasemmasta ylälaidasta ja kulkevat vasemmalta oikealle siirtyen kahta riviä alaspäin (palaan tähän erikoisuuteen aivan pian). Vaakasuuntaiset viivat eivät varsinaisesti koostu pikseleistä vaan vapaasti mustan (0,3volttia) ja valkoisen (1voltti) välillä ajansuhteen muuttuvasta valoisuudesta.
gradientti - jännitevsaika.png
gradienttikuva.png
kaksivalkoista palkkia.png
kaksipalkkia.png
Viivojenvälillä lähetetään erillinen signaalikertomaan kun lähetettäväviiva päättyy ja uusi alkaa. Jos kuvan mukana haluttaisiin lähettää myös tieto viivan väreistä, tulisi se informaatio lähettää kuvan alussa niin kutsutussa color burstissa. Lisäksi lähetetään signaali kun kuvan kaikki viivat ovat lähetetty ja uutta kuvaa aletaan lähettämään.

Videosignaalissa on erikoisuus että yksi kuva (frame) muodostuu itseasissa kahdesta erillisestä kuvasta. Ensimmäisestä lähetetystä kuvasta muodostetaan kuvan rivit 1, 3, 5, 7 ja niin edelleen ja toisesta kuvasta rivit 2, 4, 6, 8 ja niin edelleen. Tätä kutsutaan kuvanlomitukseksi (interlaced video). Tästä johtuen kuvan päättävä signaali on erilainen aikaisemmin mainituille parillisille ja parittomille kuvan muodostaville kuville. Tämän vuoksi totesin aikaisemmin viivojen siirtyvän kahta riviä alaspäin kuvaa muodostettaessa.

Wikipedian artikkeli kuvanlomituksesta.

Seikkaperäinen artikkeli komposiittivideo signaalin rakenteesta ja sen generoimisesta mikrokontrolloreita käyttäen.

[size=150]Komposiittivideota arduino-alustalla valmista kirjastoa käyttäen.[/size]

Kuten edellä on kuvattu lyhyesti on videosignaalissa monia asioita jotka vaativat tarkkaa ajoittamista ja signaalistandardin hyvää tuntemusta. Onneksi Myles Metzer niminen henkilö on luonut MIT-lisenssin alaisen arduino-tvout kirjaston arduino yhteensopiville mikrokontrollereille. Kirjasto tarjoaa mahdollisuuden piirtää matalaresoluutioisen mustavalkokuvaa. Kirjastossa on myös mahdollisuudet tekstin, yksinkertaisten muotojen ja kuvien piirtämiseen.

Videosignaalin muodostamiseen käytetään kahta arduinon digitaalipinniä. Yhtä video pinniä käytetään generoimaan ohjaussignaalit, joita käytetään osoittamaan uutta riviä ja uutta kuvaa. Näiden signaalien logiikkataso on 0,0-0,3volttia. Itse kuvainformaatio lähetetään taas toisella pinnillä jonka taso vaihtelee 0,3voltin (musta) ja 1,0voltin (valkoinen) välillä. Digitaalipinnit tuottavat joko 0volttin tai 5voltin jännitteen, jonka vuoksi jännite pitää pienentää sopivaksi joka tehdään kahdella vastuksella.

Arduino Unon (ATmega328) tapauksessa nämä pinnit ovat digitaaliset 9 ja 7. Pinniä 9 käytetään luomaan ohjaussignaalit ja pinniä 7 itse videokuvan luomiseen. Vaadittavat vastukset ovat 1kiloohmi pinnille 9 ja 470 ohmia pinnille 7. Vastusten jälkeen signaalit yhdistetään yhdeksi kokonaiseksi videosignaaliksi. Tähän ei tarvita erillistä komponenttia vaan johtimet vain yhdistetään.

piirikaaviio.png
kytkentäoikeassamaailmassa.jpg

Komponenttiliittimessä ulkokuori toimii maatasona ja keskellä oleva ”tappi” toimii videosignaalin siirtoväylänä. Komponenttiliittimen saa helposti esimerkiksi vanhasta komponenttijohdosta. Kun johdon kuorii, sisältä löytyy todennäköisesti kuparisukka jonka sisällä kulkee johdin. Lähes poikkeuksetta kuparisukka on maataso ja johdin videosignaali. Tämä kannattaa kuitenkin varmistaa yleismittarilla. Ulkokuori kytketään maatasoon.
kaapeli.jpg

Kirjaston voi ladata osoitteesta code.google.com/p/arduino-tvout/ … p&can=2&q=

Ladattu Zip-paketti puretaan siten että Arduino-ympäristön kansioon libraries tulee ZIP-paketista löytyvät kansiot TVout, TVoutfonts ja pollserial.

kirjastonasennus.png

Kun kytkennät ja kirjaston-asennus on saatuvalmiiksi, voidaan kokeilla saada yksinkertainen kuva uloslaitteesta seuraavanlaisella Arduino ohjelmalla.

[code]// Ensin ladataan mukaan TVout kirjasto ja fontit tekstin esittämistä varten
#include <TVout.h>
#include <fontALL.h>

TVout TV;

void setup() {
TV.begin(PAL,120,96); //Komento aloittaa
//televisio signaalin luonnin ja
//resoluutioksi asetetaan 120x96
//(huomaa että lukujen pitää olla
//kahdeksalla jaollisia
TV.select_font(font6x8); //Valitaan käytettävä fontti.
//Tekstiä ei voi tulostaa ruudulle ennen
//kuin fontti on valittu
TV.set_cursor(0,0); //Asetetaan tekstin tulostus-
//kursori kuvan vasempaan ylälaitaan
TV.print(“Kiitos Myles Metzer”); //Tulostetaan kiitokset
//kirjaston kehittäjälle
}

void loop() {

}[/code]
Testiohjelmantulos.jpg

[size=150]Muutamia huomioita kirjaston käyttämisestä
[/size]
Koska näytettävä näkymä piirretään videopuskuriin, ei meidän tarvitse kertoa jokaisen videostriimin kuvan kohdalla uudelleen mitä haluamme näyttää ruudulla. Lisäksi piirtäminen voi kestää pitempään kuin yhtä kuvaa näytetään ruudulla, sillä videopuskuria ei tyhjennetä, ellemme niin käske.

Ei kannata käyttää normaaleja keskeytyksiä ja delay funktioita koska TVout kirjaston tv-kuvan tuottamiseksi vaaditut toiminnot vaativat tarkkaa ajastamista. Jos näitä käyttää saattaa videokuva hyppelehtiä hieman. Kirjasto tarjoaa kaksi hidastusfunktiota delay ja delay_frame. Delay toimii kuten arduinon alkuperäinen delay vaikka se ei olekaan yhtä tarkka. Delay_frame funktio taas asettaa ohjelman odottamaan tietyn määrän videostriimin kuvia.

Kirjastossa käytettävät värikoodit ovat 0 –musta, 1 - valkoinen ja 2 – käänteinen (eli jos pikseli on musta tulee piskelistä valkoinen ja jos pikseli on valkoinen tulee pikselistä musta).

Seuraavassa koodissa esitetään animointia käytännössä.

[code]#include <TVout.h>
#include <fontALL.h>

TVout TV;
char viesti[] = “Ruuvipenkki!”;
void setup() {
TV.begin(PAL,120,96);

TV.select_font(font6x8);
}

void loop() {
TV.delay_frame(72);
TV.print(0);
TV.fill(0);
TV.set_cursor(0,20);

//Animoidaan lyhyt tekstin esiintuloefekti
for(unsigned int i = 0;i<11;i++){
TV.print(viesti[i]);
TV.delay_frame(8);
}
TV.delay_frame(48);

//Piirretän neliö ja ympyrä ja vaihdetaan värit käänteisiksi
TV.draw_rect(10,40,20,20,1);
TV.delay_frame(48);
TV.draw_circle(50,50,10,1);
TV.delay_frame(48);
TV.fill(2);
TV.delay_frame(48);

//Liutetaan kuvaa ylöspäin
for(unsigned int i = 0;i<120;i++){
TV.shift(1,0);
TV.delay_frame(2);
}

//Animoidaan edestakaisin liikkuva laatikko
//ensin siten että ruutua ei tyhjennetä
//piirtokertojen välissä
for(unsigned int z = 0; z < 1; z++){
TV.fill(0);
for(unsigned int i = 0; i < 80; i++){
TV.draw_rect(i+10,40,20,20,1);
TV.delay_frame(1);
}
TV.fill(0);
for(unsigned int i = 79; i > 0; i–){
TV.draw_rect(i+10,40,20,20,1);
TV.delay_frame(1);
}
}
TV.delay_frame(24);
for(unsigned int z = 0; z < 2; z++){
for(unsigned int i = 0; i < 80; i++){
TV.fill(0);
TV.draw_rect(i+10,40,20,20,1);
TV.delay_frame(1);
}
for(unsigned int i = 79; i > 0; i–){
TV.fill(0);
TV.draw_rect(i+10,40,20,20,1);
TV.delay_frame(1);
}
}
TV.delay_frame(24);

//Animoidaan kasvava ympyrä ilman ruudun
//tyhjentämistä ja ruuduntyhjentämisen kanssa
for(unsigned int z = 0; z < 2; z++){
TV.fill(0);
for(unsigned int i = 0; i < 20; i++){
TV.draw_circle(50,50,i,1);
TV.delay_frame(1);
}
TV.delay_frame(24);
for(unsigned int i = 0; i < 20; i++){
TV.fill(0);
TV.draw_circle(50,50,i,1);
TV.delay_frame(1);
}
TV.delay_frame(24);
}
}[/code]

Video siitä miltä lopputuloksen pitäisi näyttää löytyy Vimeosta.

Kirjaston kaikki funktiot löytyvät osoitteesta code.google.com/p/arduino-tvout/wiki/FDcomplete

Mielenkiintoinen artikkeli. Voisi kokeilla, kunhan hommaan arduinon tässä lähiaikoina.
Seuraavaksi voisit tehdä jonkun pelin :mrgreen:

Pong voisi kyllä olla hauska.

Harmi ettei tuo osaa värejä. Lisäisi käyttökohteita, mutta tietysti taitaa piiristä loppua tehokin kesken sitten.

Mikähän piiri jaksaisi pistää pihalle VGA (RGBHV) tai komposiittisignaalia samalla kun lukee EGA-signaalia (TTL RGB, kaksi johtoa per väri sekä pysty- ja vaaka synkronointi). Kiinnostaisi kytkeä yksi vanhempi kone johonkin uudempaan näyttöön, kun sen oma näyttö on hajonnut.

Rakensin pongin ja siitä tämä artikkeli idea itseasissa tuli :laughing:
youtube.com/watch?v=hCJ74U4l8Po