Lo standard RS232, ovvero la comunissima “porta seriale”, prevede alcuni pin per il controllo della comunicazione. Infatti, oltre alle linee dati TxD (trasmissione) e RxD (ricezione), sono presenti diversi pin che possono essere utilizzati per il controllo della comunicazione stessa: DCD, DTR, RTS, CTS e RI.
Guardando la porta seriale dal lato computer, i pin di controllo che hanno direzione di uscita (output) sono RTS (Request To Send) e DTR (Data Terminal Ready), ed entrambi possono essere utilizzati per il nostro scopo.
Signal Pin Pin Direction Full
Name (25) (9) (computer) Name
----- --- --- --------- -----
FG 1 - - Frame Ground
TxD 2 3 out Transmit Data
RxD 3 2 in Receive Data
RTS 4 7 out Request To Send
CTS 5 8 in Clear To Send
DSR 6 6 in Data Set Ready
GND 7 5 - Signal Ground
DCD 8 1 in Data Carrier Detect
DTR 20 4 out Data Terminal Ready
RI 22 9 in Ring Indicator
I livelli logici 1 (high/acceso) e 0 (low/spento) in una porta seriale “vera”, ovvero quella che presenta un connettore a vaschetta “DB9”, corrispondono a livelli di tensione elettrica che vanno da +3V a +15V per il livello logico “1” e da -15V a -3V per il livello logico “0”. I valori di tensione compresi tra -3V e +3V non sono accettati.
Utilizzare queste tensioni risulta scomodo, ma esistono circuiti integrati, come il MAX232, che ci permetto di utilizzare valori TTL (0/5V) o CMOS (0/3.3V) molto più gestibili.
Nei moderni computer sprovvisti di porta seriale possiamo usare un’interfaccia USB/TTL-232 come questa che lavora già a livelli di tensione TTL, e quindi non abbiamo bisogno dell’integrato di cui sopra.
Attenzione: non tutti i modelli espongono i pin di controllo (DTR/RTS) sul connettore, quindi, se ne state acquistando una per questo scopo specifico, assicuratevi che siano presenti. Alcune, infatti, terminano sul connettore solamente i pin Vcc, GND, Tx ed Rx.
Se avete già in casa una di queste interfacce e, come nel mio caso, nessuno dei due pin è presente sul connettore, provate a cercare il datasheet del circuito integrato utilizzato sulla pennetta. Quella che ho utilizzato io monta un driver “PL2303” che ha la linea RTS sul pin 3 e la linea DTR sul pin 2. Una volta individuato il giusto pin dell’integrato basta saldarci un piccolo filo elettrico.
Tutte le linee di output presenti sulla nostra interfaccia, essendo progettate per erogare piccolissime correnti necessarie solamente alla comunicazione digitale, non possono essere utilizzate per alimentare direttamente la bobina di un relè. Ad esempio, anche se la tensione del pin RTS settato allo stato logico “1” equivale a 5V, non possiamo connetterlo direttamente ad un relè da 5V poiché la corrente che circola nella bobina e nell’integrato rischierebbe di danneggiare l’integrato stesso.
Per questo motivo l’uscita dei pin digitali va collegata alla “base” di un transistor BJT che funge da interruttore in serie al relè.
Questo l’esempio di uno schema utilizzabile a tale scopo, provvisto anche di diodo di protezione e resistenza di “pull-down” per scongiurare stati logici “aleatori”:
Se non volete costruire questo piccolo circuito è possibile acquistarne di già fatti, ad esempio: https://amzn.to/2QDpRQF o https://amzn.to/2QycYHM.
Questo il codice C per settare il livello logico “1” (SET) sul pin RTS:
#include
#include <sys/ioctl.h>
#define PORT "/dev/ttyUSB0"
main() {
int fd;
fd = open(PORT, O_RDWR | O_NOCTTY);
ioctl(fd, TIOCMBIS, TIOCM_RTS);
close(fd);
}
e questo per settare il livello logico “0” (CLEAR) sul pin RTS:
#include
#include <sys/ioctl.h>
#define PORT "/dev/ttyUSB0"
main() {
int fd;
fd = open(PORT, O_RDWR | O_NOCTTY);
ioctl(fd, TIOCMBIC, TIOCM_RTS);
close(fd);
}
Per usare la linea DTR al posto di RTS bisogna cambiare TIOCM_RTS con TIOCM_DTR.
Compiliamo il codice con “gcc” ed eseguiamolo:
gcc set-rts.c -o set-rts
oppure eseguiamolo direttamente con “tcc”:
tcc -run set-rts.c
Questa è la mia vecchia interfaccia USB/TTL232 che ho utilizzato per pilotare il relè:
Fonte: https://blog.pasqualefiorillo.it/drive-a-relay-with-an-usb-to-uart-interface/
Pasquale ‘sid’ Fiorillo – CC-BY-SA