|
Appunti informatica |
|
Visite: 1327 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Il meccanismo di simulazione e l'architettura ad oggetti di ASIMIl meccanismo di simulazione e l'architettura ad oggetti di ASIM 1.1 Il DeadlockDeadlock Un insieme di processi si trova in una situazione di stallo Supermercati e informaticaSUPERMERCATI E INFORMATICA Indice: Ų Introduzione Ų Cenni |
Progetto per la realizzazione di un robot comandato da computer tramite WiFi
Indice:
Introduzione
Hardware
Meccanica
Elettronica
La Fonera
Software
Linux OpenWrt
Programma Server
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.
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 |
|
Rele' con avvolgimento da 5 volt |
|
Transistor BC 547 C |
|
Cicalino |
|
Router "La Fonera" |
|
Batteria da 6 volt per alimentazione circuito e motore |
|
Batterie per alimentazione fonera |
|
Diodo led |
|
Motore 6 volt |
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 |
|
|
Fermo |
|
|
Fermo |
|
|
Indietro |
|
|
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.
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.
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.
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.
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
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)
else:
# Altrimenti prova ad inviare il file richiesto
try:
sc.send(open(cmd.split(' ')[1][1:], 'r').read())
except: pass
# Chiude la connessione
sc.close()
# Funzione che avvia il server
def start(self):
print __SERVER_NAME__ + ' started'
# Accende il led
self.led(1)
# Inizializza il server socket
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Assegna la porta al server
self.socket.bind(('', __SERVER_PORT__))
# Mette il server in ascolto per massimo 1 utente alla volta
self.socket.listen(1)
while 1:
# Attende una connessione
(SocketClient, address) = self.socket.accept()
# Avvia la funzione di gestione del client
self.clientHandler(SocketClient)
if __name__ == '__main__':
# Inizializza un oggetto robotServer()
rs = robotServer()
# Richiama la procedura di avvio
rs.start()
Appunti su: robot comandati con ip, tutti robot comandati da ip, |
|