- Comunicazione seriale RS-485
- Componenti richiesti
- Schema elettrico
- Programmazione STM32F103C8 e Arduino UNO per comunicazione seriale RS485
- Testare la comunicazione RS485 tra STM32F103C8 e Arduino UNO:
I protocolli di comunicazione sono parte integrante di un'elettronica digitale e di un sistema embedded. Ovunque ci sia l'interfacciamento di più microcontrollori e periferiche, il protocollo di comunicazione deve essere utilizzato per scambiare una serie di dati. Sono disponibili molti tipi di protocollo di comunicazione seriale. L'RS485 è uno dei protocolli di comunicazione seriale ed è utilizzato in progetti industriali e macchinari pesanti.
Abbiamo appreso della comunicazione seriale RS485 tra Arduino Uno e Arduino Nano nel tutorial precedente . Questo tutorial riguarda l'utilizzo di una comunicazione seriale RS-485 nel microcontrollore STM32F103C8. Se non conosci il microcontrollore STM32, inizia con Introduzione a STM32 utilizzando l'IDE di Arduino: LED lampeggiante e controlla tutti i progetti STM32 qui.
In questo tutorial Master STM32F103C8 ha tre pulsanti che vengono utilizzati per controllare lo stato di tre LED presenti sullo Slave Arduino Uno utilizzando la comunicazione seriale RS-485.
Cominciamo con la comprensione del funzionamento della comunicazione seriale RS-485.
Comunicazione seriale RS-485
RS-485 è un protocollo di comunicazione seriale asincrono che non richiede clock. Utilizza una tecnica chiamata segnale differenziale per trasferire dati binari da un dispositivo a un altro.
Allora, qual è questo metodo di trasferimento del segnale differenziale?
Il metodo del segnale differenziale funziona creando una tensione differenziale utilizzando 5V positivo e negativo. Fornisce una comunicazione Half-Duplex quando si utilizzano due fili e una comunicazione Full-Duplex quando si utilizzano quattro fili.
Utilizzando questo metodo:
- RS-485 supporta una velocità di trasferimento dati maggiore di 30 Mbps massimo.
- Fornisce inoltre la massima distanza di trasferimento dati rispetto al protocollo RS-232. Trasferisce dati fino a un massimo di 1200 metri.
- Il vantaggio principale di RS-485 rispetto a RS-232 è lo slave multiplo con singolo master mentre RS-232 supporta solo uno slave singolo.
- Può avere un massimo di 32 dispositivi collegati al protocollo RS-485.
- Un altro vantaggio dell'RS-485 è immune al rumore poiché utilizzano il metodo del segnale differenziale per il trasferimento.
- RS-485 è più veloce rispetto al protocollo I2C.
Il modulo RS-485 può essere collegato a qualsiasi microcontrollore dotato di porta seriale. Per l'utilizzo del modulo RS-485 con microcontrollori è necessario un modulo chiamato 5V MAX485 TTL a RS485 basato su Maxim MAX485 IC in quanto consente la comunicazione seriale su una lunga distanza di 1200 metri ed è bidirezionale e half duplex ha una velocità di trasferimento dati di 2,5 Mbps. Questo modulo richiede una tensione di 5V.
Descrizione pin RS-485:
Nome pin |
Descrizione |
VCC |
5V |
UN |
Ingresso ricevitore non invertente Uscita driver non invertente |
B |
Inversione dell'ingresso del ricevitore Inversione dell'uscita del driver |
GND |
GND (0V) |
R0 |
Uscita ricevitore (pin RX) |
RI |
Uscita ricevitore (LOW-Enable) |
DE |
Uscita driver (HIGH-Enable) |
DI |
Ingresso driver (pin TX) |
Il modulo RS485 ha le seguenti caratteristiche:
- Tensione di esercizio: 5 V.
- Chip MAX485 a bordo
- Un basso consumo energetico per la comunicazione RS485
- Ricetrasmettitore con velocità di risposta limitata
- Terminale 2P passo 5,08 mm
- Comodo cablaggio di comunicazione RS-485
- Tutti i pin del chip a cui sono stati collegati possono essere controllati tramite il microcontrollore
- Dimensioni scheda: 44 x 14 mm
Usare questo modulo con STM32F103C8 e Arduino UNO è molto semplice. Vengono utilizzate le porte seriali hardware dei microcontrollori. Di seguito sono riportati i pin seriali hardware in STM32 e arduino UNO.
- In STM32F103C8: pin PA9 (TX) e PA10 (RX)
- In Arduino Uno: Pin 0 (RX) e 1 (TX)
La programmazione è anche semplice basta usare il Serial.print () per scrivere a RS-485 e Serial.Read () per leggere da RS-485 e le spine DE & RE di RS-485 è fatto LOW per ricevere dati e fatti HIGH scrivere i dati sul bus RS-485.
Componenti richiesti
- STM32F103C8
- Arduino UNO
- Modulo convertitore MAX485 TTL a RS485 - (2)
- Potenziometro 10K
- Pulsante - 3
- LED - 3
- Resistenze
- Breadboard
- Collegamento dei cavi
Schema elettrico
In questo tutorial STM32F103C8 viene utilizzato come Master con un modulo RS-485 e Arduino UNO viene utilizzato come Slave con un altro modulo RS-485.
Collegamento del circuito tra RS-485 e STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RI |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
UN |
Ad A di Slave RS-485 |
B |
A B dello Slave RS-485 |
STM32F103C8 con tre pulsanti:
Tre pulsanti con tre resistori di pull down da 10k sono collegati ai pin PA0, PA1, PA2 di STM32F103C8.
Collegamento del circuito tra RS-485 e Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RI |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
UN |
Ad A del Master RS-485 |
B |
A B del Master RS-485 |
Vengono utilizzati tre LED dove gli anodi dei LED con resistenza da 330 ohm sono collegati ai pin 4, 7, 8 di Arduino UNO e il catodo dei LED sono collegati a GND.
Programmazione STM32F103C8 e Arduino UNO per comunicazione seriale RS485
Arduino IDE viene utilizzato per lo sviluppo e la programmazione di entrambe le schede, ovvero STM32 e Arduino UNO. Ma assicurati di aver selezionato la PORTA corrispondente da Strumenti-> Porta e scheda da Strumenti-> Scheda. In caso di difficoltà o dubbi, fare riferimento alla programmazione del proprio STM32 in ARDUINO IDE. La programmazione per questo tutorial è composta da due sezioni, una per STM32F103C8 (Master) e l'altra per Arduino UNO (Slave). Entrambi i codici verranno spiegati uno per uno di seguito.
STM32F103C8 come MasterSul lato Master, lo stato del pulsante viene letto e quindi scritto in serie quei valori sul bus RS-485 attraverso le porte seriali hardware 1 (PA9, PA10) di STM32F103C8. Inoltre, al momento non è necessaria alcuna libreria esterna. L'Arduino ha tutta la libreria necessaria per la comunicazione seriale.
Inizia la comunicazione seriale utilizzando i pin seriali hardware (PA9, PA10) a buadrate di 9600.
Serial1.begin (9600);
Leggere lo stato del pulsante ai pin PA0, PA1, PA2 di STM32F103C8 e memorizzarli in una variabile button1val, button2val, button3val. Il valore è ALTO se il pulsante viene premuto e BASSO quando non viene premuto.
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
Prima di inviare i valori dei pulsanti alla porta seriale, i pin DE e RE di RS-485 dovrebbero essere ALTI che è collegato al pin PA3 di STM32F103C8 (Per rendere il pin PA3 ALTO):
digitalWrite (enablePin, HIGH);
Avanti per inserire quei valori nella porta seriale e inviare valori a seconda del pulsante premuto, utilizzare l'istruzione if else e inviare il valore corrispondente quando viene premuto il pulsante.
Se viene premuto il primo pulsante, la condizione corrisponde e il valore "1" viene inviato alla porta seriale a cui è collegato Arduino UNO.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
Allo stesso modo, quando si preme il pulsante 2 il valore 2 viene inviato sulla porta seriale e quando si preme il pulsante 3 il valore 3 viene inviato sulla porta seriale.
altrimenti if (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
E quando non viene premuto alcun pulsante il valore 0 viene inviato ad Arduino Uno.
altro { int num = 0; Serial1.println (num); }
Questo termina la programmazione per configurare STM32 come Master.
Arduino UNO come SlaveSul lato Slave Arduino UNO riceve un valore intero che viene inviato dal Master STM32F103C8 che è disponibile alla porta Seriale Hardware di Arduino UNO (P0, 1) dove è collegato il modulo RS-485.
Basta leggere il valore e memorizzare in una variabile. A seconda del valore ricevuto il LED corrispondente viene acceso o spento collegato ad Arduino GPIO.
Per ricevere i valori dal Master è sufficiente portare i pin DE & RE del modulo RS-485 in BASSO. Quindi il pin-2 (enablePin) di Arduino UNO è impostato su LOW.
digitalWrite (enablePin, LOW);
Ora basta leggere i dati interi disponibili su Serial Port e memorizzarli in una variabile.
int ricevere = Serial.parseInt ();
A seconda del valore cioè (0, 1, 2, 3) ricevuto, quello corrispondente dei tre LED si accende.
if (receive == 1) // A seconda del valore ricevuto, il LED corrispondente viene acceso o spento { digitalWrite (ledpin1, HIGH); } altrimenti se (ricevi == 2) { digitalWrite (ledpin2, HIGH); } else if (ricevi == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Questo termina la programmazione e la configurazione di Arduino UNO come Slave. Anche questo termina le configurazioni complete per Arduino UNO e STM32. Il video di lavoro e tutti i codici sono allegati alla fine di questo tutorial.
Testare la comunicazione RS485 tra STM32F103C8 e Arduino UNO:
1. Quando Push button-1, che è collegato al Master STM32, viene premuto il LED 1 si accende collegato allo Slave Arduino.
2. Quando viene premuto il pulsante-2, collegato al Master STM32, il LED 2 si accende collegato allo Slave Arduino.
3. Allo stesso modo, quando viene premuto il pulsante 3, il LED 3 si accende collegato allo slave Arduino.
Questo termina la comunicazione seriale RS485 tra STM32F103C8 e Arduino UNO. Le schede Arduino UNO e STM32 sono schede ampiamente utilizzate per la prototipazione rapida e abbiamo realizzato molti progetti utili su queste schede. Se trovi qualche dubbio o hai qualche suggerimento per noi, scrivi e commenta di seguito.