"Decodifica" sequenza di note con arduino

La "selettiva" di cui parli è la DSC usata dalle forze dell'ordine e non solo, visto che fa parte del GMDSS (codifica marina), ma direi di non complicare troppo le cose.

Però le informazioni che hai dato ancora non sono proprio sufficienti (almeno per me) per poter trovare una possibile soluzione, tutto il discorso può variare abbastanza in base ad alcuni fattori per cui provo ad elencare quelli che mi vengono in mente, che ti consiglio comunque di prendere in considerazione (a meno che tu non l'abbia già fatto, ma non avendolo detto non so :wink: ):

  1. tipo di informazioni da trasmettere: bastano i 12 simboli del DTMF (numeri 0-9 più i due simboli "*" e "#" delle tastiere) o servono anche altri caratteri? Certo, si potrebbero "ricodificare" altre informazioni con questi 12 simboli, ad esempio se mando un asterisco questo deve essere seguito da 3 cifre che identificano un carattere ASCII (ma ciò comporta la necessità di trasmettere ben 4 toni DTMF per ogni carattere "extra")

  2. affidabilità della trasmissione: dato che possono capitare interferenze che potrebbero impedire la trasmissione di tutti gli elementi, sono dati importanti e quindi serve un metodo di correzione degli errori? quindi si può o deve configurare ad esempio una risposta ACK ad ogni pacchetto ricevuto per confermare la ricezione, o NAK per chiedere la ritrasmissione)?

  3. tipologia di trasmissione: qual è la quantità di informazioni da mandare in ogni "pacchetto" e quale la velocità minima necessaria di trasmissione?

Praticamente tutti questi aspetti sono legati ovviamente tra loro.

Assumendo per ora che la codifica DTMF vada bene per questioni di praticità e relativa semplicità, e che ci sia un Arduino che trasmette ed uno che riceve.

Quindi per trasmettere ed evitare di usare altri accrocchi, ti consiglierei di provare ad implementare un piccolo convertitore passivo D/A con R/2R come QUESTO oppure con un circuitino D/A su I2C come QUESTO.

Per il ricevitore, credo che possa bastare quello che già ti avevano suggerito, vedi ad esempio QUESTO.

Una volta fatto un piccolo "lab" con due Arduino connessi localmente, il resto è un problema solo software e di codifica.

Quella è la ZVEI-1: Google: ZVEI-1

Generare la sequenza con Arduino è un gioco per lattanti; :slight_smile: Decodificarla con Arduino da solo, sarà un po' più laborioso. Prima di tutto, devi amplificare il segnale fino a ottenere livelli logici (0-5V); poi, con pulseIn devi identificare una per una le note. Se cominci con una sequenza lenta, è facile; bisogna vedere, poi, quanto riesci a velocizzare.

Datman:
Quella è la ZVEI-1: Codifica ZVEI-1

Si, vero. Ma comunque non è semplice da gestire, per cui non serve... :wink:

Datman:
Decodificarla con Arduino da solo, sarà un po' più laborioso.

Appunto, a meno che non stia progettando un sistema radio per la Protezione Civile e/o non abbia tempo in abbondanza da dedicare a questo progetto, la cosa non è proprio semplice, e limitandosi ai DTMF potrebbe bastargli. Ma non conoscendo le caratteristiche richiete né l'ambito di applicazione, non serve sbilanciarsi con spunti tecnologicamente interessanti ma difficili da implementare :wink:

Decodificare la ZVE-1 con Arduino:
Google: ZVEI-1 Arduino

Per decodificare la ZVE-1 con solo Arduino, c'è la possibilità di arrivare a un risultato, perché è un solo tono per volta; decodificare il DTMF con solo Arduino, invece, è impossibile.

Datman:
Google: ZVEI-1 Arduino

Ma mi stai perculando? :cold_sweat: Guarda che mica ho detto che è difficile cercare con Google, ma che è la codifica e l'hardware da realizzare (e relativo software di gestione) che non è semplice.

Essibbono, su, visto che non sappiamo quale sia l'esigenza reale ed i "requisiti" (ed evitiamo singoli post con una sola riga, dì quello che devi dire tutto insieme) e poi aspettiamo almeno che l'OP "digerisca" i nostri consigli e ci chiarisca :wink:

Scusa, ma che ci vuole??? Fai una sequenza di tone() e hai ottenuto il codice; poi con pulseIn() rilevi le frequenze! Naturalmente bisogna cominciare provando una sequenza lentissima, ad esempio un tono al secondo; poi si prova ad aumentare la velocità poco per volta ottimizzando il codice. :slight_smile:

Se non stessi realizzando un provacavi UTP (e non avessi collegato 9 diodi a catodo comune, anziché ad anodo comune! >:( ), avrei quasi voglia di provarci! :slight_smile:

No Datman non mi son perso la tua risposta, solo che più o meno riprendeva quella di gbp01.
Probabilmete sarò lungo e complicato nella spiegazione..ma vedo di esporvi la mia idea nel miglior modo possibile come chiesto, giustamente, da docdoc.
Quello che avevo in mente è un sistema di comunicazione di comunicazione per una stazione di ambulanze basata su app Zello(cosa che ho già realizzato e funziona alla grande) funzionante tramite connessione internet. Ogni mezzo della flotta è equipaggiato con tale sistema di comunicazione. Ora sto progettando la sala operativa e, basandomi sulla mia esperienza, so che i normali sistemi di radiocomunicazione, ad utilizzo civile,(servizi 118, vigili del fuoco, forze dell'ordine ecc) hanno la possibilità, tramite la pressione di una combinazione di tasti(es #3 #4 ecc) di inviare in frequenza un segnale audio formato da note( io lo sento così) che, in centrale operativa, viene riconosciuto dal sistema e, in base al mezzo, tasti premuti ed inviati, fanno apparire su un monitor il nominativo del mezzo ed il suo status( es #3 corrisponde a "mezzo operativo" #4 corrisponde a " mezzo sul posto della chiamata" ecc). Quello che volevo ricreare, senza tante pretese, è proprio una cosa simile( mezzo invia, tramite combinazioen tasti, un suono, arriva in centrale, viene "decodificato" e sul monitor seriale viene scritto lo status del mezzo che ha inviato) . Non mi importa se, avendo 20 mezzi e ci fossero 10 status a mezzo, io debba inventarmi 200 composizione di suoni per esser nettamente riconoscibili ogni status per mezzo, ma volevo sapere, secondo voi che siete sicuramente più esperti di me, è una cosa fattibile senza diventar matto. Ecco perchè avevo pensato alla funzione "tone" . Però, sono aperto a qualsiasi altra soluzione possibilmente non troppo complessa(devo necessariamente utilizzare degli arduino nano per via dello spazio, per cui non so se riesca a processare soluzioni troppo complicate).

Da notare il fatto che i 2 arduino non sono collegati fisicamente insieme...ma "comunicano" tramite app sopracitata.

Inviare un suono deriva dal fatto che, appunto, non c'è comunicazione diretta tra i 2 arduini e l'unico sistema e appunto il suono inviato e ricevuto tramite l'app.

Spero di aver reso l'idea, intanto vi ringrazio per le risposte che mi state dando.

AGGIORNAMENTO.

docdoc il sistema di selettive che ti dicevo è basato sui toni di chiamata ZVEI 1 che sono facilmente replicabili con arduino. Quello che mi manca è come poterli far leggere ad un altro arduino, sempre con lo stesso sistema di invio. In rete ho trovato del materiale sugli NE567 che vengono anche usati per la decodifica del codice morse. Chiedo, secondo voi, c'è modo fi interfacciare quello che compongo con arduino, tramite "tone" e decodificarlo, per far poi scrivere su monitor seriale qualcosa di preinpostato, cn questo NE567? se si esiste un circuitino replicabile da interfacciare ad arduino..e qualche info su un possibile codice?

Grazie a tutti

Ti serve un NE567 per ogni frequenza da identificare. Inoltre, bisogna dimensionare bene un condensatore (l'ho usato una trentina d'anni fa per generare e riconoscere una chiamata bitonale sul baracchino CB) per avere una banda sufficientemente stretta da evitare errori, ma stringendo la banda aumenta il tempo necessario per identificare il tono.
NE567 - Datasheet

Comunque gli NE567 non funzioneranno mai bene come il CMX823, che ha filtri digitali strettissimi. Si trova intorno ai 15€. Più difficile è trovare il datasheet completo. Al massimo ho trovato questo: Datasheet
Per avere informazioni su come interfacciarlo con Arduino potresti mandare un'email al produttore.

Cerca con Google: ZVEI tone decoder, senza -1.

Se ti interessa un programma per calcolare il valore dei componenti per il NE567 dai un occhiata ad un vecchio mio programma postato qui:

Allora ..ho fatto come ha idetto tu Datman, ma non ho trovato nulla a riguardo che si interfacciasse con arduino(non che si trovi molto anche sulla decodifica senza arduino).
Stavo pensando, siccome arduino dovrebbe essere in grado si rilevare la frequenza di un segnale audio, potrei fargli misurare quello e, in base alla frequenza che rileva, far scrivere sul monitor seriale qualcosa...credo sia fattibile la cosa.
Voi cosa ne dite?

Ciao
Puoi provare squadrando il segnale e mandandolo a un ingresso digitale. Giusto oggi sono riuscito a far funzionare bene il prova cavi LAN misurando la durata degli impulsi con micros(): quando arriva l'impulso copia micros() in una variabile e quando torna giù legge il tempo trascorso, così come si fa con millis(). Precedentemente avevo provato con pulseIn, ma non ho ottenuto risultati altrettanto buoni. Nel mio caso, in realtà, ho anche il problema che in attesa di un impulso devo fare una scansione velocissima degli ingressi leggendo insieme tutta la porta di 8 bit e quando ne rileva uno il fronte di salita è appena passato, perciò pulseIn non può più partire.

Sia chiaro che questo non è un gioco che si può fare in maniera approssimativa: va fatto con attenzione, rendendo tutto il più veloce possibile. L'ingresso, ad esempio, devi leggerlo con PIND/PINB.

Ok....vedo dicreperire un pò di materiale da internet riguardo cio che hai suggerito,provo e poi vi faccio sapere.

Rieccomi... allora...o sono io che non riesco a trovare nulla , o non si trova effettivamente nulla in rete. Non riesco a trovare neppure come squadrare un onda sinusoidale e renderla positiva, in picco picco, per non rovinare Arduino(si trova solo gente che inserisce direttamente l'audio in Arduino tramite i pin analogici). C'è qualche anima pia che può o spiegarmi, in maniera esaustiva, o linkarmi qualcosa che lo spieghi, sempre in maniera comprensibile, come poter immettere una sequenza audio e poter poi decodificare la sua frequenza( così da poter decodificare quello che mi serve) ?
Ve ne sarei molto grato.

Puoi fare così, con solo il transistor e il primo inverter:
Misure di frequenza con Arduino