Upload
gabriele-guizzardi
View
221
Download
2
Embed Size (px)
Citation preview
RASPBERRY PIPROGRAMMAZIONE
19 maggio 2015 - TechBar presso Cowo42 - Osimo
Chi sonoGabriele Guizzardihttp://[email protected]
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