Arduino e TV

Ciao a tutti.
Ho da poco scoperto che è possibile collegare il nostro Arduino alla TV tramite cavo RCA. Guardando sul playground ho visto la libreria tvout e lo schema di connessione molto semplice, ho bisogno di un paio di giorni per reperire le giuste resistenze e il cavo, però ho visto che esiste anche una shield specifica, la tellymate.
Mi chiedo che differenza c'è tra usare il collegamento "semplice" visto sul playground e la tellymate, che a livello costruttivo mi pare molto più complessa.
Mi scuso se è una domanda banale, ma sono proprio all'inizio.
Grazie.

Non ne sono sicuro, ma credo che sulo shield ci sia un processore dedicato perche' l'Amtel non è abbastanza potente per generare segnali video.
Credo, aspettiamo pero' qualcuno che se ne intende.

Innanzitutto grazie per l'interessamento.
Sicuramente la tellymate shield (link: Batsocks - TellyMate Shield ) permette qualcosa in più rispetto al normale collegamento del cavo RCA all' Arduino, da quel poco che ho capito è possibile scrivere sulla TV utilizzando il comando serial come se si usasse la seriale, batsocks fornisce anche un sistema per la creazione di caratteri, e credo utilizzi sequenze di controllo predefinite già implementate.
Devo capirci meglio qualcosa, comunque penso che le stesse cose siano fattibili utilizzando la libreria tvout e il solo Arduino.
Arduino Pong | Video here: www.youtube.com/watch?v=m_PoMv7Mt… | Flickr
Probabilmente si vedrebbero i limiti hardware e di memoria su applicazioni più complesse, comunque esistono varie shield per collegarsi alla Tv, c'è anche la videogame shield, hackvision che usa un Arduino dedicato come tellymate, rimango in attesa anch'io di qualcuno più informato!!

L'arduino, o meglio l'Atmega328, basta ed avanza non solo a generare un segnale video B/N, ma lo può generare anche a colori e gestire contemporaneamente effetti sonori e codice del giocatore.
Sono un paio di mesi che mi documento e la cosa, anche se non alla portata di tutti (i progetti che si trovano online sono stati scritti prevalentemente in assembly), è sicuramente fattibile.

Ecco un po' di link:
http://avga.prometheus4.com/ AVGA
http://belogic.com/uzebox/ Uzebox: questo progetto è fantastico
tvText • benryves.com Generazione segnale con 2 resistenze

L'Uzebox, di cui esiste anche una versione basata su chip DIP (Fuzebox) fa capire di cosa sia realmente capace un chip Atmega.

Ne conosco altri di link ma ora a mente non mi vengono. Ma se fate una ricerca su internet ci sono un sacco di cose a giro.
Io sto studiando appunto di realizzare un microcomputer basato su uno Z80 ed usare un Arduino o un Atmega "solitario" come GPU.

Ti ho visto scrivere su altri post, so che ti stai muovendo in quella direzione, sono molto interessato al tuo progetto, una cosa per volta, adesso devo riuscire a tirare fuori sto benedetto segnale alla tv, con un collegamento del genere riesco a vedere qualcosa sulla TV?
http://www.arduino.cc/playground/Main/TVout
Mi serve una cosa semplice per cominciare, avevo già visto quei link, ma il 90% per me è arabo, magari piano piano..
p.s. grazie delle delucidazioni so che sei molto avanti.

TVOut è simile a TvText, usa cioè 2 resistenze esterne come DAC per convertire il segnale generato dall'Arduino in segnale composito video (un DAC è un convertitore digitale/analogico).

Entrambi sono basati sul sistema di gestire la generazione video tramite interrupt.

Credo che rispetto ad altri progetti scritti in assembly, la risoluzione usata sia da imputarsi alla velocità raggiungibile dal C compilato, inferiore rispetto all'assembly puro.

L'arduino, o meglio l'Atmega328, basta ed avanza non solo a generare un segnale video B/N, ma lo può generare anche a colori e gestire contemporaneamente effetti sonori e codice del giocatore.

Da non crederci!

Quindi sarebbe DAVVERO possibile usare una arduino per ricostruire un intero Commodore 64! :-? L'idea balzana mi passava per la testa l'altro giorno... Se è davvero così veloce, basterebbe affiancargli una memorietta da 64 KB... e riscrivere l'intero OS del Commodore 64 in Arduino-C . O non è così semplice? I programmi possono risiedere in una memoria esterna?!?

Intanto ti invito a visitare il link di Uzebox che ho pubblicato qualche post sopra.

Poi ti sfato subito un mito, uno scoglio contro cui mi sono schiantato anch'io. Gli Atmega ad 8 bit NON possono gestire programmi esterni alla propria memoria per cui anche se teoricamente fattibile, l'emulazione di un computer ad 8 bit quale il C64 su un unico uC la vedo cosa molto dura.
Tieni conto che il C64 non era solo il 6510: ad esso c'erano affiancati il VIC-II ed il SID, più altri chip secondari per la gestione del resto del computer.

Per ricreare un mini C64 all'interno di un unico mC dovresti scrivere tanti emulatori quanti sono i chip di quel computer. Fatto questo, dovresti poi inserire un emulatore della macchina, poi il KERNAL ed il BASIC del C64, la sua mappa caratteri ecc... Ad oggi, difatti, non ho visto nessun computer ad 8 bit riprodotto in un Atmega.

Grazie leo72, mi farebbe piacere sapere a che punto sei con il tuo progetto visto che ti sei già scontrato con diversi problemi, mi piacerebbe realizzare un semplice SO capace di visualizzare e modificare file di testo da una scheda SD, magari mi metti nella direzione giusta.

Sto studiando sui fogli. :sunglasses:
Siccome il progetto è complesso, sto studiando gli integrati che mi serviranno perché con una famiglia da mandare avanti non posso permettermi di ordinare chip su chip, quindi meno sbaglio e meglio è ;D

Al momento ho un progetto di massima su cosa il mio microcomputer dovrà fare però il vero problema sarà poi la programmazione dello Z80, che non ho mai affrontato dato che io in passato ho programmato i chip MOS 65xx

Ti suggerisco anche questo link, se vuoi seguire la mia strada:
http://www.benryves.com/projects/z80computer
contiene un sacco di info ed esperimenti sugli Atmega e sugli Z80 usati per realizzare un microcomputer tipo quello che vorrei fare io.

Poi ti sfato subito un mito, uno scoglio contro cui mi sono schiantato anch'io. Gli Atmega ad 8 bit NON possono gestire programmi esterni alla propria memoria per cui anche se teoricamente fattibile, l'emulazione di un computer ad 8 bit quale il C64 su un unico uC la vedo cosa molto dura.

Ma io non parlavo di emulazione! Parlavo proprio di "riprodurre" o "ricreare" nativamente un C64 atmel-based!
Emulare un processore a 8 bit tramite un altro processore a 8 bit non mi sembra fattibile, anche se il C64 andava a 1 MHz.
Pero' non mi ricordavo del VIC-II ma solo del SID... :-? Pero' abbiamo già visto che l'atmel puo' creare segnali video autonomamente, quindi non servirebbe, forse. L'audio poi non sarebbe indispensabile, trattandosi di un progetto puramente dimostrativo...
Il vero grosso problema sarebbe riscrivere da zero un OS in assembly, anche se solo di una 30ina di kb! :-?
Ma fino a quanta RAM arrivano ad avere gli Atmel? O meglio, quanta memoria-programma... come si chiama, "EEPROM interna"?!? :-?

Il SID era il chip audio, il VIC-II era il chip grafico (immagine e sprite).

Detto questo, non ho capito cosa vuoi fare, allora. Emulare un sistema (CPU, computer o quel che sia) significa riprodurne le funzioni tramite un differente hardware. Ricreare un C64 usando un Atmega significa in buona sostanza emularne le funzioni, no?
E per simulare un OS devi scrivere anche un emulatore della macchina su cui gira quell'OS, altrimenti come puoi ad esempio dirgli di scrivere la lettera "A" nella prima locazione dello schermo se non hai riprodotto l'hardware del C64?

Cmq, il SO del C64 era composto da diverse parti: c'era il KERNAL, ovvero il SO vero e proprio, poi la mappa caratteri (sempre in ROM), e l'interprete BASIC che fungeva da interfaccia e da linguaggio. Per non parlare di tutte quelle decine di KB di RAM usate per le impostazioni del sistema (pagina 0), i dati degli sprite del VIC-II, i dati audio del SID ecc... (Commodore 64 memory map)

Detto questo, dovrai anche ricreare un sistema per gestire l'Input dall'utente e l'output su qualche dispositivo, altrimenti il computer sarebbe inusabile. Quindi devi scrivere tutte le routine per gestire una tastiera e mandare l'output su qualcosa: un LCD o una TV che dir si voglia.

Insomma, NON è assolutamente un progetto facile. Ed usare un solo Atmega mi pare quasi impossibile. Considera che l'Atmega328 dell'Arduino ha solo 32 KB di Flash RAM (quella dove è possibile inserire il codice da eseguire): l'Eeprom interna è usabile solo come memoria non volatile ma non come memoria per il codice; l'SRAM interna viene usata dall'Atmega come spazio per le variabili del programma.

Il SID era il chip audio, il VIC-II era il chip grafico (immagine e sprite).

Detto questo, non ho capito cosa vuoi fare, allora. Emulare un sistema (CPU, computer o quel che sia) significa riprodurne le funzioni tramite un differente hardware. Ricreare un C64 usando un Atmega significa in buona sostanza emularne le funzioni, no?

Per me un emulatore è una "cosa SW", un programma che fa finta di essere un computer.

E per simulare un OS devi scrivere anche un emulatore della macchina su cui gira quell'OS, altrimenti come puoi ad esempio dirgli di scrivere la lettera "A" nella prima locazione dello schermo se non hai riprodotto l'hardware del C64?

Allora diciamo che più precisamente mi chiedevo se sarebbe tenicamente possibile fare il porting del S.O. del C64 da 6502 ad Atmel.

Cmq, il SO del C64 era composto da diverse parti: c'era il KERNAL, ovvero il SO vero e proprio, poi la mappa caratteri (sempre in ROM), e l'interprete BASIC che fungeva da interfaccia e da linguaggio. Per non parlare di tutte quelle decine di KB di RAM usate per le impostazioni del sistema (pagina 0), i dati degli sprite del VIC-II, i dati audio del SID ecc... (Commodore 64 memory map)

Detto questo, dovrai anche ricreare un sistema per gestire l'Input dall'utente e l'output su qualche dispositivo, altrimenti il computer sarebbe inusabile. Quindi devi scrivere tutte le routine per gestire una tastiera e mandare l'output su qualcosa: un LCD o una TV che dir si voglia.

Insomma, NON è assolutamente un progetto facile. Ed usare un solo Atmega mi pare quasi impossibile. Considera che l'Atmega328 dell'Arduino ha solo 32 KB di Flash RAM (quella dove è possibile inserire il codice da eseguire): l'Eeprom interna è usabile solo come memoria non volatile ma non come memoria per il codice; l'SRAM interna viene usata dall'Atmega come spazio per le variabili del programma.

Si', s', tutto l'ambaradam; se ho capito bene ci sono Atmel anche da 128 KB, quindi mi chiedevo, appunto, se sarebbe possibile il porting.
Ma solo per curiosità, non credo che sarei in grado di farlo io. A casa ho un libro col disassemblato commentato di tutta la ROM del C64, e una volta mi misi ad esaminare come funziona punto per punto, fino a scoprire la routine che andava ad accendere uno per uno i pixel sullo schermo per stampare i caratteri! :wink:

Ma, sempre per capire, sulla Arduino si puo' montare un qualunque Atmel compatibile a livello di piedini?

Cioe', questo potrebbe diventare un commodore sessantaduino? ;D

il mega!! ti basta la rom 128k :stuck_out_tongue:

auguri però a riscriverti tutto....

Appunto: il problema non è tanto il "farci stare tutto", il problema è proprio il "riscrivere tutto".

Un conto è scriversi un mini SO per far fare ad un 6502 qualche sciocchezza, un conto è scrivere un emulatore di un computer. Fattibile ma a costo di mesi di lavoro. Ed il gioco, alla fine, non vale la candela: tanto vale realizzare un clone, spendi meno e ci metti meno tempo.

ma infatti non ho intenzione di farlo, mi chiedevo solo se fosse tecnicamente possibile.
Visto che lo è... immagino che quacuno prima o poi lo farà!
Magari è persino possibile farlo in automatico, se il set di istruzioni Atmel è più grande di quello del 6502, e immagino che sia cosi'.
Per curiosità, sapete dove trovare i set di istruzioni di un Atmel 128K (o 64K) e del 6502? :slight_smile:

Per il 6502 puoi vedere qui:
http://e-tradition.net/bytes/6502/6502_instruction_set.html

Per l'Atmega, quelli ad 8 bit usano tutti lo stesso set. Guarda sul sito di Atmel.

Ciao ragazzi, ci sono novità, ieri notte, appena ho potuto, ho provato a collegare Arduino al mio televisore lcd fullHD INNO HIT da 19'' utilizzando lo schema nel playground:
http://www.arduino.cc/playground/Main/TVout
Caricato lo sketch DemoPAL, sullo schermo non visualizzo nulla, o meglio, il segnale alla TV arriva, ma con qualità pessima, posso dire che la "demo" viene visualizzata perchè ho visto l'output che genera su youtube e riesco ad intravedere qualcosa nel nero dello schermo.
Devo capire se la scarsa qualità del segnale è dovuta alla pessima realizzazione del collegamento del cavo RCA dalla breadboard alla televisione, in effetti nella fretta, e con i pochi strumenti a disposizione (non ho un saldatore e non ho mai effettuato una saldatura, per ora..) ho usato un cavo RCA tagliato, infilando nella breadboard il filo del segnale utile "+", e la calza opportunamente "arrotolata", senza utilizzare alcun connettore.
Devo provare anche a collegarmi ad un televisore a tubo catodico e, nel caso visualizzassi correttamente, capire se devo aggiungere altri componenti o modificare lo sketch.
Oggi, se faccio in tempo compro un saldatore!
Sono in attesa di questo componente, ho chiesto eventualmente la disponibilità a Robotitaly, sennò lo prendo qua:
http://www.homotix.it/prodotti.cfm?IdProdotto=1377
Sto trovando difficoltà, ma sono fiducioso nella riuscita del progetto!
Grazie per l'attenzione dedicatami e mi scuso se la lettura è un po' pesante, ma scrivo di argomenti che non conosco bene.

Allego lo sketch DemoPAL che ho usato senza alcuna modifica.

#include <TVout.h>

TVout TV;
unsigned char x,y;

void setup()  {
  x=0;
  y=0;
  TV.start_render(_PAL);      //for devices with only 1k sram(m168) use TV.begin(_PAL,128,56)
}

void loop() {
  TV.clear_screen();
  x=0;
  y=0;
  for (char i = 32; i < 127; i++) {
    TV.print_char(x*6,y*8,i);
    x++;
    if (x > TV.char_line()) {
      y++;
      x=0;
    }
  }
  TV.delay_frame(50);
  TV.clear_screen();
  TV.print_str(0,0,"fill screen pixel");
  TV.print_str(0,8,"by pixel");
  TV.delay_frame(50);
  TV.clear_screen();
  for(x=0;x<TV.horz_res();x++){
    for(y=0;y<TV.vert_res();y++){
      TV.set_pixel(x,y,1);
    }
  }
  TV.delay_frame(50);
  TV.clear_screen();
  TV.print_str(0,0,"draw some lines");
  TV.delay_frame(50);
  for(y=0;y<TV.vert_res();y++){
    delay(10);
    TV.draw_line(0,y,x-y,y,2);
  }
  TV.delay_frame(50);
}

Ciao ragazzi, ci sono novità, ieri notte, appena ho potuto, ho provato a collegare Arduino al mio televisore lcd fullHD INNO HIT da 19'' utilizzando lo schema nel playground:
Arduino Playground - TVout

Ti aggiri di notte coperto dalle tenebre così che nessuno possa vedere le tue malefatte. ;D

Io penso che la scarsa qualità non dipenda dal collegamento volante, l'importante che calza e polo centrale non si tocchino e alle volte sembra così ma a guardare bene poi un malefico filicino della calza tocca e non tocca il polo centrale.

Però potrebbe anche essere il RCA tagliato, danno problemi in campo audio figuriamoci con segnale video composito. Poi si potrebbe vedere di amplificarlo se è troppo debole.

Ciao.

:slight_smile: Mi aggiro di notte coperto dalle tenebre così che nessuno possa vedere le mie malefatte.. è vero!
stasera provo a rifare i collegamenti decentemente sempre con il sistema di ieri, facendo attenzione, come da tuo consiglio. Per quanto riguarda amplificare il segnale, come posso fare??
Grazie MauroTec!

EDIT: Ho rifatto i collegamenti un po' meglio, ho riprovato, ma niente, mi viene il dubbio che cappello in qualcosa, disperato ho cambiato la resistenza da 1k con una da 10k e, alla fine l'output è minimamente più leggibile, quel tanto che basta da rendermi conto che vengono visualizzate solo le righe verticali, delle lettere, della frase draw some lines, e infine una riga al lato sinistro dello schermo che scende in verticale.
Secondo voi cosa devo tentare? Dove sbaglio? Consigli? Suggerimenti?

Allego la foto dello schema di collegamento, le resistenze sono in verticale perchè le ho infilate direttamente nei pin per limitare i collegamenti al minimo.

Uploaded with ImageShack.us