chipKIT Network Shield™
Il chipKIT Network Shield™ è qualcosa di unico nel suo genere. Si tratta essenzialmente di uno shield (scheda di espansione) destinato ad essere usato unicamente con il chipKIT MAX32™ (niente Arduino quindi, ma nemmeno niente chipKIT UNO32™). Dicevo unico nel suo genere, perchè?
Come il chipKIT Basic IO Shield™ non è destinato ad assolvere ad un’unica funzione, bensì è uno shield multifunzione. In un’unica scheda abbiamo difatti varie possibilità di connessione con il mondo esterno:
- Ethernet 10/100
- USB Device e USB Host
- Doppio modulo CAN
- Connettori daisy chain per I2C
A differenza degli shield per Arduino, qui non c’è componentistica esterna che assolve a tutte queste funzioni dato che il PIC32MX95F512L montato a bordo del chipKIT MAX32™ ha già a bordo i moduli per eseguire questi tipi di connessioni. Sullo shield difatti sono montati unicamente i componenti ausiliari che servono al PIC32 per poter assolvere alle sue funzioni di base, che ha già integrate.
Analizziamo più in dettaglio tutte le caratteristiche che questo shield ci offre. Dato che questo shield è molto complesso, cercherò in questo primo articolo di dare una panoramica tecnica della scheda per far capire a cosa ci troviamo di fronte.
Prima di partire con questo shield, è necessario, come sempre collegarsi al sito ufficiale della Digilent, alla pagina dedicata al chipkit Network Shield, e scaricare documentazione (soprattutto!) e librerie. Successivamente, per evitare inutili frustrazioni vi consiglio di iscrivervi al forum del Chipkit e postare li, nell’apposita sezione, vostri dubbi, perplessità e problemi.
Indice dei contenuti
Installare le librerie per il Network Shield
Come già spiegato per il Basic IO Shield, le librerie per il Network shield vanno copiate nella cartella “Libraries” presente nella cartella degli Sketch. Le librerie vanno scaricate dalla pagina ufficiale del chipKIT MAX32 o da quella del Network Shield. La cartella in cui copiare le librerie è visibile dal menù File -> Preferences. In tale cartella dovremmo trovare una situazione del genere:
Le cartelle che contengono le librerie da usare con il Network Shield sono quelle il cui nome inizia per “chipKIT”.
Interfaccia Ethernet
Il PIC32 a bordo del MAX32 ha già integrato un Ethernet Medium Access Controller (MAC), c’è quindi unicamente bisogno di un’interfaccia fisica (Physical Layer Transceiver – PHY) per il collegamento ad una rete Ethernet 10/100, e questa viene fornita, sul Network Shield, da un LAN8720 prodotto dalla SMSC. Il connettore RJ45 MagJack provvede infine al collegamento fisico alla rete LAN. Lato software, per il collegamento ad una rete, vengono fornite delle librerie (lo stack TCP/IP) che ci consentono di utilizzare questa interfaccia Ethernet allo stesso modo con cui usiamo l’Ethernet Shield di Arduino, per cui il passaggio è indolore, dovremo però usare le librerie del ChipKIT e non quelle di Arduino.
Sull’Ethernet Shield di Arduino è invece montato un chip Wiznet W5100, che fornisce sia il layer fisico che quello MAC dato che l’ATmega328 non ne è provvisto.
3 linee del connettore Ethernet sono condivise con i pin analogici A11, A12 e A13, per cui quando è in uso la funzione Ethernet non è possibile utilizzare tali pin. Quando colleghiamo l’Ethernet Shield ad una rete lan è necessario fornire al PIC32 l’indirizzo MAC in maniera da poter essere identificato sulla rete in maniera univoca. Sebbene possiamo mettere qualsiasi valore in realtà gli indirizzi MAC sono assegnati dall’IEEE. Il network shield ha un adesivo nella parte inferiore con un codice a barre e un numero esadecimale del tipo 00 18 3E xx xx xx : questo numero va inserito nelle librerie quando si va a definire l’indirizzo MAC:
// Enter a MAC address and IP address for your controller below. // A zero MAC address means that the chipKIT MAC is to be used byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
Ripeto: non è necessario in quanto la libreria prevede che rimanendo tutti 0x00 venga usato in automatico il MAC del PIC32. Al di fuori di MPIDE, se vogliamo programmare il MAX32 con MPLAB C32, nella Microchip Application Library sono presenti degli esempi proprio per PIC32MX795 con LAN8720.
Altro settaggio importante è l’indirizzo IP, che deve avere i primi 3 numeri uguali a quelli dei vostri dispositivi di rete, generalmente 192.168.1 :
// !!MODIFY THIS!! // The IP address will be dependent on your local network: byte ip[] = { 192,168,1,190 }; |
Ricordo che il PIC32MX795 ha due serie di pin per permettere il collegamento della parte MAC al PHY ma il chipKIT MAX32 e il Network Shield sono progettati per utilizzare i pin di default. Il LAN8720 ha un pin di reset, indicato con NRST nello schema elettrico, che è connesso al pin RE9/INT2 del PIC32 (pin digitale 7 del MAX32). Il LAN8720 è tenuto normalmente in stato di reset (tale pin è sempre tenuto basso). Per mettere il LAN8720 in funzione, questo pin deve essere portato a livello alto: questa funzione è già eseguita in automatico dalla libreria per MPIDE per cui non dovete preoccuparvene, dico questo perchè se ne devono preoccupare quelli che programmano tale scheda con MPLAB C32 dal momento che questa cosa non è eseguita in automatico dalle librerie standard Microchip: non è parte dello stack TCP/IP ma è piuttosto un dettaglio hardware che non tutte le interfacce necessitano.
Esempio Network Shield
Il modulo Ethernet non richiede nessun settaggio dei jumper. Il primo esempio che ho provato, e quello che ritengo più interessante per un sistema domotico, è l’esempio del webserver. L’esempio è accessibile dal menù File -> Examples -> chipKITEthernet -> ChipKITWebServer:
Io ho lasciato tutte le impostazioni di default dato che gli indirizzi IP della mia rete domestica iniziano tutti per 192.168.1 e il 190 non è utilizzato. Caricandolo sul Max32 e collegandolo alla rete LAN è possibile navigare all’indirizzo 192.168.1.190 e leggere lo stato dei 6 ingressi analogici:
Ricordo che l’esempio non prevede il refresh della pagina ma dovete aggiornare voi la pagina. Bastano comunque delle minime basi di HTML per implementare queste funzioni.
Interfaccia USB
Il PIC32 a bordo del chipKIT MAX32 ha un’interfaccia USB OTG 2.0 Full Speed, questo significa che il modulo USB non ha bisogno di nulla se non dei connettori esterni. Sul Network shield abbiamo quindi due connettori USB. Il connettore J4 montato sul lato superiore è un ricettacolo USB tipo A e viene comunemente utilizzato come Host (es.: per collegarci una pendrive). Il connettore J2, montato sul lato inferiore, proprio al di sotto di J4, è un connettore USB micro AB e viene utilizzato quando il PIC32 opera come Device oppure in modalità OTG (cioè può passare da Host a Device e viceversa).
Anche Arduino ha uno shield chiamato USB Host. Ma, dato che l’ATmega328 montato su Arduino non ha una periferica USB, tale shield assolve lui a tutte le funzioni e comunica con l’ATmega attraverso l’interfaccia SPI. Questo shield utilizza il MAX3421 per eseguire questa funzione, ed è ovvio che è il chip esterno ad occuparsi di tutto. Questione leggermente diversa potrebbe essere l’Arduino UNO che ha un atmega aggiuntivo con funzione USB: in ogni caso ci sono sempre due chip, uno dei quali esegue da solo la funzione USB e va pure programmato a parte.
L’interfaccia USB OTG di cui è dotata il picmicro, in aggiunta, ha anche la possibilità di sfruttare il DMA. Quando viene sfruttata la connettività USB, questa fa uso di numerosi pin, che sono quelli identificati dal connettore J9 del MAX32. Vengono utilizzati due segnali aggiuntivi quando l’USB viene usato come HOST e sono l’ingresso analogico 5 (AN5 = pin digitale 59) e il pin digitale 2, per cui questi due pin non possono essere utilizzati quando è in uso questa modalità.
In modalità USB, il MAX32 può operare come self-powered device (alimentato a parte) o bus-powered device (alimentato dal bus usb a cui è connesso in modalità device).
Per operare come dispositivo con alimentazione autonoma, il MAX32 deve essere alimentato sul connettore coassiale a barile J2. In aggiunta se l’alimentazione esterna è già a 5V, il jumper JP1 va messo in posizione BYP per bypassare il regolatore a 5V. Questa modalità di alimentazione è sempre consigliata perchè non sovraccarica eventuali porte USB alle quali le schede sono collegate ed inoltre è l’unica possibilità quando si usa la scheda come USB HOST.
Il jumper JP4 sul network shield (quello sulla sinistra, etichettato come “USB HOST”) è usato per deviare l’alimentazione sui connettori USB: va chiuso in posizione “A” quando si vuole usare il connettore host tipo A (J4, quello sopra) o in posizione “MICRO” quando si vuole usare il connettore micro-AB (J2, quello sotto).
In modalità bus-powered device, l’alimentazione può essere prelevata dalla porta USB (connettore J1 sul MAX32). Tale connettore sul MAX32 è usato dal convertitore seriale e in questa modalità di alimentazione l’insieme MAX32+Network shield appare come bus-powered device dalla prospettiva della porta usb connessa a J1 (sul MAX32) ma appare ovviamente come self-powered device dalla prospettiva della porta connessa a J2 sul network shield, per cui qui bisogna prendere alcuni accorgimenti per evitare di friggere tutto quando si usa il connettore J2 del network shield dato che questo connettore potrebbe essere collegato ad un dispositivo che fornisce anch’esso 5V. In questo caso bisogna rimuovere il jumper sul connettore JP4 del network shield e collegare con un cavetto jumper il pin 1 di JP4 ad un punto qualsiasi contrassegnato con 5VO (questo punto si trova sull’header alimentazione J17 o su J14 in alto a destra) e quando si usa questa modalità è necessario che i due connettori USB siano collegati allo stesso dispositivo (es.: allo stesso computer) perchè i pin di alimentazione vengono collegati insieme e se le tensioni sono diverse si può danneggiare sia lo shield, che il MAX32 che il dispositivo collegato.
Devo ammettere che la gestione dell’alimentazione è piuttosto complicata ma d’altronde non vedo come fosse possibile semplificarla dato che ci sono in totale 3 connettori USB compreso quel del MAX32 e deve poterci essere il bisogno di usare varie modalità di alimentazione. In ogni caso a mio avviso: usate sempre l’alimentazione esterna e non avrete problemi!
Quando invece il pic opera in modalità HOST, la distribuzione della tensione sul bus viene controllata attraverso il pin VBUSON (pin digitale 59 / pin analogico A5 quindi inutilizzabili in tale modalità). Tale pin controlla l’integrato TPS2051B, prodotto dalla TI, che si occupa di distribuire la tensione e controllare l’assorbimento: nel caso di assorbimenti eccessivi il pin USBOC (pin digitale 2) viene portato a livello basso. Tale pin è RE8/INT1 sul pic.
Nelle librerie per MPIDE fornite dalla Digilent ci sono numerosi esempi di utilizzo dell’interfaccia USB sia come Host che come Device tra cui un esempio interessante per leggere/scrivere files su pendrive. Sul forum è inoltre in corso lo sviluppo di codice per utilizzare l’USB Host con dispositivi Android : questo per ora, però, prevede la programmazione tramite MPLAB C32 e quindi di un programmatore compatibile come il Pickit3 (ricordo che il Pickit2 non è in grado di programmare il PIC32 del MAX32). Questo esempio per Android, che spero di provare prossimamente, prevede che sia utilizzanto anche il Basic I/O Shield.
Esempio interfaccia USB
L’esempio che ho provato subito è quello che prevede l’utilizzo dell’USB in modalità HOST per la lettura/scrittura di files su pendrive. Questo esempio deriva direttamente da quelli della MAL e che sto usando con successo sul mio logger GPS, ovviamente il tutto è adattato per essere usato con MPIDE. L’esempio è accessibile da File -> Examples -> chipKITUSBMSDHost -> USBMSDHost.
Alimentiamo il chipKIT MAX32 da una fonte esterna e settiamo il jumper JP4 in posizione A. Dopo data alimentazione alla scheda, colleghiamo una pendrive sul connettore.
Attendiamo che il led di stato sulla pendrive smetta di lampeggiare, dopodichè possiamo staccarla e collegarla al PC. Troveremo un file dal nome “TEST.TXT” che contiene il testo “This is a test.”. Documentazione più approfondita su questa particolare funzionalità è possibile trovarla in questo documento della Microchip.
Divertimento assicurato utilizzando questa funzione insieme all’Ethernet!
Interfaccia CAN
Il PIC32 a bordo del MAX32 ha due moduli CAN separati. Sul Network Shield sono presenti due MCP2551 che si occupano dell’interfacciamento tra i due moduli CAN a bordo del pic e i dispositivi CAN esterni. Il PIC32 ha due serie di pin per l’interfacciamento ai moduli CAN, il Network shield utilizza i pin alternativi. Programmando in C32, l’utilizzo dei pin alternativi viene impostato utilizzando l’apposita direttiva Pragma:
#pragma config FCANIO=OFF |
Utilizzando invece MPIDE non bisogna fare nulla dato che questa word di configurazione è già impostata dal bootloader. Il modulo CAN1 utilizza un pin dell’UART 3B e un pin del modulo SPI 3A (pin 14 e 15 del connettore J4 sul MAX32). Sotto al network shield, in corrispondenza dei due jumper (non popolati) JP1 e JP5, ci sono due tracce che uniscono tali pin: è possibile tagliarle per disconnettere il modulo CAN1: successivamente è possibile popolare i pad con due strip e chiuderli con due jumper per ripristinare il funzionamento standard. I pin usati dal modulo CAN2 sono i pin digitali 22 e 23, per cui non è possibile usare questi due pin quando si usa il modulo CAN2. Dato che non esiste un connettore standard per la comunicazione CAN, sul network shield sono presenti due header da 2×6 pin per entrambi i moduli, etichettati come CAN#1 e CAN#2. Per facilitare le cose è possibile utilizzare tali header con un cavo femmina/femmina da 6 pin (qui ce ne sono alcuni) in abbinamento ad una scheda Digilent PmodCON1 che permette il collegamento attraverso terminali a vite.
Lo standard CAN prevede che i bus di comunicazione siano terminati con resistori da 120Ω. JP6 fornisce la terminazione per il modulo CAN1 e JP8 per il modulo CAN2.
Anche in questo caso è presente una libreria con codice di esempio.
Altro
Sul Network Shield troviamo in aggiunta due header 4×2 che permettono di accedere a 2 dei 5 moduli I2C presenti sul PIC32. L’header J7 fornisce l’accesso al modulo I2C#1 (SCL1 e SDA1) e l’header J6 al modulo I2C#2 (SCL2 e SDA2). Sul bus del modulo 1 sono già presenti 2 resistenze di pullup da 2.2KΩ. Nel caso in cui si renda necessario isolare il bus I2C e liberare i pin, è possibile tagliare le tracce sotto i jumpers JP9 e JP12. Il funzionamento può essere ripristinato saldando due header maschio con jumper.
Il pullup per il modulo 2 è fornito invece da uno specchio di corrente che consente tempi di risalita più rapidi, riducendo in questo modo lo slew rate e consentendo l’utilizzo di cavi di connessione più lunghi; nel caso in cui questo costituisse un problema è possibile disabilitare gli specchi di corrente tramite i due jumper JP10 e JP11. I moduli I2C sono utilizzabili con MPIDE includendo la libreria Wire come su Arduino. Sul Bus I2C del modulo I2C#1 è collegata anche un’eeprom 24LC256 (IC5 sulla parte posteriore della scheda).
L’indirizzo a 7 bit è 0x50 e per utilizzarla ci sono gli esempi già previsti per il Basic IO Shield.
In aggiunta è presente un oscillatore da 32768Hz per utilizzare il modulo RTCC incluso nel PIC32 del MAX32. Per usare questa funzione attualmente non è prevista una libreria per MPIDE anche se sul forum è possibile trovare degli esempi.
In Italia i prodotti della Digilent vengono distribuiti da Mirifica, e il mio consiglio è di andare sul loro sito per l’acquisto del chipKIT™ Network Shield.
Galleria Fotografica chipKIT Network Shield