ORbit16™ – Scheda di sviluppo per PICmicro a 16/32bit con USB OTG
Dopo parecchio tempo che ci lavoro su, finalmente riesco a presentare questo mio progetto!
Indice dei contenuti
La storia di ORbit16™
Tutto nasce qualche anno fa, quando mi misi in testa di realizzare un dispositivo per la localizzazione remota che tenesse anche un log degli spostamenti. La scelta della MCU ricadde ovviamente su un PICmicro e all’epoca l’unico pic ad essere dotato di due UART hardware (me ne serviva una per il GPS e una per il modulo GSM) + USB, in formato PDIP, era il PIC24FJ64GB002. La prima cosa che faccio io in questi casi è recuperare quanta più documentazione possibile in lingua originale e mettermi a studiare. Questo mio modo di operare si potè notare a Settembre 2010, quando cominciai a pubblicare i primi articoli sui PIC a 16bit. Dopo un anno circa di studi sui pic a 16 bit, fatti su altre schede di sviluppo, nacque il mio primo prototipo, su millefori:
Non era un granchè esteticamente ma funzionava bene: per la connessione USB avevo usato una breakout board per facilitarmi le cose. L’USB mi funzionò al primo colpo. Dopo i primi lampeggiamenti di led e cose varie passai quindi al primo prototipo con la fotoincisione. Questa volta inclusi un regolatore di tensione a 5V per poter far funzionare l’USB anche in modalità Host (volevo collegare una pendrive al PIC insomma) e quindi anche tutto il necessario da avere a portata di mano per sperimentare ma senza troppi fronzoli, volevo una cosa semplice, che non mi creasse troppi problemi.
Nacque così il secondo prototipo, ora etichettato come “REV.1”, che alcuni amici stanno ancora usando senza che perda un colpo:
La ritengo una scheda di tutto rispetto, realizzata in maniera “solida”, con piste di adeguato spessore fatte per sopportare anche correnti elevate. A bordo ci sono due regolatori di tensione: uno da 5V per poter usare l’USB anche in modalità Host ed alimentare eventualmente dispositivi esterni: il regolatore è del tipo da 1.5A così da non rimanere a corto di corrente! C’è quindi un secondo regolatore da 3.3V in cascata per alimentare il picmicro.
L’alimentazione in ogni caso può anche essere prelevata dal connettore USB device permettendo di alimentare anche l’USB Host ma senza che interferiscano le linee dati dal momento che avevo previsto due jumper per deviare tali segnali di comunicazione. Sulla scheda avevo incluso unicamente un led ed un pulsante da utilizzare per le proprie applicazioni: il minimo indispensabile, come dicevo non mi piacciono i fronzoli.
Per la connessione con il mondo esterno ho scelto da subito un sistema che mi permettesse di creare degli “shield” utilizzando le semplici basette millefori, per cui la disposizione degli header di espansione segue una certa logica. Diciamoci la verità: Arduino è sicuramente una figata, ma hanno fatto l’errore madornale di disporre gli header di espansione con un criterio piuttosto discutibile che non permette di usare una basetta millefori.
“[…] permette sicuramente di vendere i proto-shield” (cit.)
Per la realizzazione della scheda sono partito da alcuni presupposti basilari dal momento che sono io il primo utilizzatore e mi ritengo molto critico e obiettivo: ne ho provate tante e so di cosa ho bisogno. Innanzitutto ho sdoppiato ogni pin: ogni I/O del picmicro ha difatti due contatti in parallelo sugli header di espansione. E’ una funzione, questa, che ho sempre trovato utile per poter collegare un oscilloscopio o un analizzatore logico per capire “cosa” sta succedendo nelle applicazioni più complicate.
I pin di alimentazione? Molte schede di sviluppo hanno i pin di alimentazione, soprattutto la massa, “risicati”: uno o due al massimo. Quando si usa una breadboard per sperimentare, avere la possibilità di potersi collegare all’alimentazione in più punti rende la vita molto comoda: semplifica di molto i collegamenti e non siamo costretti a usare prolunghe o cavetti molto lunghi. La realizzazione di shield fatti in casa, inoltre, è sicuramente semplificata.
I due header di espansione laterali, inoltre, hanno i pin di alimentazione disposti all’inverso (cioè sono ruotati di 180° l’uno rispetto all’altro): se ad esempio ci siamo creati noi uno shield che potremmo accidentalmente montare al contrario, non corriamo il rischio di bruciare qualcosa dal momento che le alimentazioni vengono a trovarsi negli stessi, identici, punti. Non è un’idea geniale? Sono il primo a presentare una soluzione del genere e me ne compiaccio. Sono sicuro che ora molti me la copieranno ma non importa, sarete voi a dire loro: ma l’idea l’ha avuta settorezero!
Oltre a questa caratteristica, i pin di alimentazione sono ripetuti due volte di seguito lungo un header che si viene così a ritrovare diviso in due sezioni: questo permette anche di crearsi dei “mezzi shield”, sempre montabili al contrario. Ebbene si, due idee geniali così in un colpo solo non capitano molto spesso!
Mancava un’ultima cosa: la possibilità di programmare la scheda senza dovermi portare appresso il pickit ogni volta. Detto fatto, ho apportato qualche leggera modifica al bootloader della microchip (sia lato hardware sul pic, che lato pc) e ho quindi richiesto loro un PID per fare in modo che la mia scheda fosse in qualche modo “esclusiva” e me l’hanno accordato: era pronto tutto!
Comincio quindi a scrivere le prime applicazioni. Avevo bisogno di un posto dove pubblicare i codici man mano e nasce così ORbit16.com che in primo momento ho condiviso unicamente con quelli che hanno appoggiato la mia idea da subito, pochi conoscenti e amici che mi seguono da tempo, tra cui Luca che ci sta facendo su la tesi di Laurea con una roba complicatissima che prevede la triangolazione della posizione sfruttando gli ID delle celle GSM (usare un semplice GPS era roba da poppanti!).
Comunque… Passa il tempo e la mia prima applicazione prende forma, in questa foto potete capire cosa intendevo prima con “mezzi shield”:
In questa prima fase della mia realizzazione non facevo altro che prendere i dati dal ricevitore GPS, “scremarli”, e riportarli su un file di testo. Funzionava alla grande ma … non mi accontento. Aggiungo quindi un display. Un tipo di display che oramai uso per tutto, anche al posto dei classici basati su HD44780, dato che mi permette di abbellire tutto anche con simpatiche icone, assorbe molto poco, ha bisogno di solo 4 I/O per funzionare, viene alimentato a 3.3V quindi non ho problemi con i livelli logici e soprattutto, cosa più importante di tutte, costa pochissimo:
Si tratta di un display basato sul controller PCD8544 usato nei vecchi cellulari Nokia 5110 e 3310, per il quale ho scritto una libreria (completa di documentazione e istruzioni su come creare bitmap e icone). Inutile dire che i risultati furono davvero superiori a quanto mi ero preventivato. Giusto per farvi capire, senza usare costosi shield esterni ma solo con l’ORbit16, un display da 4 euro e un gps (che si può trovare in Cina anche a meno di 10 euro) questa applicazione esegue le seguenti funzioni:
- Riceve i dati dal GPS, tra cui la data, ed esegue la correzione dell’orario per riportarlo a quello usato in Italia (non credete che basti aggiungere un 2 all’orario perchè la cosa non è così semplice!).
- I dati importanti del GPS e lo stato di funzionamento sono chiaramente mostrati sul display usando anche icone.
- Registra i dati su una qualsiasi pendrive formattata con FAT16 o 32, quindi nessun filesystem “strano”.
- Premendo il pulsante presente sull’ORbit16, che funge da start/stop, viene creata una cartella nominata con data/orario di avvio e l’applicazione registra 3 files: un file CSV che riporta unicamente data/orario/coordinate, un file di testo con l’intera stringa $GPRMC restituita dal GPS e infine (cosa ultrafica) un file KML, apribile direttamente con Google Earth, che mostra sulla mappa il percorso fatto. E non venitemi a dire che non si tratta di una cosa grandiosa! Il file di testo viene registrato in ogni caso, gli altri due files soltanto se il fix dei satelliti è stato eseguito.
- Sfrutta il bootloader e rimane addirittura un altro 8/10% di memoria programma libera usando la versione gratuita di MPLAB C30 C Compiler !
L’HEX di questa applicazione lo renderò scaricabile appena possibile
Continuano gli esperimenti e i commenti positivi delle persone che usavano il prototipo e mi decido così a farmi realizzare le schede in fabbrica con serigrafia e soldermask. Ne approfitto quindi per apportare delle migliorie che altrimenti non mi erano permesse con il sistema casalingo della fotoincisione e nasce quindi la “REV.2”:
In particolare qui ho apportato numerosi miglioramenti tra cui spiccano: sicuramente la serigrafia, realizzata per avere tutte le indicazioni a portata di mano senza usare il datasheet (trovo difatti molto noioso, quando si realizza un’applicazione, dover disporre di un manuale da leggere); l’utilizzo di un deviatore per commutare la modalità USB Host/USB device (posto su una estremità per facilitarne l’uso anche con shield montati); piani di massa per consentire un’adeguata schermatura soprattutto delle sezioni di clock; ampia area di dissipazione per i due regolatori di tensione, utilizzo di pad alternativi per alcuni condensatori che consentono il montaggio di componenti con pitch diversi.
Sul retro della scheda sono inoltre presenti alcuni jumper a saldare che permettono di attivare/disattivare alcuni I/O normalmente utilizzati sulla scheda per altre funzioni. Nella documentazione sul sito ufficiale c’è scritto tutto. Ho deciso di scrivere tutto in inglese, almeno in un primo momento, dato che collaboro anche oltreoceano ma anche perchè chi si avvicina a questo tipo di cose o impara l’inglese una volta per tutte o è meglio che non ci prova affatto. In ogni caso cercherò di mettere qui su settorezero gli aggiornamenti in italiano ma orbit16.com rimarrà in inglese.
Aggiornamento: E’ ora disponibile la revisione 2A, che porta alcuni piccoli miglioramenti: serigrafia ancora più esplicita, diodo per protezione contro inversione polarità sostituito con un modello Schottky da 2A, aggiunta resistenza disinseribile su pin 28 per piena compatibilità con PIC32MX220F032B + altre modifiche minori.
Caratteristiche PIC24FJ64GB002
- Massima velocità di elaborazione: 16MiPS (32MHz)
- Possibilità di utilizzare il clock interno (8MHz o 32KHz) e liberare 2 I/O
- Memoria Flash: 64Kb
- Memoria RAM: 8Kb
- Periferiche di comunicazione digitale: 2 UART, 2 SPI, 2 I2C
- USB On-The-Go. Modulo USB con possibilità di funzionare come Host, come Device o in alternanza
- Fino a 21 I/O disponibili
- Fino a 5 CCP (Capture Compare PWM – PWM a 16bit)
- Fino a 9 ingressi analogici (10 bit di risoluzione, velocità di campionamento fino a 500mila campioni al secondo)
- 5 Timers a 16bit
- Fino a 13 canali utilizzabili come ingressi capacitivi (“touch”)
- RTCC (Real Time Clock Calendar) integrato
- Bootloader USB precaricato sul PIC24FJ64GB002 incluso con ORbit16™
- Funzione PPS per molte periferiche: è possibile scegliere su quale pin ridirezionare gli I/O di un modulo (es.: TX/RX dell’UART)
Caratteristiche ORbit16™ rev. 2A (indipendenti dal tipo di PICmicro montato)
- 3 diverse possibilità di alimentazione: da porta USB, da terminale a vite, da connettore jack standard a barile da 2.1mm
- Selezione manuale con jumper della sorgente di alimentazione
- Jumper di selezione per tipo di pic montato (PIC24FJ64GB002 / PIC32MX220F032B)
- Regolatore di tensione a 5V 1.5A, e da 3.3V 800mA
- Connettore USB tipo B (modalità device / bootloader / alimentazione da USB)
- Connettore USB tipo A (modalità HOST)
- Deviatore a slitta per modalità device/host
- La scheda può essere alimentata dal connettore USB device anche quando è in uso la modalità USB Host, senza che le linee dati interferiscano
- Header di espansione compatibili con basette millefori
- I/O e alimentazioni sdoppiate
- Linee di alimentazione ripetute 4 volte lungo un singolo header (ogni header di espansione è suddiviso in due parti, ogni parte ha 2 pin a 5V, 2 a 3.3V e 6 punti di GND per un totale di 4 punti a 5V, 4 a 3.3V e 12 di GND per ogni Header)
- Linee di alimentazione ruotate di 180° tra i due header: è possibile montare gli shield al contrario per quanto riguarda le alimentazioni
- Essendo ogni header diviso in 2 zone, è possibile utilizzare “mezzi shield”, ognuno con le proprie linee di alimentazione
- Protezione contro l’inversione di polarità
- Predisposizione per quarzo secondario da 32768Hz da usare con il modulo RTCC (componenti non forniti di serie)
- Pulsante di reset
- Led di segnalazione presenza tensione
- Led utente, escludibile con jumper a saldare (usato anche dal bootloader), la serigrafia indica su quale pin è collegato
- Pulsante utente, escludibile con jumper a saldare (usato anche dal bootloader), la serigrafia indica su quale pin è collegato
- Le linee dati utilizzate dall’USB possono essere escluse tramite jumper a saldare se non si vuole usare il modulo USB
- Serigrafia chiara: la funzione di ogni pin degli header è indicata in maniera univoca, i pin normalmente non disponibili perchè usati da altre funzioni sono riportati tra parentesi quadre: questo indica anche che è possibile utilizzarli agendo sui jumper a saldare. I pin con funzione analogica hanno un’ulteriore indicazione con un asterisco seguito da un numero che ne identifica il canale nel registro. La serigrafia fornisce anche indicazioni relativamente a quali pin hanno il modulo I2C dato che non è possibile dislocarlo su pin alternativi utilizzando la funzione PPS, a differenza, ad esempio, dell’UART che può invece essere assegnato su pin a piacere.
- Montaggio facile per coloro che vorranno il solo PCB: non ci sono componenti SMD; per alcuni condensatori potete utilizzarne con diversi pitch; il tipo di deviatore che ho scelto ammetto che è difficile da trovare perchè cercavo qualcosa di solido e ben fatto, per cui lo fornisco sempre insieme al PCB.
PICmicro utilizzabili su ORbit16™
A meno che non decidiate di optare per ORbit16™ in versione solo PCB o in KIT senza PIC, lo fornisco con il PIC24FJ64GB002 con il bootloader precaricato. Altri Picmicro utilizzabili su ORbit16™, aventi la funzionalità USB OTG e compatibili pin-to-pin, sono:
- PIC24FJ32GB002 (uguale al PIC24FJ64GB002 ma con memoria programma da 32Kb. Vantaggio? Costa meno!)
- PIC32MX210F016B
- PIC32MX220F032B
- PIC32MX230F064B
- PIC32MX250F128B
Nota: Il datasheet è lo stesso per questi due pic32 elencati + gli altri due indicati più sotto. Nell’immagine del pinout è riportato erronamente PIC32MX220F016B invece di PIC32MX210F016B
I PIC32 hanno periferiche ancora più avanzate come ad esempio l’I2S che permette applicazioni audio di un certo livello. Sul sito ufficiale di ORbit16 sono presenti anche esempi di programmazione con i PIC32MX
Altri picmicro in formato PDIP a 28 pin possono essere utilizzati su ORbit16™, ma non hanno la funzionalità USB, per cui si possono usare non montando (o non usando) i connettori USB e facendo gli opportuni aggiustamenti con i jumper a saldare.
Documentazione ed esempi
La documentazione, gli schemi e gli esempi di programmazione si trovano tutti su orbit16.com. Dal momento che settorezero risulta ad oggi uno dei siti di elettronica maggiormente vittima di sciacalli (diciamo pure tranquillamente idioti) ho deciso per ora di non rendere disponibili a tutti i codici di esempio e la documentazione ma solo a chi acquisterà la scheda (anche il solo PCB). Per ogni scheda verrà difatti fornito un codice di invito con il quale è possibile procedere all’iscrizione su orbit16.com e scaricare il materiale. E’ implicito che poi chi scarica il materiale commette comunque reato se lo ripubblica senza il mio consenso ed è quindi passibile di denuncia.
Gli esempi fanno tutti uso del bootloader, in particolare ogni esempio contiene il progetto MPLAB completo. L’utilizzo del bootloader è semplicissimo, un documento spiega sia come usarlo che come sfruttare questa caratteristica nei propri programmi. Imparerete ad utilizzarlo in 5 minuti e vi assicuro che userete sempre questa caratteristica. In ogni caso se possedete un Pickit2 o 3 o compatibile è sempre meglio dato che alcune volte (ma fin’ora mai con l’ORbit16™) mi è capitato che su altre schede di sviluppo il bootloader venisse corrotto e non funzionasse più: avendo a disposizione un programmatore è possibile riprogrammare il bootloader (scaricabile) oppure sfruttare tutta la memoria programma a disposizione utilizzando la modalità di programmazione classica a cui siamo abituati.
Nel caso vogliate usare ORbit16™ con i PIC32 elencati sopra, è necessario il Pickit3 dato che il Pickit2 non li supporta
Gli esempi presenti sul sito orbit16.com si trovano in questa pagina: https://www.settorezero.com/orbit16/home/examples/ ed è inoltre presente una pagina in cui pubblico progetti completi e finiti: https://www.settorezero.com/orbit16/home/projects/
Alcune demo hanno ovviamente bisogno di componenti aggiuntivi oltre all’ORbit16™. Personalmente ritengo che già questi esempi siano di un certo livello.
Di cosa ho bisogno per iniziare?
A parte l’ORbit16™ sono necessari:
- un cavetto USB con connettore tipo B (quello ad esempio usato sulle stampanti) in modo da sfruttare il bootloader
- avere un pickit o un programmatore compatibile è altamente consigliato ma non indispensabile per iniziare (se usate il pic32mx è necessario il pickit3, se invece usate il pic24f va bene anche il pickit2)
- avere installata l’ultima versione di MPLAB IDE
- iscriversi sul sito della microchip, scaricare ed installare MPLAB C30 C compiler (o MPLAB C Compiler for PIC32 MCUs se usate il pic32mx)
- un alimentatore è consigliato ma non indispensabile
- avere voglia di leggere
- un po’ di esperienza e dimestichezza con la programmazione dei PICmicro
In aggiunta su settorezero sono presenti alcuni articoli molto utili per cominciare con i pic a 16 bit.
Libri consigliati
Vi consiglio i libri che ho letto io, dei quali sono molto soddisfatto:
- Programming 16-bit microcontrollers in C – Learning to fly with PIC24 di Lucio di Jasio (mi fu consigliato da Guido)
- Exploring PIC32 di Lucio di Jasio
- USB Complete, Fourth Edition di Jan Axelson (mi fu consigliato da Mauro)
- Datasheet ed errata corrige del PIC24FJ64GB002
- PIC24F Family Reference Manual
- Documentazione di MPLAB C30 C Compiler. Dopo averlo installato, la documentazione si trova in:
C:\Program Files\Microchip\MPLAB C30\docs