# Data Matrix

Data Matrix è un codice a barre bidimensionale a matrice, composto da celle (o moduli) bianche e nere disposte all'interno di uno schema di forma rettangolare o quadrata.

## Panoramica

Le informazioni che possono essere codificate sono dati testuali o dati grezzi. L'usuale dimensione dei dati va da pochi byte fino a 2 kilobytes. La quantità di dati codificati dipende dalla dimensione del simbolo usato.
Inoltre è previsto un sistema di correzione degli errori che aggiunge byte al messaggio codificato in modo da rendere leggibile anche un Data Matrix parzialmente danneggiato. Un simbolo Data Matrix può immagazzinare fino a 2.335 caratteri alfanumerici.
I Data Matrix sono di forma rettangolare (spesso quadrati) e sono suddivisi in celle, ognuna delle quali rappresenta un bit. In base alla codifica usata, una cella di colore chiaro può rappresentare il bit 0 e una di colore scuro il bit 1 (o viceversa).
I bordi che delimitano un Data Matrix hanno la seguente configurazione:
* due bordi adiacenti sono colorati in modo uniforme e formano una "L" definita formalmente Finder Pattern;
* gli altri due bordi adiacenti appaiono tratteggiati a causa dell'alternanza di celle di colore bianco e nero. Essi costituiscono il Timing Pattern.
All'interno di questi bordi troviamo tutte le celle, organizzate in righe e colonne, che compongono l'informazione codificata. Il Finder Pattern è utilizzato per permettere ai dispositivi di decodifica di localizzare e orientare correttamente il Data Matrix, mentre il Timing Pattern permette di contare il numero di righe e di colonne che lo costituiscono. Man mano che il numero dei dati aumenta, il numero di righe e di colonne cresce. In genere le sue dimensioni variano da 8x8 a 144x144.

## Applicazioni

Comunemente il Data Matrix viene utilizzato come codice per marcare piccoli oggetti, infatti esso può includere fino a 50 caratteri in una superficie di appena 2 o 3 mm$^2$ ed è sufficiente un contrasto del 20% per distinguere le sue celle (ovvero per distinguere le celle chiare da quelle scure) e quindi per leggere i bit che compongono l'informazione.
Un Data Matrix è infinitamente scalabile, nelle applicazioni commerciali può essere piccolo fino a 300 micrometri (per esempio è possibile incidere a laser un Data Matrix su un dispositivo di silicio di 600 micrometri) e grande fino a un metro. Il livello di fedeltà del sistema di incisione e la precisione dei dispositivi di lettura sono le uniche limitazioni tecniche.
La EIA (Electronic Industries Alliace) raccomanda di usare i Data Matrix per etichettare piccoli componenti elettronici. I codici Data Matrix fanno parte di un nuovo processo di tracciabilità diffuso in molte industrie, in particolare nell'industria aerospaziale dove il controllo di qualità è rigido ed esiste il problema del mercato nero di componenti contraffatti e non vendibili al pubblico.
I codici Data Matrix e i dati alfanumerici aggiuntivi identificano i dettagli del componente come:
* identificativo del produttore;
* il numero identificativo del pezzo;
* un codice seriale unico e differente per ogni pezzo prodotto.
Il Dipartimento della Difesa degli Stati Uniti ha selezionato lo standard Data Matrix per garantire un'identificazione unica e obbligatoria per determinati prodotti. Molti articoli, a partire da intere armi fino alle componenti critiche della maggior parte dei sistemi, devono essere marcati permanentemente con un codice Data Matrix d'identificazione unico in accordo con gli standard militari 130.
Gran parte dell'industria aerospaziale, specialmente i membri dell'ATA (Associazione dei trasporti aerei) mirano ad identificare tutti i componenti di ogni aereo tramite l'uso di particolari codici Data Matrix. I Data Matrix sono anche utilizzati dalla Semacode per codificare gli indirizzi delle pagine web (URL) in modo da essere facilmente letti da cellulari dotati di fotocamera.

## Specifiche tecniche

I simboli Data Matrix sono composti da moduli definiti all'interno di un perimetro formato da finder e timing pattern. Essi possono codificare fino a 3.116 caratteri Ascii (comprese le estensioni). Ogni simbolo è diviso in regioni di dati, ognuna delle quali contiene un array regolare di moduli. I simboli di grandi proporzioni contengono parecchie regioni.
Ogni regione di dati è delimitata dal finder pattern, e questo è circondato a sua volta su tutti i lati da una zona libera (detta Quiet Zone) usata come margine. (Nota: i moduli possono essere rotondi o quadrati, non c'è una forma specifica stabilita dallo standard).
I simboli hanno un numero pari di righe e di colonne. La maggior parte dei simboli è quadrata con dimensioni che vanno dai 10x10 ai 144x144. Tuttavia alcuni simboli sono rettangolari con dimensioni che vanno dagli 8x8 ai 16x48. Tutti i simboli che utilizzano l'ECC200 error correction (il sistema di correzione dell'errore ECC200) sono riconoscibili dal fatto che il modulo in alto a destra del simbolo ha lo stesso colore dello sfondo (bianco, binary 0).
ECC200 è la nuova versione presente nei Data Matrix e supporta avanzati algoritmi di controllo e di correzione degli errori (come Reed-Solomon). ECC200 permette la ricostruzione pratica fino al 30% dell'intera serie dei dati codificati. Ciò significa che anche quando il simbolo è per il 30% danneggiato esso è ancora leggibile, cosa che sarebbe impossibile utilizzando codici a barre lineari.

## Applicazioni Data Matrix

I codici Data Matrix stanno diventando comuni e vengono anche stampati su supporti cartacei come lettere o buste. Il codice può essere letto rapidamente da uno scanner che permette al supporto di essere tracciato negli spostamenti, ad esempio nel caso di un pacco inoltrato al destinatario.
Ai fini dell'ingegneria industriale, i codici Data Matrix possono essere marcati direttamente sui componenti, assicurando così che ogni componente sia identificato dai dati del proprio Data Matrix. I codici possono essere marcati sui componenti con diversi metodi: all'interno dell'industria aerospaziale sono comunemente usate stampe a getto d'inchiostro, incisioni ad aghi, incisioni laser e procedure di incisione chimica (elettrolitica).
Questi metodi permettono di realizzare una marchiatura permanente che dovrebbe durare per l'intera vita del componente. Dopo l'applicazione del codice Data Matrix sul supporto, questo è solitamente verificato usando particolari fotocamere e appositi software. Tale verifica assicura che il codice sia adatto agli standard e assicura che potrà essere letto per tutta la durata del componente.
Inoltre quando il componente inizia ad essere utilizzato, il codice Data Matrix può essere letto da un'apposita fotocamera in grado di decodificare i dati contenuti nel Data Matrix che possono essere così usati per un gran numero di scopi, come il tracciamento degli spostamenti e la gestione dell'inventario delle merci. I codici Data Matrix, insieme ad altri codici Open Source come codici a barre monodimensionali, possono essere letti con i cellulari, dotati di fotocamera, semplicemente scaricando un'applicazione compatibile con il proprio modello.
Sebbene la maggior parte dei cellulari siano capaci di leggere i Data Matrix, solamente alcuni possono estendere il processo di decodifica per abilitare l'accesso al dispositivo e di conseguenza l'interazione. I codici possono essere usati in modo sicuro, indipendentemente dal supporto, con molteplici applicazioni: ad esempio tracciabilità dei prodotti, sistemi di anti-contraffazione, e-government e soluzioni bancarie.
In Italia, per esempio, i Data Matrix vengono usati dalle Poste per tracciare gli spostamenti delle buste da lettera e dal Ministero del Tesoro nelle proprie buste paga come meccanismo di anti-contraffazione.
In Italia, il datamatrix, nello standard GS1 datamatrix viene usato dal 2008 per etichettare i farmaci ad uso veterinario.

## Standard

Data Matrix fu inventato dalla International Data Matrix Inc (ID Matrix) che si è unita alla RVSI/Acuity CiMatrix. Queste successivamente furono acquisite dalla Siemens AG nell'ottobre 2005 e da Microscan nel settembre 2008.
Data Matrix è coperto da diversi standard ISO/IEC ed è di pubblico dominio per molte applicazioni, ciò significa che esso può essere usato liberamente senza pagare licenza o royalities.
* ISO/IEC 16022:2006—Data Matrix bar code symbology specification
* ISO/IEC 15415—2-D Print Quality Standard
* ISO/IEC 15418:2009—Symbol Data Format Semantics (GS1 Application Identifiers and ASC MH10 Data Identifiers and maintenance)
* ISO/IEC 15424:2008—Data Carrier Identifiers (including Symbology Identifiers) [IDs for distinguishing different bar code types]
* ISO/IEC 15434:2009—Syntax for high-capacity ADC media (format of data transferred from scanner to software, etc.)
* ISO/IEC 15459—Identificante unico

## Codifica

Il processo di codifica è descritto nei documenti pubblicati nel sito web della ISO.
Il software open source per la codifica e la decodifica dello standard Data Matrix ECC-200 è stato pubblicato
I diagrammi che seguono illustrano la posizione dei dati del messaggio all'interno di un simbolo Data Matrix. Il messaggio è "Wikipedia", ed è disposto in una configurazione diagonale alquanto complicata partendo vicino all'angolo superiore sinistro. Alcuni caratteri sono suddivisi in due pezzi, come la W iniziale, e la terza 'i' è nel "modello di angolo 2", piuttosto che il solito a forma di L. Sono inoltre mostrati i codici di fine-del-messaggio (marked End), il padding (P) ed i bytes per la correzione degli errori (E), e quattro moduli di spazio non utilizzato (X).
Ci sono diverse modalità di codifica utilizzate per memorizzare diversi tipi di messaggi. La modalità di default memorizza caratteri ASCII a 8 bit. I codici di controllo sono previsti per passare da una modalità all'altra, come mostrato di seguito
| Codeword | Interpretation |
| 0 | Non usato |
| 1 – 128 | ASCII data (valore ASCII + 1) |
| 129 | Fine del messaggio |
| 130 – 229 | Digit pairs 00 – 99 |
| 230 | Inizio codifica C40 |
| 231 | Inizio codifica Base 256 |
| 232 | FNC1 |
| 233 | Structured append. Allows a message to be split across multiple symbols. |
| 234 | Reader programming |
| 235 | Set high bit of the following character |
| 236 | 05 Macro |
| 237 | 06 Macro |
| 238 | Begin ANSI X12 encoding |
| 239 | Begin Text encoding |
| 240 | Begin EDIFACT encoding |
| 241 | Extended Channel Interpretation code |
| 242 – 255 | Non usato |

### Text modes

Le modalità C40, Text and X12 sono potenzialmente più compatte per immagazzinare testo. Sono simili al DEC Radix-50, che usano caratteri nell'intervallo 0–39 e tre di questi codici sono combinati per creare un numero fino a 40³=64000, il quale è memorizzato in due bytes (valore massimo 65536):
    V = C1*1600 + C2*40 + C3 + 1
    B1 = floor(V/256)
    B2 = V mod 256
Il risultato di B1 è nell'intervallo 0–249. Il valore speciale 254 è utilizzato per ritornare nella modalità ASCII
La tabella a seguire mostra il significato dei codici. Le modalità C40 e Text sono quattro insiemi separati. Set 0 è l'impostazione predefinita, e contiene codici che selezionano temporaneamente un set diverso per il carattere successivo. L'unica differenza è che invertono maiuscole-minuscole. C40 usa principalmente maiuscole, con lettere minuscole nel set 3. Text è contrario. Set 1, contenente codici di controllo ASCII, e set 2 contenente i simboli di punteggiatura, sono identici sia in C40 che in Text.
| Code | C40 | C40 | C40 | C40 | Text | Text | X12 |
| Code | set 0 | set 1 | set 2 | set 3 | set 0 | set 3 | X12 |
| 0 | set 1 | NUL | ! | ' | set 1 | ' | CR |
| 1 | set 2 | SOH | " | a | set 2 | A | * |
| 2 | set 3 | STX | # | b | set 3 | B | > |
| 3 | space | ETX | $ | c | space | C | space |
| 4 | 0 | EOT | % | d | 0 | D | 0 |
| 5 | 1 | ENQ | & | e | 1 | E | 1 |
| 6 | 2 | ACK | ‘ | f | 2 | F | 2 |
| 7 | 3 | BEL | ( | g | 3 | G | 3 |
| 8 | 4 | BS | ) | h | 4 | H | 4 |
| 9 | 5 | HT | * | i | 5 | I | 5 |
| 10 | 6 | LF | + | j | 6 | J | 6 |
| 11 | 7 | VT | , | k | 7 | K | 7 |
| 12 | 8 | FF | - | l | 8 | L | 8 |
| 13 | 9 | CR | . | m | 9 | M | 9 |
| 14 | A | SO | / | n | a | N | A |
| 15 | B | SI | : | o | b | O | B |
| 16 | C | DLE | ; | p | c | P | C |
| 17 | D | DC1 | < | q | d | Q | D |
| 18 | E | DC2 | = | r | e | R | E |
| 19 | F | DC3 | > | s | f | S | F |
| 20 | G | DC4 | ? | t | g | T | G |
| 21 | H | NAK | @ | u | h | U | H |
| 22 | I | SYN | [ | v | i | V | I |
| 23 | J | ETB | \ | w | j | W | J |
| 24 | K | CAN | ] | x | k | X | K |
| 25 | L | EM | ^ | y | l | Y | L |
| 26 | M | SUB | _ | z | m | Z | M |
| 27 | N | ESC | FNC1 | { | n | { | N |
| 28 | O | FS | | | | o | | | O |
| 29 | P | GS | | } | p | } | P |
| 30 | Q | RS | hibit | ~ | q | ~ | Q |
| 31 | R | US | | DEL | r | DEL | R |
| 32 | S | | | | s | | S |
| 33 | T | | | | t | | T |
| 34 | U | | | | u | | U |
| 35 | V | | | | v | | V |
| 36 | W | | | | w | | W |
| 37 | X | | | | x | | X |
| 38 | Y | | | | y | | Y |
| 39 | Z | | | | z | | Z |

### EDIFACT mode

EDIFACT mode usa sei bits per carattere, con 4 caratteri immagazzinati in tre bytes. Possono essere memorizzati numeri, lettere maiuscolo, alcuni segni di punteggiatura, ma non supporta le lettere minuscole.
| Code | Meaning |
| 0 – 30 | ASCII codes 64 – 94 |
| 31 | Return to ASCII mode |
| 32 – 63 | ASCII codes 32 – 63 |

### Base 256 mode

Base 256 mode inizia con l'indicazione della lunghezza, seguito dal numero di byte. Una lunghezza compresa tra 1 e 249 è memorizzata in un solo byte, mentre lunghezze superiori sono memorizzate in 2 byte.
    L1 = floor(length / 250) + 249, L2 = length mod 250
Sono da evitare lunghe stringhe di zeri nei messaggi, perché nel codice Data Matrix diventano delle vaste aree vuote, che potrebbero causare al lettore una perdita di sincronizzazione (il valore di default della codifica ASCII non usa lo zero proprio per questa ragione). Affinché questo sia meno probabile, la lunghezza e i dati sono oscurati aggiungendo un valore pseudocasuale R (n), dove n è la posizione nel flusso di byte.
    R(n) = (149 × n) mod 255 + 1

## Come funziona

Sebbene si tratti di uno standard libero, non ci sono documenti gratuiti che spiegano il processo di codifica. La documentazione in PDF o in formato cartaceo può essere acquistata dal sito web dell'ISO.