Interfaccia optoisolata: accensione - Raspberry PI

circuito test interfacciaE dopo aver realizzato l'interfaccia, è giunto il momento di testarne il funzionamento; quantomeno che non bruci il Raspberry durante il funzionamento. L'apparato di misura è molto semplice: una delle uscite dell'interfaccia è riportata su una breadboard e fa da interruttore elettronico ad una serie led - resistenza di limitazione. Il tutto è sottoposto a 12V provenienti da un alimentatore stabilizzato (nella foto quello con il led blu accecante). Inoltre, ai capi della resistenza sono connessi i puntali della sonda dell'oscilloscopio, che permetterà di  avere una chiara idea del segnale, più o meno sporco, più o meno corretto, che pilota il circuito. vista interfaccia in misuraSistemato il lato hardware non resta che preparare uno programmino di test, in python: ho scelto un semplice ciclo che generi un'onda quadra di 100Hz (non c'è nessun motivo tecnico o trascendentale per cui ho scelto tale valore) ai morsetti dell'OUT1. In pratica si attiva a livello alto l'OUT, si attendono 0.005s (è quindi necessario importare anche il modulo time per avere il comando di pausa) terminati i quali si porta l'uscita a livello basso. Il tutto ripetuto all'infinito con un while. Il programa risultante (in cui ho voluto inizializzare comunque tutti gli altri ingressi e uscite, anche se non necessario) è:

import time
import RPi.GPIO as GPIO

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

#impostazione funzioni pin: Input o Output;
#19,21,24,26 sono i pin dedicabili anche a SPI
GPIO.setup(7, GPIO.OUT)     #OUT 1 = GPIO 4
GPIO.setup(11, GPIO.OUT)    #OUT 2 = GPIO 17
GPIO.setup(13, GPIO.OUT)    #OUT 3 = GPIO 21
GPIO.setup(15, GPIO.OUT)    #OUT 4 = GPIO 22
GPIO.setup(19, GPIO.OUT)    #OUT 5 = GPIO 10
GPIO.setup(21, GPIO.OUT)    #OUT 6 = GPIO 9
GPIO.setup(12, GPIO.IN)     #IN 1 = GPIO 18
GPIO.setup(16, GPIO.IN)     #IN 2 = GPIO 23
GPIO.setup(18, GPIO.IN)     #IN 3 = GPIO 24
GPIO.setup(22, GPIO.IN)     #IN 4 = GPIO 25
GPIO.setup(24, GPIO.IN)     #IN 5 = GPIO 8
GPIO.setup(26, GPIO.IN)     #IN 6 = GPIO 7

#abilitazione delle resistenze di pull-up interne sugli Input
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while 1:
GPIO.output(7, True)
time.sleep(0.005)
GPIO.output(7, False)
time.sleep (0.005)

Il led verde rettangolare rende la misura molto vintage e soprattutto indica il corretto funzionamento dell'interfaccia. L'oscillogramma risultante pone invece qoscillogramma interfacciaualche quesito: il segnale in uscita dovrebbe infatti essere un'onda quadra (0.005 a livello alto e 0.005 a livello basso), mentre sullo schermo dell'oscilloscopio continua a variare leggermente in frequenza. A mio modesto parere tale problema non è dovuto ai fotoaccoppiatori 4N25 (che con tempi di discesa e di salita di circa 25μs dovrebbero garantire corretto funzionamento fino a qualche decina di kHz) quanto piuttosto al Raspberry stesso: in particolare penso che il normale funzionamento del sistema operativo (ancora piuttosto lento, nonostante l'abbia portato ad un livello di overclock medio) faccia saltare o rallenti , di tanto in tanto, l'esecuzione del loop. Non proprio il massimo se volessi generare un segnale stabile o leggere un dato variabile in input, tanoto più a frequenze così basse...

led pilotato da interfaccia

Il led lampeggiante durante l'esecuzione del test. Molto anni '80

  • mauro

    complimenti per il tuo bel lavoro
    volevo chiedere se questo sistema sarebbe indicato in un impianto luci comandato da normale interruttore e da raspberry,
    nel caso di mancanza dell energia elettrica le luci si spegneranno
    ma al ritorno di essa il raspberry con il fotoaccopiatore riuscirebbe a restituirmi lo stato corretto degli interruttori (se sono on o off)

    grazie mille

    • secondo me basterebbe modificare il programma in modo che il raspberry salvi in un file lo stato delle luci ed in caso di stacco della tensione, al riavvio del raspberry, il file venga letto e le luci impostate di conseguenza. Se l'impianto è domestico gli optoisolatori dovrebbero però essere collegati a relè e non direttamente alle luci