CW Keyboard Encoder/Decoder

Aperto da trodaf_4912, 18 Giugno 2017, 12:14:12

Discussione precedente - Discussione successiva

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

trodaf_4912

Finito. E' un CW Keyboard Encoder/Decoder in pratica decodifica il CW e lo trasmette attraverso una tastiera da PC invece dell'utilizzo del tasto. E' dotato di un display LCD a 2 righe per 16 colonne. La riga superiore visualizza i caratteri trasmessi mentre quella inferiore quelli ricevuti, il tutto in modo slegato tra loro. La tastiera consente la trasmissione automatica di 12 messaggi (F1-F12) precedentemente codificati oltre ovviamente ai singoli caratteri alfanumerici e simboli mantenendo il classico rapporto uno a tre tra il punto e la linea. In ogni caso e' possibile modificare la velocita' di trasmissione ed il tono attraverso il potenziometro presente il tutto in tempo reale e cioe'mentre si trasmette. Come decodificatore ho usato un sw gia' presente in rete che utilizza l'algoritmo d Goertzel e cioe' una versione alleggerita della FFT per microcontrollore e attraverso 4 dip switch e' possibile selezionare la BW. In questo sw pero' il display visualizza i caratteri ricevuti su entrambe le linee del display mentre io volevo tenere distinte la riga superiore per i caratteri trasmessi e quella inferiore per quelli ricevuti e quindi ho dovuto modificarlo.
L'HW e' molto semplice, e' presente un microcontrollore che fa' tutto e un 74HC14 per pulire e squadrare i segnali di clock e data provenienti dalla tastiera. Quest'ultima e' di tipo XT/AT ed e' gestita ad interrupt dal microcontrollore. Ogni volta che premo un tasto leggo lo scancode di posizione e lo converto prima in carattere alfanumerico maiuscolo e poi, attraverso una ulteriore LOOK UP Table lo converto nei punti e linee relativi, che sono poi trasmessi. E'possibile collegare l'ingresso audio per la decodifica all'uscita audio del ricevitore attraverso un jack oppure l'utilizzo di un microfono a condensatore e porlo vicino alla sorgente audio (altoparlante del ricevitore.Nel primo caso si regola il volume del ricevitore per una corretta ricezione, nel secondo caso si regola un potenziometro che pero' attualmente non ho previsto in quanto mi basta avvicinare o allontanare il microfono dalla sorgente audio. La prima soluzione e' quella preferibile in quanto non capta rumori ambientali. Ho assegnato ai tasti ESC e TAB la funzione di cancellazione asincrona delle righe superiore e inferiore del display. La visualizzazione su quest'ultimo, sia per i caratteri trasmessi che per quelli ricevuti, avviene da destra a sinistra e cioe' dalla posizione 15 alla posizone 0. Quelli piu' a sinistra vengono eliminati. In pratica sono due scritte scorrevoli indipendenti. Come si puo' vedere al momento non e' ancora inscatolato ma lo sara'a breve e i collegamenti sono tutti filati a meno della schedina microcontrollre che uso normalmente sui miei progetti e della quale horealizzato un certo numero di circuiti stampati. La programazione del microcontrollore avviene attraverso le linee SPI presenti sul doppio pettine della schedina del microcontrollore. Il micro e' quello di Arduino e cioe' l'ATMEGA328 e per lo sviluppo ho usato un Arduino UNO R3 come ICE (In Circuit Emulator) che si collega direttamente allo zoccolo della scheda icrocontrollore come si vede nella foto.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te


Carmelo_97

Complimenti per il progetto.
Potresti darci maggiori delucidazioni sul programma?
73 Carmelo IT9GHW


Inviato dal mio iPhone utilizzando RogerKApp
Pagina QRZ.COM www.qrz.com/db/IT9GHW
Sito web www.it9ghw.jimdo.com
                          STAY TUNED!

Maxxim


trodaf_4912

#3
Per quanto riguarda il decoder ho modificato nella parte di visualizzazione su display quello che e' in rete di OZ1JHM ed apparso su RR di Febbraio. L'encoder invece e' stato scritto completamente da me. Il linguaggio utilizzato e' il C/C++, il micro usato e' l'ATMEGA328 cioe' quello di Arduino tanto e' che ho usato Arduino uno R3 per lo sviluppo e il debug. A tale proposito ho creato una macro BREAKPOINT che se inserita in un punto del programma ne blocca l'esecuzione e visualizza il valore della variabile richiesta. Il programma poi riprende se premo il tasto INVIO (CR). E' una sorta di semplicissimo breakpoint sw che fa perdere il tempo reale ma che mi ha aiutato durante lo sviluppo.
Anche il decoder e' stato scritto per Arduino e quindi ho potuto usare lo stesso componente. Come si vede ho utilizzato la scheda Arduino come sistema di sviluppo, molto semplice per carita', costruendo un "naso" che si inserisce sullo zoccolo della scheda target disponendo cosi' di tutti gli I/O presenti sulla scheda madre. In questo naso non ho portato il quarzo che rimane per tutte le mie realizzazioni a 16MHz e il reset. L'alimentazione +5V e' presente e alimeta la scheda target durante lo sviluppo. Viceversa quando viene rimosso "l'emulatore" e' presente un circuito di alimentazione nativo sulla scheda target che, per evitare conflitti, viene interrotto da un dip switch quando e' Arduino a fornire i 5V. Il sw dell'ewncoder si basa sull'idea di sostituirsi al classico tasto per la telegrafia. In pratica ogni tasto premuto sulla tastiera viene letto dall'encoder e poi elaborato per ottenere la sequeza corrispondente di punti e linee che viene inviata ad un buzzer e allingresso audio del tx dove viene eseguita anche la commutazione in TX. il problema e' stato capire bene come funziona una tastiera xt/at. Infatti ogni volta che viene premuto un qualsiasi tasto un codice viene trasferito dalla tastiera al''encoder che lo legge.Il formato di lettura e' seriale a 9600baud ed e' costituito da due segnali, dati e clock, quest'ultimo varia da 20 a 30KHz e sui fronti di discesa del clock va campionato il dato seriale. Sono 8 bit dati, 1 start, 1 stop, 1 parita' e un ack bit. E' stato pertanto necessario gestire la lettura ad interrupt  dando la max priorita' a tale processo. Inoltre il codice  inviato dalla tastiera  e' un codice di posizione del tasto sulla tastiera stessa e non il codice ASCII del tasto premuto. In questo modo tutte le versioni di tastiera, italiana usa, francede tedesca etc.. inviano lo stesso codice di posizione per quel tasto fisico premuto. Ad esempio se osserviamo la tastiera del nostro PC vedremo i 5 tasti posizionati a fianco del TAB che  se letti da sx a dx soriginano la parola QWERTY. Orbene nella tastiera francese la Q non e' iln quella posizione ma c'e' la A e cosi' pure la W sostituita dalla Z e quindi leggeremmo AZERTY. In praticaa e' il PC che ricevuto il codice del tasto premuto lo elabora secondo una tabell relativa alla nazione e gli assegna il giuto carattere ASCII. In realta' le cose sono ancora un po piu' complesse in quanto l'operazione di premere e rilasciare un tasto origina 3 diversi codici che vengono inviati dalla tastiera e cioe' il primo detto SCANCODE che e' relativo alla singola pressione del tasto, un MAKECODE relativo alla pressione continuata del tasto, un BREAKCODE relativo al rilascio del tasto. Inoltre vengono inviate combinazioni di scancode se viene premuto oltre al tasto anche lo shift o il tasto ALT. Questa e' stata decisamente la parte piu' rognosa da sviluppare.Io ad esempio non cosidero i tasti SHIFT e ALT e le loro combinazioni cosi' pure il BREAKCODE e il MAKECODE ma solo lo SCANCODE e quindi rilevo e manipolo i tasti alfanumerici, e funzione per mia scelta di progetto. Una volta che ho ricevuto il codice del tasto premuto lo gestisco attraverso due serie di LOOK UP TABLE, la prima per associare al tasto il suo carattere ASCII e poi, se e' una lettera, lo converto in maiuscolo e la seconda per ottenere la sequenza di punti e linee relative al carattere ACII in questione.
faccio uso largamente di puntatori nell'ambito del sw per puntare a queste due tabelle ed inoltre per passare il buffer di trasmissione alla procedura che esegue fisicamente la creazione dei punti e delle linee. Con il carattere ACII "in mano" devo anche eseguirne la rappresentazione sul display lcd. ed in questo caso uso un buffer da 17 caratteri (16+1) che e' la fotografia della riga superiore del display. una volta che ho il nuovo carattere da scrivere lo scrivo nella posizione 17 del buffer e poi shifto a sx tutto il buffer in modo che il nuovo carattere compaia alla posizione 16 del display e venga eliminato quello alla posizione 0. In sintesi il meccanismo dell'encoder e' questo.   
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te


arkeo

Avendo una vaga idea del lavoro che ci è voluto tanto di cappello e congratulazioni!

trodaf_4912

#5
Finalmente ho trovato il tempo di inscatolarlo e fare ulteriori modifiche. Ho introdotto un mini editor che permette di associare 12 messaggi di max 50 caratteri ai 12 tasti F1-F12 della tastiera. Tutte le operazioni di commutazione tra trasmissione e ricezione sono gestite dalla tastiera PC. Questi messaggi sono utili per prememorizzare alcuni classici messaggi di risposta e si lanciano in trasmissione premendo semplicemente il tasto F corrispondente. Sono inoltre memorizzati in Eeprom e quindi anche allo spegnimento non vengono persi. Esiste tuttavia la possibilita' di cancellarli semplicemente premendo il tasto ESC all'interno della procedura di editing alla quale si accede premendo il tasto TAB. La velocita' di trasmissione WPM e' regolabile in tempo reale con il potenziometro SPEED, posizionato nella parte inferiore,anche durante la trasmissione stessa. Ho previsto due ingressi audio: uno per un microfono electret e uno per l'uscita della BF dell'RTX e un'uscita PTT verso l'RTX con possibilita' di gestire direttamente il full o semi break-in.  In ricezione la massima WPM raggiungibile prima di errori di decodifica e' 36 WPM corrispondenti a 175 caratteri al minuto. Questa limitazione e' dovuta al clock del microcontrollore. Se avessi a disposizione un micro piu' prestante potrebbe aumentare sicuramente in quanto la decodifica si basa su l'algoritmo di Goertzel che e' una versione semplificata nel campo del discreto della FFT (Fast Fourier Transformer). Aumentando il numero di campioni aumenta la precisione ma a scapito di un rallentamento del processo di decodifica e quindi e' necessario andare piu' veloci. In ogni caso gia' 30 WPM e' un bell'andare.
Allego tre foto del prototipo ed inoltre ho realizzato due video del suo funzionamento ma che non riesco a postare.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te


trodaf_4912

Aggiungo lo schema elettrico disegnato a mano per motivi di tempo. Se qualcuno vuole realizzarlo posso inviare l'l'eseguibile per caricarlo sul microcontrollore.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te


trodaf_4912

#7
Se a qualcuno interessa ho upgradato la velocita' wpm di decodifica sostituendo il quarzo da 16MHz con uno da 20MHz. Ho cambiato la frequenza di campionamento da 8928 a 11140 e ho lasciato il lacktime sempre a 1. Mantenendo la target_freq a 744Hz allora il numero di campioni e' diventato 48. Questi parametri sono all'interno del sorgente che si trova in rete per la realizzazione di un decoder CW basato sull'algorimo di Goertzel (DFT alleggerita) che utilizza tre campioni, quello corrente all'istante T, quello all'istante T-1 e quello all'istante T-2.
In questo modo sono arrivato a decodificare sino a 45 wpm corrispondenti a circa 225 caratteri/minuto. Nel programma originale e citato viene usata la funzione millis() che pero' dipende dal clock. In questo caso, dopo varie prove, ho ritenuto di non adattarla al clock incrementato in quanto funziona bene lo stesso. La gestione del display lcd non ne risente e cosi' pure l'interfaccia di ricezione della tastiera PS2/XT in quanto il campionamento del dato e' eseguito sul fronte di discesa del clock generato dalla tastiera stessa leggendo lo stato del bit esattamente alla sua meta' e quindi non cambia nulla sostituendo il quarzo. Anche la conversione A/D dei campioni del tono letti sul canale analogico/digitale funziona lo stesso ed e' piu' veloce.
Se qualcuno e' interessato a questa realizzazione sono a disposizione per chiarimenti.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te

trodaf_4912

Una cosa molto importante che mi sono dimeticato di aggiungere : occorre modificare i FUSE dell'ATMEGA328P con questi valori :
LOW FUSE          = 0xF7
HIGH FUSE         = 0xDE
EXTENDED FUSE = 0x05
Questo lo si puo fare direttamente con un programmatore tipo USBASP e con il programma gratuito EXTREME BURNER AVR che consente anche di programmare e leggere l'ATMEGA328P senza dovere creare un nuovo BOOTLOADER a 20MHz.
Insomma si sviluppa il programma con un quarzo a 16MHz poi si cambia il quarzo, si ricompila il programma con le modifiche sopra esposte, lo si scarica con il programmatore sul micro e si modificano i FUSE come indicato.
Tutto qui.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te


trodaf_4912

#9
Per Carmelo, provo ad allegare qui l'eseguibile in formato .hex

io non uso mai la scheda Arduino per il progetto finale. Sul micro di Arduino e' presente il bootloader che mi occupa spazio in memoria inutilmente e quindi il micro lo programmo con un programmatore esterno e un sw di programmazione tipo Extreme Burner versione 1.4. Per lo sviluppo  uso la scheda di arduino ma alla fine mi sgancio da quest'ultima in modo da liberare i due pin della comunicazione seriale 0e 1 che corrispondono rispettivamente ai pin 2 e 3 del micro, per poterli utilizzare per i miei scopi. Se usi la scheda di arduino questi due pin li devi lasciare liberi per la comunicazione seriale con il PC.  In questo progetto, come vedi dallo schema, sono riuscito a farne a meno per un pelo e per ottenere un pin in piu' ho usato un 74hc14 per pilotare i due led TX e RX con un solo output. Mi sono ritrovato in un cassetto una manciata di questi buffer e cosi' ho optato per il loro uso.
Se hai bisogno di altre info chiedi pure. Una cosa, il connettore PS2/XT-AT della tastiera e' normalmente un 5 poli mentre nel mio schema e' a 4 poli. Questo perche' ho dovuto tagliare quello originale per trovare i fili del CLOCK, DATA, +5, GND. Poiche' sono 4 allora ho usato un connettore a 4 poli. Ho fatto una prova di ricezione con CWPLAYER di F6DQM e sono arrivato a ricevere senza problemi a 50wpm max. In tx non ci sono problemi provato con CWGET. Per tua info il tono selezionato in ricezione deve essere 744 e il numero di campioni da passare all'algorimo e' 45. Pertanto seleziona i 4 dip switch per questi valori. Se hai problemi chiedi pure.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te

Carmelo_97

Citazione di: IK4MDZ il 19 Luglio 2017, 00:19:38
Per Carmelo, provo ad allegare qui l'eseguibile in formato .hex

io non uso mai la scheda Arduino per il progetto finale. Sul micro di Arduino e' presente il bootloader che mi occupa spazio in memoria inutilmente e quindi il micro lo programmo con un programmatore esterno e un sw di programmazione tipo Extreme Burner versione 1.4. Per lo sviluppo  uso la scheda di arduino ma alla fine mi sgancio da quest'ultima in modo da liberare i due pin della comunicazione seriale 0e 1 che corrispondono rispettivamente ai pin 2 e 3 del micro, per poterli utilizzare per i miei scopi. Se usi la scheda di arduino questi due pin li devi lasciare liberi per la comunicazione seriale con il PC.  In questo progetto, come vedi dallo schema, sono riuscito a farne a meno per un pelo e per ottenere un pin in piu' ho usato un 74hc14 per pilotare i due led TX e RX con un solo output. Mi sono ritrovato in un cassetto una manciata di questi buffer e cosi' ho optato per il loro uso.
Se hai bisogno di altre info chiedi pure. Una cosa, il connettore PS2/XT-AT della tastiera e' normalmente un 5 poli mentre nel mio schema e' a 4 poli. Questo perche' ho dovuto tagliare quello originale per trovare i fili del CLOCK, DATA, +5, GND. Poiche' sono 4 allora ho usato un connettore a 4 poli. Ho fatto una prova di ricezione con CWPLAYER di F6DQM e sono arrivato a ricevere senza problemi a 50wpm max. In tx non ci sono problemi provato con CWGET. Per tua info il tono selezionato in ricezione deve essere 744 e il numero di campioni da passare all'algorimo e' 45. Pertanto seleziona i 4 dip switch per questi valori. Se hai problemi chiedi pure.
Ok grazie vediamo se riesco a realizzare il progetto.
Grazie.


inviato iPhone using rogerKapp mobile
Pagina QRZ.COM www.qrz.com/db/IT9GHW
Sito web www.it9ghw.jimdo.com
                          STAY TUNED!

trodaf_4912

Ho realizzato questo progetto più per sfizio che altro in quanto se uno accetta di usare un PC allora con 50 euro di licenza può usare MRP40 un SW che consente di ricevere e trasmettere usando anche la tastiera dello stesso PC ed ha un innumerevoli opzioni. E
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te

trodaf_4912

Come promesso, Carmelo, reinvio lo schema elettrico. Si potrebbe fare a meno dei dip switch 3,4,5,6 settando direttamente nel sw la target_freq=744Hz e il numero di campioni = 45 liberando 4 pin per eventuali modifiche o sviluppi. Al momento ho lasciato tutto cosi'.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te


trodaf_4912

Scusate ma ho commesso un errore nello schema sulle connessioni del 74hc11 lato keyboard. Oggi lo ridisegno per bene con TinyCad e lo posto.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te

trodaf_4912

#14
Ecco lo schema corretto e leggibile ed inoltre il manuale d'uso.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te

trodaf_4912

Aggiornamento. Ho rivisto il progetto eliminando il potenziometro per la regolazione della velocita' e i dip switches per la selezione della target_frequency e del numero di samples. Queste selezioni sono possibili adesso direttamente dalla tastiera e quindi lo schema si e' semplificato . Inoltre ho recuperato un display PC2002L da 20 colonne / 2 righe con caratteri di 1 cm di altezza e quindi ben visibili. Pertanto ho modificato il FW per la nuova configurazione.
Allego schema elettrico e 2 foto del progetto inscatolato e pronto per il funzionamento.
Se qualcuno ti dedica del tempo apprezzalo sempre perché lo toglie al suo per dedicarlo a te