Costruiamo un’unità CAN Master USB

Dopo aver presentato la scheda slave a 4 relé, proponiamo l’unità master, connessa al computer mediante USB e utilizzata per inviare i comandi.

Il progetto è costituito da una serie di schede slave con interfaccia CAN provviste ognuna di quattro relé, e da una scheda master di interfaccia tra il bus CAN e il bus USB, in modo da poter facilmente interfacciare i dispositivi slave ad un’interfaccia software residente su Personal Computer.

Nella prima puntata ci siamo soffermati in maniera dettagliata sulla parte hardware della scheda slave. Passiamo adesso alla descrizione della scheda master del sistema, ossia dell’interfaccia CAN/USB che viene governata dal software su PC allo scopo di inviare i comandi diretti alle schede slave.

Come di consueto soffermiamoci inizialmente sull’analisi dei requisiti della scheda, in modo da avere ben chiaro cosa vogliamo ottenere; per la scheda master, possiamo individuare un gruppo di requisiti hardware, un gruppo di requisiti funzionali ed alcuni requisiti di configurazione. Vediamoli uno per volta.

Fig. 1 Schema a blocchi del sistema.

Requisiti hardware

Dal punto di vista hardware vogliamo che il sistema sia dotato delle seguenti caratteristiche:
• interfaccia CAN 2.0B, con indirizzamento esteso (29-bit) e capacità di raggiungere baud-rate fino a 500 kbit/s;
• interfaccia USB 2.0 Full Speed;
• alimentazione dal bus USB;
• quattro LED di stato (2 per l’attività su USB, uno di sistema ed uno indicante la presenza di errori sul bus CAN), controllati direttamente dal microcontrollore principale;
• 2 LED di indicazione del traffico, pilotati direttamente dalle linee CANH e CANL;
• opzione per la terminazione della rete CAN a 120 Ω, attivabile tramite jumper;
• possibilità di alimentare le schede slave tramite una tensione a 12V stabilizzata proveniente da un alimentatore esterno.
Requisiti funzionali
Dal punto di vista funzionale, la scheda master è essenzialmente un bridge tra il bus CAN e il bus USB. Il sistema dovrà quindi prevedere una serie di messaggi per garantire il controllo delle schede; inoltre dovrà provvedere a trasferire sul bus USB i messaggi ricevuti dal CAN. Prevediamo quindi che la scheda determini:
• un messaggio per il controllo dei 4 relé;
• un messaggio per il controllo dei 2 LED (quando impostati per controllo remoto);
• un messaggio per trasferire i messaggi in arrivo sul bus CAN verso l’host su bus USB.

Inoltre vogliamo che la modalità di funzionamento normale (ossia quella in cui l’interfaccia USB invia i messaggi di controllo alle schede slave) sia distinta da quella di configurazione (modalità in cui possono essere cambiati i parametri di funzionamento delle varie schede) e che le due modalità di funzionamento siano logicamente separate, in modo da evitare l’eventualità di invio accidentale di messaggi di configurazione durante il funzionamento normale e viceversa. Dovranno quindi essere previsti due messaggi aggiuntivi che permettano di passare da una modalità all’altra.
Per eseguire queste operazioni sarà necessario impostare un protocollo di livello applicazione su bus USB; nei prossimi paragrafi spiegheremo come fare.

Requisiti di configurazione

Il sistema dovrà prevedere una serie di messaggi USB destinati alla propria configurazione, alcuni dedicati alla configurazione dei nodi slave, sfruttando gli appositi messaggi CAN di configurazione definiti durante la progettazione della scheda relé, altri per la configurazione dell’interfaccia. In particolare, occorre prevedere i seguenti messaggi:
• uno dedicato all’invio del messaggio CAN di configurazione CAN_CONFIG_MSG_1 (in modo da poter cambiare il messaggio di comando del nodo);
• uno dedicato all’invio del messaggio CAN di configurazione CAN_CONFIG_MSG_2 (in modo da poter cambiare il messaggio di risposta del nodo);
• uno dedicato all’invio del messaggio CAN di configurazione CAN_CONFIG_MSG_3 (in modo da poter cambiare le impostazioni del nodo, tra cui il baud rate del CAN);
• uno dedicato a impostare il baud-rate CAN dell’interfaccia USB.

Come sappiamo dalla puntata precedente, tutte le impostazioni eseguite sui nodi slave vengono salvate in memoria non volatile e caricate in fase di startup; non c’è necessità di salvare in maniera permanente le impostazioni dell’interfaccia USB, in quanto queste ultime potranno risiedere nell’interfaccia software e venire caricate ad ogni nuovo avvio del programma.

Schema elettrico

Progetto hardware della scheda

Passiamo adesso al progetto pratico della scheda di interfaccia, iniziando dallo schema a blocchi, riportato in Fig. 2. Il cuore di tutto è il microcontrollore PIC18F2550 (la cui piedinatura è riportata in Fig. 3), prodotto dalla Microchip Technology, RISC ad 8-bit con interfaccia USB integrata. Le risorse interne di questo micro sono:
• 32k di memoria di programma di tipo Flash;
• 2k di memoria RAM (di cui 1k di dual-access RAM dedicata all’USB);
• Modulo USB compatibile USB 2.0 (Low Speed e Full Speed), in grado di supportare fino a 32 endpoint;
• On-board USB transceiver con regolatore 3,3 V integrato;
• MSPP (Master Synchronous Serial Port), funzionante in modalità SPI ed I²C.

Fig. 2 Schema a blocchi della scheda di interfaccia USB.

Fig. 3 Piedinatura del PIC18F2550.

 

Il dispositivo è connesso direttamente ad un connettore USB type mini B femmina, in quanto il modulo USB del PIC18F2550 (Fig. 4) non necessita di componenti aggiunti (anche i pull-up della linea differenziale sono integrati all’interno del chip).

Fig. 4 Schema a blocchi del modulo USB del PIC18F2550.

 

Dal lato CAN, la scheda ricalca la stessa configurazione della scheda relé, usando il CAN controller MCP2515 connesso da un lato, tramite collegamento SPI, alla MSSP del PIC e dall’altro al transceiver CAN MCP2551. Questa configurazione è largamente collaudata ed è stata descritta in dettaglio nella puntata precedente, ragion per cui non ci soffermiamo oltre.
La scheda è dotata inoltre di quattro user LED con le seguenti funzioni:
• LED_1 e LED_2 = USB LED, utilizzati per indicare lo stato di funzionamento del collegamento USB; questi due LED lampeggiano alternativamente, con un periodo di circa 500 ms, se il collegamento USB risulta attivo;
• LED_3: System LED = utilizzato per indicare lo stato di funzionamento del sistema; se il sistema si trova in modalità normale questo LED pulsa con un rapporto pari a durata di 200 ms e pausa di 1,3 s, mentre se il sistema si trova in modalità configurazione il LED pulsa con rapporto periodo/pausa di 100/500 ms;
• LED_4: CAN error state, utilizzato per indicare uno stato di errore sul bus CAN.

Fig. 5 Schema a blocchi del modulo MSSP del PIC18F2550 in modalità SPI.

 

Poi, conformemente ai requisiti esposti nelle pagine precedenti, sono stati previsti anche due LED per indicare il traffico sul bus CAN, collegati direttamente alle linee di TX ed RX dell’MCP2515.
La tensione di alimentazione per la scheda è ricavata direttamente dal bus USB, ma è stato previsto un connettore tipo jack in grado di portare un’eventuale tensione a 12V stabilizzata direttamente sul connettore CAN, in modo da poter alimentare gli slave con un alimentatore collegato all’interfaccia USB.

Passiamo adesso alla realizzazione hardware della scheda, eseguita anche in questo caso con l’ausilio di KiCad (www.kicad.com). Lo schema elettrico del dispositivo è riportato in queste pagine; analizziamone come di consueto i vari dettagli, in modo da comprenderne lo sviluppo.

Iniziamo dalla sezione relativa al microcontrollore, partendo dalla realizzazione del suo circuito di clock. I requisiti della comunicazione USB Full Speed impongono la presenza di una sorgente di clock di 48 MHz, necessaria a garantire il corretto funzionamento del sistema. Per consentire l’utilizzo di quarzi differenti e meno costosi, la Microchip ha dotato i dispositivi della famiglia 18F4550/2550 di un albero di clock dotato di PLL integrato che permette di raggiungere i 48 MHz richiesti dalla USB, praticamente con quasi tutte le combinazioni di quarzi normalmente utilizzati in applicazioni embedded.

Come è possibile notare in Fig. 6, l’ingresso dell’oscillatore primario viene diviso tramite un prescaler di un fattore tale da portare la frequenza a 4 MHz; a questo punto si aggancia un PLL (Phase Locked Loop o Anello ad Aggancio di Fase) a 96 MHz, la cui uscita viene portata al valore di 48 MHz da un divisore di frequenza con fattore 2. Da questa sorgente vengono tratti i segnali di clock per tutte le periferiche USB e, volendo, anche per la CPU. È quindi possibile utilizzare una grossa varietà di quarzi in ingresso al generatore; la nostra scelta è ricaduta su un elemento da 12 MHz.

Fig. 6 Schema a blocchi del circuito di clock del PIC18F2550.

Oltre al circuito di clock, il micro è stato dotato del classico pulsante di reset collegato al Master Clear e di un pulsante generico collegato al pin RB3. Inoltre è stato inserito il condensatore C6 da 1 µF per stabilizzare la tensione di uscita del regolatore USB ed un condensatore di bypass da 100 nF (C7) tra i pin di alimentazione. Al micro sono inoltre collegati i quattro user LED descritti in precedenza, gestiti tramite le linee RA3, RA4, RA5 ed RA6. Infine abbiamo inserito il solito connettore ICSP per permettere programmazione e debug in-circuit del dispositivo.

L’interfaccia CAN è in tutto e per tutto simile a quella realizzata per la scheda relé. Il collegamento dell’MCP2515 al PIC è realizzato tramite linea SPI con CS ed anche in questo caso è stato mantenuto il collegamento del pin INT (per la precisione al pin RB2 del PIC) in modo da garantire la possibilità di utilizzare anche una gestione ad interrupt dell’interfaccia CAN. Per quanto riguarda il transceiver MCP2551, anche in questo caso è stata inserita la terminazione a 120 Ω selezionabile tramite jumper e i due LED per l’indicazione del traffico sul bus CAN collegati ai pin TX/RX provenienti dal CAN controller. Infine è stato inserito un connettore a 4 poli (da realizzarsi tramite morsettiera a vite) in grado di portare i segnali CAN (CANH e CANL) e l’alimentazione (0-12V) ai dispositivi slave.

Per quanto riguarda l’alimentazione della scheda, come già detto in precedenza, i 5V per il funzionamento dei vari dispositivi è stato deciso che siano prelevati dal computer tramite il connettore USB mini B, tuttavia è stato previsto un circuito di alimentazione in grado di portare 12V stabilizzati in ingresso fino al connettore CAN, per consentire l’alimentazione dei nodi slave direttamente dall’interfaccia USB e semplificare di conseguenza i cablaggi.

Questo circuito è stato dotato di un diodo 1N4007 in funzione di protezione dall’inversione di polarità (D3), di un condensatore di stabilizzazione (C9) e di un LED per indicare la presenza della tensione di alimentazione.

Dal punto di vista del layout del circuito stampato, si è deciso di posizionare il connettore USB sulla parte anteriore della scheda ed il connettore CAN sulla parte posteriore, in modo da semplificare le operazioni di connessione della scheda stessa.

Di conseguenza, i LED USB e il LED di sistema sono stati posizionati sul davanti di fianco al connettore USB, mentre i LED per l’indicazione del traffico CAN e il LED di errore sul bus sono stati posizionati dietro, a fianco del connettore CAN, come anche il jumper per l’inserimento della terminazione a 120 Ω. Sulla parte sinistra sono stati posizionati i pulsanti e lo zoccolo di programmazione. Infine, la parte destra è occupata dalla sezione di alimentazione per i nodi slave.

In Fig. 7 è riportato uno screenshot del progetto del PCB, mentre in Fig. 8 è possibile osservare il render 3D della scheda. La pista che porta l’eventuale alimentazione degli slave è stata dimensionata usando il calcolatore per PCB di KiCad: si è supposto di dover alimentare, con questa linea, fino ad un massimo di 40 nodi slave, supponendo un consumo di circa 100 mA di picco per nodo e potendo tollerare un incremento di temperatura di 20 °C; lo spessore della pista che ne è derivato è 1,4 mm. In Fig. 9 è riportato uno screenshot dell’utility di calcolo, riportante i parametri suaccennati.

 

 

 

 

Fig. 7 Progetto del PCB.

 

Fig. 8 Render 3D della scheda.

Fig. 9 Calcolo della larghezza della pista di alimentazione dei nodi slave.

 

Protocollo di comunicazione

Passiamo adesso alla descrizione del protocollo di comunicazione usato per il collegamento USB; come abbiamo già spiegato nella parte iniziale dell’articolo, la comunicazione sul bus USB dovrà essere bidirezionale, ossia vogliamo poter inviare comandi dall’interfaccia SW alla scheda (per la gestione dei relé e della configurazione) e desideriamo altresì che la scheda invii all’interfaccia SW le informazioni sullo stato dei nodi slave che transitano sul bus CAN.

Decidiamo quindi di avere due tipologie di messaggi, un messaggio di comando e uno di risposta (trasmissione e ricezione visti dal lato dell’interfaccia SW). Quindi il messaggio di comando è generato dal nostro software di controllo e diretto alla scheda e, viceversa, il messaggio di risposta viene generato dalla scheda e diretto verso l’interfaccia utente su Personal Computer.

Nelle Tabella 1a e Tabella 1b è riportato il formato di entrambi i messaggi. Il protocollo impiega quattro campi, che sono header, command type, node address e payload. Le due tipologie di messaggio sono differenziate solo dall’header (CM = command mode, RM = response mode).

Dopo l’header c’è un campo di 2 byte che corrisponde al command type: questo permette di distinguere i vari tipi di comandi tra di loro (questo campo ha invece poco significato per i messaggi di risposta, in quanto non c’è differenziazione per tipologia).

Dopodiché abbiamo un campo da 8 byte che contiene l’indirizzo del nodo CAN (node address) cui viene indirizzato il messaggio o da cui è stato ricevuto un messaggio presente sul bus. Questo campo resta in genere vuoto nel caso in cui l’operazione da eseguire non sia legata all’invio del messaggio sul bus (ad esempio un cambio di modalità operativa della scheda). Infine, abbiamo un campo payload da 8 byte, che contiene i dati da trasferire o in ricezione sul bus.

 

Tabella 1a Messaggio di comando.

 

Tabella 1b Messaggio di risposta.

Piano di montaggio

Elenco Componenti:

C1: 100 nF ceramico (0805)
C2÷C5: 22 pF ceramico (0805)
C6: 1 µF ceramico (0805)
C7: 100 nF ceramico (0805)
C8: 100 nF ceramico (0805)
C9: 47 µF 25 VL elettrolitico
D1: GF1M
LD1÷LD4: LED giallo (1206)
LD5: LED verde (1206)
LD6: LED giallo (1206)
LD7: LED giallo (1206)
R1: 10 kohm (0805)
R2, R3: 220 ohm (0805)
R4. R5: 4,7 kohm (0805)
R6: 220 ohm (0805)
R7: 120 ohm (0805)
R8÷R11: 220 ohm (0805)
SW1: Microswitch
SW2: Microswitch
U1: MCP2515
U2: PIC18F2550-I/SO (MF1137)
U3: MCP2551
X1: Quarzo 16 MHz (HC49/US)
X2: Quarzo 12 MHz (HC49/US)

Varie:
- Plug alimentazione
- Morsetto 4 poli
- Strip maschio 2 poli
- Strip maschio 6 poli
- Jumper
- Connettore mini-USB
- Circuito stampato

 

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Menu