Ciao a tutti!
Prima di cimentarmi nel progetto vero e proprio e prima di comprare tutto il materiale sto cercando di fare piccoli test per verificarne l'effettivo funzionamento.
Quello che sto facendo adesso è leggere il segnale audio proveniente da un uscita audio (RCA a 3 poli Video/Left/Right).
La sorgente è una scheda HackBerry, molto simile a Raspberry. Quello che ho fatto è stato collegare l'uscita Video al monitor della TV, ed è ok, poi ho preso un cavo audio (che collegato alla TV produce audio) e ho collegato la massa alla stessa massa in comune con Arduino e il polo centrale sul PIN A0.
Ho poi usate questo semplice codice:
#define LEFT A0 // PIN di lettura del valore analogico
unsigned short v_left = 0;
long signal; // Segnale letto, togliendo l'offset DC
const long threshold = 400; //at what level the light turns on
void setup() {
Serial.begin(9600);
}
void loop()
{
v_left = analogRead(LEFT);
Serial.print("Audio: ");
Serial.println(v_left);
signal = v_left * v_left;
Serial.print("Signal: ");
Serial.println(signal);
delay(500);
}
Questi dati sono molto simili tra loro sia se lascio collegato il cavo, sia se lo interrompo e sia se lascio collegato il cavo ma metto in pausa la sorgente...
Quello che mi aspettavo è che se io mettessi in pausa o scollegassi il cavo, il valore letto sarebbe stato 0 (o comunque molto vicino).
Purtroppo tramite tester non ho la possibilità di avere una sensibilità molto bassa sulla tensione alternata, quindi non so con precisione il livello di tensione prodotto, tuttavia, se la misuro in continua il valore è di 0.9/0.8 mV.
Occorre uno stadio di amplificazione da interfacciare tra l'Hackberry e l'Arduino in modo da alzare la tensione in ingresso?
gpb01:
... devi traslare il segnale in modo che la sinusoide sia TUTTA sopra il GND di Arduino e, probabilmente, anche amplificarla :smiley-
Ho fatto qualche ricerca su come amplificare il segnale e mi sono orientato sull'amplificatore operazionale LM358 in quanto funziona bene anche con alimentazione singola.
Ho provveduto ad effettuare alcune simulazioni con Multisim e questo è il circuito adottato:
In uscita ho un tensione di 3.9Vpp, con questa tensione riesco a passarla all'entrata analogica dell'Arduino?
Tuttavia ho alcuni "problemi".... Se apro l'interrutto A, per simulare la mancanza di audio, in uscita ottengo comunque un uscita di 3.98V...quindi non riesco a capire se c'è o non c'è audio.
Poi mi è venuto in mente; dato che a me interessa sapere solo se c'è o non c'è audio che proviene da una fonte, non è che il circuito lo sto pensando più complicato di quanto sia realmente?
DidyMond:
Poi mi è venuto in mente; dato che a me interessa sapere solo se c'è o non c'è audio che proviene da una fonte, non è che il circuito lo sto pensando più complicato di quanto sia realmente?
E non lo potevi dire prima ???
Amplifichi un po' il segnale (basta un transistor), lo raddrizzi così hai solo una serie di semionde positive e un circuitino RC per creare un facsimile di segnale DC .. sotto un certo valore, non c'è audio, sopra un certo valore, l'audio è presente
Ok, magari sono stato un po' succinto ... ma era giusto per darti l'idea ...
... a te basta un valore di tensione presente/assente da rilevare quindi ... presenza della sinusoide -> uscita di un segnale DC, assenza della sinusoide -> assenza di segnale DC.
gpb01:
Ok, magari sono stato un po' succinto ... ma era giusto per darti l'idea ...
... a te basta un valore di tensione presente/assente da rilevare quindi ... presenza della sinusoide -> uscita di un segnale DC, assenza della sinusoide -> assenza di segnale DC.
Ok, tramite i tuoi suggerimenti mi sono orientato su una configurazione con transistor e leggendo varie "guide" sul dimensionamento dei componenti ho tirato fuori questo circuito:
Così come lo vedi in figura ottengo:
-Con interruttore chiuso, in uscita, ho quasi una tensione costante, raddrizzata dal condensatore con tensione minima di 3.55V e massima circa 4V
-Con interruttore aperto, in uscita, ho una tensione di circa 162mV.
Dato che sono valori TTL corretti (cioè nel range per decidere se ho 0 o 1) posso collegare l'uscita del transistor ad un pin digitale dell'arduino e tramite funzione:
readDigital(PIN);
dovrei riuscire a capire se c'è o non c'è segnale audio.
Corretto? O il dimensionamento è sbagliato?
Ps: i valori sono di tensione riportati sono stati effettuati con la simulazione di un'onda ad 1Hz a 800mVpp
DidyMond:
....
-Con interruttore chiuso, in uscita, ho quasi una tensione costante, raddrizzata dal condensatore con tensione minima di 3.55V e massima circa 4V
-Con interruttore aperto, in uscita, ho una tensione di circa 162mV.
Dato che sono valori TTL corretti (cioè nel range per decidere se ho 0 o 1) posso collegare l'uscita del transistor ad un pin digitale dell'arduino ....
SE i valori teorici li ritrovi anche praticamente (... e ti consiglio di verificarli prima di collegare il segnale ad Arduino ), sei esattamente nel range di valori adatti alla digitalRead() e non dovresti avere problemi
gpb01: SE i valori teorici li ritrovi anche praticamente (... e ti consiglio di verificarli prima di collegare il segnale ad Arduino ), sei esattamente nel range di valori adatti alla digitalRead() e non dovresti avere problemi
Pomeriggio ho guardato nel sacchetto dei componenti e sono riuscito a trovare tutto il materiale già a casa, così ho tirato fuori la breadboard e verificato il funzionamento del circuito, ma purtroppo non funziona come dovrebbe, o meglio....si e no.
Se applico la sorgente audio al circuito e faccio uscire l'audio, in uscita del transistor ho 5.17V (valore di Vcc), e quindi è corretto, rileva l'audio.
Se tolgo il cavo audio, in uscita del transistor ho 0.9 V (avrei preferito più basso, per non rischiare valori TTL indeterminati, ma per ora mi accontento), e quindi è corretto, non rileva audio.
Il problema nasce quando lascio collegato il cavo audio, ma metto in pausa la sorgente; in uscita ho comunque 5.17V a fronte di un segnale di ingresso (probabilmente rumore?) di -0.1mV (perdonate la misura non precisa in quanto non dispongo di un oscilloscopio e questa tensione è data misurando in tensione continua).
Quindi credo che il dimensionamento sia errato, e che amplifichi anche piccolissimi segnali. Credo che devo prendere in considerazione solo segnali in ingresso maggiori a 0.6mV...
gpb01:
... e se metti un condensatore in ingresso così da tagliare l'eventuale componente continua ?
Guglielmo
Appena provato, ho messo un condensatore elettrolitico da 220uF in parallelo tra la la base del transistor e massa ma non cambia nulla, ho gli stessi valori di prima
gpb01:
NO, non in tra base e massa, se devi separare in DC lo devi mettere in SERIE all'ingresso !
Guglielmo
Messo in serie all'ingresso ho un comportamento diverso; in uscita del transistor ottengo un valore di 0.9V, ovvero come se scollegassi il cavo...
Mentre quando emette suoni ho una tensione che oscilla tra 0.9V e 0.97V...
Altro dubbio che mi viene in mente...potrebbe essere che dipenda da come sono alimentati i due circuiti? Ovvero, la scheda che emette il suono ha una sua alimentazione con il suo alimentatore collegato alla rete elettrica, mentre il circuito del transistor ha un altra alimentazione (un alimentatore da banco). Il collegamento tra i due è fatto prendendo un cavo RCA e ponendo il polo positivo come ingresso per il transistor (in pratica al posto di XFG1 nell'immagine) e la massa collegata alla bread board, dove c'è l'alimentazione del transistor.
Ma non hai messo in comune le masse (GND) dei due alimentatori ?
Se lo stadio di amplificazione funziona guarda con l'oscilloscopio cosa hai sulla base con l'audio presente e poi controlla cosa hai sul collettore (verifica anche senza C1) ...
E comunque, se il tuo scopo è ottenere un segnale logico LOW/HIGH, dovrai comunque separare in DC anche l'uscita amplificata, raddrizzarla ed integrarla così che in presenza del segnale amplificato avrai un valore HIGH (più o meno stabile) e in assenza di segnale un valore prossimo a zero che verrà letto come LOW.
gpb01:
Ma non hai messo in comune le masse (GND) dei due alimentatori ?
Si, le ho messe....mi era venuto il dubbio ma poi ho controllato e sono ok!
gpb01:
Se lo stadio di amplificazione funziona guarda con l'oscilloscopio cosa hai sulla base con l'audio presente e poi controlla cosa hai sul collettore (verifica anche senza C1) ...
Purtroppo non possiedo un oscilloscopio....Le uniche misure che posso fornirti sono attraverso un tester, tra l'altro nemmeno in tensione alternata perchè ho un fondo scala di 200V, quindi non rileverebbe nulla....Posso solo utilizzarlo con tensione/corrente continua...
gpb01:
E comunque, se il tuo scopo è ottenere un segnale logico LOW/HIGH, dovrai comunque separare in DC anche l'uscita amplificata, raddrizzarla ed integrarla così che in presenza del segnale amplificato avrai un valore HIGH (più o meno stabile) e in assenza di segnale un valore prossimo a zero che verrà letto come LOW.
E' esattamente quello che ho in mente...Mi basta solo un segnale logico LOW/HIGH qual'ora non ci sia o ci sia segnale audio!
... che è simile al tuo. E' il minimo per un amlificatorino in classe A e, come vedi, in uscita, hai un segnale sinusoidale amplificato e, anche in assenza di segnale, in uscita hai Vcc/2.
A questo punto, da quel segnale per ottenere il tuo LOW/HIGH dovrai ...
eliminare la componente continua presente in assenza di segnale (Vcc/2) ... magari come hai fatto in entrata con un condensatore in uscita
integrare il segnale (un semplice circuito R/C dovrebbe bastare) così da non avere una sinusoide ma un valore medio che verrà interpretato come HIGH
Come stai facendo le prove ? Hai un software di simulazione per circuiti analogici ?
gpb01:
Come stai facendo le prove ? Hai un software di simulazione per circuiti analogici ?
Credo che ormai mi sto incasinando....
Un oscilloscopio non ce l'ho, quindi i comportamenti dei segnali analogici li posso verificare solo a livello teorico tramite un simulatore (per la precisione Multisim 13).
Dopo che mi hai detto che, a circuito aperto, in uscita del transistor dovrei avere comunque Vcc/2, ho rivisto il circuito e applicato alcune modifiche.
Questa è l'immagine del circuito, simulando lo scollegamento del cavo
In questo modo in uscita, a circuito aperto, ottengo Vcc/2 in tensione continua.
Questa invece è l'immagine del circuito, applicando un segnale da 100mVpp
No, no, perché ... calma e sangue freddo e ragiona ... sei a metà dell'opera, ti manca la seconda metà
DidyMond:
Un oscilloscopio non ce l'ho, quindi i comportamenti dei segnali analogici li posso verificare solo a livello teorico tramite un simulatore (per la precisione Multisim 13).
Ok, va bene ugualmente, anche se poi devi ovviamente fare qualche verifica pratica
Ora, sei arrivato ad "amplificare" il segnale, ma, come dicevamo, hai sempre un segnale sinusoidale e non un livello LOW/HIGH ...
quindi ... prendi l'uscita e mandala di nuovo in ingresso ad un condensatore ... così elimini la componente DC dell'uscita che ti falserebbe il LOW/HIGH tenendoti il segnale sempre in HIGH anche in assenza dell'audio in ingresso.
Passo successivo, prendere quello che esce da detto condensatore e mandarlo ad una rete RC per integrarlo ...
... immagina, semplificando a grandi linee, che quella sia una sorgente d'alternata e tu la vuoi far diventare DC ... così quando c'è il segnale audio, hai una tensione CC e quando non c'è .. non hai nulla.
Un passo alla volta ... vedrai che arrivi alla soluzione
gpb01:
... immagina, semplificando a grandi linee, che quella sia una sorgente d'alternata e tu la vuoi far diventare DC ... così quando c'è il segnale audio, hai una tensione CC e quando non c'è .. non hai nulla.
Ok, piano piano ci stiamo arrivando!
Ho aggiunto i "pezzi" mancanti e sono arrivato ad un circuito come questo:
Il diodo mi serve per far passare solo la semionda positiva.
Il condensatore per rettificare l'onda.
In uscita ho circa 470mV a fronte di un segnale da 100mVpp.
Arduino riuscirebbe a leggere una tensione di 470mV? Credo di si...
Quello che più mi preoccupa è non riuscire ad identificare con precisione, in quanto assenza di oscilloscopio, la tensione reale che ho con cavo inserito quando c'è suono e quando è in pausa...
gpb01:
Un passo alla volta ... vedrai che arrivi alla soluzione
Lo spero! Intanto ti ringrazio e perdona qualche mia stupidata!