Come usare interrupt Pull Up e Pull Down con Python Raspberry Pi

Premessa:

Chiunque si è imbattuto nel realizzare software ha avuto modo  di affrontare delle particolari resistenze denominate PULL UP e PULL DOWN. In questo articolo vedremo come e dove impiegare queste resistenze e perchè hanno un ruolo fondamentale in elettronica ma soprattutto nella gestione degli interrupts. Realizzeremo un piccolo progetto in python e vedremo come pilotare dei pulsanti digitali.

LISTA DEI MATERIALI:

Cosa sono gli interrupts:

Gli interrupts sono degli eventi che vengono eseguiti con massima priorità interrompendo tutta l’esecuzione del processo main loop quindi del ciclo principale (esempio While True:) ed eseguendo esclusivamente la funzione assegnata all’evento legato.

Cosa sono le resistenze di Pull Up e Pull Down:

I resistori Pull Up e Pull Down servono nei collegamenti di circuiti logici per fornire una tensione di riferimento quando si devono confrontare differenti livelli di tensione in ingresso. Di solito è sufficiente un valore resistivo di 10 kohm per fare in modo che il resistore “tiri” la tensione verso il polo positivo (PULL UP) o verso il polo negativo (PULL DOWN). Se l’ingresso logico su cui si opera la lettura della tensione in ingresso non ha un livello di riferimento, l’ingresso potrebbe rilevare che il pulsante è stato premuto ma anche il contrario, dando risultati imprevedibili o addirittura dannosi per il circuito stesso. In realtà, il Raspberry Pi è dotato di pull-up e pull-down resistenze attivabili via software. Ciò significa che possiamo eliminare i nostri resistori PULL “fisici” per i pulsanti nella figura sotto riportata.

Schema Hardware:

comeusareinterruptpulluppulldownpythonraspberrypiSotware:

#!/usr/bin/env python2.7  

import RPi.GPIO as GPIO  
GPIO.setmode(GPIO.BCM)  
  
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)  
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)  
  
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  
  

def my_callback(channel):  
    print "falling edge detected on 17"  
  
def my_callback2(channel):  
    print "falling edge detected on 23"  
  
print "Make sure you have a button connected so that when pressed"  
print "it will connect GPIO port 23 (pin 16) to GND (pin 6)\n"  
print "You will also need a second button connected so that when pressed"  
print "it will connect GPIO port 24 (pin 18) to 3V3 (pin 1)\n"  
print "You will also need a third button connected so that when pressed"  
print "it will connect GPIO port 17 (pin 11) to GND (pin 14)"  
raw_input("Press Enter when ready\n>")  
  
GPIO.add_event_detect(17, GPIO.FALLING, callback=my_callback, bouncetime=300)  
  
# when a falling edge is detected on port 23, regardless of whatever   
# else is happening in the program, the function my_callback2 will be run  
# 'bouncetime=300' includes the bounce control written into interrupts2a.py  
GPIO.add_event_detect(23, GPIO.FALLING, callback=my_callback2, bouncetime=300)  
  
try:  
    print "Waiting for rising edge on port 24"  
    GPIO.wait_for_edge(24, GPIO.RISING)  
    print "Rising edge detected on port 24. Here endeth the third lesson."  
  
except KeyboardInterrupt:  
    GPIO.cleanup()   
GPIO.cleanup()           

Riepilogo:

GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

setta il pulsante in Pull Up

def my_callback2(channel):
print "falling edge detected on 23"

funzione richiamata ad interrupt rilevato

GPIO.add_event_detect(23, GPIO.FALLING, callback=my_callback2, bouncetime=300)

chiamata all’interrupt

bouncetime definisce il delaytime per rilevare con più precisione la pressione del pulsante

GPIO.wait_for_edge(24, GPIO.RISING)

altro tipo di funzione interrupt che attende la pressione del pulsante collegato al pin 24 del Pi

Buon progetto.