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
Avevo trovato questo in rete, ma parlavano di frequenze per applicazioni RPM(contagiri) e quindi ho lasciato stare, ma vedo di reperire i componeti e provare. Dici che, con questa configurazione si riesca a fare ciò che mi serve, cioè leggere varie frequenze una dopo l'altra
tone (buzz, 1152, tempo);
delay(tempo);
tone (buzz, 1446, tempo);
delay(tempo);
tone (buzz, 991, tempo);
delay(tempo);
tone (buzz, 1192, tempo);
delay(tempo);
tone (buzz, 2400, tempo);
, oppure no?
Questo emette suoni
Porta pazienza, ma che senso ha rispondere ad una mia domanda, con una frase riportante una cosa scontata? Lo so anch'io che il codice che ho riportato emette suoni. Io questi suoni li devo decodificare, in base alla loro frequenza,o in qualsiasi altro modo che mi potete spiegare, per far compiere ad arduino determinate cose(nel mio caso si tratta di scrivere uan cosa sul monitor seriale o su un display LCD). Ho chiesto se la cosa è fattibile e mi avete detto di si..bene...ora vi chiedo come poterlo fare. C'è qualche buon uomo/donna che può spiegarmelo,magari con spiegazioni più accurate, senza scrivere cose ovvie o non rilevanti al fine di ciò che chiedo?
(non sto parlando di codifica/decodifica di toni DTMF)
Guarda, io l'unica cosa che consco sono due ottime librerie che permetto di leggere, con una buona precisione, una frequenza su Arduino ... librerie con cui è anche possibile fare un piccolo frequenzimetro ... magari puoi adattarle per capire la frequenza che ti interessa.
Sono dello stesso autore e sono due perché sono suddivise per range di frequenza identificabile; la prima, FreqMeasure, è specifica per frequenza tra 0.1 Hz fino ad 1 KHz; la seconda FreqCount, è specifica per frequenze tra 1 KHz fino a 8 MHz (su Arduino, su altre schede arriva anche sino a 65 MHz).
Studiatele e adattale alla tua esigenza (... ci sono anche gli schemi di ingresso).
Guglielmo
Lima68:
Avevo trovato questo in rete, ma parlavano di frequenze (...). Dici che, con questa configurazione si riesca a fare ciò che mi serve, cioè leggere varie frequenze una dopo l'altratone (buzz, 1152, tempo);
delay(tempo);
tone (buzz, 1446, tempo);
delay(tempo);
tone (buzz, 991, tempo);
delay(tempo);
tone (buzz, 1192, tempo);
delay(tempo);
tone (buzz, 2400, tempo);
, oppure no?
Con quel codice non puoi leggere frequenze. È scontato, ma la tua domanda era proprio quella...
Chiedi se con quella configurazione puoi leggere una frequenza... Di che configurazione parli? Circuitale? Subito dopo hai riportato il codice, perciò pensavo che ti riferissi a quello e che, quanto meno, avessi incollato il codice sbagliato!
Per generare i segnali, invece, va bene.
Comunque il compito non mi sembra affatto liquidabile con "misurare una frequenza" (che richiede che la frequenza sia stabile per un certo tempo di misura), si tratta di riconoscere sequenze asincrone di toni della durata di 70ms con relative interpause... cioè, mi sembra ci sia da scrivere un vero e proprio modem AFSK software, con relativa macchina a stati per il riconoscimento non solo delle frequenze ma anche di tutte le temporizzazioni...
Infatti io leggerei il tempo con micros(), calcolerei la durata e, da quella, identificherei il tono in arrivo, senza perdere tempo a fare la divisione per calcolare la frequenza. L'uso dall'interrupt potrebbe essere controproducente. Piuttosto, deve essere tutto molto rapido.
Ad esempio, un while che attende un segnale
Sul fronte di salita prende il tempo
Un altro while attende la discesa
Quando arriva, prende il tempo e calcola la durata
In base alla durata, attiva l'uscita corrispondente
Ritorna ad attendere la salita
Fa le stesse cose
Finché la durata è la stessa, ignora.
Io pensavo ad una ISR che "per questa volta" esegua qualche operazione in più, cioè che si incarichi non solo di misurare il singolo periodo, ma anche di riconoscere un treno di misure uguali (±tolleranza), e segnali con questo la ricezione di un tono, e lasciare al loop principale con tutta calma il compito di decidere se è un tono valido e se si stanno rispettando i tempi. In questo modo altri segnali audio non dovrebbero poter essere scambiati per toni validi.
Infatti stavo per correggermi: bisogna verificare che la durata resti costante (con un po' di tolleranza) per almeno 100 cicli, altrimenti rileverà anche frequenze nel parlato.
L'interrupt non lo userei, perché non deve interrompere inutilmente altre operazioni. Una volta rilevato con certezza il tono, deve scriverlo in una matrice contenente la sequenza di toni ignorando l'ingresso; fatto ciò, torna a controllare l'ingresso.