TITOLO DEL PROGETTO Realizzazione di un sistema di riconoscimento Vetro/Plastica con instradamento automatico del rifiuto utilizzando la piattaforma Arduino Ing. Francesco Cozzolino Prof. Ferdinando Implacabile Prof. Giuseppe Caccavale
Questo progetto rappresenta un prototipo di un sistema intelligente per la raccolta differenziata dei rifiuti. Il sistema è stato pensato per la raccolta differenziata delle bottiglie di vetro e di plastica, esso è costituto da un vano in cui si inserisce la bottiglia, con un doppio grado di riconoscimento: 1. Un sistema di fotocellule per accertarsi che il rifiuto sia o vetro o plastica, in caso contrario, ad esempio nel caso di una lattina di alluminio il sistema fornisce un messaggio di errore indicando che non è possibile depositare quel rifiuto 2. Un cella di carico che, in base al peso, riconosce se la bottiglia è di vetro o di plastica e la instrada nel corretto contenitore azionando un servomotore. L interfaccia con l utente avviene tramite display a cristalli liquidi (LCD 2x 16) il quale indica fornisce due informazioni fondamentali: 1. Inserisci bottiglia per indicare che la macchina è pronta 2. Rifiuto indifferenziato per indicare che il rifiuto inserito non è né vetro, né plastica. La premessa, d obbligo, è che il sistema è puramente didattico, ossia contiene degli evidenti bachi a causa dell utilizzo di sensori ed attuatori di basso costo e di una meccanica abbastanza semplice. E intuitivo che basta poco per renderlo professionale, a cominciare dall utilizzo di etichette già vicino alle bottiglie, in modo che basterebbe un lettore di codice a barre per rendere il riconoscimento univoco. Un'altra modifica che si può apportare è l'integrazione con un lettore di chip in modo che all utente che inserisce le bottiglie possono essere associati dei punti da far valere in fase di pagamento delle tasse relative ai rifiuti. Questo progetto è l occasione per imparare ad utilizzare Arduino, a fare esperienza con la programmazione in linguaggio C e ad applicare in pieno il concetto di automazione. Con relative schede di interfaccia tra scheda Arduino, sensori ed attuatori. Tuttavia, può essere utilizzata una struttura in legno o plastica tale da rendere il prodotto finale funzionante, interattivo, didatticamente interessante ed anche bello da vedersi
Propedeutici alla realizzazione del prototipo saranno diverse esercitazioni con Arduino, con l utilizzo di strumenti di misura e con l utilizzo di attrezzature da laboratorio. La lista completa del materiale necessario alla realizzazione di un prototipo è la seguente Item Componente Descrizione Quantità 01 Arduino + cavo UNO 1 02 adattatore 220V/USB 1 03 Display LCD 2x16 1 04 Trimmer o potenziometro 1 05 Led infrarossi IR Trasmettitore Tx 2 06 Led infrarossi IR Ricevitore rx 2 07 R 2 08 R 2 09 Portaled 4 10 Cella di carico 1 11 Circuito integrato INA 114 ap 1 12 zoccolo 8 pin 1 13 R 1 14 servomotore 1 15 millefori piccola 1 16 morsetti per millefori 2.88 6 Realizzazione del sistema in 8 passi: Essendo il progetto completo molto complicato, esso è stato suddiviso in singoli moduli che verranno implementati sia dal punto di vista hardware che software. In particolare si realizzeranno: 1. Interfaccia Arduino Display LCD 2x16 2. Acquisizione di ingressi analogici dalle fotocellule ad Arduino 3. Cella di carico: scheda di condizionamento del segnale proveniente dalla cella di carico ed acquisizione da parte di Arduino 4. Comando di un servo motore con Arduino 5. Scheda elettronica per la distribuzione dell alimentazione 6. Costruzione della struttura di supporto 7. Cablaggio finale 8. Collaudo
Interfaccia Arduino LCD Il display costituirà l interfaccia con l utente, lo schema riportato sui vari siti web è il seguente: Si consiglia, dopo aver fatto le varie prove, di ipotizzare la grandezza del prototipo, e di stabilire almeno orientativamente la distanza tra Arduino e l LCD con eventuale percorso dei cavi di collegamento di modo da avere una struttura finale simile a come indicato sotto: Il software da caricare è il seguente: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
void setup() // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("buon Lavoro!"); void loop() // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setcursor(0, 1); // print the number of seconds since reset: lcd.print(millis()/1000);
Collegamento delle fotocellule ad Arduino Il riconoscimento del rifiuto consta di due parti: il primo avviene tramite fotocellule che inviano ad Arduino due segnali analogici. Lo scopo è quello di porre la bottiglia in un cilindro ove sono applicate le due coppie di fotocellula come si vede nella figura sotto. Vediamo nel dettaglio il collegamento elettrico delle due fotocellule con relative resistenze limitatrici, alimentazioni e cavi di uscita.
Si uniscono i 4 cavi positivi tra loro e diventa un solo positivo, idem si uniscono i 4 negativi. In uscita si hanno 4 cavi, 2 di alimentazione (+ e -) e due che portano i segnali. Il principio di funzionamento è molto semplice, si ha la fotocellula Tx che invia un segnale al ricevitore Rx (ricordiamo che i due diodi trasmittente e ricevente devono essere esattamente allineati), se non vi è alcun ostacolo interposto, il ricevitore Rx riceve il segnale ed invia ad Arduino una certa tensione elettrica. (A livello software poi, si imposta la soglia di lettura). Vediamo il software: Infine ricordarsi di utilizzare gli appositi porta led:
Cella di carico: scheda di condizionamento del segnale proveniente dalla cella di carico ed acquisizione da parte di Arduino La cella di carico è un trasduttore che misura il peso degli oggetti che si posano sopra e fornisce in uscita un segnale di tensione elettrica molto bassa che va opportunamente amplificata. Lo schema elettrico del circuito amplificatore è il seguente:
Provare la cella di carico significa acquisire un segnale analogico. Stavolta il caso è diverso dalle fotocellule in quanto in quel caso, si stabiliva una soglia e si verificava se tra la fotocellula era interposto o meno un ostacolo opaco. In pratica lì si è utilizzato un segnale analogico trattandolo di fatto come se fosse digitale. Con la cella di carico si deve per forza parlare di segnale analogico, allora si ha che ad ogni peso poggiato sulla cella corrisponde un valore di tensione. Con Arduino si acquisisce il valore di tensione ed in base a quello, previa taratura iniziale, si evince se trattasi di plastica, vetro o altro. Per una maggiore comprensione della cella di carico si potrà effettuare una successiva verifica dopo aver parlato di servomotore. Di seguito il software per l acquisizione del segnale analogico proveniente dalla cella di carico, opportunamente amplificato, il cui valore in questa fase verrà solo visualizzato Software: Comando di un servo motore con Arduino Un servomotore è un attuatore in grado di movimentare un braccio meccanico, nel caso in questione aziona il cilindro che instrada correttamente il rifiuto nel contenitore della plastica o del vetro
Lo schema di collegamento ad Arduino con relativo software è di seguito riportato: Software per il comando. Servo myservo; int pos = 0; void setup() myservo.attach(9); void loop() for(pos = 0; pos < 180; pos += 1) myservo.write(pos); delay(15); for(pos = 180; pos>=1; pos-=1) myservo.write(pos); delay(15);
Scheda elettronica per la distribuzione dell alimentazione Dopo avere effettuato le singole prove sulle varie parti del circuito per procedere all assemblaggio finale è necessario realizzare una schedina su basetta millefori in modo da distribuire le varie alimentazioni. Cioè dovendo alimentare a 5 Volt continui il servomotore, le fotocellule, il display LCD e l integrato per amplificare il segnale della cella di carico (ricordiamo che la cella vera e propria è alimentata con tensione V=3,3 volt), è conveniente portare due cavi (GND e 5 Volt) da Arduino a questa scheda ed alimentare tutto il resto: Come si vede, nella stessa scheda è inglobato anche l integrato per amplificare il segnale della cella pertanto si hanno i morsetti 2 e 3 costituenti l alimentazione della cella direttamente dall integrato e l uscita analogica Ao già condizionata (cioè opportunamente amplificata). Struttura di supporto La struttura ove alloggiare il tutto deve somigliare ad un sistema formato da due campane, con un riconoscitore di bottiglie, un vano tecnico ove alloggiare le schede elettroniche, una predisposizione per il passaggio cavi ed infine delle asole o dei vani in cui alloggiare motori, display, ecc. Il tutto può essere disegnato e realizzato o con legno oppure con stampante 3D. Alla base del riconoscitore occorre inserire una struttura con due spazi separati per raccogliere da una parte il vetro e dall altra la plastica.
La parte più delicata è il posizionamento del cilindro ove inserire la bottiglia stando attenti all allineamento con la parte sensibile della cella di carica. Il movimento del cilindro provvederà ad instradare in uno dei due contenitori
Cablaggio finale Via via che si fanno le prove intermedie conviene prepararsi i vari componenti con cavi sufficientemente lunghi e relativi strip in modo tale che alla fine possa collegarsi il tutto ad Arduino o alla scheda in modo semplice. Ricordarsi di battezzare ogni cavo cioè munirlo di etichetta (in questo caso è stato usato un semplice skotch carta) su cui scrivere dove collegarlo con il numero di pin
A questo punto si possono fissare la scheda Arduino e la basetta millefori ed effettuare tutti i collegamenti int bilancia =A0; int fotouno =A1; int fotodue =A2; int riferimento =180; int plastica =200; int vetro =240; int fotocellule= 100; #include <Servo.h> Servo myservo; Il software finale è il seguente:
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup () lcd.begin(16, 2); myservo.attach(9); void loop () int valorebilancia = analogread(bilancia); if (valorebilancia < riferimento) lcd.setcursor(0, 0); lcd.print("ins bottiglia"); myservo.write(45); else int valorefotouno = analogread(fotouno); int valorefotodue = analogread(fotodue); if (valorefotouno >fotocellule valorefotodue >fotocellule) if(valorebilancia < vetro) delay (500); myservo.write (80); lcd.setcursor(0, 0);
lcd.print("plastica..."); if (valorefotouno > fotocellule valorefotodue > fotocellule) if (valorebilancia > vetro) myservo.write(10); lcd.clear (); lcd.setcursor(0, 0); lcd.print("vetro..."); delay (1000); Per scaricare il presente documento vai sul sito: www.ingegnercozzolino.altervista.org