Go Down

Topic: Collegare un microfono (Read 3981 times) previous topic - next topic

elQuero

Salve a tutti,
stavo revisionando un vecchio progetto che non funzionava. Il problema era semplice: anche se, ad ogni entrata analogica usata, era collegato un carico resistivo variabile, si introduceva un errore variabile di qualche decimo di volt, tale da rendere poco affidabile la lettura. Ho scoperto che questa interferenza era dovuta da un microfono collegato al circuito: infatti, scollegandolo, non ho avuto nessun'altro disturbo e la lettura era perfetta. Al che mi sono chiesto: non è che il circuito andava fatto seguendo delle particolari tecniche (non so, schermatura dei fili, circuiti attui a renderlo "innocuo", ecc)?

Il circuito attuale era un semplice microfono da Sparkfun (https://www.sparkfun.com/products/9964 ) collegato ad Arduino con 3 semplici cavetti per breadbord. Consigli?

uwefed

Consigli:
Sí piú informazioni. Quale progetto, schemi, descrizione.
Ciao Uwe

elQuero

Allora, vediamo.
Il progetto è un progetto con cui ho a che fare (sul forum) a più riprese chiamato Comfort Meter: questo dispositivo prende 4 valori in ingresso (luminosità, co2, temperatura e rumore) e calcola un indice di comfort generale, che poi esterna completandosi di un colore che varia dal verde al rosso.
Di schemi non ne ho, in quanto sono tanti circuiti elementari uniti (uno per l'LM35, uno per il sensore di CO2, uno per la fotoresistenza e uno per il microfono), ed ognuno comunica i suoi dati su di una analogIn (se volete gli schemi precisi li sto facendo su fritzing, abbiate pazienza).
Il problema è come se le letture dell'ADC vengano sballate dal circuito del microfono. E' possibile? Prima ho parlato di schermatura in quanto mi era stata consigliata come risoluzione, ma volevo, se possibile, saperne di più...

Grazie ;-)

uwefed

Senza schema e sketch possiamo solo indovinare e la mia razione di indovinello la avevo finita giá in agosto.   ;) ;)
Ciao Uwe

elQuero

Guardate, intanto scusatemi ma non ho idea di cosa diavolo stava succedendo. Ora ho rifatto l'intero circuito, attenendomi a questa guida http://lowvoltage.wordpress.com/2011/05/21/lm358-mic-amp/ e funzionano tutti i sensori tranquillamente. Comunque sia consiglio a tutti la guida che ho linkato, semplice ed efficace, sopratutto per chi è alle prime armi come me ;-)

AGoGo

#5
Sep 19, 2013, 03:27 am Last Edit: Sep 19, 2013, 05:50 am by AGoGo Reason: 1
salve o copiato anche io lo stesso circuito o inserito i dati in arduino
Code: [Select]
/**
* Measures the voltage on an analog pin over a ~1s period of time
* and sends the Min, Max and Diff (Spread) values over Serial.
*
* Author: Dimitar Kovachev, http://lowvoltage.wordpress.com/
*
* Released under the Creative Commons Attribution Share-Alike 3.0 license
* http://creativecommons.org/licenses/by-sa/3.0/
*/
const int analogPin = 0;

void setup() {
 Serial.begin(9600);
}

void loop() {
 int mn = 1024;     // mn only decreases
 int mx = 0;        // mx only increases

 // Perform 10000 reads. Update mn and mx for each one.
 for (int i = 0; i < 10000; ++i) {
   int val = analogRead(analogPin);
   mn = min(mn, val);
   mx = max(mx, val);
 }

 // Send min, max and delta over Serial
 Serial.print("m=");
 Serial.print(mn);  
 Serial.print(" M=");
 Serial.print(mx);  
 Serial.print(" D=");
 Serial.print(mx-mn);  
 Serial.println();  
}


ma non capisco i valori che ne ricavo sono

m=0 M=0 D=0
m=0 M=0 D=0
e cosi via cosa ho sbagliato ?

AGoGo AMA Alfredo M.

cyberhs

Quote
...cosa ho sbagliato?


L'errore è quello di aver dichiarato le variabili mn ed mx (minimo e massimo) localmente in setup, mentre avrebbero dovuto essere dichiarate globalmente:
Code: [Select]
...
const int analogPin = 0;
int mn = 1024;     // mn only decreases
int mx = 0;        // mx only increases
...

AGoGo

#7
Sep 19, 2013, 06:18 pm Last Edit: Sep 19, 2013, 07:13 pm by AGoGo Reason: 1
mi può fare un esempio sa non sono bravo ne programmare

e magari se mi puoi dire come faccio ad assegnare lo spegnimento di un led con un valore minimo e l'accensione con un valore massimo

ad esempio con 2 barriti di mano si spegne e con uno si accende
AGoGo AMA Alfredo M.

cyberhs

Code: [Select]

const int LEDPin = 13;
const int analogPin = 0;
int mn = 1024;     // mn only decreases
int mx = 0;        // mx only increases

void setup() {
  pinMode(LEDPin, OUTPUT);                // set the digital pin as output
  Serial.begin(9600);
}

void loop() {

  // Perform 10000 reads. Update mn and mx for each one.
  for (int i = 0; i < 10000; ++i) {
    int val = analogRead(analogPin);
    mn = min(mn, val);
    mx = max(mx, val);
  }

  // Send min, max and delta over Serial
  Serial.print("m=");
  Serial.print(mn); 
  Serial.print(" M=");
  Serial.print(mx); 
  Serial.print(" D=");
  Serial.print(mx-mn); 
  Serial.println(); 
}

if (val < 500) digitalWrite(LEDPin, HIGH);    // se il valore è minore di 500 accendi il LED
else  digitalWrite(LEDPin, LOW);               // altrimenti spegnilo

AGoGo

scusami
ma nella verifica di scrittura mi e sorto  un errore

Microfono 30 errore: expected unqualified-id before 'if'
Microfono 31 errore: expected unqualified-id before 'else'

come correggo grazie
AGoGo AMA Alfredo M.

cyberhs

Certo... ho commesso l'errore di dimenticare la parentesi graffa.
Code: [Select]

...
  Serial.print(mx-mn); 
  Serial.println(); 

if (val < 500) digitalWrite(LEDPin, HIGH);    // se il valore è minore di 500 accendi il LED
else  digitalWrite(LEDPin, LOW);               // altrimenti spegnilo

}

AGoGo

grazie mille ma non capisco come faccio a bloccare l'accensione del led .. come anche lo spegnimento con un comando specifico
Code: [Select]
const int LEDPin = 11;
const int LEDPin1 = 12;

const int analogPin = 0;
int mn = 1024;     // mn only decreases
int mx = 0;        // mx only increases

void setup() {
  pinMode(LEDPin, OUTPUT);   pinMode(LEDPin1, OUTPUT);               // set the digital pin as output
  Serial.begin(9600);
}

void loop() {

  // Perform 10000 reads. Update mn and mx for each one.
  for (int i = 0; i < 10000; ++i) {
    int val = analogRead(analogPin);
    mn = min(mn, val);
    mx = max(mx, val);
if (mx > 5 ) digitalWrite(LEDPin, HIGH);    // se il valore è minore di 500 accendi il LED
else  digitalWrite(LEDPin, LOW);               // altrimenti spegnilo
if (mx < 600) digitalWrite(LEDPin1, HIGH);    // se il valore è minore di 500 accendi il LED
//else  digitalWrite(LEDPin1, LOW); 
if (val > 30) digitalWrite (LEDPin1, LOW);// altrimenti spegnilo}
else  digitalWrite(LEDPin1, LOW);  }
  // Send min, max and delta over Serial
  Serial.print("m=");
  Serial.print(mn); 
  Serial.print(" M=");
  Serial.print(mx); 
  Serial.print(" D=");
  Serial.print(mx-mn); 
  Serial.println(); 

}
AGoGo AMA Alfredo M.

cyberhs

Stai facendo un po' di confusione.
Le variabili mn e mx indicano il minimo ed il massimo valore assunti dalla variabile val durante il campionamento (10000 valori).

Alla fine del ciclo avremo questi due valori (ad esempio 1 e 1000).

Tu cosa vuoi ottenere?

AGoGo

non ho capito niente ...

il mio scopo e di dargli un livello di suono per potersi accendere   e uno più alto per potersi spegnere ma che poi rimanga spedo fino al mio prossimo comando

AGoGo AMA Alfredo M.

cyberhs

#14
Sep 23, 2013, 11:41 am Last Edit: Sep 23, 2013, 11:46 am by cyberhs Reason: 1
Invece di fare come dici tu, sarebbe meglio programmare in modo che alla ricezione di un suono piuttosto "forte" (ad esempio un battito di mani) il LED si accenda e rimanga acceso sino al successivo che, al contrario, lo spegne.

Questo perché è difficile discriminare tra un suono "forte", un suono "medio" ed il rumore ambientale.
Code: [Select]

const int InputPin = A0;   // ingresso segnale
const int LEDPin = 13;   // il LED è già presente sulla scheda!
const int Soglia = 500;   // soglia rumore "forte"
int Valore = 0;     //
boolean Stato = LOW;  // stato LED (LOW = spento, HIGH = acceso)

void setup() {
 pinMode(InputPin, INPUT);    // set the digital pin as input
 pinMode(LEDPin, OUTPUT);    // set the digital pin as output
 Serial.begin(9600);
}

void loop() {
 Valore = analogRead(InputPin );  // 0 - 1023
  Serial.print(Valore, DEC);
 if (Valore > Soglia) digitalWrite(LEDPin, !Stato);   // ad ogni superamento di Soglia, lo Stato del LED si inverte (vedi operatore "!")
}

Go Up