SlideShare a Scribd company logo
1 of 40
Download to read offline
RASPBERRY PI
PROGRAMMAZIONE
19 maggio 2015 - TechBar presso Cowo42 - Osimo
Chi sono
Gabriele Guizzardi
http://www.brainandbytes.com
guizzardi@brainandbytes.com
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
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...
GPIO della RPi B+ e della 2
I2C
UART
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).
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)
Pulse Width Modular
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()
Come funziona I2C
Usando 7 bit per gli indirizzi si possono collegare fino a 128 Slave (alcuni riservati quindi sono meno)
Come funziona i2c
Abilitiamo I2C
disabilitato ma presente:
nano /etc/modules
Abilitiamo I2C
nano /etc/modprobe.d/raspi-blacklist.conf
(aggiungere il carattere sharp alla riga i2c-bcm2708 per abilitarlo)
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)
Controlliamo I2C
- i2cdetect -y 0 oppure - i2cdetect -y 1
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
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)
Pulsante + LED
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
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
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
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"
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
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).
Tabella pin di wiringPi
Utilizziamo MONO e C#
apt-get install mono-complete
apt-get install monodevelop
apt-get install gtk-sharp2
Utilizzare Java
http://pi4j.com
(utilizza http://wiringpi.com)
- curl -s get.pi4j.com | sudo bash
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();
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) {
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);
}
}
}
Java
javac -classpath .:classes:/opt/pi4j/lib’*’ -d . PulsanteLed.java
java -classpath .:classes:/opt/pi4j/lib’*’ PulsanteLed
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
Web Server Python
python -m CGIHTTPServer
Da un altro PC collegarsi a
http://[indirizzo ip]:8000
PHP
<?php
/* l'istruzione exec esegue un comando da shell */
exec("gpio read 0", $stato);
$led = '<img src="spento.png">';
if (isset($_POST['accendi']))
{
exec("gpio mode 1 out");
exec("gpio write 1 1");
$led = '<img src="acceso.png">';
}
if (isset($_POST['spegni']))
{
exec("gpio mode 1 out");
exec("gpio write 1 0");
$led = '<img src="spento.png"';
}
PHP
if (isset($_POST['lettura']))
{
exec("gpio read 0", $stato);
}
?>
<html>
<head>
<title> EMCelettronica - by Gabriele Guizzardi </title>
</head>
<body>
<H2 align=center> Accensione LED tramite pulsante web </H2>
<form method="post" action="">
<p align=center>
PHP
LED : <button name="accendi">Accendi</button>
<button name="spegni">Spegni</button>
<?php echo $led; ?>
</p>
</form>
<form method="post" action="">
<p align=center>
Valore Pulsante : <button name="lettura"> Leggi stato </button>
<input type="text" name="valor" value= "<?php echo $stato[0]; ?>" >
</p>
<p align=center>Tenete premuto il pulsante del circuito e cliccate Leggi
Stato.</p>
</form>
</body>
</html>
Lazarus (Free Pascal)
- apt-get install fpc
- apt-get install lazarus
Windows 10 IoT
Visual Studio 2015
...l’avventura inizia adesso...
CIAO

More Related Content

What's hot

Internet of Things for Dummies
Internet of Things for DummiesInternet of Things for Dummies
Internet of Things for DummiesPaolo Aliverti
 
Arduino & Smartphone
Arduino & SmartphoneArduino & Smartphone
Arduino & Smartphonedega1999
 
Lezione 3 arduino - corso 20 ore
Lezione 3 arduino - corso 20 oreLezione 3 arduino - corso 20 ore
Lezione 3 arduino - corso 20 oreMirko Mancin
 
Introduzione ad Arduino
Introduzione ad ArduinoIntroduzione ad Arduino
Introduzione ad ArduinoSimone Lusenti
 
Lezione 1 arduino - corso 20 ore
Lezione 1 arduino - corso 20 oreLezione 1 arduino - corso 20 ore
Lezione 1 arduino - corso 20 oreMirko Mancin
 
Android-Arduino interaction via Bluetooth
Android-Arduino interaction via BluetoothAndroid-Arduino interaction via Bluetooth
Android-Arduino interaction via BluetoothOpen Makers Italy
 
Raspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avereRaspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avereNicola Corti
 
Arduino wifi logger node
Arduino wifi logger nodeArduino wifi logger node
Arduino wifi logger nodeMirco Piccin
 
Corso Arduino Base - Basi Pratiche con Arduino Genuino
Corso Arduino Base - Basi Pratiche con Arduino GenuinoCorso Arduino Base - Basi Pratiche con Arduino Genuino
Corso Arduino Base - Basi Pratiche con Arduino GenuinoMauro Alfieri
 
Arduino basic workshop
Arduino basic workshopArduino basic workshop
Arduino basic workshopDaniele Iori
 
Come rendere Arduino professionale
Come rendere Arduino professionaleCome rendere Arduino professionale
Come rendere Arduino professionaleEmanuele Bonanni
 
Arduino: breve introduzione & progetti
Arduino: breve introduzione & progettiArduino: breve introduzione & progetti
Arduino: breve introduzione & progettiMirco Piccin
 
Open Hardware: Arduino, un prodotto italiano
Open Hardware: Arduino, un prodotto italianoOpen Hardware: Arduino, un prodotto italiano
Open Hardware: Arduino, un prodotto italianoRiccardo Lemmi
 
Introduzione a Arduino
Introduzione a ArduinoIntroduzione a Arduino
Introduzione a ArduinoPietro Aiuola
 
Intro to Arduino
Intro to ArduinoIntro to Arduino
Intro to ArduinotrevisoAUG
 

What's hot (20)

Internet of Things for Dummies
Internet of Things for DummiesInternet of Things for Dummies
Internet of Things for Dummies
 
Arduino & Smartphone
Arduino & SmartphoneArduino & Smartphone
Arduino & Smartphone
 
Lezione 3 arduino - corso 20 ore
Lezione 3 arduino - corso 20 oreLezione 3 arduino - corso 20 ore
Lezione 3 arduino - corso 20 ore
 
Introduzione ad Arduino
Introduzione ad ArduinoIntroduzione ad Arduino
Introduzione ad Arduino
 
Lezione 1 arduino - corso 20 ore
Lezione 1 arduino - corso 20 oreLezione 1 arduino - corso 20 ore
Lezione 1 arduino - corso 20 ore
 
Workshop su Arduino
Workshop su ArduinoWorkshop su Arduino
Workshop su Arduino
 
Android-Arduino interaction via Bluetooth
Android-Arduino interaction via BluetoothAndroid-Arduino interaction via Bluetooth
Android-Arduino interaction via Bluetooth
 
Arduino: domotica OpenSource
Arduino: domotica OpenSourceArduino: domotica OpenSource
Arduino: domotica OpenSource
 
Raspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avereRaspberry Pi - Il computer che hai sempre voluto avere
Raspberry Pi - Il computer che hai sempre voluto avere
 
Arduino wifi logger node
Arduino wifi logger nodeArduino wifi logger node
Arduino wifi logger node
 
Corso Arduino Base - Basi Pratiche con Arduino Genuino
Corso Arduino Base - Basi Pratiche con Arduino GenuinoCorso Arduino Base - Basi Pratiche con Arduino Genuino
Corso Arduino Base - Basi Pratiche con Arduino Genuino
 
Raspberry
RaspberryRaspberry
Raspberry
 
Arduino basic workshop
Arduino basic workshopArduino basic workshop
Arduino basic workshop
 
Come rendere Arduino professionale
Come rendere Arduino professionaleCome rendere Arduino professionale
Come rendere Arduino professionale
 
Arduino: breve introduzione & progetti
Arduino: breve introduzione & progettiArduino: breve introduzione & progetti
Arduino: breve introduzione & progetti
 
Arduino galileo edison_udoo
Arduino galileo edison_udooArduino galileo edison_udoo
Arduino galileo edison_udoo
 
Arduino ICT2016 [IT]
Arduino ICT2016 [IT]Arduino ICT2016 [IT]
Arduino ICT2016 [IT]
 
Open Hardware: Arduino, un prodotto italiano
Open Hardware: Arduino, un prodotto italianoOpen Hardware: Arduino, un prodotto italiano
Open Hardware: Arduino, un prodotto italiano
 
Introduzione a Arduino
Introduzione a ArduinoIntroduzione a Arduino
Introduzione a Arduino
 
Intro to Arduino
Intro to ArduinoIntro to Arduino
Intro to Arduino
 

Similar to Programmare raspberry pi - Cowo42 - Osimo (AN)

CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsMirko Mancin
 
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0SANTIAGO PABLO ALBERTO
 
Presentazione
PresentazionePresentazione
Presentazionecesario
 
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con ArduinoItalian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con ArduinoPaolo Aliverti
 
Introduzione a RaspBerry PI
Introduzione a RaspBerry PIIntroduzione a RaspBerry PI
Introduzione a RaspBerry PIPaolo Aliverti
 
TechDay: Internet delle cose - Paolo Aliverti
TechDay: Internet delle cose - Paolo Aliverti TechDay: Internet delle cose - Paolo Aliverti
TechDay: Internet delle cose - Paolo Aliverti Codemotion
 
Anatomia di un'istruzione in Arduino Pt.1
Anatomia di un'istruzione in Arduino Pt.1Anatomia di un'istruzione in Arduino Pt.1
Anatomia di un'istruzione in Arduino Pt.1µhack
 
Workshop Arduino by Fiore Basile
Workshop Arduino by Fiore BasileWorkshop Arduino by Fiore Basile
Workshop Arduino by Fiore BasileCommit University
 
Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2µhack
 
Elettronica digitale with Example
Elettronica digitale with ExampleElettronica digitale with Example
Elettronica digitale with ExampleClaudio Mignanti
 
Arkanoid on Altera DE-1
Arkanoid on Altera DE-1Arkanoid on Altera DE-1
Arkanoid on Altera DE-1Matteo Gazzin
 
Microcontrollori
MicrocontrolloriMicrocontrollori
Microcontrollorisamu97
 
Domotica per il risparmio energetico
Domotica per il risparmio energeticoDomotica per il risparmio energetico
Domotica per il risparmio energeticoGiuseppe Salinaro
 
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...Aruba S.p.A.
 
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015Matteo Baccan
 

Similar to Programmare raspberry pi - Cowo42 - Osimo (AN) (20)

CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
 
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
 
Presentazione
PresentazionePresentazione
Presentazione
 
Internet delle cose
Internet delle coseInternet delle cose
Internet delle cose
 
TuxIsAlive
TuxIsAliveTuxIsAlive
TuxIsAlive
 
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con ArduinoItalian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
 
Openmoko
OpenmokoOpenmoko
Openmoko
 
Introduzione a RaspBerry PI
Introduzione a RaspBerry PIIntroduzione a RaspBerry PI
Introduzione a RaspBerry PI
 
TechDay: Internet delle cose - Paolo Aliverti
TechDay: Internet delle cose - Paolo Aliverti TechDay: Internet delle cose - Paolo Aliverti
TechDay: Internet delle cose - Paolo Aliverti
 
Anatomia di un'istruzione in Arduino Pt.1
Anatomia di un'istruzione in Arduino Pt.1Anatomia di un'istruzione in Arduino Pt.1
Anatomia di un'istruzione in Arduino Pt.1
 
Workshop Arduino by Fiore Basile
Workshop Arduino by Fiore BasileWorkshop Arduino by Fiore Basile
Workshop Arduino by Fiore Basile
 
Introduzione ad Arduino del Maker DevLab
Introduzione ad Arduino del Maker DevLabIntroduzione ad Arduino del Maker DevLab
Introduzione ad Arduino del Maker DevLab
 
Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2
 
Elettronica digitale with Example
Elettronica digitale with ExampleElettronica digitale with Example
Elettronica digitale with Example
 
Arkanoid on Altera DE-1
Arkanoid on Altera DE-1Arkanoid on Altera DE-1
Arkanoid on Altera DE-1
 
Microcontrollori
MicrocontrolloriMicrocontrollori
Microcontrollori
 
Arduino - Cosa sono e come funzionano i display
Arduino - Cosa sono e come funzionano i displayArduino - Cosa sono e come funzionano i display
Arduino - Cosa sono e come funzionano i display
 
Domotica per il risparmio energetico
Domotica per il risparmio energeticoDomotica per il risparmio energetico
Domotica per il risparmio energetico
 
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...Con Aruba, a lezione di Cloud  #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
 
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
 

Programmare raspberry pi - Cowo42 - Osimo (AN)

  • 1. RASPBERRY PI PROGRAMMAZIONE 19 maggio 2015 - TechBar presso Cowo42 - Osimo
  • 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...
  • 5. GPIO della RPi B+ e della 2 I2C UART
  • 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)
  • 12. Abilitiamo I2C disabilitato ma presente: nano /etc/modules
  • 13. Abilitiamo I2C nano /etc/modprobe.d/raspi-blacklist.conf (aggiungere il carattere sharp alla riga i2c-bcm2708 per abilitarlo)
  • 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)
  • 15. Controlliamo I2C - i2cdetect -y 0 oppure - i2cdetect -y 1
  • 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).
  • 25. Tabella pin di wiringPi
  • 26. Utilizziamo MONO e C# apt-get install mono-complete apt-get install monodevelop apt-get install gtk-sharp2
  • 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); } } }
  • 31. Java javac -classpath .:classes:/opt/pi4j/lib’*’ -d . PulsanteLed.java java -classpath .:classes:/opt/pi4j/lib’*’ PulsanteLed
  • 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
  • 34. PHP <?php /* l'istruzione exec esegue un comando da shell */ exec("gpio read 0", $stato); $led = '<img src="spento.png">'; if (isset($_POST['accendi'])) { exec("gpio mode 1 out"); exec("gpio write 1 1"); $led = '<img src="acceso.png">'; } if (isset($_POST['spegni'])) { exec("gpio mode 1 out"); exec("gpio write 1 0"); $led = '<img src="spento.png"'; }
  • 35. PHP if (isset($_POST['lettura'])) { exec("gpio read 0", $stato); } ?> <html> <head> <title> EMCelettronica - by Gabriele Guizzardi </title> </head> <body> <H2 align=center> Accensione LED tramite pulsante web </H2> <form method="post" action=""> <p align=center>
  • 36. PHP LED : <button name="accendi">Accendi</button> <button name="spegni">Spegni</button> <?php echo $led; ?> </p> </form> <form method="post" action=""> <p align=center> Valore Pulsante : <button name="lettura"> Leggi stato </button> <input type="text" name="valor" value= "<?php echo $stato[0]; ?>" > </p> <p align=center>Tenete premuto il pulsante del circuito e cliccate Leggi Stato.</p> </form> </body> </html>
  • 37. Lazarus (Free Pascal) - apt-get install fpc - apt-get install lazarus