vuoi
o PayPal
tutte le volte che vuoi
Tesina - Premio maturità 2009
Titolo: progetto per la realizzazione di un robot
Autore: Gessa Marco
Descrizione: Realizzazione di un dispositivo robot che abbia la possibilità di andare avanti, indietro e riavviarsi, comandato a distanza attraverso il router "La Fonera" tramite un collegamento wifi ed un interfaccia web.
Il primo passo del progetto consiste nella realizzazione del robot che deve avere la possibilità di alloggiare al suo interno il dispositivo fonera, il circuito elettronico per il pilotaggio della meccanica e il sistema di alimentazione. Per fare questo ho utilizzato i pezzi del meccano, che ben si prestano ad un assemblaggio modulare del robot. Il sistema di movimento è stato realizzato con un motorino ad inversione di polarità recuperato da un lettore di musicassette accoppiato alle ruote attraverso una cinghia
Area: tecnologica
Materie trattate: elettronica: relizzazione del circuito elettronico; informatica-sistemi: creazione del programma server in pyton, software configurazione fonera; meccanica: costruzione del robot con alloggio fonera, circuito elettrico e alimentazione.
1. Introduzione
Realizzazione di un dispositivo robot che abbia la possibilità di andare avanti, indietro e riavviarsi,
comandato a distanza attraverso il router “La Fonera” tramite un collegamento wifi ed un
interfaccia web
2. Hardware
L'hardware di questo progetto, si puo' dividere in tre diverse unita': la parte meccanica e la parte
elettronica e la parte “La Fonera”.
2.1 Meccanica
Il primo passo del progetto consiste nella realizzazione del robot che deve avere la possibilità di
alloggiare al suo interno il dispositivo fonera, il circuito elettronico per il pilotaggio della meccanica
e il sistema di alimentazione.
Per fare questo ho utilizzato i pezzi del meccano, che ben si prestano ad un assemblaggio modulare
del robot. Il sistema di movimento è stato realizzato con un motorino ad inversione di polarità
recuperato da un lettore di musicassette accoppiato alle ruote attraverso una cinghia.
3
2.2 Elettronica
Realizzata la parte meccanica il secondo passo del progetto prevede la realizzazione del circuito
elettronico in grado di invertire la polarità ai capi del motore.
Invertendo l’alimentazione del motorino infatti si inverte il senso di marcia del robot. Per ottenere
tale inversione di polarità ho utilizzato un relè con avvolgimento da 5 volt e le uscite normalmente
chiuse e normalmente aperte dello stesso collegate al motore.
Un ulteriore relè messo in cascata mi da la possibilità di fermare il motore.
Il consenso per l’eccitazione dei relè è dato da una serie di uscite logiche del fonera che io abilito o
disabilito attraverso la parte software (analizzata in seguito).
Il primo problema affrontato è stato quello di dover amplificare il segnale di uscita del fonera che
non era in grado di eccitare l’avvolgimento del relè per ovviare a tale problema ho inserito due
transistor del tipo NPN modello BC 547 c che pilotati sulla base dal segnale in uscita del fonera mi
portavano sull’avvolgimento del relè la tensione della batteria da 6 volt che permetteva
l’eccitazione del relè.
Schema elettrico:
Componenti:
Quantita' Componente
2 Rele' con avvolgimento da 5 volt
2 Transistor BC 547 C
1 Cicalino
1 Router “La Fonera”
1 Batteria da 6 volt per alimentazione circuito e motore
1 Batterie per alimentazione fonera
2 Diodo led
1 Motore 6 volt 4
Il rele uno pilotato dalla porta uno del fonera abilita sulle uscite 9 ed 8 (contatti normalmente aperti)
l’alimentazione al rele 2 sugli ingressi 13 e 4. Il relè due pilotato dalla porta 3 del fonera ha le uscite
9 ed 8 (normalmente aperte ) e le uscite 6 ed 11 (normalmente chiuse) incrociate sul motore.
Attraverso la tabella di verità riportata sotto si riesce a capire l’interazione tra ingressi ed uscite
Sul movimento del motore
Ingresso Porta 1 Ingresso Porta 3 Evento
0 0 Fermo
0 1 Fermo
1 0 Indietro
1 1 Avanti
Ho completato il robot con due led ed un cicalino che vengono attivati in base al senso di marcia
Led verde acceso quando il robot si muove in avanti, Led giallo e cicalino acceso quando il robot si
muove all’indietro. 5
2.3 La fonera
“La Fonera” e' un piccolo router venduto ad un costo abbastanza basso (circa 25 euro) dall'azienda
spagnola FON, per estendere il progetto, appunto chiamato “Fon”, che prevede la creazione di una
rete condivisa in tutto il mondo.
Un router e' in se' un computer, “La Fonera” e' dotata di un processore di 300mhz, 16mb di
memoria ram, e circa 15mb di memoria di memoria flash. Offre inoltre due antenne wireless, ed una
di queste verra' utilizzata dal nostro robot per comunicare con altri computer.
Per l'attivazione dei motorini, dentro la fonera sono presenti 6 pin GPIO (General Purpose Input
Output) che possono essere attivati mediante software e che forniscono una tensione di 3,7V
quando sono accesi.
ù 6
3. Software
Per quanto riguarda il software analizzeremo prima come e' stato configurata “La Fonera” ed in
seguito il funzionamento del programma server, che gestira' la comunicazione con l'esterno.
3.1 Linux OpenWrt
La Fonera appena comprata, ha al suo interno una distribuzione di Linux ottimizzata per la
piattaforma hardware del router, configurata per svolgere lo scopo iniziale, ovvero la funzione di
router wireless; l'azienda “Fon” ha reso pero' questa piattaforma difficilmente modificabile.
Ho deciso di installare Linux OpenWrt, una distribuzione fatta apposta per i router di questo tipo;
tramite un applicazione trovata su internet, ho sostituito il firmware originale della Fonera con un
firmware OpenWrt compilato per questa piattaforma; appena installato openwrt, collegandosi al
server ssh del “La Fonera” da un altro computer, avremo davanti a noi una normalissima console
linux, con i commandi fondamentali per la configurazione e l'installazione di nuovi pacchetti.
La rete e' stata configurata in modo da far apparire il fonera come un access point senza password
(questo solo per velocizzare i test in fase di progettazione), e di risultare accessibile all'ip
192.168.254.105.
Per la comunicazione con le porte GPIO, ho installato un modulo del kernel, sempre disponibile in
un pacchetto; per attivare o disattivare una porta, basta scrivere nel file corrispondente, 0 per
disattivare la porta, 1 per attivarla. Ecco come fare utilizzando il comando echo; utilizzeremo questo
metodo per attivare e disattivare le porte nel programma server:
echo stato > /proc/gpio/porta_dir; echo stato > /proc/gpio/porta_out
3.2 Programma Server
Per la creazione del programma server ho deciso di utilizzare il linguaggio interpetato python; era
gia' disponibile un mini pacchetto con le librerie principali, che ho inviato ed installato sul fonera.
Il programma avra' la funzione di creare un server http basilare ad una porta prestabilita (la 1055),
consentire le connessioni da computer esterni, e gestire la chiamata GET del protocollo http. E'
presente una pagina html chiamata __MAINPAGE__ nella stessa cartella del programma, che
contiene questo form:
<form action="robot.htm" method="get" enctype="text/plain">
<br><div align="center">Secondi:
<input type="text" name="second" value="1"></div>
<br>
<div align="center">
<input type="submit" name="ex" value="Indietro">
<input type="submit" name="ex" value="Avanti">
<input type="submit" name="ex" value="Riavvia"></div>
</form>
Vengono creati tre tasti (avanti, indietro e riavvia) ed una barra di inserimento testo per decidere per
quanti secondi eseguire quell'azione.
Quando un broswer http si connette al server (in questo caso 192.168.254.105:1055), gli viene
inviata questa pagina. Quando viene premuto un tasto, il nome del tasto premuto ed il contenuto
della barra dei secondi, vengono mandate al server, che si occupera' di analizzarle ed eseguire la
funzione desiderata. 7
Se il server trova nella richiesta GET il nome della pagina principale, tenta di analizzare l'url per
vedere se e' stato premuto un tasto, cerca di prendere l'informazione dei secondi e di quale tasto e'
stato premuto, ed esegue il commando, restituendo al client la pagina richiesta con una segnalazione
del commando eseguito. Se viene richiesto un altro elemento (per esempio un immagine o un altra
pagina), il server prova ad aprire il file richiesto, ed in caso positivo lo invia al client.
Ecco il codice del programma:
#!/usr/bin/python
import socket
import thread
import time
import os
__SERVER_PORT__ = 1055
__SERVER_NAME__ = "RoboServer"
__MAINPAGE__ = "robot.htm"
__ABILIT__ = 1
__MOTOR__ = 3
__LED__ = 2
class robotServer:
# Imposta il led allo 'state'
def led(self, state):
os.system("echo "+str(state)+" > /proc/gpio/"+str(__LED__)+"_dir; echo
"+str(state)+" > /proc/gpio/"+str(__LED__)+"_out")
# Movimento di un motore
def go(self, w, dir):
m = not dir
# Abilita le porte per la direzione desiderata
os.system("echo 1 > /proc/gpio/"+str(__ABILIT__)+"_dir; echo 1 >
/proc/gpio/"+str(__ABILIT__)+"_out")
os.system("echo "+str(m)+" > /proc/gpio/"+str(__MOTOR__)+"_dir; echo "+str(m)+" >
/proc/gpio/"+str(__MOTOR__)+"_out")
# Attende w secondi
time.sleep(w)
# Le disabilita
os.system("echo "+str(m)+" > /proc/gpio/"+str(__MOTOR__)+"_dir; echo "+str(m)+" >
/proc/gpio/"+str(__MOTOR__)+"_out")
os.system("echo 0 > /proc/gpio/"+str(__ABILIT__)+"_dir; echo 0 >
/proc/gpio/"+str(__ABILIT__)+"_out")
# Riavvia il robot
def reboot(self):
os.system("reboot");
# Gestore di un client
def clientHandler(self, sc):
# Riceve 128B di dati
cmd = sc.recv(128)
# Se vieene richiesta la pagina principale
8
if cmd.find("GET /"+__MAINPAGE__) != -1 or cmd.find("GET / ") != -1:
# Legge la pagina principale
page = open(__MAINPAGE__, "r").read()
# Prova a trovare i secondi nel link
try: sec = float(cmd.split("=")[1].split("&")[0])
except: sec = 1.0
# Se trova la parola avanti
if cmd.find("ex=Avanti") != -1:
# Aggiunge dell'html alla pagina per le info
# riguardo l'azione
page += "<br><b><div align=\"center\">Eseguendo: Avanti per
"+str(sec)+" secondi</div></b>"
page += "<meta HTTP-EQUIV=\"REFRESH\" content=\""+str(sec)+";
url=/\">" # Invia la pagina
sc.send(page)
sc.close()
# Esegue il commando
self.go(float(sec),0)
# Se trova la parola indietro
elif cmd.find("ex=Indietro") != -1:
# Aggiunge dell'html alla pagina per le info
# riguardo l'azione
page += "<br><b><div align=\"center\">Eseguendo: Indietro per
"+str(sec)+" secondi</div></b>"
page += "<meta HTTP-EQUIV=\"REFRESH\" content=\""+str(sec)+";
url=/\">" # Invia la pagina
sc.send(page)
sc.close()
# Esegue il commando
self.go(float(sec),1)
# Se trova la parola riavvia
elif cmd.find("ex=Riavvia") != -1:
# Aggiunge dell'html alla pagina per le info
# riguardo l'azione
page += "<br><b><div align=\"center\">Riavvio in corso</div></b>"
# Invia la pagina
sc.send(page)
sc.close()
# Spegne il led
self.led(0)
# Riavvia la macchina
self.reboot()
else: # Altrimenti invia la pagina __MAINPAGE__
sc.send(page) 9