Raspberry PI

Download Report

Transcript Raspberry PI

Raspberry PI
Francesco Leoncino
Cos'è il Raspberry PI
●
●
È un piccolo computer a basso costo della
dimensione di una carta di credito.
È stato sviluppato dalla Raspberry Pi
Foundation (raspberrypi.org) con l'intento di
ispirare una generazione di studenti a essere
creativi e a imparare i fondamenti
dell'informatica e della programmazione.
Francesco Leoncino
Cos'è il Raspberry PI
Il sito della fondazione descrive così il Raspberry PI
The Raspberry Pi is a low cost, credit-card sized computer that plugs into a
computer monitor or TV, and uses a standard keyboard and mouse. It is a
capable little device that enables people of all ages to explore computing, and
to learn how to program in languages like Scratch and Python. It’s capable of
doing everything you’d expect a desktop computer to do, from browsing the
internet and playing high-definition video, to making spreadsheets, wordprocessing, and playing games.
What’s more, the Raspberry Pi has the ability to interact with the outside
world, and has been used in a wide array of digital maker projects, from music
machines and parent detectors to weather stations and tweeting birdhouses
with infra-red cameras. We want to see the Raspberry Pi being used by kids
all over the world to learn to program and understand how computers work.
Francesco Leoncino
Cos'è il Raspberry PI
●
●
●
●
Può essere collegato a un monitor o a una TV utilizzando
mouse e tastiera standard.
È un piccolo ma potente dispositivo che permette di
sperimentare l'informatica e programmare in linguaggi come
Scratch e Python.
Permette di fare tutto quello che vi aspettate da un personal
computer, come navigare su internet, vedere video in HD,
lavorare con sistemi di automazione di ufficio, giocare.
In aggiunta il Raspberry Pi dispone della possibilità di interagire
con il mondo esterno e può essere usato in un ampio contesto
di progetti di making.
Francesco Leoncino
Versioni del Raspberry PI
Fonte: raspberrypi.org
Francesco Leoncino
Com'è fatto il Raspberry PI
●
I vari modelli si basano su un SoC (System on Chip):
Per i modelli A/A+, B/B+, Zero, compute module è stato usato il Broadcom
BCM2835, inizialmente sviluppato per fare da acceleratore della sezione
multimediale dei telefoni cellulari che comprende: una CPU ARM 1 core
700MHz, 512 MB di RAM, una GPU.
– Il modello B rev 2 utilizza il Broadcom BCM2836 che ha una architettura
analoga al BCM2835 ma si basa su una CPU ARM 4 core 900MHz, ha 1 GB
di RAM e una GPU VideoCore IV 3D
È energeticamente più efficiente dei sistemi desktop, per esempio l'operazione
di decodifica di un video full HD consuma soli 200mW contro consumi dell'ordine
di 30 W di un PC desktop.
–
●
●
È sicuramente meno potente di un PC, ma dispone di una GPIO (General
Purpose Input Output) in cui sono esposti una serie di porte di I/O del chip che
permettono diverse modalità di interazione con apparati esterni.
Francesco Leoncino
Com'è fatto il Raspberry PI
●
512 MB / 1GB RAM
●
2/4 USB
●
1 uscita video HDMI
●
1 uscita video analogica (rev 1)
●
1 uscita audio (rev 1)
●
1 uscita audio/video combinata (rev 2)
●
1 NIC 100Mbps
●
1 Slot per memory card SD (µSD rev 2)
●
1 ingresso di alimentazione µUSB
●
1 connettore per video camera
●
1 connettore per display
●
1 connettore GPIO
Francesco Leoncino
Com'è fatto il Raspberry PI
Francesco Leoncino
Cosa mi serve
●
Essenziale:
–
–
●
Almeno la prima volta:
–
●
Un alimentatore µUSB di potenza adeguata (almeno da 1.2 A, meglio 2 A)
Una scheda SD (µSD per rev 2) da almeno 4GB
Monitor/Tastiera/Mouse
Optional:
–
–
–
–
Case
Cavo di rete/dongle wi fi
Hub usb alimentato
Apparati di contorno (Hat...)
Francesco Leoncino
Possibile utilizzo
Posso usarlo semplicemente come PC desktop utilizzando una distro
Linux come Raspbian. Il modello B rev 2 permette anche l'installazione di
Windows 10.
●
Posso usarlo come media center utilizzando una distro come OpenElec o
OSMC.
● Posso usarlo come server linux
(web/mail/storage/kiosk/streaming/download/access/monitor/cluster...).
●
Internet of Things,ovvero posso usarlo per interfacciare dispositivi a
Internet, sia per visualizzare lo stato di qualcosa, sia per comandare
dispositivi da internet.
●
Making (sensori/attuatori/robot/Xcopter,...).
●
È l'ideale complemento di un sistema Arduino a cui è in grado di
aggiungere le funzionalità di un sistema operativo.
●
Francesco Leoncino
Raspberry vs Arduino
Raspberry
Arduino
Architettura
Microprocessore
Microcontrollore
I/O
Alcuni limiti
Ampio
Facilità
programmazione
buona
ottima
Ecosistema
ottimo
ottimo
Network
nativo
Shield esterno
Camera
ottimo
Non adatto
Uso Stand Alone
buono
ottimo
IoT
ottimo
Necessita integrazione
Uso come PC
possibile
no
Francesco Leoncino
I Sistemi Operativi
Francesco Leoncino
Ecosistema
Francesco Leoncino
I primi passi
Scarico NOOBS
● Copio NOOBS sulla SD (preventivamente formattata
con il tool scaricabile da
https://www.sdcard.org/downloads/formatter_4/)
● Inserisco la SD nel RPi
● Collego tastiera, mouse, monitor, alimentatore
● Scelgo la distribuzione Raspbian e la installo
● Eseguo il tool raspi-config per configurare il
comportamento del RPi
●
Francesco Leoncino
I primi passi
Francesco Leoncino
Il desktop
Francesco Leoncino
Programmazione
Scratch
● Python
● PHP
● C/C++
● Wolfram (Mathematica)
● Qualsiasi ulteriore linguaggio/ambiente
disponibile/installabile nel sistema operativo
●
Francesco Leoncino
GPIO model B
Gli I/O sono a 3.3 V
● Non sono protetti elettricamente
● Solo Input digitali
● 17 connessioni di I/O + 9 di servizio
●
Francesco Leoncino
GPIO model B+ e rev 2
●
26 connessioni di I/O + 14 di servizio
Francesco Leoncino
GPIO model B+ e rev 2
●
26 connessioni di I/O + 14 di servizio
Francesco Leoncino
GPIO
Francesco Leoncino
GPIO nomenclatura Pin
Esistono differenti nomenclature dei Pin GPIO
●
Fisica
●
GPIO (relativa alla libreria GPIO)
●
WiringPI (relativa alla libreria WiringPI)
●
BCM (Broadcom, relativa al chip)
Quando si fa riferimento a un Pin si deve essere
sicuri di quale nomenclatura stiamo usando.
Francesco Leoncino
LED Lampeggiante
Bash
Python wiringpi
import wiringpi2 as wiringpi
import time
wiringpi.wiringPiSetup()
wiringpi.pinMode(7, 1)
def clear():
wiringpi.digitalWrite(7, 0)
try:
clear()
while 1:
wiringpi.digitalWrite(7, 1)
time.sleep(1)
wiringpi.digitalWrite(7, 0)
time.sleep(1)
except KeyboardInterrupt:
clear()
print("done")
Francesco Leoncino
#!/bin/bash
gpio mode 7 OUT
while true; do
gpio write 7 0
sleep 1
gpio write 7 1
sleep 1
done
Python GPIO
import time
import RPi.GPIO as GPIO
GPIO.cleanup()
# Imposta la nomenclatura GPIO
GPIO.setmode(GPIO.BOARD)
# Imposto Pin 7 come output
GPIO.setup(7,GPIO.OUT)
while True:
GPIO.output(7,GPIO.HIGH)
time.sleep(1)
GPIO.output(7,GPIO.LOW)
time.sleep(1)
Servo Motore
Un servo motore permette il posizionamento del proprio albero su un
angolo di circa 180°, tramite impulsi di comando di ampiezza variabile tra
0,5 ms (-90°) e 2,5 ms (+90°).
I servo motori presentano 3 connessioni: Vcc, Ground, Vin
Per generare gli impulsi che comandano il movimento normalmente si
utilizza un PWM con frequenza 50 Hz (T=20ms) modulando il duty cycle.
Immagine da forum.arduino.cc
Francesco Leoncino
Servo Motore
Per pilotare un servo motore con il Raspberry è possibile far uso di un Pin
5V e uno GND per alimentarlo, ed è necessario scrivere del codice che
imposti un piedino GPIO come output PWM e ne moduli il duty cycle.
Anche se la GPIO opera a 3.3V il segnale è comunque sufficiente a
muovere il servo.
Se si utilizza un alimentatore di amperaggio insufficiente il raspberry può
“crashare” perché si hanno picchi di assorbimento di corrente se al servo
vengono comandati movimenti ampi.
Il Chip dispone di circuiti che permettono la generazione di un segnale
PWM “hardware”, ovvero senza caricare la CPU e senza risentire di
interrupt.
Le librerie consentono comunque di realizzare un PWM “software”.
Francesco Leoncino
Servo Motore
Esempio di codice di gestione di un servo motore
#!/usr/bin/python
import sys
import time
import RPi.GPIO as GPIO
#!/usr/bin/python
import sys
import time
import wiringpi2 as wiringpi
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
wiringpi.wiringPiSetupGpio()
p=GPIO.PWM(18,50)
p.start(2.5)
for x in range(25, 115):
dc=float(x/10.0)
p.ChangeDutyCycle(dc)
time.sleep(0.3)
for x in range(25, 115):
dc=float((115-x+25)/10.0)
p.ChangeDutyCycle(dc)
time.sleep(0.3)
p.stop()
GPIO.cleanup()
wiringpi.pinMode(18,2)
wiringpi.pwmSetMode(0)
wiringpi.pwmSetClock(400)
wiringpi.pwmSetRange(1024)
dtMin, dtMax = 24, 110
dt = 24
for x in range (24,110):
wiringpi.pwmWrite(18, x)
time.sleep(0.3)
for x in range (24,110):
wiringpi.pwmWrite(18, 134-x)
time.sleep(0.3)
Il codice effettua uno scan da -90° a +90° del servo
Viene mostrato l'utilizzo ad alto livello tramite libreria RPI.GPIO e a basso livello tramite libreria wiringpi
Viene usato il PIN 18 che è uno dei due possibili per il PWM “hardware”
Francesco Leoncino
Camera Module
Il RPi è dotato di un connettore per una videocamera.
Il Camera Module opera nel visibile con una risoluzione full
HD (1080p30).
Esiste un modulo denominato Pi NoIR (No IR filter) che è
privo del filtro IR presente nel modulo standard, il che
permette di fare riprese notturne utilizzando una
illuminazione a LED IR.
Ambedue i moduli possono essere utilizzati attraverso le API
MMAL (Multi Media Abstraction Layer), V4L (Video for Linux),
la libreria python-picamera, tool grafici e a linea di comando.
Francesco Leoncino
Camera Module
Il Camera Module può essere pilotato a linea di
comando con i tool seguenti:
- raspistill: cattura singola immagine
Es: raspistill -t 1000 -o cam.jpg
- raspivid: cattura video in formato h264
Es: raspivid -o video.h264 -t 10000
- raspiyuv: cattura singola immagine in formato raw
Es: raspiyuv -t 1000 -o cam.data
Francesco Leoncino
Camera Module
Impostando un cronjob è semplicissimo realizzare una istantanea temporizzata da
consultare tramite web.
È sufficiente installare un server web sul RPi e salvare l'immagine in una cartella pubblicata.
Inserendo un cronjob come il seguente:
* * * * * /usr/bin/raspistill -t 50 -o /var/www/stillcamera.jpg
Ogni minuto verrà acquisita una immagine che sovrascrive la precedente.
Si può dunque accedere all'immagine via http con l'indirizzo http://ipRPI/stillcamera.jpg
O meglio realizzare una pagina html come la seguente:
<html>
<head>
<meta http-equiv="refresh" content="60">
</head>
<body>
<img src="stillcamera.jpg">
</body>
</html>
Francesco Leoncino
Camera Module
È anche possibile combinare il tool raspivid con VLC
(videolan.org) per generare uno streaming video a partire
dalla videocamera. Il comando da usare è il seguente:
raspivid -o - -t 0 -n -w 600 -h 400 -fps 12 | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}'
:demux=h264
In pratica l'output di raspivid viene inviato con una pipe al
VLC che provvede a generare uno stream accessibile con il
protocollo rtsp.
Naturalmente la distribuzione di uno streaming video va
gestita con sistemi specifici in funzione del numero di fruitori
previsti.
Francesco Leoncino
Camera Module
Un altro tool molto potente è Motion
http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome
“Motion is a program that monitors the video signal from cameras. It is able to detect
if a significant part of the picture has changed; in other words, it can detect motion”
Non è solo un tool di acquisizione, riesce anche a riconoscere il movimento, per cui
rende possibile la realizzazione di sistemi di videosorveglianza.
Motion è un tool generico per sistemi Linux, e necessita di una patch (motion-mmal)
per interfacciarsi con la videocamera del raspberry.
Come utilizzo minimale Motion può essere impiegato per implementare un sistema
di streaming su protocollo http.
L'utilizzo di Motion necessita di risorse di calcolo significative, ma se non si esagera
con le dimensione e il frame rate si possono ottenere risultati significativi anche con
il RPi
Francesco Leoncino
Pan e Tilt
Combinando due Servo Motori è possibile
motorizzare su due assi il Camera Module.
È necessario disporre di una struttura di
montaggio della Videocamera e dei Servo
pensata a tale scopo.
Dopodiché è sufficiente predisporre gli script di
comando di Videocamera e Servo
Francesco Leoncino
Pan e Tilt
Script di comando pan e tilt
#!/usr/bin/python
import sys
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
p=GPIO.PWM(18,50)
dc=float(sys.argv[1])
p.start(dc)
time.sleep(0.3)
p.stop()
GPIO.cleanup()
Lo script riceve come parametro da linea di
comando il valore del duty cycle che viene
mantenuto per 3 decimi di secondo.
Lo stesso script viene usato sia per Pan che per
Tilt, utilizzando Pin differenti.
Lo script può essere richiamato da pagine web
Francesco Leoncino
Pan e Tilt
Richiamo da pagina web (index1.php)
<?php
$H1=2.5;$H1deg=-90;
$H2=11.5;$H2deg=90;
$V1=2.5;$V2=10;
$V1deg=135;$V2deg=0;
function linval($ang,$x1,$x2,$y1,$y2){
return $x1+($ang-$y1)*($x2-$x1)/($y2-$y1);
}
if (isset($_GET["ang"])){
$v=$_GET["ang"];
if (!is_numeric($v)) {
print "$v ERROR_ang";
exit();
}
}
switch ($_GET["dir"]){
case "h":
$v=linval($v,$H1,$H2,$H1deg,$H2deg);
system("sudo /home/pi/vai.py $v");
break;
case "v":
$v=linval($v,$V1,$V2,$V1deg,$V2deg);
system("sudo /home/pi/vai2.py $v");
break;
default:
print "ERROR_dir";
}
?>
Francesco Leoncino
Script in linguaggio PHP pensato
per essere richiamato in forma
REST
Riceve in GET l'asse di movimento
e l'angolo a cui portarsi
Ricava il duty cycle con una
interpolazione lineare con i limiti
relativi al servo utilizzato
Pan e Tilt
Interfaccia web (index.html)
<html>
<head>
<script>
function esegui(act){
document.getElementById("myDiv").innerHTML="";
xmlhttp=new XMLHttpRequest();
if (act=='h+'){
ang=parseInt(document.getElementById("lhang").innerHTML)+1;
if (ang>90) ang=90;
xmlhttp.open("GET","index1.php?dir=h&ang="+ang,false);
xmlhttp.send();
document.getElementById("lhang").innerHTML=ang;
}
if (act=='h-'){
ang=parseInt(document.getElementById("lhang").innerHTML)-1;
if (ang<-90) ang=-90;
xmlhttp.open("GET","index1.php?dir=h&ang="+ang,false);
xmlhttp.send();
document.getElementById("lhang").innerHTML=ang;
}
if (act=='v+'){
ang=parseInt(document.getElementById("lvang").innerHTML)+1;
if (ang>135) ang=135;
xmlhttp.open("GET","index1.php?dir=v&ang="+ang,false);
xmlhttp.send();
document.getElementById("lvang").innerHTML=ang;
}
if (act=='v-'){
ang=parseInt(document.getElementById("lvang").innerHTML)-1;
if (ang<0) ang=0;
xmlhttp.open("GET","index1.php?dir=v&ang="+ang,false);
xmlhttp.send();
document.getElementById("lvang").innerHTML=ang;
}
if (act=='reset'){
xmlhttp.open("GET","index1.php?dir=v&ang=90",false);
xmlhttp.send();
xmlhttp.open("GET","index1.php?dir=h&ang=0",false);
xmlhttp.send();
document.getElementById("lhang").innerHTML='0';
document.getElementById("lvang").innerHTML='90';
}
if (act=='pan'){
xmlhttp.open("GET","index1.php?dir=pan",true);
xmlhttp.send();
document.getElementById("lhang").innerHTML='-90'
}
if (act=='tilt'){
xmlhttp.open("GET","index1.php?dir=tilt",true);
xmlhttp.send();
document.getElementById("lvang").innerHTML='135';
}
}
</script>
</head>
<body onload="esegui('reset');">
<form method="POST">
<table><tr><td>
Pan <label id="lhang"></label></td><td>
<input type=button name="dir" value="+" onclick="esegui('h+');">
<input type=button name="dir" value="-" onclick="esegui('h-');">
</td></tr><td>
Tilt <label id="lvang"></label></td><td>
<input type=button name="dir" value="+" onclick="esegui('v+');">
<input type=button name="dir" value="-" onclick="esegui('v-');">
</td></tr><td>
<input type=button name="dir" value="reset" onclick="esegui('reset');">
</td><td>
<input type=button name="dir" value="pan" onclick="esegui('pan');">
<input type=button name="dir" value="tilt" onclick="esegui('tilt');">
</td></tr></table>
</form>
<div id="myDiv"></div>
<iframe width=1200 height=800 src="http://10.32.1.133:8081">
</body>
</html>
Francesco Leoncino
Pan e Tilt
Interfaccia web (index.html)
Presenta 4 tasti per ruotare sull'asse
verticale e orizzontale, uno per
riportare in posizione centrale il
sistema, uno per fare un pan
completo e uno per un tilt completo.
È presente un iframe predisposto per
mostrare lo streaming della
telecamera. Per visualizzare lo
streaming è necessario avviarlo.
Francesco Leoncino
Gateway/Proxy
Il RPi può funzionare da Access Point WiFi e fare
da gateway verso una rete cablata, utilizzando
tool standard di analisi e filtraggio delle
comunicazioni.
Può anche essere utilizzato come Reverse Proxy
sfruttando la flessibilità di Linux per facilitare la
pubblicazione di contenuti altrimenti difficilmente
accessibili (IoT).
Francesco Leoncino
Gateway/Proxy
Caso d'uso:
Filmato in time lapse di un cantiere
Per realizzare il filmato 2 telecamere di tipo
GoPro sono state montate all'interno del cantiere
e rese disponibili in rete attraverso 2 RPi
Il tool utilizzato per indirizzare il flusso di rete delle
telecamere è “socat”
Francesco Leoncino
Gateway/Proxy
socat:
“Socat is a command line based utility that establishes two bidirectional byte streams
and transfers data between them.”
Le Tlc GoPro si comportano come AP, a cui un RPi si può collegare tramite un dongle
WiFi ricevendo un IP dalla GoPro, che però risulta su una LAN privata non instradabile.
Attraverso la connessione Ethernet è possibile utilizzare socat per effettuare il relay di
una porta dell'indirizzo IP della rete cablata su una porta dell'indirizzo della GoPro.
Questa operazione può essere effettuata con il seguente comando:
socat tcp4-listen:8000,fork tcp4:10.5.5.9:8080
In pratica si istruisce il RPi a dirottare tutte le connessioni che arrivano sulla porta 8000
verso la porta 8080 dell'IP 10.5.5.9 che è la porta dell'interfaccia web della GoPro.
Sarà dunque possibile accedere all'interfaccia web della GoPro da qualunque PC che
sia in rete con il RPi.
Francesco Leoncino
Raspberry vs Arduino
Un confronto sbagliato
● Sono complementari
● Usiamoli tutti e due integrandoli
●
Francesco Leoncino
Alternative
●
Varie con specificità differenti, spesso con caratteristiche più avanzate, ma costo
superiore, per esempio:
– UDOO
– Cosino
– Arduino
Yun
– Beagle
– Nvidia
Jetson K1
– Lattepanda
– Pine A64
Francesco Leoncino
Progetti
Cluster (http://www.southampton.ac.uk/~sjc/raspberrypi/)
Francesco Leoncino
Progetti
Francesco Leoncino
Grazie
Francesco Leoncino