DPM Serial Protocol


Protocollo di comunicazione seriale DPM

(Dilbertian Protocol Modified)

Nota sul nome del protocollo
Il nome “Dilbertiano” proviene dalla prima versione di questo protocollo, che chiamammo “IDP Inverted Dilbertian Protocol” (2010), nella quale gli zeri erano rappresentati con una cella “stretta” e gli uni con una cella “larga” (“0” magro e “1” grasso – come da vignetta seguente tratta da “Dilbert” di Scott Adams – www.dilbert.com).

ENGLISH

ITALIAN
dilbertian_one


Perché un nuovo protocollo ?

Il sistema Theremino si propone di fornire un sistema di Input-Output per PC semplice, poco costoso e facile da usare. Per renderlo facile da usare sono necessari l’auto-numerazione dei dispositivi e il riconoscimento dei loro tipi, per semplificare e ridurre al minimo il costo dei collegamenti è necessaria la comunicazione su un filo solo.

Non esistendo un protocollo simile abbiamo dovuto scriverlo. La versione attuale raccoglie il meglio di molti anni di sperimentazioni e ricerche.

Download di questa documentazione in formato PDF:
Theremino System -   DPM_Protocol_2015_ENG.pdf
Theremino System -   DPM_Protocol_2015_ITA.pdf


Caratteristiche

  • Comunicazione seriale bidirezionale su un solo filo.
  • Auto-configurazione.
  • Auto-riconoscimento dei dispositivi collegati.
  • Numero di dispositivi variabile da 1 a 200.
  • Numero di byte trasmessi e ricevuti variabile a seconda del tipo di dispositivo.
  • Velocità di trasmissione fino a 4 MegaBit/sec per trasmettere molti dati con cavi corti.
  • Velocità di trasmissione fino a 100 KiloBit/sec per cavi molto lunghi (fino a 10 Km).
  • Alta efficienza di comunicazione (da 10 a 20 volte maggiore rispetto al CAN).


Aspetti elettrici

La trasmissione avviene su un solo filo, ma è necessaria una massa di riferimento e una tensione di alimentazione, per cui i fili sono normalmente tre.

Ogni dispositivo che supporta il protocollo DPM deve avere un connettore di ingresso (verso il Master) e uno di uscita verso i dispositivi a valle (Slaves)

I connettori normalmente usati sono da 3 poli, con spaziatura di 2.54 mm.

Sulla catena di comunicazione deve essere presente un Master (che fornisce sincronismo e alimentazione) e un certo numero di dispositivi collegati in cascata (chiamati Slave).

La tensione che il Master fornisce sulla linea è di 5 V, con la stessa tolleranza e con la stessa corrente massima dei 5 V che si prelevano dal connettore USB.

La corrente massima che il Master può fornire rappresenta un limite al numero e al tipo di dispositivi collegabili. Questa corrente, è normalmente 250 mA, e potrebbe essere aumentata fino a 500 mA. Andando oltre si supererebbe la capacità dell’USB e si imporrebbero caratteristiche inusuali ai connettori.

Il numero massimo di dispositivi collegabili è limitato dai fattori seguenti:
– La corrente massima che il “Master” può fornire.
– Il numero massimo di byte che la linea sopporta in tempo di ciclo di rice-trasmissione.

Sia il “Master” che gli “Slave” sono collegati alla linea con un resistore di smorzamento, che agisce anche come passa basso, contro i disturbi radio e come protezione contro le sovratensioni. Il valore di questo resistore è normalmente da 33 a 330 ohm


Formato di trasmissione

Si usa un formato Non-Return-to-Zero (NRZ) standard.

Default format =  8, N, 1
– 1 start bit
– 8 data bits
– no-parity
– 1 stop bit


Livelli della linea dati “Com.Line”

La linea a riposo è a livello alto (3.3 V)
Il segnale “1” è indicato con 3.3 V
Il segnale “0” è indicato con 0 Vdilbertian two


Tempi di ripetizione e velocità di trasmissione

Velocità di trasmissione
Si usano velocità basse quando la lunghezza, e quindi la capacità dei cavi di collegamento, sono alte. Quando invece le distanze sono brevi si possono usare velocità alte e comunicare con un gran numero di dispositivi (o comunicare con dispositivi che richiedono un gran numero di byte) Sono stabilite le velocità denominate da “1” (1 k bit/Sec) fino a “12” (4 mega bit/Sec)

Numero massimo di byte
A seconda della velocità di trasmissione il numero massimo di byte che si possono trasmettere è elencato nella tabella seguente.


Tempi, distanze e numero di byte

Speed
bit time
bit
per
second
Bytes
every
15mS
Bytes every
30mS
Max distance
Max capacity
Slaves
max
number
1
1 mS
1K
1
3
10 Km
1 uF
3
2
500 uS
2K
3
6
5 Km
500 nF
6
3
200 uS
5K
4
8
2 Km
200 nF
15
4
100 uS
10K
15
30
1 Km
100 nF
30
5
50 uS
20K
30
60
500 m
50 nF
60
6
20 uS
50K
40
80
200 m
20 nF
150
7
10 uS
100K
150
300
100 m
10 nF
160
8
5 uS
200K
300
600
50 m
5 nF
80
9
2 uS
500K
400
800
20 m
2 nF
32
10
1 uS
1M
1500
3000
10 m
1 nF
16
11
500 nS
2M
3000
6000
5 m
500 pF
8
12
250_nS
4M
6000
12000
2.5 m
250 pF
4

Tutti i dispositivi devono implementare per lo meno la velocità “7” che è considerata la velocità di default.  Se si desidera impostare una velocità diversa dalla “7” tutti i dispositivi della catena devono supportarla.

La “massima distanza” dipende dalle caratteristiche dei cavi, i valori della tabella sono calcolati per un cavo schermato RG58 da 50 ohm con capacità di 100pF per metro.

Alle velocità basse il numero di “slaves” è limitato dal numero massimo di byte che si possono trasmettere in 30 millisecondi. (ogni slave usa almeno un byte e si pretende una ripetizione abbastanza veloce da rendere i movimenti fluidi)

Alle velocità alte il numero di “slaves” è limitato dalla capacità massima, ogni “slave” aggiunge una capacità di circa 40..60 pF e riduce la massima distanza di circa 50 cm.

La capacità è stata calcolata sulla base di 30pF per ogni “slave” cui si aggiungono altri 20pF per un cavo di collegamento da 20 centimetri e altri 10pF per tenere conto della resistenza aggiuntiva provocata dal “bilateral switch” (totale: 60pF)


Massima lunghezza del cavo di comunicazione rispetto alla corrente di alimentazione e alla resistenza per metro

Cable type —>
 
Maximum current
( peak current )
H1500/H1000/ H500/H155/RG11
20 milli ohm 
or less
per meter
RG58/RG59U/ H155/
net cables
about
 50 milli ohm
per meter
RG59/RG6/phone twisted wire/
net cables
about 
100 milli ohm
per meter
10 mA 1 Km 400 m 200 m
20 mA 500 m 200 m 100 m
50 mA 200 m 80 m 40 m
80 mA 125 m 50 m 25 m
100 mA 100 m 40 m 20 m
200 mA 50 m 20 m 10 m
400 mA 25 m 10 m 5 m
500 mA 20 m 8 m 4 m
800 mA 12.5 m 5 m 2.5 m
1 A 10 m 4 m 2 m

Nel calcolo della distanza si tiene conto che la caduta di tensione sul polo di massa, non superi i 200 mV. La caduta di tensione sul filo di alimentazione, non provocando errori di trasmissione, può essere anche molto maggiore (i 5 V possono scendere fino a 3.3 V senza creare problemi) In caso di cavi schermati il polo di massa è lo schermo, che normalmente ha una resistenza minore di quella dichiarata, quindi la distanza sarà maggiore.


Capacità dei cavi di collegamento

I valori di “massima lunghezza” indicati nella tabella precedente sono validi solo per cavi di collegamento con capacità di circa 100 pF per metro. La tabella seguente mostra le correzioni da applicare per i cavi di uso più comune.

Cable
External
diameter
( mm )
Impedance
( ohm )
Capacity
(pF/mt.)
Resistance
(milliohm
/ meter)
Max length corrector
H1500
15
50
80
4
x 1.25
H1000
10.3
50
80
11
x 1.25
RG213
10.3
50
100
 
H500
9.8
50
82
15
x 1.22
H155
5.8
50
82
32
x 1.22
RG8
10
52
90
 
RG11 (TV)
10.3
75
60
21
x 1.7
RG59 (TV)
6.15
75
67
159
x 1.5
RG6_(TVsat)
6.8
75
51
100
x 2.0
RG56/U_(TV)
6.9
75
53
 
x 2.0
RG59/U_(TV)
4.5
75
53
45
x 2.0
RG58
5.2
50
100
53
RG142
4.95
50
96
 
RG174
2.8
50
100
 
RG178
1.85
50
95
 
RG179
2.55
75
64
 
x 1.5
RG187
2.7
75
65
 
x 1.5
RG188
2.7
50
95
 
RG196
1.9
50
93
 
RG316
2.5
50
95
 
Net cable
 
 
min 50
max 130
min 60
max 200
x 2.0
x 0.7
PC Audio cable
 
 
min 120
max 300
min 500
max 3000
x 0.8
x 0.5
Microphonic
cable
 
 
min 60
max 300
 
x 1.7
x 0.3
Telephone twisted wire
 
 
50
100
x 2.0

Esistono anche cavi a bassa capacità (poco usati e difficilmente reperibili):

  • RG62 – 93 ohm – 44 pF/mt
  • RG71 – 93 ohm – 44 pF/mt
  • RG210 – 93 ohm – 44 pF/mt
  • RG63 – 125 ohm – 33pF/mt
  • RG114 – 185 ohm – 27pF/mt

Misurare la capacità di un cavo sconosciuto:

  • Preparare il cavo schermato spellandolo e mantenendo isolato il filo centrale.
  • Misurare tra centrale e schermatura esterna con un tester o capacimetro.
  • Per migliorare la precisione di misura, usare cinque o dieci metri di cavo.
  • Dividere il valore di PicoFarad misurato per il numero di metri di cavo.


Tipi di dispositivi

I dispositivi sono identificati con un numero da 0 a 199 che identifica il suo “Type”.
Nella fase di riconoscimento e numerazione ogni dispositivo si identifica con questo “Type”.

Attualmente sono definiti i dispositivi seguenti:

Device Type
Speed
min
Speed max
In out Pins
Power
Name
0
Special “custom” type
1
1
12
1
12 mA
Capacitive Sensor
Hi Quality
2
1
12
10
InOut Servo
3
1
12
12
InOut Generic
4
1
12
12
InOut
5
6
Virtual Master Pins
(first version)
8
10
Virtual Master Pins – V2
9 12 Virtual Master Pins – V4
255 Unknown

Numero massimo di dispositivi
Il numero massimo di dispositivi collegabili è limitato da:
– il numero massimo di byte che possono essere trasmessi a seconda della velocità selezionata.
– la corrente massima che il “master” può fornire (normalmente 500 mA)
– il massimo numero di dispositivi supportato dal protocollo che è 200 (da 0 a 199)


Tipi di pin

I pin sono identificati con un numero da 0 a 255 che identifica il suo “PinType”.

OUTPUT Pin Types

Output Pin
Type
Name
Master to Slave
bytes
Slave to Master
bytes
0
UNUSED
0
0
1
DIG_OUT
1
0
2
PWM_8
1
0
3
PWM_16
2
0
4
SERVO_8
1
0
5
SERVO_16
2
0
 6  STEPPER  4  0
7 PWM_FAST 5 0

INPUT Pin Types

Input Pin
Type
Name
Master to Slave
bytes
Slave to Master
bytes
129
DIG_IN
0
1
130
DIG_IN_PU
0
1
131
ADC_8
0
1
132
ADC_16
0
2
133
CAP_8
0
1
134
CAP_16
0
2
135
RES_8
0
1
136
RES_16
0
2
140
COUNTER
0
2
141
COUNTER_PU
0
2
142
FAST_COUNTER
0
2
143
FAST_COUNTER_PU
0
2
144
PERIOD
0
4
145
PERIOD_PU
0
4
146
SLOW_PERIOD
0
4
147
SLOW_PERIOD_PU
0
4
150
USOUND_SENSOR
0
2
160
CAP_SENSOR
0
3
165
STEPPER_DIR
0
4
180
ENCODER_A
0
2
181
ENCODER_A_PU
0
2
182
ENCODER_B
0
0
183
ENCODER_B_PU
0
0
175
ADC_24
0
1
176
ADC_24_DIN
0
0
177
ADC_24_DOUT
0
0


Comunicazioni tra Master e Slaves  (linea seriale)

Primo byte Tipo di trasmissione Trasmissione Ricezione
255 (*4) Comando speciale esteso
(per future espansioni)
1 byte (estensione)
>>>>> vedere la tabella dei comandi estesi <<<<<
254 (*1) RecogStart
Inizio riconoscimento
e numerazione
1 byte (numero byte dati = 0)
1 byte (CRC di Cmd / 0)
253 (*2) Recog
Invio numero progressivo e richiesta del tipo
1 byte (numero byte dati = 1)
1 byte (da 0 a 199)
1 byte (CRC di Cmd/Nbytes/Type)
1 byte ( tipo )
1 byte ( CRC )
251 (*3) FastDataExchange
Scambio di dati veloce.
1 byte (numero byte dati = 0)
1 byte (CRC di Cmd/0)
da 0 a 60 byte di dati
Da 0 a 63 byte di dati
249 (*4) SetupSlavePins
Invio delle impostazioni per i
pin di uno “slave”
1 byte (slave index)
1 byte (numero di byte dati)
nn byte (PinTypes: 1 byte per pin)
1 byte (CRC di Cmd/SlaveId/ etc..)
1 byte (slave index)
1 byte (CRC sul byte
precedente)
248 (*4) SetMasterName
Invio del nome del “master”
nn byte (caratteri del nome terminati con zero)
247 (*4) GetMasterName
Lettura del nome del “master”
nn byte (caratteri del
nome terminati con zero)
246 (*4) SendValuesToSlave
Invio di “n” bytes
a slave “m”
(max 56 byte)
1 byte (slave index)
1 byte (numero di byte)
byte 1 . . . byte n
1 byte (CRC di
Cmd/SlaveId/nBytes/n)
1 byte (slave index)
1 byte (CRC sul byte
precedente)
245 (*4) GetValuesFromSlave
Richiesta di “n” bytes da slave “m”
(max 56 byte)
1 byte (slave index)
1 byte (numero di byte)
1 byte (CRC di Cmd/SlaveId/nBytes)
byte1 . . byte n
1 byte (slave index)
1 byte (CRC sugli
n + 1 byte precedenti)
244 (*4) SendBytesToSlave
Invio di “n” bytes a slave “m”
(max 56 byte)
1 byte (slave index)
1 byte (numero di byte)
byte 1 . . . byte n
1 byte (CRC di
Cmd/SlaveId/nBytes/n)
1 byte ( slave index )
1 byte ( CRC ) sul byte
precedente
243 (*4) GetBytesFromSlave
Richiesta di “n” bytes da slave “m”
(max 56 byte)
1 byte (slave index)
1 byte (numero di byte)
1 byte (CRC di Cmd/SlaveId/nBytes)
byte 1 . . . byte n
1 byte (slave index)
1 byte ( CRC ) sugli
n + 1 byte precedenti
199 (*5) SetSpeed 1 byte (Comm. Speed)
1 byte (CRC su Cmd/Comm.Speed)
0 Nessuna azione

(*1) Comandi di servizio.
(*2) Il comando Recog viene usato solo dal master e dagli slaves durante il riconoscimento.
(*3) Comunicazione veloce – il master scambia i valori con tutti gli slaves usando un solo scambio USB
(*4) Comandi di comunicazione sicura verso il singolo slave
(*5) Comandi speciali

SendValuesToSlave invia i valori ai Pin di Output di uno slave (virtuale sul Master o Fisico nei moduli Slaves)

GetValuesFromSlave legge i valori dai Pin di Input di uno slave (virtuale sul Master o Fisico nei moduli Slaves)

SendBytesToSlave invia byte generici (ad esempio di configurazione), verso uno slave (virtuale sul Master o Fisico nei moduli Slaves)

GetBytesFromSlave legge byte generici  (ad esempio di stato), da uno slave (virtuale sul Master o Fisico nei moduli Slaves)

Tutti i comandi hanno codici da 200 a 255, per evitare che, in caso di errori, gli ID e i tipi degli slave (da 0 a 199) possano venir interpretati come comando. (SetSpeed non conta perché non viene mai inviato lungo la linea seriale ma solo dall’HAL, verso il Master, via USB)


Comunicazioni tra Host computer e Master  (USB)

Comandi da “Host” verso “Master”

Command name ID
USB_TxData[0]
PARAMETERS
USB_TxData[1 to n]
RecogStart CommandID, Nbytes
FastDataExchange CommandID, From 0 to 60 data bytes
SetupSlavePins CommandID, SlaveId, Nbytes
SetMasterName CommandID, MasterName (zero terminated)
GetMasterName CommandID,
SendValuesToSlave CommandID, SlaveId, Nbytes, Byte1….ByteN
GetValuesFromSlave CommandID, SlaveId, Nbytes
SendBytesToSlave CommandID, SlaveId, Nbytes, Byte1….ByteN
GetBytesFromSlave CommandID, SlaveId, Nbytes
SetSpeed CommandID, CommSpeed

Risposte da “Master” verso “Host”

Command name RESPONSE
USB_RxData[0]
RETURN VALUES
USB_RxData[1 to n]
RecogStart 0 = OK Nslaves, Slave Type1 … Slave Type N
FastDataExchange 0 = OK From 0 to 63 data bytes
SetupSlavePins 0 = OK
SetMasterName 0 = OK
GetMasterName 0 = OK Master Name (zero terminated)
SendValuesToSlave 0 = OK
GetValuesFromSlave 0 = OK Byte 1 … Byte N
SendBytesToSlave 0 = OK
GetBytesFromSlave 0 = OK Byte 1 … Byte N
SetSpeed 0 = OK

La posizione zero del Buffer USB indica se il comando è stato eseguito dal “Master” con successo.


Calcolo dei CRC

Tutti i CRC usati sono calcolati su un certo numero di byte consecutivi e il CRC risultante è un byte. Per il calcolo del CRC si usa un algoritmo basato sul “Longitudinal redundancy check”.

Longitudinal redundancy check

Dim CRC as Byte 
CRC = 0 
For each byte b 
    CRC = CRC Xor b 
Next

Per evitare “collisioni” tra sequenze banali ( ad esempio 0000 = 1111 o 123 = 321 ) e  sequenze semplici che producono CRC validi ( ad esempio 0000 con CRC = 0 ) il metodo precedente viene modificato con una permutazione.

Il calcolo del CRC risultante è efficiente ed estremamente semplice.

Calcolo del CRC usato in questo protocollo

Dim CRC as Byte 
CRC = 0 
For each byte b 
     CRC = CRC Xor b 
     CRC = CRC + 1 
Next 


Impostazione della velocità di trasmissione

Se si decide di usare una velocità di trasmissione diversa da quella di default, allora il “master” deve comunicare a tutti i dispositivi della catena la nuova velocità da usare.

Questa impostazione deve essere possibile anche prima di aver effettuato un ciclo di riconoscimento dei dispositivi e deve essere possibile anche con linee di trasmissione molto lunghe. Pertanto esiste il comando speciale che viene ora illustrato.

1 – Il Master mantiene la linea alta per 50 mS
2 – Tutti gli Slave sono sicuramente posizionati in attesa di un carattere
3 – Il Master genera un BREAK (linea a livello basso per 12 bit alla minima velocità
4 – Il Master emette un carattere 55h (01010101) al baud rate desiderato
5 – Tutti gli Slave deducono il baud rate da questo byte (auto-baud)
6 – Il Master invia un byte che specifica la “Speed” (da 1 a 12)
7 – Il Master invia un byte di CRC calcolato su due byte (cmd/speed)
8 – Se lo Slave riscontra un errore non cambia la sua velocità

dilbertian eig

Verifica della velocità di trasmissione

Se imposta una velocità troppo alta per la linea di trasmissione in uso è possibile che alcuni dispositivi della catena non siano in grado di sostenere la velocità impostata e che si verifichino errori durante la trasmissione dei dati.

Se gli errori di trasmissione sono pari a zero o minori dello 0.1% allora la velocità impostata è valida.


Riconoscimento e numerazione

1 – Il Master emette verso gli Slave tutta la sequenza di impostazione “Speed” per assicurarsi che tutti comunichino alla stessa velocità.
2 – Il Master non trasmette comandi per 50 millisecondi.
3 – A questo punto tutti gli Slave dovrebbero essere in attesa di un comando.
4 – Il Master emette un codice “254″ (RecogStart).
5 – Tutti gli Slave mettono il weak-pull-up (100-400 uA) sul filo di input-output e aprono il collegamento di uscita verso i dispositivi a valle. Inoltre essi non rispondono più a nessun comando tranne il “253″ (Recog).
6 – Il Master” emette un codice “253″ (richiesta del tipo) e poi un byte con il numero “0″, il primo dispositivo della catena risponde un byte con il suo tipo, toglie il pull-up, collega l’uscita verso gli Slave a valle e non risponde più a nessun comando.
7 – Il Master emette un codice “253″ (richiesta del tipo) e poi un byte con il numero “1″, il secondo dispositivo della catena risponde un byte con il suo tipo, toglie il pull-up, collega l’uscita verso gli Slave a valle e non risponde più a nessun comando.
8 – Il Master emette un codice “253″ (richiesta del tipo) e poi un byte con il numero “2″,

           …. il “253” (richiesta del tipo) viene ripetuto fino ad un massimo di 200 volte
 
Quando nessun dispositivo risponde più per una durata maggiore di 10 bit alla velocità di trasmissione attuale, significa che la catena è finita. Per evitare questo calcolo, si può usare un time-out di 12 mS che funziona sempre, anche alla velocità più bassa.
 

9 – Il Master emette verso gli Slave tutta la sequenza di impostazione “Speed”, che riporta tutti gli Slave nella modalità di normale comunicazione.
10 – Il Master comunica all’Host (PC) tramite USB il numero di Slave riconosciuti e il tipo di ciascuno di essi.

 Roberto_Cena & Livio_Cicala (2010 – 2016)


Ottenere i moduli del sistema

Il team del sistema Theremino si occupa solo di ricerca e non vende hardware. Il sistema è completamente “Freeware”, “Open Source”, “No Profit” e “DIY”, ma esistono produttori che possono fornire i moduli assemblati e collaudati a un ottimo prezzo. Difficilmente si potrebbe auto-costruirli spendendo meno. Un elenco dei produttori in questa pagina: www.theremino.com/contacts/producers


Donazioni
 

Il codice sorgente dei nostri programmi non contiene note sul copyright, nomi degli autori e link al nostro sito, per cui potete farne ogni uso, senza limitazioni di alcun genere. Non chiediamo di specificare la fonte originale o il nostro sito ma se sarete contenti del nostro software ricordatevi di noi e fate conoscere questo sito ai vostri amici. Eventuali donazioni, anche piccole, sono molto gradite e possono aiutarci a mantenere il software “free” ed a produrne sempre di nuovo.

Comments are closed.