Programmare raspberry pi - Cowo42 - Osimo (AN)

Post on 04-Aug-2015

216 views 2 download

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

RASPBERRY PIPROGRAMMAZIONE

19 maggio 2015 - TechBar presso Cowo42 - Osimo

Chi sonoGabriele Guizzardihttp://www.brainandbytes.comguizzardi@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 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).

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 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()

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 I2Cdisabilitato ma presente:nano /etc/modules

Abilitiamo I2Cnano /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 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

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)

Pulsante + LED

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

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

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

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"

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

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

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();

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 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); } }}

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"';}

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>

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