Programmare raspberry pi - Cowo42 - Osimo (AN)

40
RASPBERRY PI PROGRAMMAZIONE 19 maggio 2015 - TechBar presso Cowo42 - Osimo

Transcript of Programmare raspberry pi - Cowo42 - Osimo (AN)

Page 1: Programmare raspberry pi - Cowo42 - Osimo (AN)

RASPBERRY PIPROGRAMMAZIONE

19 maggio 2015 - TechBar presso Cowo42 - Osimo

Page 3: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

GPIO della RPi B+ e della 2

I2C

UART

Page 6: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

Pulse Width Modular

Page 9: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

Come funziona i2c

Page 12: Programmare raspberry pi - Cowo42 - Osimo (AN)

Abilitiamo I2Cdisabilitato ma presente:nano /etc/modules

Page 13: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

Controlliamo I2C- i2cdetect -y 0 oppure - i2cdetect -y 1

Page 16: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

Pulsante + LED

Page 19: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

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)

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)

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)

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)

Tabella pin di wiringPi

Page 26: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

Utilizzare Java

http://pi4j.com(utilizza http://wiringpi.com)

- curl -s get.pi4j.com | sudo bash

Page 28: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

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)

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)

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)

Web Server Python

python -m CGIHTTPServer Da un altro PC collegarsi a http://[indirizzo ip]:8000

Page 34: Programmare raspberry pi - Cowo42 - Osimo (AN)

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)

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)

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)

Lazarus (Free Pascal)

- apt-get install fpc- apt-get install lazarus

Page 38: Programmare raspberry pi - Cowo42 - Osimo (AN)

Windows 10 IoT

Page 39: Programmare raspberry pi - Cowo42 - Osimo (AN)

Visual Studio 2015

Page 40: Programmare raspberry pi - Cowo42 - Osimo (AN)

...l’avventura inizia adesso...

CIAO