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
Scarica

HACKING RASPBERRY PI