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.
Descrizione del progetto
[modifica]Il sistema ha il seguente funzionamento:
- in ingresso riceviamo il segnale d'avvio, dato dal cellulare tramite BT, che andrà a inizializzare i sensori di prossimità.
- 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.
Questo processo ha inizio quando dal cellulare viene indicata la modalità di funzionamento voluta:
- Modalità 1 - la macchina continuerà a seguire all'infinito la linea del circuito.
- Modalità 2 - Attiva la modalità notturna, accendendo l'abbagliante davanti
- 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]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]-
Prototipo 3D del progetto
-
Render del prototipo
-
Modello realizzato in laboratorio
Codice
[modifica]Di seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:
- inclusione delle librerie, definizione delle costanti e variabili;
- codice da eseguire all'avvio del programma e alla pressione del tasto di reset;
- 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.