HACKING RASPBERRY PI Relazione del tirocinio Pietro Benini 625213 [email protected] 3 giugno 2014 - INGV - Sezione di Bologna Tutor Stefano Cacciaguerra INTRODUZIONE COS'È RASPBERRY PI Raspberry Pi [fig1] è un single-board-computer (ovvero un calcolatore implementato su una sola scheda elettronica), della dimensione di una carta di credito, sviluppato nel Regno Unito dalla Raspberry Pi Foundation con lo scopo di creare un dispositivo compatto, semplice ed economico. È basato su un System-on-a-Chip(Soc) Broadcom BCM2835 nel quale sono incorporati: un processore ARM1176JZF-S (architettura RISC per ISA ARMv6) a 700MHz, una GPU VideoCore IV e 256 o 512 Megabyte di RAM. Il dispositivo non alloggia nessuna memoria di massa ma incorpora uno slot SD; scheda nella quale installare il Sistema Operativo. Fig.1:fronte superiore di RaspberryPi 1 SISTEMA OPERATIVO Per poter utilizzare RaspberryPi è necessario procurarsi un Sistema Operativo sviluppato appositamente per l'archittettura di questo dispositivo. La Raspberry Pi Foundation fornisce gratuitamente alcune immagini di Sistemi Operativi specifici per Raspberry Pi , ad esempio Raspbian [fig.2] e Pidora, scaricabili dal sito ufficiale. Fig.2: Raspbian è un sistema operativo per Raspberry Pi derivato da Debian e come tale distribuito sotto licenza GNU ESEMPI DI UTILIZZO DI RASPBERRY PI Raspberry Pi è una piattaforma flessibile, la sua natura open-source gli permette di essere configurato secondo le necessità. Installando un sistema operativo Raspbian, Raspberry Pi diventa un calcolatore Linux utilizzabile come workstation o come server. Le prestazioni sono limitate rispetto a un moderno computer tuttavia l'ambiente grafico LXDE [fig.3] fornisce tutte le funzionalità richieste a un sistema operativo, dalla navigazione di Internet al leggere e scrivere documenti digitali. Allo stesso tempo le sue dimensioni ridotte lo rendono adatto ad applicazioni (es:domotica [fig.4], video sorveglianza [fig.5], rilevamenti meteo [fig:6] ecc...) che necessitano di un collegamento in rete ed una elaborazione locale di piccole quantità di dati. Fig.3:ambiente grafico di Rasbian 2 Fig.4:Sistema per apertura e chiusura elettronica di porte Fig.5:telecamera di sorveglianza Fig.6:stazione meteo 3 INSTALLAZIONE E CONFIGURAZIONE DI RASPBERRY PI INSTALLARE RASPBIAN Per poter rendere utilizzabile il nostro Raspberry per prima cosa dobbiamo installare il sistema operativo. La sezione Download del sito ufficiale permette di scaricare l'immagine .iso di Raspbian. Un immagine ISO è un file archivio di un disco ottico ed è composto dai dati contenuti in ogni settore scritto del disco, incluso il file system. La ISO quindi va copiata su SD mantenendone la struttura. Munirsi di una scheda SD da almeno 2GB e lanciare da un terminale: $ df -h inserire la scheda nel proprio computer e lanciare nuovamente: $ df -h il terminale mostrerà una nuova riga che indica dove trovare la scheda sd. Generalmente le viene assegnato “/dev/sdd1” o “dev/mmcblk0p1” NB: la scheda è divisa in 2 partizioni, “/dev/sdd”e “/dev/mmcblk0” sono il nome della scheda, il suffisso indica la partizione. Per copiare il file, lanciare dal terminale: $ dd bs=4M if=[path1] of=[path2] dd (diskdump) copia byte per byte, bs=4M accelera il processo leggendo e scrivendo bocchi da 4 megabyte alla volta. If è il path dell'immagine, of è la destinazione (senza il suffisso). A processo terminato, rimuovere la scheda dal computer e inserirla nello slot di raspberry. Collegare all'alimentazione e a caricamento ultimato [fig.7] inserire: username: pi password:raspberry Fig.7:schermata di log-in di Raspbian Non disponendo di Raspberry Pi per provare Raspian è possibile emularlo con QEMU (si veda l'appendice “EMULAZIONE DI RASPBIAN CON QEMU” per la gestione di una macchina virtuale Raspbian su host Linux/Debian). IMPOSTAZIONI INIZIALI Il sistema operativo Raspbian è dotato di un tool chiamato: “raspi-config” [fig.8 e fig.9] per facilitare le configurazioni iniziali ad esempio l'impostazione della lingua e del fuso orario. Per utilizzarlo lanciare come root: # raspi-config 4 Fig.8:funzioni base di: “raspi-config” Fig.9:funzioni avanzate di “raspi-config” È consigliabile abilitare “SSH”, opzione “A3” del menù: “Advanced Options” che permette di interagire con Raspbian da una Shell remota. USO DELLA SHELL REMOTA (SSH) SSH (Secure Shell) è un protocollo di rete che permette di stabilire una sessione remota cifrata tramite interfaccia a riga di comando con un altro host di una rete informatica. È diventato uno standard per l'amministrazione remota di sistemi UNIX poiché, a differenza di telnet e di rlogin, l'intera comunicazione avviene in maniera cifrata. SSH richiede la conoscenza del nome utente, dell'indirizzo ip o dell'hostname e della password del server SSH da 5 contattare. Ecco come sfruttare ssh per controllare Raspbian dal proprio computer Linux: 1. Se non è già stato fatto, abilitare su Raspbian il server SSH tramite raspi-config (si veda il paragrafo sopra: “Impostazioni iniziali”). 2. Ottenere l'indirizzo ip di RaspberryPi, ecco come fare: • • Alcuni router domestici moderni sono dotati di un'interfaccia HTML che mostra l'elenco dei dispositivi connessi Da un terminale di Raspbian lanciare “$ ifconfig”, comando che mostra tutte le interfacce di rete e il loro indirizzo [fig.10]. Fig.10:output di ifconfig su Raspbian: alll'interfaccia eth0 (ethernet) è assegnato l'indirizzo ip:192.168.103.175 3. È ora possibile aprire una shell remota dal proprio computer lanciando da terminale: $ ssh nomeutente@host con nomeutente=pi (se non è stato modificato) host=ip del raspberry ottenuto al passo 2 Completare l'operazione inserendo la password. LA SCHEDA Terminata la configurazione iniziale possiamo cominciare a familiarizzare con il dispositivo. Fig.11:fronte superiore di Raspberry Pi e interfacce e componenti La fig.11 evidenzia i principali componenti di cui Raspberry Pi è dotato. Analizziamo i dettagli. MICRO PROCESSORE 6 Raspberry Pi è basato su un SoC (System on a Chip) BCM2835 individuabile al centro della scheda.Prodotto da Broadcom incorpora 524 MB di memoria RAM, GPU VideoCore IV, scheda audio e ARM11: processore a 32 bit progettato per ISA ARMv6.Sviluppato dalla Acorn Computers verso la fine degli anni ottanta è caratterizzata da un'architettura RISC (Reduced IStruCtion set) e da un basso consumo energetico a differenza dei processori per desktop e laptop basati su architetture CISC (Complex IStruCtion set) e con maggior assorbimento energetico. OUTPUT VIDEO E AUDIO Raspberry Pi presenta 3 diverse uscite video: composito, HDMI e DSI. Il connettore RCA, di colore giallo sulla parte superiore del Pi, permette di collegare il Raspberry ai monitor con ingresso analogico come televisori a tubo catodico. HDMI ,sulla parte inferiore della scheda, fornisce un segnale digitale ad alta risoluzione (fino a 1920x1080pixel) e sullo stesso collegamento trasmette anche il segnale audio. Non disponendo di un monitor HDMI è possibile collegarsi a un monitor DVI tramite un adattatore. Sopra lo slot della scheda SD è situata la porta DSI. Si tratta di un connettore seriale a nastro utilizzato generalmente nei display piatti di tablet e smartphone. Qualora non si utilizzasse la connessione HDMI è possibile trasmettere un flusso audio attraverso la presa jack audio da 3,5 mm di colore azzurro accanto all'RCA. PERIFERICHE E USB La scheda non è dotata di connettori PS/2, Raspberry Pi può interfacciarsi solo a periferiche USB per le quali è dotata di 2 porte USB 2.0. Un hub autoalimentato, oltre a permettere la connessione contemporanea a più di 2 dispositivi, consente l'utilizzo di periferiche come unità CD o hard drive esterni altrimenti impossibile poiché l'alimentatore del Raspberry non fornisce corrente sufficiente per il loro funzionamento. RETE Sul lato destro al di sotto delle porte USB è situato il connettore ethernet RJ45. Il controller della scheda di rete ha la possibilità di autoconfigurarsi a seconda che sia collegato un cavo cross o meno grazie alla sua caratteristica auto-MDI. Non è predisposto per connessioni wireles ma è possibile aggiungere il supporto Wi-Fi tramite un adattatore wireless USB. ALIMENTAZIONE Il Raspberry si alimenta da un connettore micro-USB a fianco dello slod SD e per funzionare ha bisogno di 700mA. Non è dotato di nessun interruttore, si avvia quando il cavo viene inserito. INPUT VIDEO Tra le porte HDMI e RJ45 è collocata la porta CSI per connettere il RaspberryPi Camera Module tramite un bus piatto come quello per DSI descritto sopra. GPIO La GPIO, si tratta di un interfaccia versatile per acquisire e trasmettere dati tra dispositivi elettronici ed è formata da 26 piedini (detti anche header), disposti su 2 pettini paralleli da 13 header situati sulla parte superiore sinistra della scheda.Il paragrafo seguente entrerà più nel dettaglio GENERAL PURPOSE INPUT/OUTPUT L'interfaccia GPIO (General Purpose Input/Output) è costituita da una serie di header generici installati, su un circuito integrato senza uno scopo predefinito. Gli header possono essere riprogrammati ad alto livello, (es:tramite librerie per Bash o C) dal RaspberryPi per adattarsi ai circuiti ai quali vengono collegati. Possono per esempio azionare attuatori come led e motori o aquisire informazioni da sensori digitali come termometri e accelerometri tramite BUS I2C SPI o UART. I2C [fig.12] è uno standard sviluppato da Philips nel 1982 per la comunicazione seriale tra circuiti integrati. Esserndo un protocollo sincrono, prevede 2 canali di comunicazione: SDA (Serial Data line) per il trasporto delle informazioni e SCL(SerialClockLine) per la sincronizzazione. Serve inoltre una connessione di riferimento, detta GND e una linea di alimentazione Vdd generalmente +5V o +3,3V. Il BUS I2c di Raspberry Pi ha un sistema di indirizzamento a 7 bit per cui è teoricamente possibile collegare sullo stesso BUS 112 diversi dispositivi (delle 128 possibili combinazioni, 16 sono riservate). Raspberry Pi dispone di 2 BUS I2c uno è utilizzato dal Soc per comunicare con i chip sulla scheda, l'altro non è disponibile per l'uso. SPI, disponibile sui Pin 19,21 e 23 è un BUS a 4 fili serial sincrono progettato principalmente per la programmazione in-system programming di microcontrollori. UART è un bus seriale asincrono connesso agli header 8 e 10. L'8 ha funzione di trasmit mentre il 10 di receive. Viene usato come porta per i messaggi quando viene configurata una porta seriale. Tramite il bus UART è possibile ottenere i messaggi del kernel. 7 Fig.12:Accelerometro digitale(i2c) a 3 assi,Sono facilmente individuabili le porte SDA, SCL 3,3V e GND Per un utilizzo pratico della porta GPIO è possibile trovare in rete librerie, ad esempio WiringPi e Rpi.GPIO, che permettono di integrarne il controllo con i comuni linguaggi di programmazione come C o Python. Nel prossimo capitolo sarà mostrato come utilizzarle. PROGRAMMARE RASPBERRY PI WIRINGPI WiringPi è una libreria C/C++ per BCM2835 (SoC di Raspberry Pi) scritta in C, per l'accesso in lettura e scrittura ai BUS I2C SPI e UART e per la programmazione dei pin GPIO.È creata sullo stile di Wiring per Arduino e include un'utility per l'utilizzo da linea di comando. Installare WiringPi 1. installare GIT se non presente nel proprio Raspberry: sudo apt-get install git-core 2. Ottenere Wiring Pi da GIT: git clone git://git.drogon.net/wiringPi 3. Spostarsi nella cartella wiringPi e installarlo: cd wiringPi ./build 4. Testare il corretto funzionamento di wiringPi: gpio readall Prima di collegare qualsiasi cavo o dispositivo alla piedinatura della scheda è bene aver chiara la funzione degli stessi. Un errore nella mappatura del circuito può portare all'arresto improvviso della macchina o alla rottura del Raspberry Pi. La fig.13 mostra in dettaglio la GPIO. Orientando Raspberry Pi come in figura, il pettine inferiore è composto dagli header dispari in ordine da sinistra a destra da 1 a 25, mentre il pettine superiore è composto dagli header pari sempre da sinistra verso destra da 2 a 26. Mentre in fig.14 è rappresentata la tabella che assegna al numero di pin (o heder) il nome e la numerazione corrispondente in WiringPi. Gli header 11,12,13,15,16,18 e 22 sono di default per l'uso generico e possono essere settati in 2 stati: high che fornisce un voltaggio di +3,3V e low che equivale a 0V. Fig.13:dettaglio della GPIO 8 Fig.14:schema funzione e numerazione degli header CHIARIMENTI SULLA NOTAZIONE Da questo momento quando si troverà scritto pin ci riferiremo alla numerazione di WiringPi mentre per identificare il piedino da 1 a 26 sul pettine parleremo di header. GPIO LED BLINKING E BUTTON READING IN BASH Il corrispettivo di “Hello World” per un interfaccia GPIO consiste nel far lampeggiare un led ovvero un trasduttore che converte una tensione elettrica in impulso luminoso, ecco come fare. Procurarsi un led, una resistenza da 270Ω una breadbord e 2 jumper per collegare la breadboard al Raspberry. Per prima cosa verifichiamo il corretto funzionamento del led collegandolo all'alimentazione +3.3. Seguire lo schema in fig.15 e fig.16. Fig.15:diagramma del circuito Fig.16:schema del circuito per testare il led,il pin1 fornisce corrente a 3.3V mentre il pin6 è per la messa a terra(GND) 9 Verificato il funzionamento del LED passiamo al controllo di accensione e spegnimento da GPIO. Cambiare il circuito come in fig.17 nella quale il cavo + passa dall'header 1 all'header 11. Fig.17:il polo positivo è collegato al pin11 Se WiringPi è installato correttamente, per controllare il led aprire una finestra di terminale Per iniziare dobbiamo settare il pin0 in modalità output: gpio mode 0 out A questo punto possiamo impostarlo con valore di uscita 1 o 0, rispettivamente acceso o spento tramite la funzione gpio write: gpio write 0 1 gpio write 0 0 la prima accede il led e la seconda lo spegne. Vediamo come realizzare lo stesso programma in C . COMPILAZIONE E CROSSCOMPILAZIONE Il C a differenza dei linguaggi interpretati che vengono tradotti e eseguiti run-time, prima di poter essere eseguito deve essere compilato. Ovvero, partendo da un sorgente C, si genera un eseguibile in linguaggio macchina. In altre parole, da un linguaggio di facile comprensione per l'uomo, genera una serie di istruzioni comprensibili per la specifica architettura di quella macchina, in questo caso ARM1176 montato su Raspberry. gcc -o nomeEseguibile nomeSorgente [-l librerie] Un eseguibile compilato su Raspberry è incoprensibile per processori basati su ISA differenti come Intel o AMD impiegati nel computer classici. Nonostante questo è comunque possibile per una macchina compilare codice per architetture diverse dalla propria con un processo chiamato CrossCompiling. Installando sulla propria macchina Linux(ad esempio Debian): gcc-arm-linux-gnueabi è possibile compilare per ARM. -Installazione del crosscompilatore: sudo apt-get install gcc-arm-linux-gnueabi -crosscompilazione del sorgente : arm-linux-gnueabi-gcc -static-march=armv5 nomefile.c -o nomeEseguibile GPIO LED BLINKING E BUTTON READING IN C Ecco come creare un programma C con un ciclo infinito nel quale ogni 500 millisecondi il led cambia stato da acceso a spento. Per prima cosa bisogna prima inizializzare il sistema WiringPi con wiringPiSetup. Tramite la funzione pinMode() impostiamo il pin che vogliamo utilizzare in modalità output. Infine regoliamo l'output del pin tramite la funzione digitalWrite impostando il valore del pin a 1 (acceso) e 0 (spento). 10 #include <wiringPi.h> int main (void) { wiringPiSetup () ; pinMode (0, OUTPUT) ; while(1) { digitalWrite (0, HIGH) ; delay (500) ; digitalWrite (0, LOW) ; delay (500) ; } return 0 ; } Per compilare il programma è necessario aggiungere a gcc la libreria lwiringPi: gcc -o blink blink.c -lwiringPi Lanciare ora il programma: sudo ./blink In fig.18 è mostrato un circuito nel quale un led viene acceso tramite la pressione del bottone. Lo stato di quest'ultimo viene letto traminte la funzione pinMode(nPin,INPUT) che interrroga un pin settato in modalità input e restituisce un 1 se è presente tensione, 0 altrimenti. Fig.18 Dopo aver montato il circuito come in figura, compilare il seguente codice: #include <wiringPi.h> int main (void) { wiringPiSetup () ; pinMode (7, OUTPUT) ; pinMode (0, INPUT) ; while(1) { if(digitalRead(0)==0) digitalWrite (7, HIGH) ; } return 0 ; } CONTROLLARE UN SERVO COMANDO HS-311 CON RASPBERRYPI E PYTHON Un servo [fig.19] è un dispositivo elettronico che serve per generare un movimento angolare. Il rotore del nostro servo può compiere uno spostamento massimo di 180°. A differenza dei semplici motori, dotati di 2 cavi (polo positivo e polo negativo), un servo ne ha 3, ai 2 precedenti si aggiunge il bus del segnale (generalmente di colore giallo)che chiamerò sig(nal). Attraverso il sig trasmetteremo al servo delle onde quadre, a ogni lunghezza d'onda corrisponde una 11 determinata posizione. Per esempio, un'onda quandra di 1,5 ms porta il servo nella posizione neutrale(N), un'onda di 0,5 ms lo sposta 90° in senso antiorario dalla posizione neutrale(W) e un'onda di 2,5ms a 90° in senso orario dalla posizione neutrale(E)[fig.20]. Fig.19:un servo motore Fig.20:schema degli spostamenti di un servomotore e relative onde Le onde inoltre devono avere un periodo di silenzio tra loro per non accavallarsi,decido quindi di trasmetterle a una frequenza di 50Hz ovvero un'onda ogni 20ms.Il rapporto tra la durata del segnale trasmesso e il periodo con la quale viene trasmesso sarà chiamato DutyCycle(dc)[fig.21]. Fig.21:Nel disegno vediamo come sono fatte le tre onde principali descritte prima e a destra del disegno l'ampiezza percentuale di un dc rispetto al periodo. IMPLEMENTAZIONE Vediamo ora come realizzare un semplice software Python per controllare la parte meccanica. Per prima cosa lo schema elettrico:collegare il polo negativo del servo all'header 6, il polo positivo all'header 2 e il signal all'header 7. Creare un file di testo e per prima cosa importare le 2 librerie necessarie: una per utilizzare l'interfaccia GPIO e l'altra 12 per scandire il tempo: import Rpi.GPIO as GPIO import time iniailizzare la scheda: GPIO.setmode(GPIO,BOARD) Settare il Pin 7(ovvero quello di signal) in modalità OUT. GPIO.setup(7,GPIO.OUT) crea un oggetto p che fa trasmettere un onda dal pin 7 con una frequenza di 50Hz: p=GPIO.PWM(7,50) imposta come prima onda quella che porta il servo in posizione neutrale: p.start(7.5) a questo punto il programma entra in un ciclo nel quale ogni 2 secondi cambia DutyCycle fino a che non viene premuto un tasto sulla tastiera. Vedi fig.22 per il codice completo. Fig.22 Python è un linguaggio interpretato, prima di essere eseguito non deve essere compilato. Lanciare uno script Python utilizzando la seguente sintassi: $ python programma.py UTILIZZARE RASPBERRY PI In questo capitolo saranno mostrate quattro possibili applicazioni per Raspberry Pi: misurazione della temperatura ambientale con termometro digitale su BUS I2C, generazione di un segnale radio FM, Raspberry Pi come ip-camera con Raspberry Pi Camera Module e Raspberry Pi come server web. LETTURA DI UN TERMOMETRO TCN75A TCN75A è un termometro digitale in grado di misurare temperature comprese tra -40°C e 120°C con precisione di 1°C. Il chip contiene 4 registri accessibili dal BUS I2C con le seguenti funzioni: -00: Registro della temperatura -01: Registro di configurazione 13 -10: Registro di temperatura di isteresi -11: Registro della temperatura critica(la scheda genera un interrupt se la temperatura misurata supera la temperatura nel registro) Per questo test è stata utilizzata la scheda MR003 che include tale chip. CONFIGURAZIONE DEL BUS I2C Raspbian non è configurato per poter utilizzare il bus I2C. Per far dialogare la macchina con i dispositvi collegati tramite il bus I2c è necessario caricare i moduli del kernel: i2c-bcm2708 e i2c-dev utilizzando il comando modprobe [nomeModulo]; per far si che i moduli vengano caricati ad ogni avvio, inserirli nel file: /etc/modules. Rimuovere o commentare la riga blacklist i2c-bcm2708 dal file /etc/modprobe.d/raspi-blacklist.conf. installare i tool:libi2c-dev i2c-tools e aggiungere pi al gruppo i2c: sudo usermod -a -G i2c pi Al termine della procedura riavviare Raspberry Pi per rendere effettive le modifiche. Collegare i pin di MR003 ai relativi pin del Raspberry. $ i2cdetect -y 1 mostra la tabella con gli indirizzi dei dispositivi I2C collegati [fig.23] Fig.23:la tabella mostra che è collegato un dispositivo I2C all'indirizzo 68 Per ottenere una misurazione di temperatura utilizzare il comando i2cget, l'indirizzo del bus l'indirizzo al quale è collegato il chip e quale registro vogliamo prendere: $i2cget -y 1 0x68 0x00 w -y legge il BUS senza chiedere conferma, w per leggere dal registro una word. In risposta otteniamo un codice esadecimale di 2 byte come: 001f espressa con ordinamento big endian di conseguenza occore invertire il primo byte con il secondo. Il valore della temperatura letta sarà quindi: 1f00. Il bit 15 rappresenta il segno: 1 negativo, 0 positivo. I bit da 14 all'8 indicano in binario la parte intera della temperatura, dal 7 al 4 la parte decimale. I bit da 3 a 0 di questo registro non hanno significato. TRASMISSIONE RADIO Per trasmettere un segnale radio FM con Raspberry Pi scaricare il modulo PiFm(vedi la sezione risorse). Collegare all'header 7 un'antenna metallica e da terminale Python lanciare: >>> import PiFm >>> PiFm.play_sound("sound.wav") per riprodurre file 16 bit mono Per trasmettere un mp3: ffmpeg -i input.mp3 -f s16le -ar 22.05k -ac 1 - | sudo ./pifm - 14 E per trasmettere uno streaming Fm dal microfono: arecord -d0 -c2 -f S16_LE -r 22050 -twav -D copy | sudo ./pifm IP-CAMERA L'ip-camera è una video camera di sorveglianza in grado di condividere le proprie riprese attraverso internet. Per l'acquisizione di immagini da videocamera, Raspberry Pi è dotato di porta CSI specifica per il RaspberryPi Camera Module[fig.24]. A Raspberry spento, collegare il BUS del modulo alla scheda orientandolo come in fig.25 quindi collegare la corrente. Tramite raspi-config, abilitare la videocamera e riavviare. Fig.24 Fig.25 Per acquisire immagini e video utilizzare i programmi specifici per Raspberry Pi camera module: raspistill e raspivid. Per ottenere un immagine in formato jpeg, da terminale lanciare: raspistill -o image.jpg Per ottenere un video di 10 secondi: raspivid -o video.h264 -t 10000 dove -t indica la durata della ripresa in milli secondi. Ai comandi raspistill e raspivid possiamo aggiungere dei parametri per modificare l'acquisizione delle immagini e video, per esempio: raspistill -t 2000 -o image.jpg -w 640 -h 480 acquisisce, ogni 2 secondi (-t 2000), un immagine di 640x480 pixel (-w indica la larghezza, -h l'altezza). Consultare il manuale per approfondire i dettagli. Se il raspberry pi è collegato a una rete internet possiamo ottenere le immagini e i video acquisiti da remoto collegandoci al suo indirizzo ip tramite ssh. Ssh richiede la conoscenza di utente e password di Raspbian. Per divulgare contenuti come file di testo o immagini, senza diffondere le nostre credenziali possiamo installare un server come lighttpd e includere i nostri file in pagine web. 15 RASPBERRRY PI COME SERVER WEB Lighttpd è un server web il cui basso consumo di risorse (cpu e ram) lo rende più indicato di Apache al'architettura di Raspberry Pi. Per installarlo, da terminale digitare: sudo apt-get install lighttpd Per installare php: sudo apt-get install php5-common php5-cgi php5 Abilitare Fastcgi: sudo lighty-enable-mod fastcgi-php Infine riavviare Lighttpd: sudo service lighttpd force-reload Per verificare il funzionamento del server lighttpd, tramite un browser, da un computer sulla stessa rete, collegarsi all'indirizzo ip del Raspberry. CONCLUSIONE DELL'ESPERIENZA Durante il corso del tirocinio sono stati sperimentati alcuni possibili impieghi di Raspberry Pi con sistema operativo Raspbian. Tale sistema è stato utilizzato in disparati progetti quali: acquisizione foto e video, misurazione della temperatura ambientale, generazione di onde radio FM, controllo di servo motori. Utilizzare Raspberry Pi con Raspbian come workstation è risultato insoddisfacente, perché l'ambiente grafico non è particolarmente fluido. Al contrario, configurandolo come server a riga di comando denota una certa utilità. Esempi consolidati sono progetti di stazione meteo o sistema di videosorveglianza (si veda la sezione “Riferimenti”). In questa ottica, si è pensato di impiegarlo per realizzare una stazione monitorante in grado di acquisire di informazioni dall'esterno (e.g. sensore di tempertura e webcam), elaborare dei dati acquisiti e generare un output (e.g. pilotare servo motori, radio), come fosse un'agente autonomo. Il costo contenuto della scheda e dei componenti lo rendono adatto alla realizzazione di una stazione monitorante sacrificabile in scenari catastrofici, come un eruzione vulcanica, dove non è possibile per l'uomo un'osservazione diretta. 16 APPENDICE: EMULAZIONE DI RASPBIAN CON QEMU Non disponendo della scheda Raspberry Pi è possibile testare il sistema operativo Raspbian su proprio computer emulandolo con QEMU. Ecco come fare: Per iniziare procurarsi una versione del sistema operativo per Raspberry Pi dal sito ufficiale nella sezione download e il kernel da: http://xecdesign.com/downloads/linux-qemu/kernel-qemu . -creare la cartella di lavoro: $ mkdir ~/qemu_vms/ questo comando genera una cartella chiamata “qemu-vms” nella nostra home. -copiare i file scaricati nella cartella di lavoro. -installare l'emulatore qemu digitando in un terminale: $ sudo apt-get install qemu-system Per poter lanciare l'immagine scaricata è necessario commentare il contenuto di: /etc/ld.so.preload di Raspbian, da NON confondere con /etc/ld.so.preload del proprio sistema operativo. Poichè Raspbian è in un file .iso questa operazione non è così immediata. Un file .iso non è la semplice copia dei contenuti di un disco ma ne è l'immagine ovvero una copia settore per settore detta DUMP. Per accedere a un file va montata sul proprio sistema operativo e per fare ciò è necessario capirene la struttura. Lanciando $ file ~/qemu_vms/2013-02-09-wheezy-raspbian.img otteniamo in output come è composto il file Dall'immagine sopra vediamo che Raspbian è composta da 2 partizioni: la prima composta da 114688 settori a partire dal settore 8193 e la seconda, che ha inizio dal settore 122880, composta da 5662720 settori. Un settore è un segmento di HardDrive da 512 byte. Il nostro file si trova nella seconda partizione, moltiplicando 122880x512 otteniamo 62914560 che è il primo Byte del secondo settore (offset). Possiamo finalmente montare il drive nella cartella /mnt: $ sudo mount ~/qemu_vms/2013-02-09-wheezy-raspbian.img -o offset=[offset] /mnt e modificare il file: $ sudo nano /mnt/etc/ld.so.preload aggiungendo: “#” all'inizio della riga del contenuto. Smontare l'immagine: $ sudo umount ~/qemu_vms/2013-02-09-wheezy-raspbian.img /mnt e tornare nella cartella di lavoro. Per lanciare Raspbian, l'emulatore qemu-system-arm ha bisogno dei seguenti parametri: il path del kernel il tipo di cpu:arm1176 quanta memoria RAM assegnare alla MV: Qemu per ARM non supporta più di 256MB il path dell'immagine di Raspbian -redir: crea tunnel TCP tra la porta 22 di Raspbian e la porta 5022 di Ubuntu $ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1" -hda ~/qemu_vms/2013-02-09-wheezy-raspbian.img -redir tcp:5022::22 username:pi password:raspberry 17 WEB-BIBLIOGRAFIA http://www.vincenzov.net/tutorial/RaspberryPi/i2c.htm http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter https://projects.drogon.net/ http://wiringpi.com/ http://wiki.qemu.org/Main_Page http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/. https://jeffskinnerbox.wordpress.com/2012/12/05/drive-a-16x2-lcd-with-the-raspberry-pi/raspberry-pi/#main http://ww.raspberrypi.org BIBLIOGRAFIA RaspberryPi la guida completa di Eben Upton, Gareeth Halfacree, HOEPLI FIGURE fig1: readwrite.com fig2: rasbian.org fig3: http://robotic-controls.com/sites/default/files/images/raspbian-screenshot.png fig4:http://www.adafruit.com/blog/2013/04/26/raspberry-pi-rfid-automated-door-access-system/ fig5:http://www.instructables.com/ fig6:http://cambolc.blogspot.it/2013/10/friday-reflection-equinox-here-some.html fig.11: https://jeffskinnerbox.wordpress.com/2012/12/05/drive-a-16x2-lcd-with-the-raspberry-pi/raspberry-pi/#main fig.12:www.robot-italy.com fig.13:www.adafruit.com fig.14:http://wiringpi.com/pins/ fig.15, fig16,fig.17,fig.18:prolect.drogon.net fig.19:servocity.com Fig.20,21:https://www.youtube.com/watch?v=ddlDgUymbxc fig.24:http://fplreflib.findlay.co.uk/ fig.25:http://rapidnotes.files.wordpress.com/ le figure:7,8,9,10,22,23 sono screen-shot acquisiti durante i tirocinio. RIFERIMENTI Per scaricare il modulo per trasmettere in FM collegarsi al sito: http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter Per ottenere il kernel per qemu: http://xecdesign.com/downloads/linux-qemu/kernel-qemu . ESEMPIO DI STAZIONE METEO http://grechi.it/blog/2013/02/15/stazione-meteo-pce-fws-20-online-grazie-ad-un-raspberry-pi/ ESEMPIO DI STAZIONE DI VIDEOSORVEGLIANZA http://www.instructables.com/id/Raspberry-Pi-as-low-cost-HD-surveillance-camera/ 18