3. NOTA
Questo incontro e queste slide possono essere considerate
il naturale continuo del Workshop fatto presso il Warehouse
Coworking di Pesaro.
Consiglio quindi di visualizzare prima tali slide ench’esse
presenti sul mio account SlideShare.
http://www.slideshare.net/guizzardigabriele
4. Quali SO sono disponibili
- Raspbian (porting di Debian Wheezy 7)
- Ubuntu Mate (RPi 2)
- Windows 10 IoT (RPi 2)
- Arch
- Debian
- Pidora (Fedora)
- RISC OS (non è Linux)
- OpenElec e altri (media center)
- ...e altri...
6. I protocolli del GPIO
Il RPi ha tre protocolli seriali: UART, SPI e I2C
UART (Universal Asynchronous Receiver-Trasmitter) trasmetti flussi di dati
in modo seriale. Asincrono significa che usa i dati stessi per sincronizzare la
trasmissione.
SPI (Serial Peripheral Interface) è una trasmissione seriale sincrona che
opera in modalità Full Duplex cioè permette la comunicazione bidirezionale
simultaneamente.
I2C (I quadro C, Inter-Integrated Circuit) bus di tipo sincrono, si basa su due
linee, una per i dati (sda) e una per il clock di sincronizzazione (scl).
7. Pulse Width Modular (PWM)
La modulazione di larghezza di impulso, è un tipo
dimodulazione digitale che permette di ottenere una
tensione media variabile dipendente dal rapporto tra la
durata dell'impulso positivo e di quello negativo (duty-
cycle), allo stesso modo è utilizzato per protocolli di
comunicazione in cui l'informazione è codificata sotto forma
di durata nel tempo di ciascun impulso. Grazie ai moderni
microcontrollori è possibile attivare o inattivare un
interruttore ad alta frequenza e allo stesso modo rilevare lo
stato e il periodo di un impulso. (wikipedia)
9. Pulse Width Modular GPIO
p = GPIO.PWM(channel, frequency) #istanzia PWM
p.start(dc) #avvia PWM dove dc è il duty cycle (0.0 <= dc <= 100.0)
p.ChangeFrequency(freq) #cambiare frequenza dove freq è la nuova frequenza in Hz
p.ChangeDutyCycle(dc) #cambiare il duty cycle dove 0.0 <= dc <= 100.0
p.stop() #ferma PWM
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
p = GPIO.PWM(12, 0.5)
p.start(1)
input('Premi un tasto per fermare')
p.stop()
GPIO.cleanup()
10. Come funziona I2C
Usando 7 bit per gli indirizzi si possono collegare fino a 128 Slave (alcuni riservati quindi sono meno)
14. Abilitiamo I2C
- apt-get install i2c-tools
- reboot
- modprobe i2c-dev
- ls /dev/i2c* (vedremo le porte)
- chmod o+rw /dev/i2c*
(ora possiamo usare le porte, dovremo rilanciare modprobe
e chmod ad ogni avvio. Se vogliamo automatizzare il
processo inseriamo i due comandi in /etc/rc.local)
16. Installare una dash board
apt-get install curl php5-curl php-json
(andare nella cartella /var/www)
git clone https://github.com/afaqurk/linux-dash.git
(oppure scaricare lo script)
sul browser digitare: 192.168.n.n/linux-dash
17. Utility utili
apt-get install mc (il vecchio Norton Commander)
apt-get install jed (editor)
apt-get install tree
apt-get install epiphani-browser (browser)
apt-get install fbi (visualizza immagini da shell)
apt-get install iptraf (analizza il traffico di rete)
apt-get install nmon (monitorare Linux da riga di comando)
19. Versione della GPIO
Python è il linguaggio principale e ufficiale della Raspberry Pi
pertanto troviamo già presente una libreria per usare la GPIO:
RPi.GPIO
Per sapere quale versione è installata eseguire:
- find /usr | grep -i gpio
20. Python
import RPi.GPIO as GPIO # carica la libreria per gestire la PGIO
from time import sleep # importa sleep da time per gestire la pausa
GPIO.setmode(GPIO.BCM) # settiamo BCM come numerico
GPIO.setwarnings(0) # sopprimo i messaggi di errore
GPIO.setup(17, GPIO.IN) # settiamo GPIO17 come input (pulsante)
GPIO.setup(18, GPIO.OUT) # settiamo GPIO18 come output (LED)
print "Lampeggio LED con GPIO 18"
try:
while True: # eseguiamo fino a che non si preme CTRL+C
if GPIO.input(17): # se NON premo il pulsante, stato = 1 (alto)
print "LED SPENTO"
GPIO.output(18, 0) # settiamo la porta a 0
else:
print "LED ACCESO"
GPIO.output(18, 1) # settiamo la porta a 1
sleep(0.5) # attende mezzo secondo
finally: # * vedi testo
GPIO.cleanup() # pulisce gli stati
21. Accendiamolo usando il C
Possiamo usare una libreria inizialmente scritta per Arduino
e adattata per RPi: WiringPi.
La libreria può essere usata anche per Python, Ruby e
Perl.
- git clone git://git.dragon.net/wiringPi
- cd wiringPi
- ./build
22. C
#include <stdio.h> //libreria standard IO
#include <wiringPi.h> //libreria WiringPi
//vedi tabella pin della GPIO, colonna wiringPi
#define LED12 1 //alla variabile LED12 assegno il pin 0
#define PULSANTE11 0 //alla variabile PULSANTE11 assegno il pin 1
int main(void)
{
printf("Lampeggio LED su GPIO 18n");
wiringPiSetup(); //inizializzo la libreria
pinMode(LED12,OUTPUT); //essendo un LED lo imposto come "output"
pinMode(PULSANTE11,INPUT); //essendo un pulsante lo imposto come "input"
23. C
for (;;) //ciclo infinito
{
if (digitalRead(PULSANTE11)==LOW) //premuto il pulsante
{
printf("LED ACCESOn");
digitalWrite(LED12,HIGH); //accendo il LED
delay(1000); //acceso per 1 sec.
}
printf("LED spenton");
digitalWrite(LED12,LOW); //spengo il LED
delay(1000); //rallento un po'
}
return 0; //chiudo main
}
gcc -o PulsanteLed PulsanteLed.c -lwiringPi
24. Setup di wiringPi
wiringPiSetup();
(usa la numerazione semplificata, 11 = 0)
wiringPiSetupGpio();
(usa la numerazione Broadcom, 11 = 17)
… ce ne sono altre meno importanti (vedi sito).
28. Java
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
public class PulsanteLed {
public static void main(String args[]) throws InterruptedException {
System.out.println("Lampeggio LED alla pressione di un pulsante");
//creo il controller
final GpioController gpio = GpioFactory.getInstance();
29. Java
//imposto myButton come input dal pin 0 (GPIO17) e imposto pin come output
sul pin 1 (GPIO18)
final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin
(RaspiPin.GPIO_00, PinPullResistance.PULL_DOWN);
final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin
(RaspiPin.GPIO_01, "MyLED", PinState.LOW);
//mi metto in ascolto dello stato del pin in input (listener)
myButton.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent
(GpioPinDigitalStateChangeEvent event) {
30. Java
System.out.println("PULSANTE: " + event.getState());
pin.toggle(); //cambio di stato il LED
System.out.println("LED ACCESO");
try {
Thread.sleep(1000); //attendo 1 sec.
}
catch (InterruptedException ie) {
//gestisci eccezzione
}
}
});
//creo un loop infinito solo per attendere l'evento (pulsante
premuto)
for (;;) {
Thread.sleep(500);
}
}
}
32. Web Server LAMP
- apt-get install apache2 (collegandosi a localhost si può
vedere che funziona)
- apt-get install mysql-server mysql-client
(durante l’installazione chiede di cambiare la password)
- apt-get install php5 libapache2-mod-php5 php5-mysql
(andare in /var/www e creare un file .php)
<?php phpinfo(); ?>
Ricollegarsi a localhost, lanciare il file .php creato e se tutto ok
viene visualizzato un elenco delle funzionalità di php
33. Web Server Python
python -m CGIHTTPServer
Da un altro PC collegarsi a
http://[indirizzo ip]:8000