Arduino e TV

Dai leo che ci portiamo avanti! Grazie anche a MauroTec.
Ciao.

Sei più fuori di me :wink: sono 04:41, ed ho pure sonno, ma resisto.

Mi sà che leo è come si suol dire tra le braccia di Morfeo.

Se vuoi cambiare da tastiera USA ad IT, si quelli sono i codici da cambiare, devi vedere però quali sono quelli da inserire.

Per leo scrivo qui:
Mi son trovato davanti i file include di avrlibc iom128.h e iom328.h.

Il 128 ha:
#define SPM_PAGESIZE 256
#define RAMEND 0x10FF /* Last On-Chip SRAM Location */
#define XRAMEND 0xFFFF <---------------
#define E2END 0x0FFF
#define E2PAGESIZE 8
#define FLASHEND 0x1FFFF

il 328:
/* Constants /
#define SPM_PAGESIZE 128
#define RAMEND 0x8FF /
Last On-Chip SRAM Location */
#define XRAMSIZE 0
#define XRAMEND RAMEND <----------
#define E2END 0x3FF
#define E2PAGESIZE 4
#define FLASHEND 0x7FFF

Quindi no Xetended Ram per il 328, niente malloc.
Solo ram esterna che devi gestire con codice scritto a manina.

Ciao.

Sei più fuori di me sono 04:41, ed ho pure sonno, ma resisto

Quando si dice: "da perderci il sonno". :slight_smile:

Se vuoi cambiare da tastiera USA ad IT, si quelli sono i codici da cambiare, devi vedere però quali sono quelli da inserire.

Si, ma dove li trovo?? mi servirebbero anche un paio di esempi, perchè anche avessi quelli giusti, non capisco se sto procedendo nel modo corretto!
A questo link ho trovato 3 scan code set, ma devo sapere come posso provare quei valori!
http://www.computer-engineering.org/ps2keyboard/
Grazie.

@leo

Non l'avevo notato questo progetto. Cmq qui sono collegati 2 Arduino, il secondo chip può essere anche un Atmega nudo e crudo, appunto.

Basta precaricarci lo sketch del TellyMate. Adesso devo vedere la libreria PS2 che pin di input usa: se non usa quelli RX/TX (cioè D0, D1) siamo a posto. Si può costruire un mini terminale con l'input letto dall'Arduino e l'output inviato all'Atmega che lo visualizza sulla TV.

Io sto usando il pin 8 e il 2
TvOut usa i pin 7 e 9, il pin 11 per l'audio (eventualmente), era questo che volevi sapere?

Si, ma dove li trovo??

Non nè ho la più pallida idea, forse negli Header di X11, ma valli a trovare.

Non puoi inviare "s" via seriale, in pratica la variabile dello switch "switch (s) {"
Esempio nel caso "s = 0x70" esegue
c = PS2_INSERT; break;

Ok ciao mi devo allontanare.
Torno fra 30:00 min forse?
Ciao.

Hai preso l'esempio più azzeccato!
INSERT
Il tasto non viene visto benchè sia "codificato" perchè nel file .h è ignorato
#define PS2_INSERT 0 //valore zero infatti
Quale valore va inserito al posto di 0 ?
Ora, al link:
http://www.computer-engineering.org/ps2keyboard/scancodes2.html
Keyboard Scan Codes: Set 2
il tasto ha valore di make E0,70 e break E0,F0,70
C'è attinenza? devo prendere per buoni quegli Scan Codes ?
Un po' sarà l'ora, mettici pure la mia ignoranza cronica, ma non ci sto capendo più un piffero!

/* Previous versions of this library returned a mix of ascii characters

  • and raw scan codes (if no ASCII character could be found). There was
  • no way to determine if a byte was ascii or a raw scan code. With
  • version 2.0, only ASCII is returned, plus the special bytes above.
  • These raw scan codes are never returned by read() anymore.

Tieni conto che io ho solo il codice che hai postato.
Sopra il commento dice che nella versione 2.0 solo acsii viene ritornato no scancode. Quindi 0x70 è mappato per essere insert, e 0x75 e mappato come tasto su.

Quindi dovrebbe funzionare, quali tasti non corrispondono?

I tasti che non vengono visualizzati sono quelli ignorati settati a 0 nel file .h
Es.
#define PS2_INSERT 0
tutti i tasti F, HOME, END e SCROLL,

Se fai caso sempre nel file .h i tasti BACKSPACE e DEL hanno entrambi numero 127 infatti producono lo stesso risultato cioè la stampa su seriale
Nel file .cpp se guardi questa parte di codice:
</del> <del>switch (s) {             case 0x70: c = PS2_INSERT;           break;             case 0x6C: c = PS2_HOME;           break;             case 0x7D: c = PS2_PAGEUP;           break;             case 0x71: c = PS2_DELETE;           break;               case 0x69: c = PS2_END;                   break;             case 0x7A: c = PS2_PAGEDOWN;    break;             case 0x75: c = PS2_UPARROW;       break;             case 0x72: c = PS2_DOWNARROW;  break;             case 0x74: c = PS2_RIGHTARROW;  break;             case 0x4A: c = '/';                          break;             case 0x5A: c = PS2_ENTER;            break;             default: break;</del> <del>
Insert, home, end, sono riportati benchè settati a 0 sul file .h e ovviamente non producono risultato, gli altri settati a 0 come i tasti F o SCROLL non sono proprio riportati nel file .cpp
Mah, magari se dai un occhiata alla libreria, sicuramente qualcosa sfugge alla mia comprensione..
..ah va bene pure se prima ti fai qualche ora di sonno!! :slight_smile:

Quelli definiti con #define sono codici ascii che deve ritornare.
Nel caso di Enter:
case 0x5A: c = PS2_ENTER; break;

se pigiando il tasto enter la tastiera emette un codice 0x5A, allora c=13 valore ascii.

Mi semra di capire che non tutti i tasti sono definiti, dal momento che hai la seriale, perche non gli invii come dicevo prima il valore della variabile s, così ti puoi mappare tutti itasti che vuoi.

Ciao si tra un pò mi spengo.

Buongiorno. Sì, ad un certo punto sono andato a letto ::slight_smile:

1) ma che file state analizzando? Io li ho diversi.
Li avete presi da qui o no?
~~http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html~~
~~http://www.pjrc.com/teensy/arduino_libraries/PS2Keyboard.zip~~
Mio errore. Era rimasto un vecchio ZIP nella barra di Chrome ed ho aperto la versione errata.

  1. ammesso che stiate usando quei file (che a me non tornano), la questione dei pin usabili è che si può cambiare il pin DATA ma non il pin CLK, che è mappato obbligatoriamente o sul pin 2 o sul pin 3 dell'Arduino (quelli di interrupt).

leo io sto usando la libreria PS2Keyboard 2.0 il file l'ho preso dalla pagina che mi hai linkato tu qualche post sopra dicendo che era l'ultima versione, il file si chiama semplicemente PS2Keyboard.zip
Si ti confermo come scritto nel commento della libreria puoi usare solo il pin 2 o 3 (interrupt) è un problema per collegare un secondo Atmega?
Sulla foto vedo che l' Arduino principale ha solo il pin 1 TX occupato..

Mauro dopo provo a fare come dici, ma non lo so se ho capito bene..leo tu un occhiata alla storia dei tasti non mappati l'hai data?

Non ce l'ho data perché non ho un connettore femmina PS/2 per fare delle prove ne' una tastiera da sacrificare per un taglio di spinotti.
Avrei trovato un vecchio adattatore PS2-DB9 però devo fare delle prove per vedere come sono cablati i pin e sono senza tester perché il mio me lo hanno distrutto i miei figlioli qualche tempo fa... ::slight_smile:

Oggi poi sono stato tutto il pomeriggio fuori casa e da domani torno a lavoro. Conto però, facendo il turno pomeridiano, di poter dedicare qualche ora della mattina.

Senti ma per cominciare ad attaccare l'altro ATmega ad Arduino, basta che uso gli stessi piedini sul mic che usa l'Arduino della foto senza bisogno si aggiungere altri componenti?
Serve alimentazione esterna?

Beh, io partirei dallo schema del TellyMate, così sei sicuro di attaccare i pin alle giuste porte dell'Arduino.

L'alimentazione la prendi direttamente dall'Arduino: d'altronde lo shield fa così, quindi va senz'altro.

Siccome sono bloccato perché ancora il programmatore non mi è arrivato ed il mio Atmega è lì che mi guarda senza poter far nulla, mi son messo a rileggere le specifiche del TellyMate.

Collegando solo il pin TX puoi mandare unicamente dati al TellyMate senza poter ricevere da esso informazioni, nel senso che è solo un sistema passivo: gli dici di scrivere "A" e lui scrive "A". Collegando anche il pin RX diventa attivo, nel senso che puoi chiedergli se nella locazione 0,0 c'è un carattere.

Nota2:usando TX e/o RX, l'uso del TellyMate taglia fuori l'uso di qualsiasi altro componente che comunichi con l'Arduino tramite seriale.

Siccome sono bloccato perché ancora il programmatore non mi è arrivato ed il mio Atmega è lì che mi guarda senza poter far nulla, mi son messo a rileggere le specifiche del TellyMate.

Io ho Arduino 2009 quindi penso che posso programmare l'ATmega semplicemente mettendolo su Arduino.

Nota2:usando TX e/o RX, l'uso del TellyMate taglia fuori l'uso di qualsiasi altro componente che comunichi con l'Arduino tramite seriale.

Questo impedirebbe l'uso di dispositivi esterni di output come la tastiera

Collegando solo il pin TX puoi mandare unicamente dati al TellyMate senza poter ricevere da esso informazioni, nel senso che è solo un sistema passivo: gli dici di scrivere "A" e lui scrive "A". Collegando anche il pin RX diventa attivo, nel senso che puoi chiedergli se nella locazione 0,0 c'è un carattere.

Questo è vero, ma comunque, ne permetterebbe l'utilizzo, se volto solo a visualizzare o leggere dati da un file, che verrebbe fatto da Arduino e poi mandato all' ATmega.
Purtroppo non ho i 2 1n4148 quindi non posso fare delle prove.

Mi domando se entrambi leggessero da una memoria comune, questo problema non si presenterebbe?

Con l'Arduino 2009 tu puoi farlo ma non mettendo il chip semplicemente sullo zoccolo. Devi fare il ponticello con il connettore ISP oppure programmarlo mettendolo su breadboard.

Ho riguardato la libreria PS/2 e dovrebbe usare solo quei 2 pin in lettura, il DATA e l'IRQ. Poi i dati mandandoli via seriale andrebbero sul TellyMate, quindi fino a qui non ci sono problemi.

Non ti servono i diodi per fare il collegamento al cavo TV. Io l'ho fatto senza e va benissimo. Bastano le 2 resistenze.

L'altro giorno ho provato con TvOut a mettere i font su una EEPROM ma non sono riuscito a visualizzare nulla. Non so se ho cannato qualcosa a livello di codice (probabile) oppure se è proprio per una questione di tempi di accesso. Ieri parlando con un mio amico ingegnere elettronico, mi ha confermato comunque che accedendo a RAM esterna bisogna valutare bene i timing perché basta perdere anche un colpo di clock che va tutto alle ortiche. Quindi per ora credo proprio che la strada dell'invio dei dati ad un Atmega che funga da chip video sia la più praticabile.

Stamattina ho pensato anche al possibile circuito.
Sull'Arduino scheda verrebbe messo l'ìinterprete Bitlash compilato con la libreria PS/2 e relativi input da tastiera per leggere l'input dall'utente mentre l'Atmega esterno, il TellyMate, sarebbe collegato tramite TX/RX e fungerebbe da chip video.

Non è difficile, vorrei solo che mi arrivasse 'sto ca@@o di programmatore... è 18 gg che l'ho ordinato, maledette feste.... >:(

Devi fare il ponticello con il connettore ISP

Eh??

Non ti servono i diodi per fare il collegamento al cavo TV. Io l'ho fatto senza e va benissimo. Bastano le 2 resistenze.

Come mai sono riportati nella foto?

il TellyMate, sarebbe collegato tramite TX/RX e fungerebbe da chip video.

Non avevamo detto che usando TX e RX non sarebbe stato possibile usare altri componenti che comunico con Arduino via seriale?

non puoi programmare un bootloader semplicemente mettendo il chip nello zoccolino. Devi usare o l'Arduino come programmatore (come riportato qui: http://arduino.cc/en/Tutorial/ArduinoISP) oppure facendo un ponticello dal chip FTDI al connettore ISP. Ma non mi chiedere di più perché sono cose che ho letto sul forum ma che non ho sperimentato non avendo il 2009.

Qualcuno li aggiungeva ma in realtà non servono a meno che tu non ci attacchi la corrente o la tua TV vada in corto, avendo quindi un ritorno di corrente verso l'Arduino. Ripeto, io l'ho fatto senza.

Sì, però ho visto che sia la libreria PS/2 in realtà non necessita di TX/RX dato che legge la tastiera dal pin DATA.
Ora, siccome il TellyMate sarebbe il dispositivo solo da mettere in ricezione, puoi mandargli i dati tramite semplice Serial.print fatto proprio da Bitlash.
Quindi credo che ALMENO SULLA CARTA le 3 cose possano coesistere. Ma non posso dartene la certezza finché non provo.

Ok capito!

Uploaded with ImageShack.us

Cerca di avere pazienza, queste cose non l'avevo mai fatte, stavo vedendo i pin su Arduino a quali corrispondono su ATmega, sulla foto l' Arduino tellymate è alimentato dall' Arduino main su 5V e GND tali pin di Arduino sull' ATmega corrispondono al 7 e l' 8 ? Non devo aggiungere altro tra Arduino a l' ATmega?
Grazie.

Qui hai lo schema dell'Arduino:

Così vedi quali pin vanno su quali porte.

P.S.:
non posso aiutarti di più perché sono a lavoro e non posso "spippolare" più di tanto :wink:

Grazie!!
Senti ho dato un occhiata qua:

Questa è la parte che mi interessa..
Minimal Circuit (Eliminating the External Clock)

Se dai un occhiata ci sono due schemi di collegamento, da quello che ho capito uno è per caricare il bootloader e l'altro per caricare gli sketches sull' ATmega "solo"

Ora, nel mio caso io ho un ATmega con bootloader UNO, quindi posso caricare gli sketch usando il collegamento Arduino TX RX --> ATmega su breadboard?

Non ho capito bene una parte:

you can burn the bootloader and upload programs onto your ATmega328 as described above. Be sure to select "ATmega328 on a breadboard (8 MHz internal clock)" when burning the bootloader. (If you select the wrong item and configure the microcontroller to use an external clock, it won't work unless you connect one.)

In realtà "ATmega328 on a breadboard (8 MHz internal clock)" andrà caricato sull' Arduino-programmatore?
Poi cambiando collegamenti, Arduino capirà che lo sketch che carico andrà sull'ATmega solo?

Ho scaricato il firmware del Tellymate, ci sono una vagonata di file, dove vanno inseriti? In che modo poi faro l'upload??

Ho un bel po' di confusione in testa..!! :o