LASERPCB – software PC

Il colloquio tra il programma PC ed il firmware sulla scheda avviene tramite porta seriale con livelli TTL (0-5V) alla velocità di 112500 baud.

Nel paragrafo successivo sono elencati i comandi leciti, esistono altri comandi non ancora documentati, utili soprattutto per i test del dispositivo.

Il protocollo

Lo scambio di dati viene sempre sollecitato da un comando inviato dal PC al dispositivo – ogni comando ha il seguente formato (i simboli < e > vengono utilizzati come separatori):

<@><comando><ack><dati opzionali>

Colloquio:

Il software invia <@> seguito da un carattere ascii che indica il comando

Il firmware del dispositivo risponde con il byte di acknowledgement (<ack>) che può valere:  k” se riconosce il comando oppure con “E” se non lo conosce.

Se la risposta è “k” altri dati possono essere inviati o ricevuti in funzione del comando stesso.

 

@q <ack><versione>

Verifica della comunicazione e della versione del firmware.

Il dispositivo deve rispondere  <k>  seguito dal numero di versione, in formato testo (max 8 caratteri ascii)

 

@h<ack><dati di header><ack>

Invia i dati generali del PCB predisponendo una stampa DIRETTA.

Questo comando viene inviato quando si preme il bottone “Burn immediate” ed è poi seguito dai comandi di invio delle righe di dettaglio.

Risposte possibili: <k> : tutto ok <E> : errore

Se la risposta è “k” i dati di header inviati dal software al con il seguente formato:

hBBRRSOLTCC

h = carattere ascii “h”

BB = 2 bytes:  numero binario (int) in formato low-endian che rappresenta il numero di bytes di ogni riga del pcb (1 pixel per ogni bit) – di fatto la larghezza del PCB in mils / 16 perché ogni bit rappresenta 2 mils in larghezza

RR = 2 bytes: numero binario (int) in formato low-endian che rappresenta il numero di righe del pcb  - di fatto è l’altezza del PCB in mils / 2 perché ogni riga rappresenta 2 mils in altezza

S = 1 byte: numero binario (char) che rappresenta la velocità di incisione così come specificata nel box dell’interfaccia visuale

O = 1 byte: opzioni indicate dai singoli bits a 1: utilizzato solo il bit 0 – viene settato a 1 quando sull’interfaccia visuale si fa “check” sul box di stampa su resist negativo

T = 1 byte: numero binario (char) che rappresenta in caso di stampa reverse (resist negativo) il numero di linee (pixel) da “bruciare” prima di iniziare la stampa vera del pcb

L = 1 byte: numero binario (char) che rappresenta in caso di stampa reverse (resist negativo) il numero di linee (pixel) da “bruciare” alla fine della stampa vera del pcb

CC = 2 bytes: numero binario (int) in formato low-endian che rappresenta la somma binaria di tutti i bytes precedenti (check byte). Se la somma supera il valore 0xFFFF vengono persi i valori di più alto ordine.

 

Se il check byte è valido il dispositivo risponde con un ack (‘k’) e (in modalità di stampa diretta) inizia la eventuale stampa delle righe di trailer.

Se tutto va a buon fine il dispositivo entra in modalità di STAMPA DIRETTA ed attende i dati di ogni riga.

 

 

@H<ack><dati di header><ack>

Invia i dati generali del PCB predisponendo una memorizzazione di stampa (DOWNLOAD).

Questo comando viene inviato quando si preme il bottone “Download” ed è poi seguito dai comandi di invio delle righe di dettaglio.

Risposte possibili: <k> : tutto ok <E> : errore

Se la risposta è “k” i dati di header inviati dal software al con il formato identico a quello del comando <@h> - in questo caso però i dati vengono semplicemente memorizzati nella eeprom e non usati per avviare una stampa.

Se tutto va a buon fine il dispositivo entra in modalità di DOWNLOAD ed attende i dati di ogni riga.

 

 

@m

Test di spostamento delle testine.

Questo comando non prevede risposta alcuna. Può dato solo DOPO che in eeprom è stato caricato un PCB da stampare (download).

L’effetto atteso è che il carrello del laser si sposti dal punto corrente verso sinistra per la larghezza del PCB memorizzato, attende un attimo, poi ritorna al punto di partenza.

Questo comando viene inviato quando si preme il bottone X-test; lo scopo è di verificare che la basetta sia correttamente posizionata sulla stampante. – il test può essere iniziato anche premendo sul dispositivo il bottone “shift” per almeno 3 secondi.

 

@e

Fine della modalità di stampa diretta.

 

@E

Fine della modalità di download.

 

@B<ack>

Inizio stampa dei dati memorizzati in eeprom dal precedente download.

Questo comando viene inviato premendo il bottone “eeprom burn” – la stampa può essere iniziata anche premendo sul dispositivo il bottone “shift” per almeno 6 secondi.

 

Stampa diretta - protocollo

In questa modalità è il software a rimanere in attesa delle richieste dati da parte del dispositivo. Ogni volta che il dispositivo è pronto a ricevere un blocco di dati (corrispondente ad una linea da stampare) esso invia la richiesta con il carattere “a”.

Ci si aspettano quindi tante richieste “a” quante sono le righe di stampa previste nel header (RR); al termine della stampa o in caso di interruzione il dispositivo invia il carattere “b” ed esce dalla modalità di stampa diretta.

A fronte di una richiesta di invio dati il software risponde:

rRDDDDDDDDDDDDDDD…CC

r = è il carattere di inizio riga e vale fisicamente il carattere asciir

R = 1 byte binario (valore da 1 a 255) indica quante volte questa riga deve essere “stampata” – ogni ripetizione vale 2 mils. Da notare che questo valore incide sul conteggio delle righe stampate che vengono confrontate con il numero di righe previste RR.

DDD… = tanti bytes quanti previsti nel header (BB)

CC = 2 bytes: numero binario (int) in formato low-endian che rappresenta la somma binaria di tutti i bytes precedenti (check byte)

Se i dati sono corretti il dispositivo risponde con un ack (“k”), se il check byte non è corretto risponde “n” e ri-sollecita l’invio della medesima riga (“a”),

Immaginate di stampare un foglio A4. La stampante inizia in alto a sinistra e stampa la prima riga fino all’estrema destra del foglio. In realtà dal vostro punto di vista la testina parte a destra e viaggia verso sinistra.
I dati da stampare (stream standard) sono visti dal punto di vista della stampante; ogni byte rappresenta 8 pixel da stampare da sinistra a destra: il primo byte sono i pixel da 1 a 8, il secondo byte i pixel da 9 a 16 e così via.  Gli 8 punti di ogni bit si stampano sempre da sinistra a destra: prima il bit 7, poi il 6, 5, 4, 3, 2, 1, 0. Ogni bit (pixel) vale 2 mils di PCB.

 

Stampa indiretta (download) - protocollo

In questa modalità è il software a rimanere in attesa delle richieste dati da parte del dispositivo. Ogni volta che il dispositivo è pronto a ricevere un blocco di dati (corrispondente ad una linea da memorizzare per la stampa) esso invia la richiesta con il carattere “a”.

Ci si aspettano quindi tante richieste “a” quante sono le righe di stampa previste nel header (RR); al termine del download o in caso di interruzione il dispositivo invia il carattere “b” ed esce dalla modalità di download.

A fronte di una richiesta di invio dati il software risponde:

zRLDDDDDDDDDDDDDDD…CC

z = è il carattere di inizio riga e vale fisicamente il carattere ascii “z”

R = 1 byte binario – due  diverse informazioni sono portate dai 2 semibyte alto (bits 7-6-5-4) e basso (bits 3-2-1-0).

Il semibyte basso (valore da 1 a 15) indica quante volte questa riga deve essere “stampata” – ogni ripetizione vale 2 mils.  Da notare che questo valore incide sul conteggio delle righe stampate che vengono confrontate con il numero di righe previste RR

Il semibyte alto indica il tipo di compressione adottata per questa riga e può valere per questa release 0, 1 (il significato è descritto sotto.

L = 1 byte binario: lunghezza di tutti i dati seguenti (da 0 a 255)

DDD… = tanti bytes quanti previsti dalla lunghezza (L – 2)

CC = 2 bytes: numero binario (int) in formato low-endian che rappresenta la somma binaria di tutti i bytes precedenti (check byte)

Se i dati sono corretti il dispositivo risponde con un ack (“k”), se il check byte non è corretto risponde “n” e ri-sollecita l’invio della medesima riga (“a”),

Immaginate di stampare un foglio A4. La stampante inizia in alto a sinistra e stampa la prima riga fino all’estrema destra del foglio. In realtà dal vostro punto di vista la testina parte a destra e viaggia verso sinistra.
I dati da stampare (stream standard) sono visti dal punto di vista della stampante; ogni byte rappresenta 8 pixel da stampare da sinistra a destra: il primo byte sono i pixel da 1 a 8, il secondo byte i pixel da 9 a 16 e così via.  Gli 8 punti di ogni bit si stampano sempre da sinistra a destra: prima il bit 7, poi il 6, 5, 4, 3, 2, 1, 0. Ogni bit (pixel) vale 2 mils di PCB.

I dati però non sono inviati in questo modo (nativo) ma in modo compresso (il tipo riga vale “z”) e vanno quindi interpretati in funzione del tipo compressione:

0: lo stream di dati (DDDDD…) va considerato a coppie di bytes – quindi anziché DDDDDD  intendiamolo SASASA: il byte S indica per quanti pixel il laser deve rimanere  spento, il byte A indica per quanti pixel il laser deve rimanere acceso, e così via. In ogni coppia S oppure A possono valere anche zero. Per default il laser deve iniziare spento e finire spento (acceso se si stampa con il flag di negativo). Con una semplice funzione questo stream può essere decompresso e trasformato nello stream standard di riga.

1: La logica è la medesima del tipo compressione “0” con la differenza che i byte A non indicano l’accensione del laser ma il rovesciamento (XOR 1) del corrispondente numero di bits nello stream standard. Viceversa i byte S non indicano lo spegnimento del laser ma che il corrispondente numero di bits nello stream standard rimane inalterato.