La scheda di sviluppo Wio Terminal, di Seeed Studio, mette a disposizione due porte grove:
Il sistema grove, sempre di Seeed Studio, consente di realizzare progetti elettronici in maniera modulare, offrendo diversi moduli (sensori, schede di controllo…) che possono essere interconnessi tra loro grazie ad un connettore standard e a librerie pronte all’uso.
Ho provato a collegare un modulo GPS (che comunica tramite UART) alla porta grove di destra del mio Wio Terminal ma mi sono accorto che non funzionava.
Dopo qualche indagine, ho risolto invertendo i segnali TX e RX (cavi bianco e giallo) nel connettore:
Ecco la spiegazione del perchè!
Il pinout standard del connettore grove per moduli UART è il seguente:
Osservando lo schema elettrico della scheda Wio Terminal, possiamo associare ai segnali UART i segnali:
- RX = A0/D0
- TX = A1/D1
Questi segnali corrispondono a due pin del microcontrollore ATSAMD51P19A:
- RX = A0/D0 = PB08/SERCOM4.0 (porta 4 pad 0)
- TX = A1/D1 = PB09/SERCOM4.1 (porta 4 pad 1)
I microcontrollori della famiglia SAMD offrono la possibilità di fare multiplexing, ovvero di associare alle periferiche interne (ad esempio quella che gestisce le comunicazioni seriali) diversi pin. Per una spiegazione più dettagliata, vi lascio a questo ottimo tutorial di Sparkfun.
I progettisti di SeeedStudio hanno quindi deciso di sfruttare la porta SERCOM4 per il connettore grove che stiamo esaminando.
Dal datasheet del microcontrollore, leggiamo che il segnale TX può essere associato solo al pad 0:
mentre Seeed Studio ha collegato il pad 0 (pin PB08) al segnale RX. Questo è il motivo per cui – per far funzionare i moduli grove UART con la porta grove di destra di Wio Terminal – è necessario invertire i segnali.
Infine vi lascio il codice per configurare, in Arduino, tale porta:
static Uart Serial3(&sercom4, D1, D0, SERCOM_RX_PAD_1, UART_TX_PAD_0); void setup() { pinPeripheral(D0, PIO_SERCOM_ALT); pinPeripheral(D1, PIO_SERCOM_ALT); Serial3.begin(GPSBaud); } [...] void SERCOM4_0_Handler() { Serial3.IrqHandler(); } void SERCOM4_1_Handler() { Serial3.IrqHandler(); } void SERCOM4_2_Handler() { Serial3.IrqHandler(); } void SERCOM4_3_Handler() { Serial3.IrqHandler(); } |
1 commento