Go Down

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

Madwriter

#75
Sep 03, 2012, 10:01 am Last Edit: Sep 03, 2012, 10:03 am by Madwriter Reason: 1

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

mah scusate ho letto un po il topic cosi per curiosità ma in questo modo anche se sparo 3 colpi di pistola(per fare un esempio non troppo scabroso) mi si accende la luce o quello che c'è collegato al relay?
Capisco i vari filtri cercare di amplificare il rumore etc ma per me conviene fare in modo da temporizzare per bene lo sketch ovvero primo rumore incremento la variabile ,secondo rumore la reincremento , passano 5 secondi la azzero in questo modo c'è bisogno di 3 rumori consecutivi per accenderlo e ci sono meno possibilità di disturbi vari.
ps scusate se lo avevate già detto,volevo solo dare un consiglio  :smiley-mr-green: cmq potreste usare un modulo di riconoscimento vocale forse e configurabile per i vari suoni :D
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

tonid

Quote
mah scusate ho letto un po il topic cosi per curiosità ma in questo modo anche se sparo 3 colpi di pistola(per fare un esempio non troppo scabroso) mi si accende la luce o quello che c'è collegato al relay?
Capisco i vari filtri cercare di amplificare il rumore etc ma per me conviene fare in modo da temporizzare per bene lo sketch ovvero primo rumore incremento la variabile ,secondo rumore la reincremento , passano 5 secondi la azzero in questo modo c'è bisogno di 3 rumori consecutivi per accenderlo e ci sono meno possibilità di disturbi vari.
ps scusate se lo avevate già detto,volevo solo dare un consiglio   cmq potreste usare un modulo di riconoscimento vocale forse e configurabile per i vari suoni

Ma era quello a cui volevamo arrivare......Se si usano dei filtri passa banda intanto si prendono in esame solo le frequenza più vicine possibili al clap e poi con il sw si fa in modo da scremare ancora il rumore facendo modo di prendere per buono un rumore più o meno uguale in frequenza ed ampiezza ripetuto per n volte......E' ovvio però che se uno ha la tosse e per sfiga la frequenza è simile al clap la luce(ad esempio)continuerà ad accendersi e spegnersi......toccherà correre lontano dal microfono  :smiley-mr-green:

electro2

#77
Sep 03, 2012, 11:59 am Last Edit: Sep 03, 2012, 12:01 pm by electro2 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.


Grazie ciclone,ieri sera ho finito di montare il tuo circuito , ma devo farti ancora delle domande pratiche  :smiley-roll-sweat:
Ma il pinAUD del microfono va sempre  sul pin A0 di arduino giusto?
Ancora una :P , ma le uscite del LM358, pin1 e il pin7, dove li collego? :smiley-red:
Non arrabbiarti x questa domanda.Grazie


Michele Menniti

#78
Sep 03, 2012, 12:22 pm Last Edit: Sep 03, 2012, 06:17 pm by Michele Menniti Reason: 1
XD XD XD

no, io non mi arrabbierò ]:D


no, io non mi arrabbierò
si consiglia di visionare l'intero video, la scena della frase di riferimento comunque termina al minuto 3 e 30 sec circa :smiley-yell:

: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

tonid

Quote
Grazie ciclone,ieri sera ho finito di montare il tuo circuito , ma devo farti ancora delle domande pratiche 
Ma il pinAUD del microfono va sempre  sul pin A0 di arduino giusto?
Ancora una  , ma le uscite del LM358, pin1 e il pin7, dove li collego?
Non arrabbiarti x questa domanda.Grazie

Dalle domande che hai fatto forse non hai capito il funzionamento di un filtro e in che modo si usa.......no problem,cerco di spiegartelo.
Il mic che hai tu rileva ed amplifica di 100 volte tutti i tipi di rumore e di conseguenza tutte le frequenze ,ecco perchè qualsiasi tipo di rumore tu faccia ,tramite la lettura dell'ingresso di arduino A0,si eccita il relè......per fare in modo che il relè si attivi solo con i rumori (frequenza)il più vicino possibile al rumore (frequenza) del battito di mani serve un dispositivo che riesca a far arrivare al pin analogico A0 di arduino solo le frequenze il più vicino possibile al battito di mani........Anche se il discorso in realtà sarebbe un po più complicato dovresti aver capito da solo dove devi mettere il filtro.....ovvero tra il mic e l'ingresso A0 di arduino.....
Quindi l'uscita del microfono ,nel tuo caso ,è quel pin 2 del microfono che ti ha disegnato cyclone e va collegata ad R1/C1,l'uscita del filtro è invece il pin 7 dell'LM358 e va collegata al pin A0 di arduino.......Tutti i  Vcc vanno ai 5v di arduino,tutti i gnd vanno ai gnd di arduino.
Mentre ,quel filo che vedi collegato al pin 1 dell'LM358 penso lo abbia usato per verificare la frequenza di taglio del filtro passa alto......
Se vuoi approfondire il discorso in rete trovi un sacco di materiale in merito,basta cercare.....
Ciao

electro2

Grazie tonid sei sempre gentile, e chiaro.


tonid

Quote
Grazie tonid sei sempre gentile, e chiaro.

Figurati.....

electro2

Ciao ragazzi, come va'.... finalmente ho finito il mio lavoro e a quanto pare funziona, pero' secondo me ce un piccolo problema con il codice...
quando alimento il circuito si accende e spegne da solo per 12 volte, poi si ferma, poi batto le mani e sembra funzionare, continuo a battere le mani per 20 volte ,poi lultimo battito, cioe' il 21esimo si blocca, attendo circa 5 secondi do' un'altro battito di mani e ritorna ad accendersi e spegnersi di nuovo per 12 volte........
=( =( credo non sia normale.
potete farmi la cortesia di dare un'occhiata al codice, perche' non riesco a capire da dove provenga questa cosa, per favore e l'ultimo piacere che vi cerco  =( Grazie
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);
}

electro2


Ciao ragazzi, come va'.... finalmente ho finito il mio lavoro e a quanto pare funziona, pero' secondo me ce un piccolo problema con il codice...
quando alimento il circuito si accende e spegne da solo per 12 volte, poi si ferma, poi batto le mani e sembra funzionare, continuo a battere le mani per 20 volte ,poi lultimo battito, cioe' il 21esimo si blocca, attendo circa 5 secondi do' un'altro battito di mani e ritorna ad accendersi e spegnersi di nuovo per 12 volte........
=( =( credo non sia normale.
potete farmi la cortesia di dare un'occhiata al codice, perche' non riesco a capire da dove provenga questa cosa, per favore e l'ultimo piacere che vi cerco  =( Grazie
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);
}




Nessuno puo aiutarmi xfavore..... :(

tonid

Ciao electro2 , sinceramente non ci capisco molto da quel codice ma in ogni caso ,se fossi al posto tuo,lo riscriverei secondo le mie necessità,anche perchè il tuo schema elettrico ora è diverso.
Un modo semplice di creare un codice funzionante è quello di procedere a piccoli passi e verificarne il funzionamento.
Nel tuo caso inizierei a fare delle letture tramite l'analog read e,stampandole in serial monitor,controllare e capire il valore che ottieni quando batti le mani e quando no (ovvero leggerai il valore corrispondente al rumore di fondo che c'è nella stanza).....in base a questi valori  potrai iniziare a studiare un modo che ti permetterà di farlo funzionare come vuoi tu.
Nell'ide ci sono diversi esempi che ti aiutano a capire come fare una lettura da un pin analogico e come poter stampare il valore ottenuto nel serial monitor.


electro2

Grazie tonid il problema e che ho gia' montato tutto su una scheda.... =( perche' quando ho provato su la breadboard no ho battuto le mani tante volte , avevo visto che funzionava e non ci ho fatto caso , e sono passato subito alla scheda. Ora come faccio a visualizzare i valori??

electro2

risolto problema codice......pero' ce un piccolo problema , alimento il circuito con un trasformatore da 5v e  SI blocca  il rele', quando invece prendo i 5v di arduino va' tutto correttamente....come devo fare? il trasformatore e di 5v 400mA, ho usato anche quello da 250mA, ma fa lo stesso problema

tonid

Stai alimentando il circuito del filtro con un alimentatore ed arduino da usb ? Se è così devi collegare insieme le gnd delle due alimentazioni.

electro2

tonid, avevo dimenticato di dirti che il filtro non lo misi piu' sono riuscito a mettere il potenziom.....ora va tutto a posto ma quando alimento il circuito (esterno) con trasformatori, non va affatto bene, se invece :0 alimento atduino con la porta usb, e nei pin 5v e gnd collego il circuito esterno, funziona..


Go Up