Sistema guidato di raccolta con Arduino

In questa lezione si mostrerà come, tramite la scheda Arduino, sia possibile ricostruire il funzionamento di un ipotetico sistema di raccolta, come quello della spazzatura, guidato da una linea che va a formare un "circuito" che l'utente può sbizzarrirsi a creare; questo grazie l'utilizzo di appositi sensori di prossimità, 4 motori e il driver che li gestisce (l298n), e un ricevitore Bluetooth per controllare tutto da Smartphone.

laboratorio
laboratorio
Sistema guidato di raccolta con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi automatici per le superiori 2
Avanzamento Avanzamento: laboratorio completa al 100%

Descrizione del progetto modifica

 
Motore 3-6V

Il sistema ha il seguente funzionamento:

  1. in ingresso riceviamo il segnale d'avvio, dato dal cellulare tramite BT, che andrà a inizializzare i sensori di prossimità.
  2. in uscita si avrà il movimento dei 4 motori, che seguiranno e rimarranno sul percorso stabilito, oltre che una luce in caso di bassa luminosità e il magnete, utilizzato per la raccolta.
 
Collegamento base di un L298N per la gestione di un singolo motore

Questo processo ha inizio quando dal cellulare viene indicata la modalità di funzionamento voluta:

  1. Modalità 1 - la macchina continuerà a seguire all'infinito la linea del circuito.
  2. Modalità 2 - Attiva la modalità notturna, accendendo l'abbagliante davanti
  3. Modalità 3 - Attiva la funzione raccolta: quando entrambi i sensori incroceranno una linea perpendicolare a quella del circuito, che li farà attivare entrambi, la macchina si fermerà e attiverà il magnete che andrà ad attrarre l'oggetto posto vicino ad essa. Lo rilascerà con un apposito comando dato dall'utente dal cellulare.

Tutti i parametri sono regolabili attraverso le variabili nella prima parte del codice.

Schema di montaggio modifica

Di seguito viene riportato lo schema di montaggio.

 

Componenti utilizzati modifica

Elenco componenti
Componente Descrizione Q.tà
DC Motor   Motore 4
SG035 Sensore di prossimità 2
Led   Fanale anteriore 1
Magnete   1
L298n Ponte ad H 1
HC-05 BT sensor 1

.

Prototipo modifica


Codice modifica

Di seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:

  1. inclusione delle librerie, definizione delle costanti e variabili;
  2. codice da eseguire all'avvio del programma e alla pressione del tasto di reset;
  3. programma vero e proprio.

Librerie, costanti e variabili modifica

#include <SoftwareSerial.h>

int bt_data;            //variabili per funzionamento Bluetooth
int mode = 0;

int IR1=11;             //pin a cui si collegano i due sensori di prossimità 
int IR2=12;   
                        //collegamenti al L2998n
int enA = 5;            //pin per abilitare Motore A
int MotorAOR=2;         //pin per far ruotare il Motore A in Orario
int MotorAANT=3;        //pin per far ruotare il Motore A in Antiorario
int enB = 6;            //pin per abilitare Motore B
int MotorBOR=4;         //pin per far ruotare il Motore B in Orario
int MotorBANT=7;        //pin per far ruotare il Motore B in Antiorario

int rele1=10;           //pin per collegmaneto ai relé (Luce 12v e Magnete)
int rele2=9;

int sx;                 //variabili per funzionamento dei sensori di prossimità
int dx;

Setup modifica

Inizializzazione del progetto, dove vengono identificate le uscite e le entrate di Arduino verso i vari componenti e si inizializza la comunicazione seriale.

void setup() 
{
  pinMode(enA, OUTPUT);           //Dichiarazione Output e Input dei vari componenti
  pinMode(enB, OUTPUT);
  pinMode(IR1,INPUT);
  pinMode(IR2,INPUT);
  pinMode(MotorAOR,OUTPUT);
  pinMode(MotorAANT,OUTPUT);
  pinMode(MotorBOR,OUTPUT);
  pinMode(MotorBANT,OUTPUT);
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  
  Serial.begin(9600);             //Inizializzazione comunicazione seriale
  delay(500);
}

Corpo del programma modifica

void loop() 
{
  if(Serial.available() > 0){                 //Lettura BT
    bt_data = Serial.read();  
  }
  if (bt_data == 10){                         //Se il dato è uguale a 1 allora vai alla modalita 1
    mode = 1;
  }
  if (bt_data == 2){                          //Se il dato è uguale a 2 allora vai alla modalita 2
    mode = 2;
  }
  if (bt_data == 3){                          //Se il dato è uguale a 3 allora vai alla modalita 3
    mode = 3;
  }
  
  switch (mode){                              //In base al valore della variabile "mode" fai:
    case 1:                                   //Se mode=1 funziona solo come Line Follower
    dx = digitalRead(IR1);
    sx = digitalRead(IR2);
  
    if(dx == 0 && sx == 0){
      Avanti();
    }
    if(dx == 1 && sx == 0){
      Destra();
    }
    if(dx == 0 && sx == 1){
      Sinistra();
    }
    case 2:                                   //Se mode=2 accende abbaglianti e funziona come Line Follower
    Luce();
    dx = digitalRead(IR1);
    sx = digitalRead(IR2);
  
    if(dx == 0 && sx == 0){
      Avanti();
    }
    if(dx == 1 && sx == 0){
      Destra();
    }
    if(dx == 0 && sx == 1){
      Sinistra();
    }
    case 3:                                  // Se 3 attiva la funzione di Raccolta: quando incontrerà 2 linee 
    dx = digitalRead(IR1);                   // nere attiverà il magnete che potra cosi recuperare l'oggetto
    sx = digitalRead(IR2);
  
    if(dx == 0 && sx == 0){
      Avanti();
    }
    if(dx == 1 && sx == 1){
      Fermo();
      Raccolta();
     }
    if(dx == 1 && sx == 0){
      Destra();
    }
    if(dx == 0 && sx == 1){
      Sinistra();
    }
  }
}
 
void Avanti(){                                   //Funzione avanti
  Serial.println("Avanti");
  dx = digitalRead(IR1);
  sx = digitalRead(IR2);
  Ruota();
  analogWrite (enA, 180);
  analogWrite (enB, 180);
}

void Fermo(){                                   //Funzione fermo
  Serial.println("fermo");
  dx = digitalRead(IR1);
  sx = digitalRead(IR2);
  digitalWrite(MotorAOR,LOW);
  digitalWrite(MotorAANT,LOW);
  digitalWrite(MotorBOR,LOW);
  digitalWrite(MotorBANT,LOW);
  analogWrite (enA, 0);
  analogWrite (enB, 0);
}

void Sinistra(){                                 //Funzione sinistra
  Serial.println("Sinistra");
  dx = digitalRead(IR1);
  sx = digitalRead(IR2);
  Ruota();
  analogWrite (enA, 150);
  analogWrite (enB, 180);
  delay(100);
}

void Destra(){                                   //Funzione destra
  Serial.println("Destra");
  dx = digitalRead(IR1);
  sx = digitalRead(IR2);
  Ruota();
  analogWrite (enA, 180);
  analogWrite (enB, 150);
  delay(100);
}

void Ruota(){                                  //Funzione che detta l'orientamento delle ruote
  digitalWrite(MotorAOR,HIGH);     
  digitalWrite(MotorAANT,LOW);
  digitalWrite(MotorBOR,HIGH);
  digitalWrite(MotorBANT,LOW);
}
void Luce(){                                  //Funzione abbaglianti
  digitalWrite(rele1,HIGH);
}
void Raccolta(){                              //Funzione raccolta    
  digitalWrite(rele2,HIGH); 
  delay(300);
  Avanti();
  delay(60);
}

Espansioni suggerite modifica

Implementazioni supplementari da poter aggiungere potrebbe essere un timer che automatizza il processo di raccolta oppure un sensore RFID che abiliti la partenza della macchina solo con apposita autorizzazione. Inoltre, aumentandone il carico della batteria, la potenza dei motori e del magnete, sarà possibile trasportare carichi più pesanti in strade più sconnesse, ad esempio in salita, o solamente in modo più veloce.