Computació física amb Python y Raspberry Pi¶

Efectors¶
Un LED¶

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¶

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.

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¶

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¶

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¶

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