RASPiTHON
Transcript
RASPiTHON
paolo macchi - serena arena RASPiTHON Introduzione a Raspberry+Python ISIS Cipriano Facchinetti - Castellanza 2016-17 Introduzione a RASPiTON = Raspberry+Python Questo testo è pubblicato sotto licenza Creative Commons - Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported - Per le condizioni consulta: http://creativecommons.org/licenses/by-nc-sa/3.0/deed.it . Le utilizzazioni consentite dalla legge sul diritto d'autore e gli altri diritti non sono in alcun modo limitati da quanto sopra. Il documento è scaricabile da http://moodle.isisfacchinetti.it/mod/data/view.php?d=21&rid=713 per fini esclusivamente didattici e non commerciali Segnalazioni di errori, critiche e consigli sono molto graditi e possono essere inoltrati a [email protected] , oppure lasciando un commento al momento del download, per gli studenti registrati. Sono grato alla prof. SERENA ARENA con cui ho condiviso il progetto iniziale e senza la quale non avrei mai cominciato. E’ sua la parte relativa alla gestione delle bash. - Paolo Macchi - ISIS “Cipriano Facchinetti” via Azimonti, 5 - 21053 Castellanza (VA) - http://www.isisfacchinetti.gov.it/ Tel. 0331635718 fax 0331679586 RASPiTHON Convenzioni usate nel testo: rappresenta una curiosità o un approfondimento Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 1 INDICE Raspi : cosa, perché, per chi Introduzione L’hardware Il software Installazione Python con Raspberry Modalità Interattiva di programmazione Modalità di programmazione Script con la creazione di un file con estensione .py Modalità Python Shell Variabili LOOP My first program CLASS General Purpose Input/Output OUTPUT Es.0 Prova per il pilotaggio di un output, Es. 1 led0.py - GPIO24 (pin 18) in OUTPUT Es. 2 led1.py (come led0.py ma con attesa tra I due stati del led)- GPIO24 (pin 18) in OUTPUT INPUT Es.3 Input button - GPIO18 (pin 12) in INPUT INPUT/OUTPUT Es.4 Input button / Output LED - GPIO18 (pin 12) in INPUT, GPIO24 (pin 18) in OUTPUT Es.5 Input button / Output LED: riflessi pronti con Gpiozero Raspbian shell Es.S1 01_LED_Blink.sh es.S2 02_PushButton_OnOff.sh Es.S3 03_LED-PushButton.sh IOT-lab Gestione remota del Raspberry Passo 0 - Configurazione di Raspberry (da effettuare una volta per tutte) Passo 1 - Accesso a Raspberry da “Desktop Remoto” Server Web LAMP – Linux Apache MySQL PHP Guida all’installazione STEP 1 – PREPARAZIONE STEP 2 – APACHE, il server web STEP 3 – PHP, il linguaggio di scripting Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 2 STEP 4 – MySQL, il database STEP OPZIONALE – PHPMYADMIN, il gestore di database Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 3 Raspi : cosa, perché, per chi Introduzione Raspberry Pi (Raspi per gli amici, Pi sta per linguaggio Python, ). è un “single-board computer” open-source, ideato e realizzato nel Regno Unito dall'omonima fondazione, che comprende varie versioni che integrano elementi aggiuntivi (quali ad esempio CPU migliorate oppure connettività wireless, come in Rasperry Pi 3 Model B ) ma che non stravolgono la struttura del progetto e non intaccano i principi di funzionamento e il costo. Grande poco più di una carta di credito, la scheda Raspberry può essere collegata al televisore di casa o al monitor e svolgere molti compiti per i quali oggi è utilizzato un normale computer. A cosa può servire? ● Educazione, Raspberry Pi è tagliato su misura per l'insegnamento della programmazione nelle scuole di ogni ordine e grado (http://www.computingatschool.org.uk/ ) ● Domotica. Date le sue dimensioni piuttosto ridotte e le sue specifiche tecniche, Raspberry Pi viene utilizzato spesso e volentieri come controller in un sistema di home automation come ad esempio il controllo della luminosità, sistemi di sicurezza casalinghi ● Server domestico . Utilizzando le adeguate schede di espansione, un Raspberry Pi può essere utilizzato anche come piccolo server personale. ● Media center ● Stazione meteo (https://blog.retep.org/2012/07/30/installing-a-usb-weather-station-on-a-raspberry-pi-part-1/ ) https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 4 L’hardware Raspberry è un computer implementato su un'unica scheda elettronica che comprende il processore, l'acceleratore grafico (GPU,Graphics Processing Unit) e la RAM. (https://www.raspberrypi.org/documentation/hardware/raspberrypi/README.md) Alcune caratteristiche di Raspberry Pi 3, third generation Raspberry Pi (Raspberry Pi 3 ha la stessa form factor di Pi 2) sono le seguenti: ● 1.2GHz 64-bit quad-core ARMv8 CPU (*) ● 802.11n Wireless LAN ● Bluetooth 4.1, Bluetooth Low Energy (BLE) ● 1GB RAM ● 4 USB ports ● 40 GPIO pins ● Full HDMI port ● Ethernet port ● Combined 3.5mm audio jack and composite video ● Camera interface (CSI) ● Display interface (DSI) ● Micro SD card slot (now push-pull rather than push-push) ● VideoCore IV 3D graphics coreGPIO NOTA Per comandare il Raspberry PI da remoto vi è RaspController. L'app per i dispositivi Android è disponibile sul Google PlayStore: https://play.google.com/store/apps/details?id=it.Ettore.raspcontroller (*) - “L'architettura ARM (Acorn RISC Machine) indica una famiglia di microprocessori RISC a 32-bit sviluppata da ARM Holdings e utilizzata in una moltitudine di sistemi embedded. Grazie alle sue caratteristiche di basso consumo elettrico (rapportato alle prestazioni) l'architettura ARM domina il settore dei dispositivi mobili dove il risparmio energetico delle batterie è fondamentale” (Wikipedia). ARMv8-A introduce un’architettura a 64-bit. La famiglia ARM Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 5 Il software Raspberry Pi necessita per funzionare di un sistema operativo. Raspberry Pi è stato progettato e realizzato per far girare distribuzioni Linux ma, attualmente, è possibile disporre di molte risorse tra cui Windows 10 (https://developer.microsoft.com/it-it/windows/iot). Raspberry Foundation raccomanda agli utenti l'utilizzo della distribuzione Raspbian (“Raspbian is a free operating system based on Debian, optimised for the Raspberry Pi hardware” https://www.raspberrypi.org/downloads ). NOTA DEBIAN (https://www.debian.org) “ Un sistema operativo è l'insieme dei programmi di base e altri vari strumenti che permettono al computer di funzionare. Al centro di un sistema operativo c'è il kernel. Il kernel è il programma fondamentale sul computer ed esegue tutte le operazioni di base e permette di eseguire programmi. I sistemi Debian attuali utilizzano il kernel Linux o quello FreeBSD. Linux è un software scritto inizialmente da Linus Torvalds e che è supportato da migliaia di programmatori nel mondo. FreeBSD è un sistema operativo che comprende un kernel e vari applicativi.” Numerose sono le applicazioni e linguaggi software che si possono usare, tra cui (https://www.raspberrypi.org/documentation/) ● ● ● ● ● ● ● ● ● ● ● ● Scratch is a visual programming tool allowing the user to create animations and games with a drag-and-drop interface Python is a general purpose programming language that is easy to pick up and also very powerful Sonic Pi Write code to make music with Sonic Pi Terminal The Linux terminal is a powerful tool for getting around the filesystem and issuing commands GPIO: The General Purpose Input/Output pins allow you to control and interact with the real world from Python, Scratch or other programming environments Minecraft interact with the real world through GPIO Python Games WordPress Set up a web server on your Raspberry Pi and install Wordpress, a content management and blogging system Mathematica is an industry leading computational platform Camera Module is capable of taking full HD 1080p photo and video and can be controlled programmatically. Using a standard USB webcam instead of the Raspberry Pi camera module Kodi media centre software Sonic per la musica Installazione NOTA: Per l’installazione https://www.raspberrypi.org/downloads/ https://www.raspberrypi.org/learning/getting-started-with-raspberry-pi-lesson/ Paolo Macchi - Serena Arena http://www.engeene.it/la-porta-gpio-della-raspberry-pi-1/ RASPiTHON – rel. 17.01.07 6 https://www.raspberrypi.org/help/ Le procedure di seguito descritte sono relative alla versione ufficiale di Raspbian disponibile dal maggio 2016, ma non dovrebbero esserci differenze significative con altre versioni Quando si inserisce l’alimentazione il sistema parte ● ● allo start parte NOOBS (NOOBS è un installer che permette di installare e configurare facilmente Raspbian.) Dal menu cliccare su: Raspbian -> Install-> Yes …. Si attende il tempo di caricamento in cui è presentata una panoramica dei servizi offerti da Raspbian (oppure Boot (rasi-config) -> Enable boot -> OK ; Desktop log -> invio; FINISH (tab) ; YES) e ... Login: pi Pass: raspberry ● Per GUI: startx ….. Sperimentare, esplorare e divertirsi Python con Raspberry Python (http://www.python.it/ ) è un linguaggio di programmazione (ideato da Guido van Rossum negli anni ‘90 al National Research Institute for Mathematics and Computer Science in Olanda ed è disponibile sotto GNU) potente e facile da usare e con Raspberry Pi consente di collegare il progetto al mondo reale . ● ● ● ● Python è interpretato Python è Interattivo: Python prompt interagisce con l’interprete Python è Object-Oriented (classi, istanze, metodi, oggetti,..) Python è un linguaggio semplice per iniziare ma è usato per un grandissimo numero di applicazioni in Web Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 7 In questo contesto (https://www.raspberrypi.org/documentation/usage/python/ )offriremo solo alcuni cenni di programmazione e ci serviremo massiiciamente delle note e dell’emulatore presente in http://www.tutorialspoint.com/python/ . Si consiglia anche il corso per principianti http://www.python.it/doc/newbie/ Ci sono vari modi di lanciare il programma : ● ● ● Modalità Interattiva di programmazione con terminale Modalità di programmazione Script con la creazione di un file con estensione .py Modalità Python Shell Modalità Interattiva di programmazione In terminal, invocare l'interprete senza passare un file di script come parametro:. L’interprete Python permette l’esecuzione dei programmi, appare uno specifico prompt, caratterizzato da 3 caratteri di maggiore (>>>). Ogni volta che viene invocato il comando python il codice scritto viene trasformato in bytecode (file .pyc o .pyo) eseguiti da un interprete bytecode che è una macchina virtuale Python(PVM). $ python Python 2.4.3 (#1, Nov 11 2010, 13:34:43) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> >>>print ("Hello, Python!");. However in Python version 2.4.3, this produces the following result: Hello, Python! quit() Modalità di programmazione Script con la creazione di un file con estensione .py Invocare l'interprete con un parametro di script fa iniziare l'esecuzione dello script che continua fino a quando lo script è terminato. I file Python hanno estensione .py. Digitare il seguente codice sorgente (ad esempio usando l’editor “nano”) in un file “test.py”: print ("Hello"); eseguirlo nella riga di comando: $ python test.py che produce Hello Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 8 Un altro modo per eseguire uno script Python è creare il file “test.py” e renderlo eseguibile: #!/usr/bin/python print ("Hello"); fornire le proprietà di esecuzione, nella riga di comando: $ chmod +x test.py # This is to make file executable $./test.py che produce: Hello Modalità Python Shell Raspbian include un IDE - Integrated Development Environment - chiamato IDLE: https://www.cs.uky.edu/~keen/help/python-tutorial/Lab0.html Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 9 Per creare un file Python in IDLE fare clic su File > New Window e verrà dato una finestra vuota che, si tratta di un file vuoto , non un prompt di Python! Si scrive un file Python in questa finestra : n=0 for i in range(1, 10): n += i print("La somma dei numeri da 1 a .. è:") print(n) ---------------------------------------------------------------Quindi salvare il file ( File> Save o Ctrl + S , si salva ad esempio in /home/pi/Desktop il file hello.py) e, quindi si esegue ( Run > Run Module, F5) e si vedrà l l'output nella finestra di Python Shell. Variabili non c’è una dichiarazione esplicita: #!/usr/bin/python counter = 100 miles = 1000.0 name = "John" # An integer assignment # A floating point # A string print counter print miles print name If … else if expression: statement(s) Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 10 else: statement(s) -------------------------------------------------#!/usr/bin/python var1 = 100 if var1: print "1 - Got a true expression value" print var1 else: print "1 - Got a false expression value" print var1 ------------------------------------------------------- LOOP while expression: statement(s) --------------------------------------------------------------#!/usr/bin/python count = 0 while (count < 9): print 'The count is:', count count = count + 1 print "Good bye!" ------------------------------------------------------------------------------for iterating_var in sequence: statements(s) -------------------------------------------#!/usr/bin/python for letter in 'Python': # First Example print 'Current Letter :', letter fruits = ['banana', 'apple', 'mango'] for fruit in fruits: # Second Example print 'Current fruit :', fruit print "Good bye!" ---------------------------------------------------------- Funzioni -------------------------------------------------------#!/usr/bin/python # Function definition is here def printme( str ): "This prints a passed string into this function" print str; return; # Now you can call printme function printme("I'm first call to user defined function!"); Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 11 printme("Again second call to the same function"); ------------------------------------------------- NOTA https://docs.python.org/2/tutorial/index.html http://www.thirdeyevis.com/pi-page-2.php https://docs.python.org/2/tutorial/introduction.html https://www.python.org/downloads/windows/ download per windows tutti i programmi http://www.tutorialspoint.com/codingground.htm My first program #my first Python program username = input("Hello, I'm Raspberry Pi! What is your name? ") print ('Nice to meet you, ' + username + ' have a nice day!') ---------------------------------------------------------------------------------------------------------------- #!/usr/bin/python3 # Fibonacci numbers module def fib(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result if __name__ == "__main__": f=fib(100) print(f) ------------------------------------------------------------oppure f=fib(100) print(f) ----------------------------------- CLASS #!/usr/bin/python3 Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 12 class Employee: 'Common base class for all employees' empCount = 0 def __init__(self, name, salary,age): self.name = name self.salary = salary self.age= age Employee.empCount += 1 def displayCount(self): print ("Total Employee %d" % Employee.empCount) def displayEmployee(self): print ("Name : ", self.name, ", Salary: ", self.salary , "Age: ", self.age) #This would create first object of Employee class" emp1 = Employee("Zara", 2000) #This would create second object of Employee class" emp2 = Employee("Manni", 5000) emp1.displayEmployee() emp2.displayEmployee() print ("Total Employee %d" % Employee.empCount) -------------------------------------------------------------- General Purpose Input/Output Un’ interfaccia GPIO è un insieme di 26 pin che comunicano direttamente con il processore e che sono facilmente programmabili per collegare periferiche. Quest’ interfaccia digitale è una delle caratteristiche rilevanti di Raspberry: può inviare e ricevere segnali digitali (0V e 3.3 V). Il modo piú semplice per programmare i pin GPIO è utilizzare Python con la libreria Python RPi.GPIO: import RPi.GPIO as GPIO ## Import GPIO library GPIO.setmode(GPIO.BCM) ## Use pin numbering E per il settaggio, ad esempio, operare così: GPIO.setup(24,GPIO.OUT) ## Setup GPIO24 to OUT Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 13 GPIO.output(24,1) ## Setup GPIO24 ON/HIGH/True Attenzione. Se si accede a GPIO, potrebbero essere necessarie le autorizzazioni di superutente: pi@raspberrypi ~ $ sudo idle3 Oppure direttamente: pi@raspberrypi ~ $ sudo python nomefile.py Ricordare di essere nella cartella in cui è stato salvato il file, o specificare la cartella UART= Universal Asynchronous Receiver Transmitter, a popular serial communication interface which provides full duplex communication between two devices. The term universal means that transmission speed and data format are configurable. As it is asynchronous it doesn’t need to send clock signal along with the data signals. UART uses two data lines for sending (Tx) and receiving (Rx) data. The ground of both devices should be made common. Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 14 SPI = Serial Peripheral Interface is a synchronous serial communication interface specification used for short distance communication. It’s a “synchronous” data bus, which means that it uses separate lines for data and a “clock” that keeps both sides in perfect sync (https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi ). I2C= Inter-integrated Circuit (I2C) Protocol is a protocol intended to allow multiple “slave” digital integrated circuits (“chips”) to communicate with one or more “master” chips. Like the Serial Peripheral Interface (SPI), it is only intended for short distance communications within a single device. Like Asynchronous Serial Interfaces (such as RS-232 or UARTs), it only requires two signal wires to exchange information. I2C is a useful bus that allows data exchange between microcontrollers and peripherals with a minimum of wiring (https://learn.sparkfun.com/tutorials/i2c ). Questa interfaccia permette di collegare numerosi circuiti integrati adatti ad interagire col mondo reale: misurare temperature o tensioni, gestire led, LCD e pulsanti, generare tensioni. Usare la libreria wiringPi ( http://wiringpi.com/ ) per interfacciarsi a questi bus. Fig. 5. Descrizione hardware della porta GPIO. In programmazione vanno importate la libreria RPi.GPIO e attivato il pin numbering OUTPUT NOTA Doc per I/O con Raspberry http://www.thirdeyevis.com/pi-page-2.php https://www.raspberrypi.org/documentation/usage/gpio/ Anche : http://www.thirdeyevis.com/pi-page-2.php led http://razzpisampler.oreilly.com/ch07.html button ---> capitoli vari su button motor etc Es.0 Prova per il pilotaggio di un output, iniziamo a provare se il nostro LED si accende usando lo schema sottostante che collega il pin di alimentazione a 3,3 V a quello di massa. Calcolo resistenza per diodo LED Per alimentare un LED é necessario limitare la corrente di alimentazione. Il limitatore di corrente più semplice é composto da una resistenza. Con la legge degli Ohm: R = (Vcc - Vd) / I ove: R e' la resistenza , Vcc e' la tensione in continua dell'alimentatore , Vd e' la caduta di tensione del Led e I è la corrente che si vuole far transitare nel Led . Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 15 Tutte le porte GPIO di Raspberry hanno una tensione di 3.3V. La corrente massima raccomandata per Raspberry, NON dovrebbe mai superare i 16 mA. Es: Diodo rosso alimentato con alimentazione in CC di 3.3V e corrente di 10mA: R = (3,3V -1,8V) / 10x10^-3 A = 150 Ohm . (Per il calcolo automatico: http://www.muzique.com/schem/led.htm ) NOTA Per la realizzazione dei prototipi ci serviremo di una breadboard (basetta) . Nella figura sottostante viene mostrata la basetta con un esempio di circuiteria ei collegamenti elettrici di una basetta: Lle linee di alimentazione, che sono generalmente poste ai lati e collegate lungo tutto l'asse, e le linee dedicate ai componenti, collegate in posizione perpendicolare alle linee d'alimentazione e più corte Es. 1 led0.py - GPIO24 (pin 18) in OUTPUT NOTA (NB agiamo su GPIO24 / pin 18 usiamo GPIO.BCM (import RPi.GPIO as GPIO ## Import GPIO library) ci riferiamo, cioè, ai numeri "Broadcom SOC channel" , ex GPIO3,GPIO3,..GPIOx che corrispondono , rispettivamente, ai pin fisici 3,5, ..x.) Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 16 http://raspi.tv/2013/rpi-gpio-basics-5-setting-up-and-using-outputs-with-rpi-gpio import RPi.GPIO as GPIO ## Import GPIO library GPIO.setmode(GPIO.BCM) ## Use pin numbering GPIO.setup(24,GPIO.OUT) ## Setup GPIO24 to OUT GPIO.output(24,1) ## Setup GPIO24 ON/HIGH/True Es. 2 led1.py (come led0.py ma con attesa tra I due stati del led)GPIO24 (pin 18) in OUTPUT ----------------------------------- import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM) ## Use numbering of GPIOx GPIO.setup(24,GPIO.OUT) ## Setup GPIO24 – pin 18 GPIO.output(24,1) print ("start") try: while True: GPIO.output(24, 1) sleep(1) # set GPIO24 (pin18) to 1/GPIO.HIGH/True # wait a second print ("wait 1") GPIO.output(24, 0) sleep(1) # set GPIO24 (pin 18) to 0/GPIO.LOW/False # wait a second print ("wait 0") Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 17 except KeyboardInterrupt: # trap a CTRL+C keyboard interrupt GPIO.cleanup() INPUT Es.3 Input button - GPIO18 (pin 12) in INPUT Il pulsante è cablato in modo che quando viene premuto, si collegherà il GPIO18 (pin 12) configurato come ingresso a GND (Il pin di ingresso è normalmente pullappato a 3.3V da pull_up_down = GPIO.PUD_UP in GPIO.setup. Questo significa che quando si si preme il pulsante il valore che si legge in ingresso (utilizzando GPIO.input), sarà False. NOTA ogni pin GPIO è configurabile con i resistori in pull-up o pull-down. Quando si utilizza un pin GPIO come input, è possibile configurare queste resistenze in modo che uno o entrambi o nessuno dei due resistori è attivato. Se questo parametro viene omesso, allora nessuna resistenza verrà attivata. Ciò lascia l'ingresso flottante, il che significa che il suo valore può oscillare tra valore alto e basso a seconda di ciò che raccoglie come rumore elettrico. (se il parametro opzionale per pull_up_down GPIO.setup è impostato su GPIO.PUD_UP, la resistenza di pull-up è abilitato; se è impostato su GPIO.PUD_DOWN, la resistenza di pull-down è abilitato). ---------------------------------------- http://razzpisampler.oreilly.com/ch07.html https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/buttons_and_switches/ import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP) Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 18 while True: input_state = GPIO.input(12) if input_state == False: print('Button Pressed') time.sleep(0.2) ------------------------------------------------------------------------chiamata: pi@raspberrypi ~ $ sudo python switch.py INPUT/OUTPUT Es.4 Input button / Output LED - GPIO18 (pin 12) in INPUT, GPIO24 (pin 18) in OUTPUT -------------------------------------------- import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(24,GPIO.OUT) ## Setup GPIO Pin 24 to OUT (GPIO8) GPIO.output(24,0) ## LED off GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP) print('Wait for Button Press') while True: input_state = GPIO.input(18) if input_state == False: GPIO.output(24, 1) ## LED on Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 19 print('Button Pressed') time.sleep(0.5) GPIO.output(24, 0) ## LED off ---------------------------------------------------------------- Prova su basetta Es.5 Input button / Output LED: riflessi pronti con Gpiozero Gpiozero è una libreria Python (“a simple interface to everyday GPIO components used with Raspberry Pi”. ) per la gestione semplificata degli GPIO del Raspberry che contiene codice che va dalla gestione dei led e pulsanti agli oggetti per case intelligenti. In https://gpiozero.readthedocs.io/en/v1.2.0/recipes.html trovate numerosi esempi, tra cui: gestione motori, semafori, robot, e il gioco dei riflessi pronti: https://www.raspberrypi.org/learning/python-quick-reaction-game/worksheet/ : Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 20 from gpiozero import LED, Button ##Gpiozero library from time import sleep from random import uniform led = LED(4) right_button = Button(15) left_button = Button(14) led.on() sleep(uniform(5, 10)) led.off() def pressed(button): print(button.pin.number + ' won the game') right_button.when_pressed = pressed left_button.when_pressed = pressed ---------------------------------------------- Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 21 Es.6 UART Legge 10 characters dalla porta seriale e ne fa l’eco import serial ser = serial.Serial ("/dev/ttyAMA0") #Open named port ser.baudrate = 9600 data = ser.read(10) ser.write(data) #Set baud rate to 9600 #Read ten characters from serial port to data #Send back the received data ser.close() Raspbian shell Es.S1 01_LED_Blink.sh #!/bin/bash # sudo sh LED_Blink.sh # Pin setting: 3=LED(out) echo 3 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio3/direction for i in $(seq 1 10); Do echo 1 > /sys/class/gpio/gpio3/value sleep 1 echo 0 > /sys/class/gpio/gpio3/value sleep 1 echo $i done echo 3 > /sys/class/gpio/unexport Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 22 es.S2 02_PushButton_OnOff.sh (a cura di Serena Arena) #!/bin/bash # sudo sh PushButton_OnOff.sh # Pin setting: 4=PushButton(in) echo 4 > /sys/class/gpio/export echo in > /sys/class/gpio/gpio4/direction for i in $(seq 1 10); Do PB=`cat /sys/class/gpio/gpio4/value` echo $PB sleep 1 done echo 4 > /sys/class/gpio/unexport ----------------------------------------------------------------------- Es.S3 03_LED-PushButton.sh (a cura di Serena Arena) #!/bin/bash # sudo sh PushButton_OnOff.sh # Pin setting: 3=LED(out) 4=PushButton(in) echo 3 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio3/direction echo 4 > /sys/class/gpio/export echo in > /sys/class/gpio/gpio4/direction # Variable settings: DELAY=0.1 DELTAT=50 # PB=0: pulsante premuto; PB=1: pulsante non premuto for i in $(seq 1 $DELTAT); Do PB=`cat /sys/class/gpio/gpio4/value` echo $PB sleep $DELAY Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 23 if [ $PB -eq 0 ] then echo 1 > /sys/class/gpio/gpio3/value else echo 0 > /sys/class/gpio/gpio3/value fi done echo 3 > /sys/class/gpio/unexport echo 4 > /sys/class/gpio/unexport --------------------------- Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 24 IOT-lab Gestione remota del Raspberry (con la collaborazione tecnica del sig. Marco Nascimben, e logistica del sig. Nino Amadore) In un laboratorio didattico è spesso utile, per motivi pratici, gestire remotamente Raspberry. Il sistema permette di gestire, da una postazione remota (in cui risiede lo studente) della stessa rete locale(Laboratorio Sistemi), un controller Raspberry . Il PC dello studente è dotato, ad esempio, di sistema operativo Windows e accede al Raspberry remoto di sua competenza. La figura sottostante mostra lo schema logico della rete. Sulla destra è rappresentato IOT-lab ( l’insieme dei Raspberry rappresentati sottoforma di sistemi intelligenti: Appliance, Door, Monitor,..) che sono collegati allo switch2 che, a sua volta, si collega a switch4 e che, tramite il router R1, accede a Internet e al server remoto (server1). Nell’immagine sottostante è mostrato il tavolo di impiego reale. Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 25 Per operare dalle postazioni remote del laboratorio (ad esempio da Sistemi-PC1) è necessario attuare una serie di passi per la configurazione del sistema complessivo. Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 26 Step 0 - Configurazione di Raspberry (da effettuare una volta per tutte) Step 0.1 - Impostazione IP statico (facoltativo) Può essere comodo configurare raspberry con un indirizzo IP statico (se possiede un indirizzo assegnato da DHCP della rete locale) per poterlo raggiungere più facilmente in occasione dei successivi collegamenti. A questo proposito seguire i passi seguenti: ● Putty (porta 22 SSH) per accesso a raspberry fig. 1 – putty con SSH su porta 22 Raspeberry risponde al prompt: Login pi Password raspberry - abilitare l’interfaccia Ethernet sudo nano /etc/network/interfaces (alla riga 4) auto eth0 (per attivare l’interfaccia eth0) iface eth0 static Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 27 address 192.168.101.x netmask 255.255.255.128 gateway 192.168.101.126 save and exit - cambio nome raspberry sudo nano /etc/hosts .. raspsisx salva sudo nano etc/hostname .. raspsisx (sudo reboot) Step 0.2 - Installazione XRDP-Remote Desktop Protocol su Raspberry ● Aggiornamento delle dipendenze (facoltativo) Accedere con Putty a Raspberry e aggiornare il sistema (consigliato) sudo apt-get update Attendere la fine .entro qualche minuto. ● installazione del desktop remoto xrdp sudo apt-get install xrdp …. Attendere la fine entro qualche minuto Step 1 - Accesso a Raspberry da “Desktop Remoto” di Windows Per accedere da remoto (da un PC con sistema operativo Windows) utilizzare l’applicazione “Desktop Remoto” di Microsoft (fig.2) Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 28 fig 2- l’applicazione Desktop Remoto su sistema operativo Windows Ora si presenta la pagina di Raspberry mostrata in fig.3 ed è possibile lavorare da remoto (come in locale!) Fig 3 controllo del raspberry da remoto Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 29 Server Web Apache è un server web che è possibile installare sul Raspberry Pi . Di per sé, Apache può gestire i file HTML su protocollo HTTP e, con moduli aggiuntivi, può gestire pagine web dinamiche utilizzando linguaggi di scripting come PHP. (SETTING UP AN APACHE WEB SERVER ON A RASPBERRY PI: https://www.raspberrypi.org/documentation/remote-access/web-server/apache.md , https://www.glgprograms.it/?p=tricks/raspberrypi-4 ) In questa sezione forniamo una GUIDA BASE all’Installazione per LAMP – Linux Apache MySQL PHP Guida all’installazione di LAMP (a cura di Marco Nascimben) STEP 1 – PREPARAZIONE Diventiamo amministratori sudo -i Aggiorniamo i repository, in modo da scaricare tutti i pacchetti necessari apt-get update STEP 2 – APACHE, il server web Installiamo Apache, il server web apt-get install apache2 … Una volta terminato il processo di installazione, possiamo provare il nostro web server visitando l'IP della macchina su cui esso gira. Se tutto funziona, visualizzeremo la pagina di default. Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 30 - Gli indirizzi IP sono quelli della macchina su cui è stato installato il server Web Per utilizzare un nostro sito, basta creare la sottocartella html : /var/www/html e creare il nuovo file prova.html ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Nota: I file nella cartella /var/www/html hanno come proprietario l’utente di root. È necessario avere i privilegi di amministratore per poterli creare o modificare. Ricordiamo che al primo accesso al sistema si può effettuare con le credenziali fornite: Utente: pi Password: raspberry L'utente pi è anche sudoers e può diventare amministratore digitando sulla riga di comando semplicemente $ sudo su ( Per Impostare la password di root effettuiamo l'accesso come utente pi, dopodichè digitiamo: $ sudo su # passwd ) Oppure come in Paolo Macchi - Serena Arena figura sottostante con il comando sudo chmod -R 777 /var/www RASPiTHON – rel. 17.01.07 31 ---------------------------------------------------------------------------------------------------------------------------------------- Chiamiamo ora il server web: ……………………………………………………………………………………... STEP 3 – PHP, il linguaggio di scripting Ora installiamo PHP (con le credenziali di root!), con il seguente comando apt-get install php5 libapache2-mod-php5 Per sicurezza, riavviamo il servizio di Apache, in modo da caricare il modulo di PHP service apache2 restart ----------------------------------------------------------------------Attenzione: per rendere effettiva ogni modifica ai file di configurazione di Apache e PHP, è indispensabile riavviare il webserver (o, al limite, ricaricare la sua configurazione), attraverso uno dei seguenti comandi # service apache2 restart # riavvia il webserver # service apache2 reload # ricarica la configurazione # service apache2 stop # spegne il webserver # service apache2 start # avvia il webserver oppure riavviando completamente il Raspberry Pi. ---------------------------------------------------------------------------------------------------------------------------Possiamo ora testare se l'installazione è avvenuta con successo. Creiamo in /var/www/html un file PHP e verifichiamo che il browser visualizzi correttamente la sua elaborazione. Nota: Apache come usa prima pagina principale index.html. Se non esiste usa index.php. Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 32 Se hai creato una pagina con nome index.php, ricorda di rimuovere o rinominare index.html STEP 4 – MySQL, il database E per finire, installiamo MySQL, uno dei principali database in circolazione. apt-get install mysql-server php5-mysql Durante l'installazione verrà richiesta una password da assegnare all'account root del database, che permette l'accesso al database. In un ambiente di prova può essere lasciata vuota, ma se un giorno dovessimo pubblicare il nostro server sul web, è importante che essa sia complicata. Anche dopo il termine di questa installazione, riavviamo Apache in modo da caricare i moduli necessari. service apache2 restart Per prova, possiamo dare il comando mysql E verificare che ci venga aperta la console dei comandi di MySQL. STEP OPZIONALE – PHPMYADMIN, il gestore di database Per semplificarsi la vita con la gestione del database, è una scelta molto diffusa quella di installare assieme a MySQL un’applicazione web, phpMyAdmin che consente di amministrare il database tramite browser anziché tramite riga di comando. Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 33 Installiamolo usando apt-get install phpmyadmin Nelle schermate successive, ci verrà chiesto: ● ● ● ● Il server web da configurare, nel nostro caso “apache2” Se avviare la configurazione automatica o manuale. In caso mysql sia appena stato installato, è meglio usare quella automatica, altrimenti se esiste già un database, è necessaria la configurazione manuale. La password di MySQL, in modo da potervi accedere La password per accedere alla configurazione di phpMyAdmin Nota: è consigliato non lasciare questo campo vuoto. Genererebbe una password casuale. Ora basterà andare su <IP>/phpmyadmin per poter eseguire il login e gestire il database da browser. Nota: in caso in MySQL la password sia vuota, phpMyAdmin impedisce il login, per motivi di sicurezza. Per permettere ciò, bisogna modificare il file /etc/phpmyadmin/config.inc.php e togliere il commento dalla riga $cfg['Servers'][$i]['AllowNoPassword'] = TRUE; Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 34 FTP E’ possibile accedere a Raspberry remoto anche tramite FTP La gestione via FTP si ottiene ad esempio con Filezilla Paolo Macchi - Serena Arena RASPiTHON – rel. 17.01.07 35