Protocolli seriali utilizzati dai calibri digitali. Analisi del protocollo 1×24
I calibri digitali oramai si trovano ad un prezzo davvero basso: possono essere acquistati per meno di 10 euro nei mercatini o sulla rete e sono un valido strumento di misura per le nostre applicazioni hobbystiche.
La stragrande maggioranza di tali calibri economici sono prodotti in Cina (diciamo pure tranquillamente: tutti!) e presentano su un lato un connettore, chiuso da un coperchio in plastica, che permette di “tirar fuori” la misura per poterla inviare ad un qualsiasi dispositivo per effettuare la lettura (es.: su un pc o su un display più grande) o meglio a un DRO (Digital ReadOut).
Per tale motivo in molti si sono dilettati a costruire interfacce per questi strumenti in maniera da poterli anche collegare a CNC o altri strumenti che necessitano sistemi di misurazione.
Il problema, però, è che non tutti i calibri seguono lo stesso protocollo per l’invio dei dati. Si tratta in ogni caso di protocolli di comunicazione seriali sincroni simplex: abbiamo sempre una linea di clock e una linea dati e il calibro può solo trasmettere ma non ricevere.
Indice dei contenuti
Protocolli usati dai calibri digitali
Protocollo Sylvac (o “2×24”)
Questo sembra essere il protocollo più diffuso. I dati sono inviati in forma di due pacchetti da 24 bit ciascuno, separati da una pausa di circa 100μS (a livello logico alto). All’inizio del primo pacchetto e alla fine del secondo, vi è un’ulteriore pausa di circa 50μS (sempre a livello logico alto). Tra un burst di dati e l’altro ci sono pause più o meno lunghe a livello logico basso. Il burst di dati completo dura circa 850μS. Il primo pacchetto di 24bit da un’indicazione della misura “assoluta” ovvero di una misurazione rispetto ad uno “zero teorico” fissato nello strumento, non noto e variabile da strumento a strumento. Si capisce, quindi, che questi primi 24 bit non ci servono a nulla. Il secondo gruppo di 24bit fornisce invece una misurazione relativa allo zero da noi effettuato sullo strumento ed è quindi questo pacchetto di dati da prendere in considerazione. Il numero fornito da questo sistema non rappresenta la cifra visualizzata dal calibro ma è un numero in proporzione: ogni pollice corrisponde al numero 20480, ogni mm a 806299. I dati sono inoltre inviati in complemento a due per distinguere le misure negative da quelle positive. Un bit indica se la misura è espressa in pollici o mm. I dati sono inviati in continuo dal bit meno significativo verso il più significativo.
Protocollo “Chinese BCD” o “7-BCD”
Tale protocollo è più raro da trovare. In questo protocollo (il nome ovviamente non è ufficiale), i dati vengono inviati in formato BCD. Sono in pratica inviati 7 nibble (gruppi di 4 bit) per un totale di 28bit. Ogni nibble identifica una cifra visualizzata dal calibro ed è espressa in formato BCD. Il pacchetto completo di 28bit dura circa 780μS e tra un burst e il successivo passano circa 320mS. Le pause anche qui sono a livello logico basso. I dati sono inviati in continuo. Vi è un bit che determina il segno della misura e un bit che indica l’unità di misura. Su alcuni calibri utilizzanti tale protocollo, i dati vengono inviati anche a strumento spento (!).
Questi due primi protocolli in genere vengono classificati genericamente come Chinese Scale Protocol (protocollo dello strumento cinese…) e sono più o meno affetti da “glitch” sul segnale, ovvero brevi spike di tensione sulla linea dati che possono compromettere la misura se non viene effettuata in maniera accurata. Inoltre, pur non potendo comunicare in maniera bidirezionale, pare che le linee clock e dati su alcuni strumenti possono essere portate a livello logico alto per eseguire il reset da remoto e cambiare la velocità di invio dati.
Protocollo Digimatic (Mitutoyo)
Questo protocollo lo si trova unicamente sugli strumenti (sia calibri che non) della nota giapponese Mitutoyo. Il protocollo in questione è molto più elaborato dei precedenti. Vengono inviati 13 gruppi da 4 bit (52bit in tutto) che forniscono la misura in formato BCD più numerose altre informazioni. Oltre alla linea dati e clock qui vi è una linea di “ready” che viene portata dallo strumento a livello basso quando una misura è pronta per essere inviata e una linea “request” che va portata a livello basso dallo strumento che effettua la lettura per ricevere la misura. I dati quindi sono inviati solo su richiesta.
Informazioni sui protocolli
Non mi dilungherò ulteriormente dato che maggiori informazioni su questi 3 protocolli possono essere trovati ai seguenti link:
- http://www.yadro.de/digital-scale/protocol.html
- http://www.shumatech.com/support/chinese_scales.htm
- http://pcbheaven.com/exppages/Digital_Caliper_Protocol
- http://www.robotroom.com/Caliper-Digital-Data-Port.html
- http://www.tinaja.com/glib/muse145.pdf (articolo sul protocollo digimatic)
- http://users.skynet.be/peter.smolders/digital_caliper_schematics.htm (esempio di circuito di interfacciamento)
- http://www.compendiumarcana.com/caliper/ (adattatore calibro/RS232 – solo per calibri con protocollo Sylvac)
- http://www.sonsivri.com/forum/index.php?topic=29876.0 (pinout strumenti Mitutoyo)
In questo articolo, come avrete capito dalla brevità delle descrizioni, parlerò di un protocollo di cui non ho trovato documentazione e che ho “scoperto” essere presente sul mio calibro. Parlando con altri pare che non sia l’unico ad avere il calibro che spara fuori i dati con nessuno dei protocolli qui menzionati, per cui ho ritenuto opportuno colmare tale lacuna e documentarla opportunamente.
Si è pensato di chiamare tale protocollo come “1×24” dal momento che invia un solo treno dati composto da 24bit e che seguono un andamento completamente diverso dal 2×24 visto in precedenza. Vedremo dopo come interpretare i dati.
Cominciamo innanzitutto con lo smontaggio del calibro in maniera tale da poterci facilmente agganciare al connettore che, come potrete immaginare, non è standard, ed è comunque comune anche agli strumenti che seguono il protocollo Sylvac e il 7BCD (ma NON quello della Mitutoyo).
Montiamo un connettore standard sul calibro
Su un fianco del calibro è generalmente presente un coperchietto che deve essere sfilato per poter accedere al connettore:
La piedinatura seguita da questo calibro è la stessa di quella utilizzanti i “Chinese scale protocols”. Abbiamo GND e +V che corrispondono ai capi della batteria e quindi la linea dati e clock che hanno i livelli di tensione uguali a quelli della batteria:
Basterebbe utilizzare, per collegarsi a tale connettore, una spinetta a innesto a 4 poli, il problema è che non ho trovato in giro niente di adatto allo scopo
Qualcosa l’ho trovato qui ma è difficile dire se poi quello spinotto va bene su tutti i calibri e in ogni caso il prezzo lo trovo davvero esagerato.
Ho pensato, così, di saldarci su un connettore a 4 pin a passo ristretto (quelli a passo standard da 2,54mm sono troppo grandi):
In realtà potrebbe essere utilizzato anche un connettore a 3 pin in quanto l’alimentazione possiamo anche tralasciarla (abbiamo bisogno solo della massa, clock e dati), ma se poi un giorno ci viene in mente che forse sarebbe meglio alimentare il calibro dall’esterno piuttosto che con la batteria?
Il connettore illustrato nella foto si trova facilmente nei videoregistratori e nelle tv. Per cui se avete qualche apparecchiatura del genere in casa (ovviamente guasta, da gettare via) e siete come me, che non buttate via mai niente, ne troverete a bizzeffe con tanto di connettore femmina munito di cavo. Ho avuto pure la fortuna di trovare un cavetto con un filo nero ad una estremità che farò capitare dal lato della massa.
Giriamo il calibro: sulla parte posteriore è presente un adesivo:
rimuoviamolo delicatamente in maniera tale, poi, da poterlo rimettere al suo posto:
Appaiono quindi 4 viti da togliere:
Oltre a queste 4 viti c’è anche da rimuovere la vite del nottolino
Possiamo quindi asportare la parte metallica del calibro per esporre il circuito:
Per rimuovere il circuito è necessario togliere altre 4 viti, più piccole, e la batteria:
Fate particolare attenzione a non rovinare la striscetta di gomma conduttiva del display e a non perdere i tastini
Vediamo innanzitutto come posizionare e orientare il nostro connettore. Nel mio caso avendo il cavetto nero da un lato dovrò fare in modo che quel pin capiti sulla piazzola di massa.
Il connettore, però, nel mio caso è leggermente più grande dell’incavo a disposizione sul calibro:
per cui devo ricorrere ad un pizzico di “forza bruta” per fare in modo da non avere problemi sia per l’alloggiamento del connettore che durante il successivo rimontaggio:
Ora il connettore alloggia perfettamente nell’incavo a lui destinato, possiamo quindi procedere alla saldatura. Come potete vedere tale connettore ha un passo leggermente più grande rispetto a quello delle piazzole sul calibro, ma si tratta di pochi decimi di millimetro che, se la saldatura è eseguita bene, non causano problemi di cortocircuito tra piazzole adiacenti:
Una volta appurato che, dopo la saldatura, scheda e connettore alloggiano perfettamente, possiamo procedere a rimontare tutto
Adesso sarà molto più facile condurre gli esperimenti, senza ricorrere a quel sistema orrendo di saldare i cavetti direttamente sul pcb del calibro:
Il protocollo “cinese” 1×24
Come detto in precedenza, i dati forniti dal mio calibro seguono un protocollo 1×24 (chiamato così per distinguerlo dal 2×24) nel quale però i dati sono inviati in formato completamente diverso rispetto al Sylvac.
Innanzitutto collegando il calibro all’oscilloscopio posso tranquillamente affermare che in questo calibro non ho trovato problemi di “glitch”, ovvero brevi spike di tensione sulla linea dati che possono causare false letture.
Per decifrare i dati, però, in questi casi è sicuramente molto più proficuo l’utilizzo di un analizzatore logico. Personalmente ho utilizzato un analizzatore Zeroplus LAP-C(16128), settato, dopo varie prove, con le seguenti impostazioni:
- Frequenza di campionamento: 50KHz
- Memoria RAM: 128K senza compressione (ne bastava anche meno!)
- Trigger al 50%, livello di tensione personalizzato a 0.5V, fronte di discesa del clock
Vediamo come appaiono i dati all’analizzatore logico:
e all’oscilloscopio:
![oscilloscopio1](https://www.settorezero.com/wordpress/contents/2010/10/oscilloscopio1.png)
In pratica tra un burst di dati e il successivo vi sono circa 189mS. Ingrandiamo un singolo burst di dati:
All’oscilloscopio il segnale risulta molto pulito e senza disturbi:
Il singolo burst di dati dura circa 15mS. Il clock non è regolare: considerando come “colpo di clock” il fronte di salita, vediamo che ogni 3 colpi della durata di circa 360μS, ce n’è un quarto più lungo di circa 660μS. Poco male in quanto i dati seguono comunque lo stesso andamento del clock. Nell’immagine il calibro stava leggendo la misura 0.00mm.
Il primo fronte di discesa del clock (indicato sull’immagine dalla barra verticale gialla) segnala l’inizio del burst di dati, i dati personalmente li ho interpretati sul fronte di salita del clock altrimenti non mi trovo bene con l’ultimo dato che termina nel punto in cui vi è la barra azzurra. Vediamo che in un certo senso i dati, seguendo l’andamento temporale del clock, è come se fossero suddivisi in 6 gruppi da 4 (24 bit in totale). Vediamo che la condizione di idle è livello logico alto per cui le uscite dati del calibro dovrebbero essere del tipo a collettore aperto e vengono tenute alte da una resistenza di pull-up. Notiamo inoltre che, con la lettura a 0,00mm, tutti i bit si trovano a livello logico basso.
La prima prova che ho fatto è stata quella di premere il pulsante per effettuare il cambio di unità di misura in maniera tale che il valore letto sia indicato in pollici (inch) anzichè in mm. Il segnale, come era logico aspettarsi, cambia leggermente:
Un occhio attento si rende subito conto che è variato unicamente il bit più a destra: in pratica con la misura in pollici tale bit vale 1, mentre con la misura in mm tale bit vale zero.
Procedendo in questo modo risulta molto semplice identificare il sistema di trasmissione. Continuando a fare varie prove è venuto fuori che i dati possono essere interpretati (usando un microcontrollore) tenendo conto di queste considerazioni:
- Il dato viene inviato a partire dal bit meno significativo (LSB – bit 0) verso il più significativo (MSB – bit 23). Facendo quindi riferimento alle immagini che vi ho mostrato, il bit più a destra, (che vi ho anticipato identifica l’unità di misura), è il bit numero 23. Il bit più a sinistra è il bit numero 0 ed è quello che viene trasmesso per primo.
- E’ possibile validare un bit di dati sul fronte di salita del clock.
- Cominciare la misurazione (la rilevazione dei dati) dopo che è passato un tempo superiore ai 15mS (tempo di un burst di dati) durante il quale sia la linea dati che la linea clock si trovano a livello logico alto. Questo periodo dura in media 189mS. La misura si può incominciare nel momento in cui il clock realizza il primo fronte di discesa. Dopodichè si possono prelevare i bit dalla linea dati sul fronte di salita per 24 volte.
I dati, avendo gli strumenti adatti, possono quindi essere decifrati abbastanza facilmente:
Bit 23: unità di misura (0=mm, 1=pollici)
Bit 22 e 21: inutilizzati, si trovano sempre a zero
Bit 20: segno (0=positivo, 1=negativo)
per cui vediamo che, essendo presente un bit per il segno, non dovremo eseguire il complemento a due!
Bits dal 19 al 0: misura (20 bits)
A seconda che la misura sia espressa in mm o in pollici, il significato dei rimanenti bit varia leggermente. Teniamo sempre presente una cosa importante: con la misura in mm abbiamo 2 decimali, con la misura in pollici ci sono 3 decimali più un quarto digit che, se acceso, vale sempre 5 ed aggiunge quindi 0,0005 pollici alla misura.
Misura in mm
I bit dal 19 al 0 (il dato così come giunge all’oscilloscopio deve essere letto da destra verso sinistra (dal bit meno significativo verso il più significativo: teniamo conto che i dati sono trasmessi dall’ LSB al MSB) indicano la misura in mm moltiplicata 100. In pratica se sul calibro leggo 2,17mm, questi bit me li ritrovo a 10011011000000000000 che letto da destra verso sinistra diventa (tralasciando gli zeri iniziali che in un numero binario non sono significativi): 11011001 ovvero proprio 217 in decimale! Per cui, come vedete, non ci tocca fare nessuna cervellotica conversione per ottenere il dato che ci interessa: basta prelevare questi bit al contrario (il primo bit ricevuto occuperà la posizione più a destra), convertirli in decimale e dividere il numero ottenuto per 100. In pratica è come se la misura venisse inviata in dm.
Misura in pollici
Il bit 0 se posto ad 1, aggiunge il famoso 0,0005 alla misura (vale quindi 2^-1), mentre i bits dal 1 al 19 indicano la misura espressa in pollici moltiplicato 1000. Se lo strumento mi indica 0,123 pollici, i bit dal 1 al 19 mi forniscono il numero decimale 123. Se il calibro legge 0,1235 (il 5 piccolo, che può valere solo ed esclusivamente 5!) il calibro fornisce sempre 123 ma il bit 0 sarà posto ad 1.
Ho preparato qui un’immagine di esempio che chiarisce ogni dubbio:
Considerazioni finali
Durante l’interfacciamento con un microcontrollore si dovrà tenere conto che i livelli di tensione del calibro sono inadatti per un interfacciamento diretto con una logica TTL in quanto il livello logico alto è settato al livello di tensione della batteria, ovvero circa 1.5Volts, per cui dovrà essere utilizzato un sistema per adattare il livello: un mosfet o un comparatore tipo l’LM393. In questo articolo vi illustro un semplice sistema che ho utilizzato con successo.
Non avendo a disposizione un oscilloscopio o un analizzatore logico è impossibile sapere con quale protocollo il vostro calibro invia i dati ma in linea di massima (a meno che non si tratti di uno strumento della Mitutoyo) dovrebbe seguire il protocollo qui esposto oppure il sylvac (2×24). Data la maggiore semplicità del protocollo che ho qui esposto non escludo che il Sylvac sia stato abbandonato a favore di questo.
Links
- Collegare il calibro ad un microcontrollore
- MuIn Caliper - Firmware PIC18F2550 per lettura calibro (283 download)
- Software su PC per leggere il calibro: Digital Caliper Readout