"Decodifica" sequenza di note con arduino

Salve a tutti, ho la necessità di generare, alla pressione di un pulsante, una serie di suoni utilizzando la classica "funzione" tone(pin, frequenza, durata). E fin qui non ci son problemi. Quello che chiedo,in questo post, è: esiste la possibilità di "decodificare" questo suono, con un altro arduino, e, in base al suono ricevuto, fargli fare una determinata azione? Il concetto di base è quello delle Seletive radio che, in base al tipo di suono inviato da un dispositivo, viene ricevuto da un altro dispositivo e fa compiere, alla radio piuttosto che ad arduino, un'azione. Ora so che le selettive radio utilizzano i toni DTMF; se con un arduino invio una serie di suoni ,utilizzando il codice sopracitato, parliamo sempre di toni DTMF o è una cosa diversa e, quindi, si deve procedere in altri modi? (attenzione: la realizzazione si intende composta da 2 arduino il quale 1 genera il segnale audio, il 2 lo riceve e lo deve decodificare il tutto passante da un sistema di comunicazione impossibilitato a generare suoni se non il parlato vero e proprio) Spero di essermi spiegato sufficientemente bene. Ringrazio chiunque saprà aiutarmi.

Alessandro

Uno solo a onda quadra, sì. Per il DTMF devi usare un decoder apposito.

Ciao, la tua risposta non mi è chiara. Forse mi sono spiegato male io. Il mio intento è quello di generare un suono, come i suoni delle selettive radio(le selettive radio vengono utilizzate per inviare un segnale audio che, ad esempio una centrale operativa, decodifica e capisce chi l'ha mandata ed altri dati sul mittente,opportunamente inseriti in un gestionale....spiegata in soldoni), utilizzando il codice "tone",o altre funzioni che potete suggerirmi, per generarlo(e questo non mi crea problemi nel farlo). Il "problema è come "decodificarlo",da un altro arduino, (credo sia la parola giusta) e fargli fare qualcosa( ad esempio accendere un led) . i miei quesiti sono questi: 1- generando un suono con la funzione "tone" (formato da più note) esso è considerabile un DTMF e,quindi, decodificaile con shield dedicata, oppure risulta essere un "suono" non DTMF? 2- Nel caso non fosse un tono DTMF c'è un modo per " decodificarlo e far fare qualcosa ad arduino?

mt8870

Porti pazienza, ma questa sua risposta a quale delle 2 domande sarebbe riferita? Quello che mi riporta lo conosco e lo utilizzo tranquillamente..quello che ho chiesto io è se la funzione "tone" di arduino genera un suono o un tono DTMF e nel caso arduino, con la funzione "tone" non generasse un DTMF come e se può essere "decoficato". Non ho bisogno che, a 2 domande ben specfiche, mi venga risposto con una cosa che non c'entra.( se no avrei chiesto come si decodifica un tono DTMF..cosa ,tra l'altro, reperibile facilmente su internet)

Lima68: 1- generando un suono con la funzione "tone" (formato da più note) esso è considerabile un DTMF e,quindi, decodificaile con shield dedicata, oppure risulta essere un "suono" non DTMF?

La seconda che hai detto. Un DTMF è un "doppio suono" ossia due toni suonati contemporaneamente (Dual Tone MultiFrequency) che rappresentano riga e colonna del tasto di una tastiera telefonica 3x4. Per emettere un DTMF devi avere un generatore DTMF. In alternativa potresti campionare i 12 suoni DTMF e riprodurli come forme d'onda (con un mp3 player per Arduino ad esempio).

2- Nel caso non fosse un tono DTMF c'è un modo per " decodificarlo e far fare qualcosa ad arduino?

E' una singola frequenza, non è affidabile, quindi direi di no. L'alternativa sarebbe costruire un segnale partendo da una frequenza fissa "modulata" per rappresentare i vari bit, cosa che potresti fare attivando e disattivando l'uscita di un pin, o, meglio, direttamente con un apposito circuito (es. un oscillatore basato su un 555, il cui output lo controlli col pin digitale). Ma la vedo sempre non proprio banale, quindi dato che dico sempre che va prima identificata l'esigenza e poi valutate le possibili soluzioni, se vuoi prova a spiegare meglio quale sia l'esigenza.

Un suono DTMF è composto da due toni miscelati, che puoi generare con due oscillatori di qualsiasi tipo, anche con Arduino.

Per decodificare un DTMF, però, serve un decoder, o due NE567, o due rivelatori con filtri a banda stretta, o devi fare un'analisi dello spettro (ma non con Arduino).

>Lima68: Se fai una semplice ricerca con Google per "arduino dtmf tone generator" trovi decine di esempi e di schemi, idem per la parte decodifica. Ovvio che NON basta SOLO Arduino, ma ci vuole un minimo di componentistica esterna.

Guglielmo

Ma infatti gpb01 ...io non chiedevo come codificare e decodificare un DTMF che ,come giustamente dici tu, ricercando in rete si trovano schemi ecc. Mi ha risposto bene docdoc che mi ha chiaramente detto che la funzione "tone" di arduino non genera un segnale decodificabile come intendo io(così ho capito).

Provo a spiegare il progetto che vorrei realizzare visto che docdoc me lo chiede.

L'idea è di replicare una selettiva radio( tipo il beep beep delle radio della polizia per intenderci) da inviare attraverso un app che simula le radio rtx, ovvero generare un suono con arduino che,al ricevente, indichi alcuni dati che andranno ad esser stampati su monitor seriale(come ad esempio il nominativo di un veicolo,ovviamente preinpostato a monte della programmazione, l'arrivo sulla scena ecc). Per cui questo suono dovrebbe essere generato da arduino, passare tramite app dal mittente al destinatario, essere "decodificato" per far scrivere sul monitor seriale qualcosa. Spero docdoc, e ovviamente tutti gli altri, di essermi fatto capire.

Alessandro

Deve esserti sfuggita la mia precedente risposta:

"Un suono DTMF è composto da due toni miscelati, che puoi generare con due oscillatori di qualsiasi tipo, anche con Arduino.

Per decodificare un DTMF, però, serve un decoder, o due NE567, o due rivelatori con filtri a banda stretta, o devi fare un'analisi dello spettro (ma non 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 ;) ):

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; :) 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... ;)

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 ;)

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 ;)

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. :)

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! :)

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