2 microfoni con 1 led ciascuno da far accendere - PROBLEMA

Ciao a tutti,
vorrei provare a far accendere il led1 (pin12) o il led2 (pin8) a seconda che il suono venga percepito dal mic1 (A0) o dal mic2 (A1).
Ho montato il tutto ma mi ritrovo con i due valori rilevati che si influenzano a vicenda e non capisco il motivo.
Sareste dirmi dove sbaglio?
Qui sotto il codice:

int valoresuonoDx = 0; // variabile valoresuono, che contiene il valore rilevato
// sulla porta 0 (il segnale in uscita dal microfono)
int valoresuonoSx = 0; // variabile valoresuono, che contiene il valore rilevato
// sulla porta 5 (il segnale in uscita dal microfono)
int i = 0; // indice utilizzato per le routine di gestione dei led
int base = 30; // valore di base, utilizzato per definire la soglia minima di accensione
// dei led, che varia in maniera imprevedibile (da 180 a 400) ad ogni
// nuovo utilizzo del sistema.
void setup()
{
 for (i = 7; i <= 13; i++) // ciclo di for per definire le porte da 7 a 13 come porte di output
 pinMode(i, OUTPUT);
 Serial.begin(9600); //inizializza il monitor seriale, per l'esposizione della traccia di debug
}
void loop()
{
 valoresuonoDx = analogRead(A0); // rileva il valore (il volume) del suono
 Serial.print("valoresuonoDx ");
 Serial.println (valoresuonoDx); // traccia di debug
 delay(250);   //delay tra Sensore Sx e Dx
 Serial.print("valoresuonoSx ");
 valoresuonoSx = analogRead(A5); // rileva il valore (il volume) del suono
 Serial.println (valoresuonoSx); // traccia di debug
 Serial.print('\n');
 for (i = 7; i <= 13; i++)
 digitalWrite(i, LOW); // spegne preventivamente tutti i led
 if (valoresuonoDx > valoresuonoSx) // Se il suono A0 supera il valore A1
 digitalWrite (12, HIGH); // accende il led da sinistra
 if (valoresuonoSx > valoresuonoDx) // Se il suono A1 supera il valore A0
 digitalWrite (8, HIGH); // accende il led da sinistra
 delay(100);  // delay prima della prossima lettura
 valoresuonoSx = 0;
 valoresuonoDx = 0;
 }

e qui una lettura:

valoresuonoDx 44
valoresuonoSx 42

valoresuonoDx 41
valoresuonoSx 41

valoresuonoDx 35
valoresuonoSx 35

valoresuonoDx 36
valoresuonoSx 35

valoresuonoDx 42
valoresuonoSx 41

valoresuonoDx 54
valoresuonoSx 41

valoresuonoDx 37
valoresuonoSx 42

valoresuonoDx 39
valoresuonoSx 41

e qui di seguito i collegamenti:

>ita_febaba: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice (… fosse anche UNA sola riga) all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo anche che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:
P.P.S.: e… impara a rileggere i post dopo che li hai inseriti, così ti accorgi di cosa combini …

Grazie mille per il chiarimento, ho sistemato il post. :slight_smile:

Forse sono io un po' duro a capire... ma cosa intendi con "2 valori che si influenzano a vicenda"?

Il segnale che riceve il mic1 aumenta anche il mic2. Se provo per verifica a staccare il cavo A0 trovo comunque valori su A0. Domani allego altre info di dettaglio.
E' come se i segnali non si comportassero da separati.
Nel funzionamento per esempio i led si accendono a volte uno solo e a volte entrambi. A volte dopo l'accensione rimangono accesi fissi.

Se leggi un pin analogico non collegato è normale che ti ritrovi dei valori "casuali".
Prova a leggere il reference
https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

Poi se non ricordo male è meglio fare una lettura a vuoto quando passi da un pin ad un altro.
Prova con

  analogRead(A0);
 valoresuonoDx = analogRead(A0);

...

 analogRead(A5);
 valoresuonoSx = analogRead(A5);

Infine, per come sono messi nella foto, credo sia normale che il rumore su uno venga percepito anche dall'altro... mi sembrano abbastanza vicini... no?

La stessa cosa che penso anche io. Se volesse separarli maggiormente dovrebbe direzionarli ad almeno 90 gradi uno dall’altro (in fondo le nostre orecchie non sono parallele in avanti…) e magari mettere uno schermo separatore tra i due (come la nostra testa…).
Detto questo, ciò che importa è la differenza di volume di uno STESSO suono, quindi il codice dovrebbe funzionare correttamente, a parte il delay che non metterei tra una lettura e l’altra ma alla fine.

Inoltre nelle if che hai messo non mi sembrano corrispondere con il commento:

...
 if (valoresuonoDx > valoresuonoSx) // Se il suono A0 supera il valore A1
 digitalWrite (12, HIGH); // accende il led da sinistra
 if (valoresuonoSx > valoresuonoDx) // Se il suono A1 supera il valore A0
 digitalWrite (8, HIGH); // accende il led da sinistra

Intendi realmente dire che se il suono viene da destra accendi il led di sinistra?

Il valore di soglia poi non lo controlli mai, il programma è “in lavorazione” immagino… In sostanza dovresti attivare i led se il suono di almeno uno dei due supera la soglia, esatto?

Poi ti consiglio di scrivere sempre i programmi in modo parametrico per le informazioni di configurazione come i pin, da mettere come #define.

Infine magari anche indentare il codice aiuta (CVtrl-T dall’interno dell’IDE te lo fa lui) e se hai commenti multilinea meglio metterli in sequenza, o racchiusi tra “/* … */”.

Insomma, prova a vedere queste modifiche che ti ho fatto “al volo” (qui il led resta acceso con l’ultimo suono ricevuto, se il comportamento deve essere differente dovrai poi modificarlo):

// Pin dei sensori
#define SENSORE_DX A5
#define SENSORE_SX A0
// Pin dei LED
#define LED_DX 12
#define LED_SX 8

// valore di base, utilizzato per definire la soglia minima di accensione
// dei led, che varia in maniera imprevedibile (da 180 a 400) ad ogni
// nuovo utilizzo del sistema.
#define SOGLIA 30

// Ritardo (ms) tra una lettura e la successiva
#define DELAY 250

// variabili valoresuono, che contiene i valori rilevati
// sulle porte (il segnale in uscita dal microfono)
int valoresuonoDx = 0; 
int valoresuonoSx = 0; 

void setup()
{
  for (byte i = 7; i <= 13; i++) // ciclo di for per definire le porte da 7 a 13 come porte di output
    pinMode(i, OUTPUT);
  Serial.begin(9600); //inizializza il monitor seriale, per l'esposizione della traccia di debug
}

void loop()
{
  // rileva il valore (il volume) del suono
  valoresuonoDx = analogRead(SENSORE_DX);
  valoresuonoSx = analogRead(SENSORE_SX);
  Serial.print("valoresuonoDx="); Serial.print(valoresuonoDx);
  Serial.print(" valoresuonoSx="); Serial.println (valoresuonoSx);
  if (valoresuonoDx > SOGLIA || valoresuonoSx > SOGLIA) {
    for (byte i = 7; i <= 13; i++)
      digitalWrite(i, LOW); // spegne preventivamente tutti i led
    if (valoresuonoDx > valoresuonoSx) // Se il suono destro supera il valore sinistro
      digitalWrite (LED_DX, HIGH); // accende il led destro
    if (valoresuonoSx > valoresuonoDx) // Se il suono sinistro supera il valore A0
      digitalWrite (LED_SX, HIGH); // accende il led da sinistra
  }
  delay(DELAY);
}

Grazie a tutti per i preziosi consigli e mi scuso per le varie inesattezze.
Vi aggiorno! Ciao

Grazie ho provato ma il problema persiste, inoltre (come prima) ha pochissima sensibilità.
Infatti per far aumentare il valore registrato devo soffiare nel microfono, qualsiasi altro rumore non viene rilevato.
Avete esperienza sulla capacità di sensibilità di questi Mic? (sono gli standard).
In realtà vorrei creare un identificatore di direzione di un suono e con questa sensibilità è veramente impossibile.
I dati inoltre vengono letti dal secondo sensore nel medesimo modo del primo (se soffio nel primo aumentano pari pari anche i valori del secondo).
Credo ci sia di mezzo qualche logica del sistema.
Infatti nei vari progetti trovati in rete non ne trovo nessuno che riporti un doppio sensore in ingresso.
Avete esperienze su doppi sensori analogici?
.....
nel frattempo ho trovato su questo stesso gruppo (ora che so cosa cercare) un problema analogo del 2013 e sembra un problema del compilatore, possibile che sia ancora il medesimo problema?

Se così fosse devo passare dal compilatore di adesso (1.8.13 a quello antico 1.5.4r2)?
Primo progetto sfortunato? :slight_smile:
Grazie.

Non sono pratico, ma non credo sia un problema del compilatore.
Hai provato a mettere la lettura a vuoto prima di quella buona?

Poi sei sicuro che quei microfoni vadano bene collegati direttamente ad un pin di arduino? Che magari non serva uno "stadio amplificatore" (sto un po' sparando... l'hardware non è il mio mestiere...)

ita_febaba:
Grazie ho provato ma il problema persiste, inoltre (come prima) ha pochissima sensibilità.

Beh, come dico sempre, provare UNA cosa per volta. Collega UN sensore, quindi fai un semplice sketch che riporta sulla seriale il livello ottenuto da analogRead() e vedi cosa succede: se anche così non cambia nulla, ossia leggi sempre valori simili anche in presenza di rumore, o hai sbagliato qualcosa nei cablaggi o i moduli sono difettosi o guasti.

Ma hai notato che hanno ognuno un trimmer? Sinceramente, visto l'uso che vuoi farne, io passerei all'uscita digitale e regolazione della sensibilità col trimmer, e se neanche in questo modo funzionano, non so più cosa dirti..

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.