UART

UART

In questa pagina è analizzato il segnale seriale asincrono, utile per trasmettere dati tra dispositivi con modesta potenza di calcolo.

Come piattaforma di sviluppo potrà essere usato Arduino UNO oppure ESP8266 oppure ESP32.

Segnale seriale asincrono con UART

Arduino dispone al proprio interno di un modulo UART (Universal Asynchronous Receiver Transmitter) cioè un dispositivo hardware che trasmette e riceve segnali seriali asincroni con codifica NRZ. Tale modulo è permanentemente connesso all'interfaccia USB del PC attraverso l'integrato FT232 (oppure CH340) e quindi non è pienamente utilizzabile.

Il diagramma temporale di un segnale seriale asincrono è costituito da:

Tutti i bit hanno la stessa durata. Qui una trattazione estesa, anche se datata.

Questo segnale è disponibile sul pin TX (trasmissione da Arduino a PC, attraverso il convertitore seriale/USB) e sul pin RX (trasmissione da PC ad Arduino, sempre attraverso il convertitore seriale/USB).

L'esempio seguente è relativo ad un segnale a 9 600 bit/s (9 600 baud) trasmesso da Arduino; ciascun bit ha durata 104 µs (1/9 600). Il byte trasmesso è 0xAF (1010 1111) a partire dal bit meno significativo (LSB), cioè "al contrario":

0xAF

Questo segnale è generato dal seguente codice:

void setup()
{ Serial.begin(9600);
}

void loop()
{ Serial.write(0xAF);
  delay(4);
}

Attività 1

Decodifica 0xAF

SoftwareSerial Library

Se si desidera utilizzare più di un'interfaccia seriale è possibile usare la libreria SoftwareSerial che permette la trasmissione e la ricezione di segnali seriali asincroni senza usare hardware dedicato. Questa libreria ha diversi limiti (solo half-duplex, velocità ridotta, uso pesante della CPU, interrupt disattivate...), ma è una buona risorsa se si vuole usare un'interfaccia seriale per ricevere da dispositivi diversi dal PC oppure serve una seconda interfaccia seriale.

La figura di apertura mostra i segnali relativi a due interfacce seriali gestiti contemporaneamente da Arduino:

Attività 2

Utilizzare la libreria SoftwareSerial In un programma simile a quello già scritto per la versione hardware. Il pin di trasmissione deve essere scelto tra quelli liberi con SoftwareSerial mySerial(rxPin, txPin).

#include <SoftwareSerial.h>

const byte rxPin = 4;
const byte txPin = 5;
SoftwareSerial mySerial(rxPin, txPin);

void setup() {
  mySerial.begin(9600);
  }

void loop() {
  mySerial.write(0xAF);
  delay(4);
}

Attenzione alla numerazione dei pin usati da alcune schede diverse da Arduino UNO. Per esempio molto diffusa è la D1 Mini. Con questa scheda i pin 4 e 5 presenti nel codice sono fisicamente indicati sulla serigrafia come D2 (rxPin) e come D1 (txPin)... W la confusione!

Ripetere i punti richiesti nell'attività 1, soffermandosi in particolare sul penultimo.

Attività 3

Collegare tra di loro il pin TX dell'UART (hardware) con il pin rxPin usato da SoftwareSerial. Scrivere il codice seguente:

#include <SoftwareSerial.h>
const byte rxPin = 4;
const byte txPin = 5;
SoftwareSerial mySerial(rxPin, txPin);

void setup() {
  mySerial.begin(38400);
  Serial.begin(38400);
}

void loop() {
  byte carattere;
  Serial.write("V");
  if (mySerial.available() > 0) {
    carattere = mySerial.read();
    Serial.print(" Byte ricevuto: ");
    Serial.println(carattere);
    mySerial.flush();
  }
  delay(1000);
}

Descrivere il funzionamento del codice sia analizzando quanto visibile con l'oscilloscopio che quanto mostrato dal monitor seriale di Arduino IDE.

Attività 4

Per questa attività servono due Arduino UNO oppure due ESPxxx. NON è possibile, pena la distruzione fisica, collegare direttamente Arduino UNO e ESPxxx tra di loro a causa della differente tensione di alimentazione: 5 V per Arduino UNO e 3.3 V per ESP8266.

Anche se non strettamente necessario, è opportuno usare due PC, ciascuno collegato al proprio Arduino.

I collegamenti fisici:

[Avanzato] Attività 5

Scrivere il codice che si comporta come richiesto dall'attività 4 in entrambe le direzioni

RS485

RS485 è un protocollo fisico che permette una comunicazione half-duplex tra due o più dispositivi, anche su distanze relativamente lunghe (centinaia di metri). Qui una descrizione approfondita.

Questo standard utilizza appositi Transceivers (trasmettitore + ricevitore) che convertono i livelli elettrici da un segnale digitale 0/1 ad una coppia di segnali differenziali, adatti per essere utilizzati su doppini con impedenza caratteristica di 100 Ω. Spesso deve essere presente un ulteriore collegamento di massa, quindi tre fili in totale.

Molto simile a questo protocollo fisico è RS422 che permette una comunicazione full-duplex tra due dispositivi usando una coppia di doppini (4 fili oltre la massa).

Due transceiver RS485 molto diffusi sono MAX485 (per microcontrollori funzionanti a 5 V) e MAX3485 (per microcontrollori funzionanti a 3.3 V).

Attività 6

Utilizzare MAX485 per trasmettere un byte serialmente.

Il codice è lo stesso già descritto; l'unica attenzione è quella di attivare il transceiver alla trasmissione, attraverso l'apposito pin DE. Come descritto nei fogli tecnici il transceiver trasmette quando DE è alto, riceve quando RE è basso. Dato che RS485 è un protocollo half-duplex  spesso questi due pin sono collegati direttamente tra di loro.

#include <SoftwareSerial.h>
const byte rxPin = 4;
const byte txPin = 5;
const byte DEpin = 16;
SoftwareSerial mySerial(rxPin, txPin);

void setup() {
  mySerial.begin(9600);
  pinMode(DEpin, OUTPUT);
  digitalWrite(DEpin, 0);
  }

void loop() {
  digitalWrite(DEpin, 1);
  mySerial.write(0xAF);
  digitalWrite(DEpin, 0);
  delay(10);
}

L'hardware è, nel caso di utilizzo di ESP8266, il seguente:

RS485 Hardware

Osservando lo schema si notano alcune apparenti incongruenze:

Il grafico seguente mostra l'andamento di D1 (pin TX) e di D0 (pin DE e RE, collegati insieme):

Pin DE e DI

Il grafico seguente mostra il byte trasmesso TX e quello ricevuto RX, evidentemente coincidenti in un sistema correttamente funzionante:

Si noti che il segnale RX è compreso tra 0 V e 5 V e quindi non è compatibile con ESP8266: il collegamento supera le tensioni massime del microcontrollore che verrebbe danneggiato fisicamente. Possibili soluzioni sono descritte alla pagina Traslatori di livello.

L'ultimo grafico mostra tutti i segnali presenti nel circuito:

Trasmissione a 115200 bit/s

Dall'alto abbiamo:

Per un approfondimento con velocità e lunghezza di linee maggiori: Linee di trasmissione


Pagina creata nel dicembre 2021
Ultima modifica: 4 aprile 2024


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima