Computació física amb Python y Raspberry Pi

_images/Raspberry-Pi-2-Model-B-GPIO-Layout.png

Efectors

Un LED

_images/LED.png
 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM)    # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7LED = 12                  # Establim el nombre del pin GPIO per a cada component
 8
 9GPIO.setup(LED, GPIO.OUT) # Establim els pins GPIO com a entrades o sortides
10
11for i in range(10):
12    GPIO.output(LED, GPIO.HIGH) 
13    time.sleep(0.5)
14    GPIO.output(LED, GPIO.LOW)
15    time.sleep(0.5)
16
17GPIO.cleanup()
  • Roig = 12

  • Grog = 17

  • verd = 4

Un LED RGB

_images/LED_RGB.png
 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM) # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7LED_ROIG = 23           # Establim el nombre del pin GPIO per a cada component
 8LED_VERD = 22
 9LED_BLAU = 27
10
11GPIO.setup(LED_ROIG, GPIO.OUT) # Establim els pins GPIO com a entrades o sortides
12GPIO.setup(LED_VERD, GPIO.OUT)
13GPIO.setup(LED_BLAU, GPIO.OUT)
14
15for i in range(3):
16    print('Roig')
17    GPIO.output(LED_ROIG, GPIO.HIGH) 
18    time.sleep(1)
19    GPIO.output(LED_ROIG, GPIO.LOW)
20    print('Verd')
21    GPIO.output(LED_VERD, GPIO.HIGH) 
22    time.sleep(1)
23    GPIO.output(LED_VERD, GPIO.LOW)
24    print('Blau')
25    GPIO.output(LED_BLAU, GPIO.HIGH) 
26    time.sleep(1)
27    GPIO.output(LED_BLAU, GPIO.LOW)
28
29GPIO.cleanup()

Modulació per amplada de polsos (PWM)

La modulació per amplada de polsos consisteix en modificar el cicle de treball d’una senyal periòdica. En resum, el que farem serà definir la durada del cicle (generalment serà d’una fracció de segon) i el cicle de treball (Duty cycle) que és el percentatge de temps que la senyal està activa.

_images/PWM_duty_cycle_with_label.gif

En aquest exemple el LED s’encén durant un percentatge cada vegada major del cicle.

 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM)             # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7LED_BLAU = 27                      # Establim el nombre del pin GPIO per a cada component
 8
 9GPIO.setup(LED_BLAU,GPIO.OUT)      # Establim els pins GPIO com a entrades o sortides
10PWM_BLAU = GPIO.PWM(LED_BLAU,50)   # Establim la durada del cicle 1/50 s
11
12PWM_BLAU.start(10)                 # Establim un cicle de treball inicial del 10%
13
14time.sleep(1)
15PWM_BLAU.ChangeDutyCycle(25)       # Canviem el cicle de treball (Duty cycle) o temps que la senyal està activada.
16time.sleep(1)
17PWM_BLAU.ChangeDutyCycle(50)
18time.sleep(1)
19PWM_BLAU.ChangeDutyCycle(75)
20time.sleep(1)
21PWM_BLAU.ChangeDutyCycle(100)
22time.sleep(1)
23PWM_BLAU.ChangeDutyCycle(0)
24time.sleep(1)
25
26GPIO.cleanup()

En aquest exemple canviem el cicle de treball progressivament, de manera que el LED s’encén i s’apaga gradualment.

 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM)             # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7LED_BLAU = 27                      # Establim el nombre del pin GPIO per a cada component
 8
 9GPIO.setup(LED_BLAU,GPIO.OUT)      # Establim els pins GPIO com a entrades o sortides
10PWM_BLAU = GPIO.PWM(LED_BLAU,50)   # Establim la durada del cicle 1/50 s
11
12PWM_BLAU.start(0)                  # Establim un cicle de treball inicial del 0%
13
14
15for t in range(101):
16    time.sleep(0.01)
17    PWM_BLAU.ChangeDutyCycle(t)
18
19time.sleep(1)
20
21for t in range(101):
22    time.sleep(0.01)
23    PWM_BLAU.ChangeDutyCycle(100-t)
24
25GPIO.cleanup()

En aquest exemple establim diferents cicles de treball per als diferents colors del LED RGB per tal d’aconseguir diferents colors.

 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM)             # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7LED_BLAU = 27                      # Establim el nombre del pin GPIO per a cada component
 8LED_ROIG = 23
 9LED_VERD = 22
10
11GPIO.setup(LED_BLAU,GPIO.OUT)      # Establim els pins GPIO com a entrades o sortides
12GPIO.setup(LED_ROIG,GPIO.OUT)
13GPIO.setup(LED_VERD,GPIO.OUT)
14
15PWM_BLAU = GPIO.PWM(LED_BLAU,50)   # Establim la durada del cicle 1/50 s
16PWM_ROIG = GPIO.PWM(LED_ROIG,50)
17PWM_VERD = GPIO.PWM(LED_VERD,50)
18
19PWM_BLAU.start(0)                  # Establim un cicle de treball inicial del 0%
20PWM_ROIG.start(0)
21PWM_VERD.start(0)
22
23PWM_BLAU.ChangeDutyCycle(40)
24PWM_ROIG.ChangeDutyCycle(20)
25PWM_VERD.ChangeDutyCycle(0)
26time.sleep(5)
27
28
29GPIO.cleanup()

Un servomotor

_images/servomotor.png
 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM)          # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7GPIO_SERVO = 14                 # Establim el nombre del pin GPIO per a cada component
 8
 9GPIO.setup(GPIO_SERVO,GPIO.OUT) # Establim els pins GPIO com a entrades o sortides
10SERVO = GPIO.PWM(GPIO_SERVO,50) # Durada del cicle 1/50s
11
12SERVO.start(7.5)                # Establim una durada inicial del cicle de 7,5% de 1/50s = 1,5ms
13
14for i in range(3):
15        SERVO.ChangeDutyCycle(5)    # 5% de 1/50s = 1ms
16        time.sleep(1)
17        SERVO.ChangeDutyCycle(7.5)  # 7,5% de 1/50s = 1,5ms
18        time.sleep(1)
19        SERVO.ChangeDutyCycle(12.5) #12,5% de 1/50s = 2,5ms
20        time.sleep(1)
21
22posicio = 7
23while posicio > 0 and posicio < 15:
24    SERVO.ChangeDutyCycle(posicio)
25    posicio = float(input('Introdueix la nova posició del servomotor [0-16]: '))
26
27SERVO.ChangeDutyCycle(7)
28GPIO.cleanup()

Sensors

Polsador

_images/polsador.png
 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5GPIO.setmode(GPIO.BCM)        # Utilitzarem la numeració de "Broadcom SOC channel".
 6
 7polsador = 24                 # Establim el nombre del pin GPIO per a cada component
 8
 9GPIO.setup(polsador, GPIO.IN) # Establim els pins GPIO com a entrades o sortides
10
11while True:
12    if GPIO.input(polsador):
13        print('Has premut el polsador!')
14        time.sleep(0.5)
15
16GPIO.cleanup()

Sensor ultrasònic HC-SR04

_images/HC-SR04.png
 1#!/usr/bin/python3
 2import RPi.GPIO as GPIO
 3import time
 4
 5def getDistance(trigger, echo):
 6    GPIO.output(trigger,True)       #Enviem un pols d'ultrasons
 7    time.sleep(0.00001)             #Pausa per donar certa durada al pols
 8    GPIO.output(trigger,False)      #Apaguem el pols
 9                                    #A continuació el sensor ficarà ECHO en high durant
10                                    #un temps igual al que tarda el pols en anar i tornar.
11    while GPIO.input(echo)==0:      #
12        start = time.time()         #start emmagatzemarà l'ultim moment en el que ECHO estaba en low
13    while GPIO.input(echo)==1:      #
14        stop = time.time()          #stop emmagatzemarà l'ultim moment en el que ECHO estaba en high
15    elapsed = stop-start            #Obtenim el temps transcorregut
16    distance = (elapsed * 34300)/2  #Distància es igual a temps per velocitat partit dos D = (T x V)/2
17    return int(distance)            #Retornem la velocitat (en centimetres)
18
19
20GPIO.setmode(GPIO.BCM)              # Utilitzarem la numeració de "Broadcom SOC channel".
21
22TRIGGER = 21                        #Utilitzem el pin GPIO 21 com TRIGGER
23ECHO    = 20                        #Utilitzem el pin GPIO 20 com ECHO
24
25GPIO.setup(TRIGGER,GPIO.OUT)        #Configurem Trigger com a sortida
26GPIO.setup(ECHO,GPIO.IN)            #Configurem ECHO com a entrada
27GPIO.output(TRIGGER,False)          #Establim el pin TRIGGER a LOW
28
29
30print('Go!')
31for i in range(20):
32    print(getDistance(TRIGGER, ECHO))
33    time.sleep(1)
34
35distancia = getDistance(TRIGGER, ECHO)
36
37GPIO.cleanup()