mercoledì 18 dicembre 2013

Mini impianto di allarme con Arduino

Salve a tutti

oggi propongo un progetto dalla semplicità disarmante sviluppato con Arduino con l'intenzione più che altro di mostrare il funzionamento di un sensore di prossimità ad ultrasuoni, questo aggeggio qua per intenderci:



Denominato con la siglia SFR04 e acquistabile su robot-italy.com alla modica di cifra di 23,40 euro.

Come scrivetti ho scritto prima è un sensore che calcola la distanza che c'è tra esso e il primo oggetto che c'è davanti a esso, questo in particolare ha un raggio d'azione di un metro/un metro e mezzo, e il suo funzionamento è molto semplice, il sensore spara un segnale a ultra suoni a intermittenza e man mano calcola quanto tempo ci mette questo segnale a tornare indietro rimbalzato appunto dal primo oggetto che incontra. In pratica ascolta ascolta il suo eco ed ha una precisione di più o meno un centimetro:



Questo sensore capovolto si presenta così:

Come è possibile notare presenta 5 fori, dove si trovano i suoi altrettanti 5 pin.

In ordine da sinistra, guardando l'immagine in spoiler, troviamo 

-GND
-buco da lasciare vuoto
-Trigger
-Echo
-5V


Con questo sensore si possono fare tante cose, la prima che mi è venuta in mente è un semplicissimo impianto d'allarme che suona quando una porta (o perché no una finestra) viene aperta per garantire una masturbazione serena senza sorprese.

Oltre a questo sensore, userò anche un Piezo, un bagaglino che suona in base al segnale che gli si invia. Il nome è buffissimo ma fa il suo sporco lavoro:



Anche questo dovrebbe essere assurdamente facilmente reperibile presso robot-italy.com.

Ok con questi componenti e qualche jumper andiamo a montare il tutto su Arduino, ho fatto uno schema con Fritzing così è chiaro:






Purtroppo non ho trovato l'immagine del sensore di prossimità in Fritzing percui l'ho rappresentato con una becera nota, però mi sembra chiaro dai.


In foto si presenta cosi:





Ok, ora per dare vita al tutto velocemente sfrutterò del codice che si trova su questa pagina



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * Autore: Corrado Ignoti
 * 
 * Descrizione: Interfaccia un SFR05 con Arduino
 *
 * Maggiori informazioni su: http://www.corradoignoti.it
 */

const int numOfReadings = 10;                   // numero di letture
int readings[numOfReadings];                    
int arrayIndex = 0;                             // contatore per ciclare nell'array
int total = 0;                                  
int averageDistance = 0;                        // distanza media

// inizializzo i PIN per collegare la scheda SFR05
int echoPin = 2;                                // echo (digital 2)

int initPin = 3;                                // trigger  (digital 3)
unsigned long pulseTime = 0;                    
unsigned long distance = 0;                     // distanza in cm

//setup
void setup() {
  pinMode(initPin, OUTPUT);                     
  pinMode(echoPin, INPUT);    
  
  // inizializza un array delle letture
  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
    readings[thisReading] = 0;
  }
     Serial.begin(9600);  //inizializza la seriale
}

// loop principale
void loop() {
  //manda un impulso di ampiezza 10 us
  digitalWrite(initPin, HIGH);                    
  delayMicroseconds(10);                          
  digitalWrite(initPin, LOW);                     
  pulseTime = pulseIn(echoPin, HIGH);             // Aspetta l'eco di risposta
  distance = pulseTime/58;                        // Distance = tempo impulso / 58 per calcolare i [cm] di distanza.
  
 //Per diminuire l'errore crea un array con le letture e calcola la media
  total= total - readings[arrayIndex];            
  readings[arrayIndex] = distance;               
  total= total + readings[arrayIndex];            
  arrayIndex = arrayIndex + 1;                    
  
  if (arrayIndex >= numOfReadings)  {
      arrayIndex = 0;
  }
  averageDistance = total / numOfReadings;      //Media dei valori delle distanze acquisite
  
  //Scrive il valore della distanza media sulla seriale
  Serial.print ("Distanza (media): ");
  Serial.println(averageDistance, DEC);         
  delay(100);                                   
}

Che altro non fa se non prendere un campione di dati e generarne la media in modo da avere un risultato abbastanza preciso.

Ora noi semplicemente aggiungiamo questa porzione di codice in fondo:

1
2
3
4
5
6
7
8
if(averageDistance<40){
    for(int i = 0; i< 5; i++){
      tone(8,500,500);
      delay(100);
      tone(8,1000,500);
      delay(100);
    }
  }

Che semplicemente dice al Piezo di suonare (comando tone() ) nel caso un oggetto si trovi entro 40 cm. 

Ho scelto 40 cm completamente a caso.

Carichiamo il tutto su Arduino, e questo è il risultato:



Chiaramente così com'è è inutile, però applichiamo il tutto di fronte a una porta, con un Piezo molto più potente, e allora le cose cominciano ad avere il loro perché.

Stay Metal
Beto




Nessun commento:

Posta un commento