Go Down

Topic: [RISOLTO]Creare interruttore battimani (Read 14665 times) previous topic - next topic

electro2

quando batto le mani non da segni di vita

tonid

prova prima con il pot tutto in un senso e poi riprova con il pot ruotato tutto nell'altro....Hai collegato i pin del pot in maniera giusta senza confondere il pin centrale con uno dei due laterali ?

electro2

una domanda ma il microf. devo collegare vcc, gnd, aud normalmente?

tonid

#63
Sep 01, 2012, 04:41 pm Last Edit: Sep 01, 2012, 04:44 pm by tonid Reason: 1
Non so se ho capito bene la domanda.....Il microfono deve essere alimentato come facevi prima ,altrimenti non funziona niente..

edit.  aud devi collegarlo al potenziometro come ti ha fatto vedere brunello

electro2

dimmi una cosa come posso aggiungere il codice per farlo vedere a tutti voi? forse sbaglio a regolare A0.

electro2

#65
Sep 01, 2012, 04:58 pm Last Edit: Sep 01, 2012, 05:00 pm by electro2 Reason: 1
QUESTO  E IL CODICE:

Code: [Select]
/*
*
* Clapper project
* author: Manoj Kunthu
* last update: 6/5/11
*/


int clap = 1;
boolean enabled = true;
int sensorValue = 0;


int SIZE = 25;
int buffer[25];


int now = 0;
int average = 0;
int total = 0;
int offset = 30;
boolean initialized = false;


int out = 10;


const int inPin0 = A0;
const int clapLed1 = 12;
const int clapLed2 = 11;


const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 3;       // the pin that the LED is attached to


// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


void setup() {                
 // initialize the digital pin as an output.
 // Pin 13 has an LED connected on most Arduino boards:
 pinMode(out, OUTPUT);
 
 // initialize the button pin as a input:
 pinMode(buttonPin, INPUT);
 // initialize the LED as an output:
 pinMode(ledPin, OUTPUT);
 
 pinMode(clapLed1, OUTPUT);
 pinMode(clapLed2, OUTPUT);


 Serial.begin(9600);
}


void loop() {
 // read the pushbutton input pin:
 buttonState = digitalRead(buttonPin);
 // compare the buttonState to its previous state
 if (buttonState != lastButtonState) {
   // if the state has changed, increment the counter
   if (buttonState == HIGH) {
     buttonPushCounter++;
   }
 }
 // save the current state as the last state,
 //for next time through the loop
 lastButtonState = buttonState;


 if (buttonPushCounter % 2 == 0) {
   digitalWrite(ledPin, HIGH);
   
   enabled = true;
 }
 else {
   digitalWrite(ledPin, LOW);
   digitalWrite(clapLed1, LOW);
   digitalWrite(clapLed2, LOW);
   enabled = false;
 }


 if(enabled){
   sensorValue = analogRead(inPin0);


   //insert the sensor value into the array
   if(initialized){          
     total = total - buffer[now] + sensorValue;    
   }          
   else{
     total = total + sensorValue;


     if(now + 1 >= SIZE)
       initialized = true;
   }


   //Find the average room noise level
   if(initialized)
     average = (total/SIZE) + offset;
   else
     average = (total/(now+1)) + offset;
   
   if (sensorValue > average)
   {
     Serial.print(" AVE: ");
     Serial.print(average);
     Serial.print("    Sensor: ");
     Serial.println(sensorValue);
   }


   if (sensorValue > average+30)
   {
     
     digitalWrite(clapLed1, HIGH);
     
     Serial.print(" AVE: ");
     Serial.print(average);
     Serial.print("    Sensor: ");
     Serial.println(sensorValue);
     //clap *= -1;
     Serial.println("---Single req");
     delay(100);


     int inc;
     for(inc = 0; inc<2000; inc++)
     {
       sensorValue = analogRead(inPin0);
       //insert the sensor value into the array
       if(initialized){          
         total = total - buffer[now] + sensorValue;    
       }          
       else{
         total = total + sensorValue;


         if(now + 1 >= SIZE)
           initialized = true;
       }


       //Find the average room noise level
       if(initialized)
         average = (total/SIZE) + offset;
       else
         average = (total/(now+1)) + offset;


       if (sensorValue > average)
       {
         digitalWrite(clapLed2, HIGH);
         Serial.print("--- AVE: ");
         Serial.print(average);
         Serial.print("    Sensor: ");
         Serial.println(sensorValue);
         clap *= -1;
         Serial.println("--------Double Clap");


         if(clap == 1){
           digitalWrite(out, HIGH);   // set the LED on
         }
         else{
           digitalWrite(out, LOW);   // set the LED off
         }
         delay(1000);
         break;
       }
       buffer[now] = sensorValue;
       now = (now+1)%SIZE;
     }
     Serial.println("---Single ack");
     delay(500);
     Serial.println("done");
   }
   buffer[now] = sensorValue;
   now = (now+1)%SIZE;


   if(average < 0 || average > 800)
   {
     initialized = false;
     
     for(now = 0;now < SIZE; now++)
     {
      buffer[now] = 0;
     }
     
     digitalWrite(out, LOW);
     total = 0;
     now = 0;
     average =0;
     Serial.print(average);
     Serial.println("RESET");


   }
 }
 else
 {
   digitalWrite(3, LOW);
   Serial.println("disabled ");
 }
 digitalWrite(clapLed1, LOW);
 digitalWrite(clapLed2, LOW);
}




cyclone

#66
Sep 01, 2012, 07:59 pm Last Edit: Sep 01, 2012, 09:53 pm by cyclone Reason: 1
voglio dire, ok non mettiamo il filtro, ma leggendo il sorgente mi pongo una domanda.....

sto sognando o sono in fase rem? cioè vorrei sapere ... qualcuno ha testato il programma?

vi chiedo questo perchè non riesco a decifrare la funzione di questo firmware...
il codice dovrebbe riconoscere il battito delle mani.... ma almeno qualcosa che ci assomigli... giusto?

Detto ciò,
dov'è la funzione derivata prima per il calcolo del gradiente da applicare ai campioni acquisiti dall'adc attraverso la quale si potrebbe in qualche modo estrapolare l'informazione di una variazione improvvisa del livello audio e quindi la pendenza con cui varia il volume ?(il battito è un rumore secco improvviso con certe caratteristiche simili ad uno sparo)
Magari a quel punto misurandone anche la durata si potrebbero utilizzare queste informazioni per dire: questo è un battito di mani, questo no.
Per fare un riconoscitore di battito-mani è necessario almeno un analizzatore di inviluppo ampiezza audio.... se nò stiamo parlando di un semplicissimo Vox Controlled Relay Switch, che è tutta un'altra cosa.

ciao

electro2

credo che tu abbia perfettamente ragione ciclone , cosa mi suggerisci di fare? grazie

Michele Menniti

Cyclone, io te l'ho detto sin dal tuo primo intervento in questo Topic che qui non si sta volando basso, si sta scavando sotto terra. Se vuoi il mio parere il circuito iniziale che il nostro paisà ha realizzato con qualche modifica è un semplice "riconoscitore" di rumore, noi ci abbiamo scherzato su ma le cose stanno realmente così. Il principio è:
il mike percepisce qualunque cosa e la amplifica fornendo segnali sinus all'ingresso di A0, quando l'intensità del segnale supera per tre volte la soglia stabilita nel firmware, si accende il carico.
Quindi è davvero possibilissimo che uno scorr, una gridata, un piatto che si rompe, una finestra che sbatte, rientrino nei rumori che contribuiscono al "funzionamento", appunto un "Vox Controlled Relay Switch", come lo chiami tu.
Quindi tutto ciò che tu ti aspetti non c'è, hai voglia di ammazzarti, speravo te ne fossi reso conto da solo.
L'unica cosa che si può fare lì è alzare il più possibile la soglia di intensità minima e diminuire l'amplificazione del mike, io ho dato la dritta, brunello gli ha dato lo schema (ma il potenziometro non dovrebbe superare i 10kohm), lui non è stato nemmeno in grado di montarlo, eppure quello schemino è perfetto, ora mi viene sinceramente da ridere pensando che, pur non avendo compreso, come buona parte di tutti noi, una beneamata mazza del tuo ultimo discorso, ti dà ragione e ti chiede come deve procedere.

@ electro2: tu non hai davvero idea di cosa sia la barca sulla quale stai tentando di salire, il mio spassionato consiglio è: prova a montare un potenziometro da 10k come ti ha schematizzato brunello e a tentativi regolalo fino ad ottenere la migliore combinazione, quello sarà il massimo del tuo circuito, altrimenti cancella tutto e aspetta che Cyclone ti faccia uno sketch adeguato e ti aiuti a completare l'hardware, se lui ha la pazienza di farlo saremo tutti contenti.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

electro2

#69
Sep 01, 2012, 10:06 pm Last Edit: Sep 01, 2012, 10:11 pm by electro2 Reason: 1
menniti io non voglio che ciclone mi faccia lo schema come ai detto tu, e poi anche se ti sempra strano, una mezza cosa l'ho capita...io volevo un suggerimento riguardo il lavoro fatto, se lo butto nel cesso oppure continuo , capì paisa'  :D  il potenziometro lo montato bene, nel serial monitor mi da i valori della resistenza , ma il circuito non funziona, cioè  il rele' non attacca......se vedi i post precedenti io ho fatto notare quale microfono io abbia comprato....dagli un'occhiata

Comunque vada, Volevo scusarmi con tutti voi per la mia cocciuta testa, non credevo che avevate perso la pazienza......Grazie lo stesso

Michele Menniti

non penso che nessuno abbia perso la pazienza, però tu devi seguire una strada per volta, se fai il grillo alla fine non concludi nulla.
Allora, il potenziometro, se lo hai collegato CORRETTAMENTE, girato su un estremo fa funzionare il circuito normalmente, com'è ora; girato sull'estremo opposto probabilmente non lo fa funzionare; procedendo dalla prima posizione all'ultima, ruotandolo leggermente, devi notare per forza una diminuzione della sensibilità; cioè lo giri tanticchia e provi di nuovo col rumore, un poco alla volta, per forza di cose devi arrivare ad un punto decente. Se dici che non funziona stai sbagliando qualcosa, certamente il potenziometro non deve andare oltre 10k, amio avviso, che valore hai usato?
Il microfono che hai preso è esattamente quello di cui abbiamo sempre parlato, amplifica 100 volte il segnale di ingresso, ovvio che scatta per qualsiasi rumorino; col metodo che ti ho detto in qualche modo riduciamo tale fattore, ma devi fare la prova con impegno altrimenti certo che poi ci si scoccia. ah, durante le prove e ccriature tienle luntane, chelle fanno cchiu casino delle bertucce e non ti aiutano certo a tarare lo strumento come si deve :smiley-sweat:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

cyclone

#71
Sep 01, 2012, 10:55 pm Last Edit: Sep 01, 2012, 11:08 pm by cyclone Reason: 1
non voglio perdere le speranze neppure io....
facciamoloooo funzionareeeee

se i consigli di menniti non andranno a buon fine, ma non per colpa sua...
ti dò l'ultima chance ma ti devi sforzare tanto ma tantoooo e poi boh!

per non farti complicare la vita con le matematiche .. e con le TDS o teorie dei sistemi
ti allego uno schema di un filtro realizzato apposta per la tua applicazione con un cutoff a 15.92 Hz per quanto riguarda il fpa e
un altro cutoff a 4822.9 Hz relativo al fpb.

non saprei più come aiutarti :) stasera ho battuto le mani come uno scemo per farti sto filtro.

tonid

Quote
menniti io non voglio che ciclone mi faccia lo schema come ai detto tu, e poi anche se ti sempra strano, una mezza cosa l'ho capita...io volevo un suggerimento riguardo il lavoro fatto, se lo butto nel cesso oppure continuo , capì paisa'    il potenziometro lo montato bene, nel serial monitor mi da i valori della resistenza , ma il circuito non funziona, cioè  il rele' non attacca......se vedi i post precedenti io ho fatto notare quale microfono io abbia comprato....dagli un'occhiata

Comunque vada, Volevo scusarmi con tutti voi per la mia cocciuta testa, non credevo che avevate perso la pazienza......Grazie lo stesso


Io non ho perso la pazienza e,come diceva Michele,non credo che nessuno altro l'abbia persa....
Il microfono deve essere collegato come segue:
-vcc va a +5volt di arduino;
-gnd va a gnd di arduino;
-aud va al  primo pin del potenziometro;
-il terzo pin del potenziometro va a gnd;
-il pin centrale del potenziometro(cursore) va all'ingresso analogico di arduino A0.
Ora ,se i collegamenti sono tutti giusti ,tenendo il pot tutto girato verso il primo pin non avrai nessuna attenuazione del segnale di uscita del microfono quindi il circuito dovrebbe per forza funzionare e avere la stessa sensibilità a qualsiasi tipo di rumore così come avevi prima. Girando invece il pot nella direzione opposta inizierai ad avere man mano una attenuazione del segnale del microfono fino a farlo scomparire nel caso che arrivi a fine corsa del pot.
Per quanto riguarda invece il sw è parecchio incasinato e sinceramente io non sono riuscito a capire bene quello che è stato fatto.....
Se dopo che ricontrolli tutti i collegamenti e ti assicuri che tutti i fili facciano bene contatto(capita che non sia così)il relè non si accende lo stesso bisogna capire cosa non va ma non è il potenziometro che può aver compromesso il funzionamento del circuito.

ops.....mentre scrivevo è arrivato uno schema....ora invio e guardo...

Michele Menniti

secondo me la pazienza l'ha persa lui ]:D

@Cyclone: bello e semplice questo passa-banda, speriamo solo che le sue mani non producano frequenze da ali di pipistrello :D
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

tonid

Quote
secondo me la pazienza l'ha persa lui


mmmm.... tu dici ?  Sarebbe un peccato.....era ormai vicino alla soluzione più o meno definitiva...

Go Up