<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Laura</id>
	<title>raspibo - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Laura"/>
	<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php/Speciale:Contributi/Laura"/>
	<updated>2026-04-29T12:13:16Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7117</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7117"/>
		<updated>2019-07-18T12:20:07Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Conclusioni e sviluppi futuri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato.&lt;br /&gt;
&lt;br /&gt;
Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I YouTube - Smart Recycle Bin]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone.&lt;br /&gt;
&lt;br /&gt;
L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale.&lt;br /&gt;
&lt;br /&gt;
In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema.&lt;br /&gt;
&lt;br /&gt;
Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale.&lt;br /&gt;
&lt;br /&gt;
Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa.&lt;br /&gt;
&lt;br /&gt;
Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
&lt;br /&gt;
[[File:Smart-scatola.jpg|center|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
[[File:foto-passopasso.jpg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati.&lt;br /&gt;
&lt;br /&gt;
Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se l'oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente.&lt;br /&gt;
&lt;br /&gt;
Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7116</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7116"/>
		<updated>2019-07-18T12:17:44Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Conclusioni e sviluppi futuri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato.&lt;br /&gt;
&lt;br /&gt;
Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I YouTube - Smart Recycle Bin]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone.&lt;br /&gt;
&lt;br /&gt;
L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale.&lt;br /&gt;
&lt;br /&gt;
In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema.&lt;br /&gt;
&lt;br /&gt;
Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale.&lt;br /&gt;
&lt;br /&gt;
Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa.&lt;br /&gt;
&lt;br /&gt;
Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
&lt;br /&gt;
[[File:Smart-scatola.jpg|center|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
[[File:foto-passopasso.jpg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati.&lt;br /&gt;
&lt;br /&gt;
Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente.&lt;br /&gt;
&lt;br /&gt;
Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7115</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7115"/>
		<updated>2019-07-18T12:17:09Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Fasi di lavoro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato.&lt;br /&gt;
&lt;br /&gt;
Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I YouTube - Smart Recycle Bin]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone.&lt;br /&gt;
&lt;br /&gt;
L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale.&lt;br /&gt;
&lt;br /&gt;
In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema.&lt;br /&gt;
&lt;br /&gt;
Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale.&lt;br /&gt;
&lt;br /&gt;
Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa.&lt;br /&gt;
&lt;br /&gt;
Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
&lt;br /&gt;
[[File:Smart-scatola.jpg|center|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
[[File:foto-passopasso.jpg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7114</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7114"/>
		<updated>2019-07-18T12:14:21Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Introduzione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato.&lt;br /&gt;
&lt;br /&gt;
Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I YouTube - Smart Recycle Bin]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
&lt;br /&gt;
[[File:Smart-scatola.jpg|center|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
[[File:foto-passopasso.jpg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7113</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7113"/>
		<updated>2019-07-18T12:13:41Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Introduzione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato. Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I YouTube - Smart Recycle Bin]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
&lt;br /&gt;
[[File:Smart-scatola.jpg|center|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
[[File:foto-passopasso.jpg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7112</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7112"/>
		<updated>2019-07-18T12:13:03Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Fasi di lavoro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato. Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
&lt;br /&gt;
[[File:Smart-scatola.jpg|center|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
[[File:foto-passopasso.jpg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7111</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7111"/>
		<updated>2019-07-18T12:09:17Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Introduzione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato. Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
&lt;br /&gt;
[[File:smart.jpeg|center|400px]]&lt;br /&gt;
&lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I]&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
 &lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:Smart-scatola.jpg&amp;diff=7110</id>
		<title>File:Smart-scatola.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:Smart-scatola.jpg&amp;diff=7110"/>
		<updated>2019-07-18T12:06:08Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:Foto-passopasso.jpg&amp;diff=7109</id>
		<title>File:Foto-passopasso.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:Foto-passopasso.jpg&amp;diff=7109"/>
		<updated>2019-07-18T12:05:31Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:Smart.jpeg&amp;diff=7108</id>
		<title>File:Smart.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:Smart.jpeg&amp;diff=7108"/>
		<updated>2019-07-18T12:04:38Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7107</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7107"/>
		<updated>2019-07-18T11:57:47Z</updated>

		<summary type="html">&lt;p&gt;Laura: /* Assemblaggio del circuito */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato. Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
                                  &lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I]&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
 &lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
[[File:Circuito.png]]&lt;br /&gt;
&lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:Circuito.png&amp;diff=7106</id>
		<title>File:Circuito.png</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:Circuito.png&amp;diff=7106"/>
		<updated>2019-07-18T11:56:06Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7105</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7105"/>
		<updated>2019-07-18T11:42:16Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato. Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
                                  &lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
Un video dimostrativo si trova al seguente link: [http://www.youtube.com/watch?v=s03stO3YR9I]&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
 &lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
 &lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7104</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7104"/>
		<updated>2019-07-18T11:36:28Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduzione ==&lt;br /&gt;
Smart Recycle Bin consiste in una scatola progettata per il riconoscimento e la differenziazione dei rifiuti: carta, vetro, plastica e indifferenziato. Scopo del progetto: l’utente ripone nello Smart Recycle Bin un oggetto da cestinare, di questo viene riconosciuto il materiale ed è cestinato nel bidone corrispondente.&lt;br /&gt;
                                  &lt;br /&gt;
Tutto il lavoro è stato sviluppato attraverso Raspberry Pi 3 B+ e Arduino Uno, con la scrittura del codice in Python nel primo caso e in C++ nel secondo.&lt;br /&gt;
&lt;br /&gt;
== Materiali e componenti utilizzati ==&lt;br /&gt;
&lt;br /&gt;
=== Componenti elettronici ===&lt;br /&gt;
* 2 servo motori MG 996R&lt;br /&gt;
* Motore passo passo bipolare Nema 17 con shield L293D&lt;br /&gt;
* Raspberry Pi Camera&lt;br /&gt;
* Breadboard&lt;br /&gt;
* Bottone e led&lt;br /&gt;
* Alimentatori vari&lt;br /&gt;
=== Altri materiali ===&lt;br /&gt;
* Scatola di cartone&lt;br /&gt;
* Assi di legno&lt;br /&gt;
* Viti, chiodi e simili&lt;br /&gt;
* Cinghia di gomma&lt;br /&gt;
* Quattro ruote&lt;br /&gt;
&lt;br /&gt;
== Fasi di lavoro ==&lt;br /&gt;
Per la costruzione della pattumiera si è utilizzata una scatola di cartone. L'identificazione del materiale del rifiuto avviene mediante una fotografia scattata dalla pi camera; questa è fissata ad un supporto in cartone la cui posizione consente un'inquadratura ottimale. In questa stessa struttura è stato inserito il Raspberry e molti dei componenti elettronici utilizzati nel progetto.&lt;br /&gt;
&lt;br /&gt;
=== Strumenti  pilotati tramite Raspberry Pi ===&lt;br /&gt;
Per comunicare al sistema la presenza del rifiuto nella scatola, l'utente deve premere il bottone. Quest'azione innesca l'attivazione dell'intero sistema. Per il riconoscimento del materiale dell'oggetto è stata utilizzata una Pi Camera, la quale scatta una foto. Questa a sua volta, è elaborata dalle API di Clarifai che restituiscono una risposta dalla quale estrapolare il materiale. Sul fondo della scatola è stata aperta una porticina dalla quale verrà espulso l’oggetto da cestinare. Lo strumento che permette di aprire e chiudere la porta è un oggetto molto simile ad una carrucola, costruito con un pezzo di legno e del filo, ed azionato mediante un servo motore. Inoltre è stata realizzata una serratura, pilotata da un altro servo motore, che permette di tenere bloccata la porta quando questa è chiusa. Infine, alla scatola sono state fissate delle ruote che consentono il suo movimento lungo la struttura in legno su cui poggia. La scatola, dotata di ruote, viene spostata da una cinghia di gomma fissata al suo fondo e connessa direttamente con il motore passo passo.&lt;br /&gt;
 &lt;br /&gt;
=== Strumenti pilotati tramite Arduino ===&lt;br /&gt;
La gestione del movimento della scatola è ottenuta con il motore passo passo. Per regolare il flusso di corrente necessario per azionare il motore stesso, è stato utilizzato uno shield L293D.&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio del circuito ===&lt;br /&gt;
Realizzata la struttura si passa all’assemblaggio del circuito e delle componenti elettroniche, come mostrato nello schema di seguito.&lt;br /&gt;
 &lt;br /&gt;
=== Comunicazione tra Rspberry Pi e Arduino === &lt;br /&gt;
Progettate le singole parti è ora di assemblarle e farle comunicare! Il modo più semplice per fare ciò è utilizzare un connettore USB e collegare direttamente tra loro le due schede configurando la comunicazione seriale.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;br /&gt;
&lt;br /&gt;
== Conclusioni e sviluppi futuri ==&lt;br /&gt;
&lt;br /&gt;
In una fase successiva molti sono gli sviluppi che potrebbero essere realizzati. Di seguito relazioniamo alcune idee:&lt;br /&gt;
* Per esigenze di spazio, lo smart recycle bin può essere costruito in taglie e forme differenti.&lt;br /&gt;
* Riconoscimento del materiale mediante codice a barre: avvicinare il codice a barre dei prodotti a un lettore e gettare i rifiuti all’interno della pattumiera, a smistare i prodotti in base al materiale ci penserà il prodotto inventato.&lt;br /&gt;
* La pattumiera può essere dotata di un compattatore per la riduzione del volume dei rifiuti e appositi sensori che riconoscano i materiali per smaltirli in maniera più veloce&lt;br /&gt;
* Si potrebbe pensare di implementare nuove funzionalità capaci di smaltire l’umido&lt;br /&gt;
* Nel caso in cui l'oggetto non venga riconosciuto mediante le modalità esposte precedentemente, si potrebbe pensare di mettere un display su cui appare un invito rivolto all'utente a premere un tasto, collocato sulla struttura, corrispondente al materiale che sta gettando&lt;br /&gt;
* Sensori di peso posti sotto ai cestini e collegati ad un display su cui appare un messaggio che permette di capire quando uno di questi è pieno&lt;br /&gt;
* Se la struttura su cui si muove la pattumiera è orizzontale, similmente alla nostra, si potrebbe migliorare il movimento del motore passo passo aggiungendo un sensore alla pattumiera, il quale permette di rilevare dei segnali posti sui binari. Questi ultimi indicherebbero al motore passo passo la posizione sulla quale dovrà fermarsi.&lt;br /&gt;
&lt;br /&gt;
Presto decidere se oggetto va nella plastica o nel vetro non sarà più uno stress: con la pattumiera intelligente. Il pianeta ve ne sarà grato!&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Laboratory_of_Making&amp;diff=7103</id>
		<title>Laboratory of Making</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Laboratory_of_Making&amp;diff=7103"/>
		<updated>2019-07-18T09:20:27Z</updated>

		<summary type="html">&lt;p&gt;Laura: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Laboratory of Making is an elective course for master students in Computer Science at the University of Bologna.&lt;br /&gt;
&lt;br /&gt;
[[LoM Lectures 2018/2019]]&lt;br /&gt;
&lt;br /&gt;
[[LoM Documents]]&lt;br /&gt;
&lt;br /&gt;
[[LoM Experiments]]&lt;br /&gt;
&lt;br /&gt;
[[LoM project ideas]]&lt;br /&gt;
&lt;br /&gt;
[[LoM lecture notes]]&lt;br /&gt;
&lt;br /&gt;
[[LoM exercises]]&lt;br /&gt;
&lt;br /&gt;
[[LoM project - Smart Recycle Bin]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[LoM old stuff]]&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7102</id>
		<title>LoM project - Smart Recycle Bin</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Smart_Recycle_Bin&amp;diff=7102"/>
		<updated>2019-07-18T09:11:23Z</updated>

		<summary type="html">&lt;p&gt;Laura: Creata pagina con '== Software ==  Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evit...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Software ==&lt;br /&gt;
&lt;br /&gt;
Per l’esecuzione del codice si è deciso di creare un ambiente virtuale python all'interno dell'utente &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; del Raspberry. Questo permette di evitare conflitti nell'utilizzo delle librerie necessarie per il progetto. La creazione dell’ambiente è stata eseguita da terminale utilizzando &amp;lt;code&amp;gt;virtualenv&amp;lt;/code&amp;gt; con il seguente comando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtualenv –p python riciclo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per attivare e disattivare l'ambiente i comandi sono rispettivamente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. /riciclo/bin/activate &lt;br /&gt;
deactivate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Attivato l'ambiente si eseguono i seguenti comandi per aggiornare l'ambiente e per installare le librerie necessarie:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
pip freeze &lt;br /&gt;
# installazione delle API di Clarifai e verifica del loro funzionamento&lt;br /&gt;
pip install clarifai &lt;br /&gt;
python –c ‘from clarifai.rest import clarifaiApp’&lt;br /&gt;
# installazione del software di PiCamera&lt;br /&gt;
pip install picamera&lt;br /&gt;
# installazione della libreria per i pin I/O di Raspberry&lt;br /&gt;
pip install RPi.GPIO&lt;br /&gt;
# installazione della libreria per la comunicazione seriale Raspberry - Arduino&lt;br /&gt;
pip install pyserial &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Di seguito si riporta il codice python con il codice implementato.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from picamera import PiCamera&lt;br /&gt;
from clarifai.rest import ClarifaiApp&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
import datetime&lt;br /&gt;
from serial import Serial&lt;br /&gt;
 &lt;br /&gt;
# setup comunicazione seriale con arduino&lt;br /&gt;
arduino = Serial('/dev/ttyACM0', 9600)&lt;br /&gt;
time.sleep(2)&lt;br /&gt;
 &lt;br /&gt;
# PIN utilizzati su Raspberry&lt;br /&gt;
button = 12&lt;br /&gt;
led = 11&lt;br /&gt;
pulley_servo = 16&lt;br /&gt;
lock_servo = 18&lt;br /&gt;
 &lt;br /&gt;
# setup GPIO&lt;br /&gt;
GPIO.setmode(GPIO.BOARD)&lt;br /&gt;
GPIO.setwarnings(False)&lt;br /&gt;
GPIO.setup(lock_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(pulley_servo, GPIO.OUT)&lt;br /&gt;
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) &lt;br /&gt;
GPIO.setup(led, GPIO.OUT)&lt;br /&gt;
 &lt;br /&gt;
# setup camera&lt;br /&gt;
camera = PiCamera()&lt;br /&gt;
 &lt;br /&gt;
# setup led&lt;br /&gt;
GPIO.output(led, GPIO.LOW)&lt;br /&gt;
led_status = False&lt;br /&gt;
 &lt;br /&gt;
# setup serratura e carrucola&lt;br /&gt;
lock = GPIO.PWM(lock_servo, 50)&lt;br /&gt;
pully = GPIO.PWM(pulley_servo, 50)&lt;br /&gt;
lock.start(0)&lt;br /&gt;
pully.start(0)&lt;br /&gt;
&lt;br /&gt;
# apertura file di log&lt;br /&gt;
f = open(&amp;quot;recycle_bin_log.txt&amp;quot; ,&amp;quot;a+&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# funzione per la comunicazione con Arduino per avviare lo stepper   &lt;br /&gt;
def start_stepper(input):&lt;br /&gt;
    arduino.write(input)&lt;br /&gt;
    c = True&lt;br /&gt;
    while c:&lt;br /&gt;
        r = arduino.readline()&lt;br /&gt;
        if r == 'ok\n':&lt;br /&gt;
            f.write(&amp;quot;Stepper end movement with response: &amp;quot; + r)&lt;br /&gt;
        c = False&lt;br /&gt;
 &lt;br /&gt;
# funzione per il riconoscimento del materiale&lt;br /&gt;
def material_recognition(): &lt;br /&gt;
    # setup clarifai&lt;br /&gt;
    app = ClarifaiApp(api_key='**************************************')&lt;br /&gt;
    model = app.public_models.general_model&lt;br /&gt;
    # richiesta alle API&lt;br /&gt;
    response = model.predict_by_filename('/home/pi/riciclo/codici/image-recognition.jpg')&lt;br /&gt;
    array = response[&amp;quot;outputs&amp;quot;][0][&amp;quot;data&amp;quot;][&amp;quot;concepts&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
    object_material = ['unknow', 0]&lt;br /&gt;
    materials_list = ('plastic', 'glass', 'paper')&lt;br /&gt;
 &lt;br /&gt;
    # lettura della risposta e selezione del materiale &lt;br /&gt;
    for el in array:&lt;br /&gt;
        keyword = el['name']&lt;br /&gt;
        value = el['value']&lt;br /&gt;
        for material in materials_list:&lt;br /&gt;
            if (keyword == material) and (int(object_material[1]) &amp;lt; value):&lt;br /&gt;
                object_material = (material, value)&lt;br /&gt;
 &lt;br /&gt;
    # il materiale è...&lt;br /&gt;
    f.write(&amp;quot;Material: &amp;quot; + object_material[0] + &amp;quot;\n&amp;quot;) &lt;br /&gt;
    return object_material[0]&lt;br /&gt;
&lt;br /&gt;
# funzione per l'attivazione dei servomotori&lt;br /&gt;
def start_servo():&lt;br /&gt;
    # si srotola la carruola&lt;br /&gt;
    pully.ChangeDutyCycle(2) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si apre la porta&lt;br /&gt;
    lock.ChangeDutyCycle(2)&lt;br /&gt;
    time.sleep(4)&lt;br /&gt;
    # si arrotola la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(5) &lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si chiude la porta&lt;br /&gt;
    lock.ChangeDutyCycle(5)&lt;br /&gt;
    time.sleep(0.5)&lt;br /&gt;
    # si allenta la carrucola&lt;br /&gt;
    pully.ChangeDutyCycle(3)&lt;br /&gt;
&lt;br /&gt;
# avvio del sistema&lt;br /&gt;
try:&lt;br /&gt;
    f.write(&amp;quot;System started - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    while True:&lt;br /&gt;
        # attesa dell'evento: &amp;quot;l'utente preme il bottone&amp;quot;&lt;br /&gt;
        channel = GPIO.wait_for_edge(button, GPIO.FALLING)&lt;br /&gt;
        if channel == button:&lt;br /&gt;
            # se il led è spento (quindi il sistema non è attivo)... &lt;br /&gt;
            if led_status == False:&lt;br /&gt;
                #  accendiamo il led e attiviamo il sistema&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led on - system activation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # attvazione della PiCamera e scatto della foto&lt;br /&gt;
                camera.rotation = 180&lt;br /&gt;
                camera.start_preview()&lt;br /&gt;
                time.sleep(0.5)&lt;br /&gt;
                camera.capture('/home/pi/riciclo/codici/image-recognition.jpg') &lt;br /&gt;
                camera.stop_preview()&lt;br /&gt;
&lt;br /&gt;
                # riconoscimento materiale&lt;br /&gt;
                object_material = material_recognition()&lt;br /&gt;
&lt;br /&gt;
                # attivazione del movimento della scatola   &lt;br /&gt;
                if obj_mat == 'glass':&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                elif obj_mat == 'unknow':&lt;br /&gt;
                    start_stepper('1')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('2')&lt;br /&gt;
                elif obj_mat == 'plastic':&lt;br /&gt;
                    start_stepper('3')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('4')&lt;br /&gt;
                else:&lt;br /&gt;
                    start_stepper('5')&lt;br /&gt;
                    start_servo()&lt;br /&gt;
                    start_stepper('6')&lt;br /&gt;
&lt;br /&gt;
                # disattivazione del sistema e spegnimento del led&lt;br /&gt;
                led_status = not led_status&lt;br /&gt;
                GPIO.output(led, led_status)&lt;br /&gt;
                f.write(&amp;quot;led off - system deactivation\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
except KeyboardInterrupt:&lt;br /&gt;
    print(&amp;quot;Cleaning up&amp;quot;)&lt;br /&gt;
    GPIO.output(led, GPIO.LOW)&lt;br /&gt;
    lock.stop()&lt;br /&gt;
    pully.stop()&lt;br /&gt;
    GPIO.cleanup()&lt;br /&gt;
    f.write(&amp;quot;System stopped - {:%Y-%m-%d %H:%M:%S} \n&amp;quot;.format(datetime.datetime.now()))&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle righe che seguono, invece, riportiamo il codice C++ implementato per il funzionamento del motore passo passo tramite Arduino.&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;AFMotor.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Number of steps per output rotation&lt;br /&gt;
const int stepsPerRevolution = 200;&lt;br /&gt;
&lt;br /&gt;
//input ricevuto da raspberry che indica quali comandi eseguire&lt;br /&gt;
int attuale;   &lt;br /&gt;
int precedente = 0;&lt;br /&gt;
&lt;br /&gt;
// connessione del motore alla prota #1 (M1 and M2)&lt;br /&gt;
AF_Stepper motor(stepsPerRevolution, 1);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * comando: 1 -&amp;gt; vai da 1 a 0 (vai su indifferenziato)&lt;br /&gt;
 *          2 -&amp;gt; vai da 0 a 1 (torna da indifferenziato a posizione base) &lt;br /&gt;
 *          3 -&amp;gt; vai da 1 a 2 (vai su plastica)&lt;br /&gt;
 *          4 -&amp;gt; vai da 2 a 1 (torna da plastica a posizione base) &lt;br /&gt;
 *          5 -&amp;gt; vai da 1 a 3 (vai su carta)&lt;br /&gt;
 *          6 -&amp;gt; vai da 3 a 1 (torna da carta a posizione base) &lt;br /&gt;
*/&lt;br /&gt;
void spostaMotore(int comando){&lt;br /&gt;
&lt;br /&gt;
  //vai in posizione 0 (indifferenziato)&lt;br /&gt;
  if(comando == 1){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 0&lt;br /&gt;
  else if(comando == 2){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 2 (plastica)&lt;br /&gt;
  else if(comando == 3){&lt;br /&gt;
    motor.step(1280, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 2&lt;br /&gt;
  else if(comando == 4){&lt;br /&gt;
    motor.step(1280, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  //vai in posizione 3 (carta)&lt;br /&gt;
  else if(comando == 5){&lt;br /&gt;
    motor.step(1280*2, BACKWARD, SINGLE);&lt;br /&gt;
  }&lt;br /&gt;
  //torna in posizione 1 da posizione 3&lt;br /&gt;
  else if(comando == 6){&lt;br /&gt;
    motor.step(1280*2, FORWARD, SINGLE); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Serial.print(&amp;quot;ok\n&amp;quot;);&lt;br /&gt;
  motor.release();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  motor.setSpeed(60); //velocita (in rpm (revolution per minute))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if(Serial.available()){&lt;br /&gt;
    attuale = Serial.read() - '0';&lt;br /&gt;
  }&lt;br /&gt;
  if(precedente != attuale){&lt;br /&gt;
    precedente = attuale;&lt;br /&gt;
    spostaMotore(attuale);&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per permettere all'utente di utilizzare lo Smart Recycle Bin senza un dispositivo dal quale farlo partire (display), è necessario abilitare l'avvio automatico dello script python all’accensione del sistema operativo. Per fare ciò si implementa uno script bash che attivi l’ambiente virtuale e che avvii successivamente il codice python. Lo script bash è il seguente:&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sleep 120&lt;br /&gt;
source /home/pi/riciclo/bin/activate&lt;br /&gt;
python /home/pi/riciclo/codici/recycle.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Successivamente occorre aggiungere le righe seguenti al file &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; in modo che esegua lo script bash ad ogni riavvio del sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin&lt;br /&gt;
@reboot /bin/bash /home/pi/riciclo/codici/avvio.sh &amp;gt; /home/pi/riciclo/codici/logsAvvio/cronlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N.B. Affinchè il software funzioni correttamente è necessario mantenere il Raspberry connesso ad internet.&lt;/div&gt;</summary>
		<author><name>Laura</name></author>
	</entry>
</feed>