programmare raspberry pi - cowo42 - osimo (an)
TRANSCRIPT
![Page 1: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/1.jpg)
RASPBERRY PIPROGRAMMAZIONE
19 maggio 2015 - TechBar presso Cowo42 - Osimo
![Page 2: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/2.jpg)
Chi sonoGabriele Guizzardihttp://[email protected]
![Page 3: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/3.jpg)
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
![Page 4: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/4.jpg)
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...
![Page 5: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/5.jpg)
GPIO della RPi B+ e della 2
I2C
UART
![Page 6: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/6.jpg)
I protocolli del GPIOIl 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).
![Page 7: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/7.jpg)
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)
![Page 8: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/8.jpg)
Pulse Width Modular
![Page 9: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/9.jpg)
Pulse Width Modular GPIOp = 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()
![Page 10: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/10.jpg)
Come funziona I2C
Usando 7 bit per gli indirizzi si possono collegare fino a 128 Slave (alcuni riservati quindi sono meno)
![Page 11: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/11.jpg)
Come funziona i2c
![Page 12: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/12.jpg)
Abilitiamo I2Cdisabilitato ma presente:nano /etc/modules
![Page 13: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/13.jpg)
Abilitiamo I2Cnano /etc/modprobe.d/raspi-blacklist.conf(aggiungere il carattere sharp alla riga i2c-bcm2708 per abilitarlo)
![Page 14: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/14.jpg)
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)
![Page 15: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/15.jpg)
Controlliamo I2C- i2cdetect -y 0 oppure - i2cdetect -y 1
![Page 16: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/16.jpg)
Installare una dash boardapt-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
![Page 17: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/17.jpg)
Utility utiliapt-get install mc (il vecchio Norton Commander)apt-get install jed (editor)apt-get install treeapt-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)
![Page 18: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/18.jpg)
Pulsante + LED
![Page 19: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/19.jpg)
Versione della GPIOPython è il linguaggio principale e ufficiale della Raspberry Pi pertanto troviamo già presente una libreria per usare la GPIO: RPi.GPIOPer sapere quale versione è installata eseguire:- find /usr | grep -i gpio
![Page 20: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/20.jpg)
Pythonimport RPi.GPIO as GPIO # carica la libreria per gestire la PGIOfrom time import sleep # importa sleep da time per gestire la pausaGPIO.setmode(GPIO.BCM) # settiamo BCM come numericoGPIO.setwarnings(0) # sopprimo i messaggi di erroreGPIO.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
![Page 21: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/21.jpg)
Accendiamolo usando il CPossiamo 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
![Page 22: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/22.jpg)
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 18\n");
wiringPiSetup(); //inizializzo la libreria
pinMode(LED12,OUTPUT); //essendo un LED lo imposto come "output"pinMode(PULSANTE11,INPUT); //essendo un pulsante lo imposto come "input"
![Page 23: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/23.jpg)
Cfor (;;) //ciclo infinito{
if (digitalRead(PULSANTE11)==LOW) //premuto il pulsante{
printf("LED ACCESO\n");digitalWrite(LED12,HIGH); //accendo il LEDdelay(1000); //acceso per 1 sec.
}printf("LED spento\n");digitalWrite(LED12,LOW); //spengo il LEDdelay(1000); //rallento un po'
}return 0; //chiudo main}
gcc -o PulsanteLed PulsanteLed.c -lwiringPi
![Page 24: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/24.jpg)
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).
![Page 25: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/25.jpg)
Tabella pin di wiringPi
![Page 26: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/26.jpg)
Utilizziamo MONO e C#
apt-get install mono-complete
apt-get install monodevelop
apt-get install gtk-sharp2
![Page 27: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/27.jpg)
Utilizzare Java
http://pi4j.com(utilizza http://wiringpi.com)
- curl -s get.pi4j.com | sudo bash
![Page 28: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/28.jpg)
Javaimport 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();
![Page 29: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/29.jpg)
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) {
![Page 30: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/30.jpg)
Java System.out.println("PULSANTE: " + event.getState());
pin.toggle(); //cambio di stato il LEDSystem.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); } }}
![Page 31: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/31.jpg)
Java
javac -classpath .:classes:/opt/pi4j/lib’*’ -d . PulsanteLed.java
java -classpath .:classes:/opt/pi4j/lib’*’ PulsanteLed
![Page 32: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/32.jpg)
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
![Page 33: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/33.jpg)
Web Server Python
python -m CGIHTTPServer Da un altro PC collegarsi a http://[indirizzo ip]:8000
![Page 34: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/34.jpg)
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"';}
![Page 35: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/35.jpg)
PHPif (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>
![Page 36: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/36.jpg)
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>
![Page 37: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/37.jpg)
Lazarus (Free Pascal)
- apt-get install fpc- apt-get install lazarus
![Page 38: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/38.jpg)
Windows 10 IoT
![Page 39: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/39.jpg)
Visual Studio 2015
![Page 40: Programmare raspberry pi - Cowo42 - Osimo (AN)](https://reader034.vdocuments.site/reader034/viewer/2022052307/55c0916fbb61eb36198b4776/html5/thumbnails/40.jpg)
...l’avventura inizia adesso...
CIAO