Pages: [1] 2   Go Down
Author Topic: Collegare un microfono  (Read 2416 times)
0 Members and 1 Guest are viewing this topic.
Montemarciano, Ancona, Italia
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Montemarciano, Ancona, Italia
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Senza schema e sketch possiamo solo indovinare e la mia razione di indovinello la avevo finita giá in agosto.   smiley-wink smiley-wink
Ciao Uwe
Logged

Montemarciano, Ancona, Italia
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

salve o copiato anche io lo stesso circuito o inserito i dati in arduino
Code:
/**
 * 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 ?



* IMG_0460[1].JPG (1847.21 KB, 2592x1936 - viewed 75 times.)
« Last Edit: September 18, 2013, 10:50:47 pm by AGoGo » Logged

AGoGo AMA Alfredo M.

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 933
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
...
const int analogPin = 0;
int mn = 1024;     // mn only decreases
int mx = 0;        // mx only increases
...
Logged

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: September 19, 2013, 12:13:29 pm by AGoGo » Logged

AGoGo AMA Alfredo M.

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 933
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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
Logged

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

AGoGo AMA Alfredo M.

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 933
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Certo... ho commesso l'errore di dimenticare la parentesi graffa.
Code:
...
  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
}
Logged

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie mille ma non capisco come faccio a bloccare l'accensione del led .. come anche lo spegnimento con un comando specifico
Code:
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(); 

}
Logged

AGoGo AMA Alfredo M.

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 933
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

AGoGo AMA Alfredo M.

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 933
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 "!")
}
« Last Edit: September 23, 2013, 04:46:06 am by cyberhs » Logged

Pages: [1] 2   Go Up
Jump to: