Sommario:

Scanner di punti XYZ con codificatori rotanti recuperati: 5 passaggi
Scanner di punti XYZ con codificatori rotanti recuperati: 5 passaggi

Video: Scanner di punti XYZ con codificatori rotanti recuperati: 5 passaggi

Video: Scanner di punti XYZ con codificatori rotanti recuperati: 5 passaggi
Video: CREALITY CR-SCAN FERRET, uno SCANNER 3D a meno di 250€??? 2024, Dicembre
Anonim
Scanner di punti XYZ che utilizza encoder rotativi recuperati
Scanner di punti XYZ che utilizza encoder rotativi recuperati

Avendo acquistato un numero piuttosto elevato di encoder ottici rotanti scartati dal mio posto di lavoro, alla fine ho deciso di fare qualcosa di divertente/utile con loro.

Di recente ho acquistato una nuova stampante 3D per la mia casa e cosa potrebbe complimentarmi meglio di uno scanner 3D! Questo progetto mi ha anche fornito l'opportunità perfetta di utilizzare la mia stampante 3D per produrre le parti richieste.

Forniture

Encoder ottici e corrispondenti sensori ottici

Arduino UNO

scudo di prototipazione opzionale

binari in barra d'acciaio

accesso a una stampante 3D

Passaggio 1: gli encoder ottici

Gli encoder ottici
Gli encoder ottici
Gli encoder ottici
Gli encoder ottici
Gli encoder ottici
Gli encoder ottici

Quasi tutti i codificatori rotanti potrebbero essere utilizzati per questo progetto, purché forniscano un numero relativamente elevato di "clic" per mm. Ovviamente encoder diversi richiederanno una soluzione di montaggio adeguata.

Ho usato un misuratore di continuità per tracciare lo schema elettrico dei fotosensori.

Passaggio 2: parti stampate in 3D

Parti stampate in 3D
Parti stampate in 3D
Parti stampate in 3D
Parti stampate in 3D

Queste parti ospitano gli encoder rotativi e forniscono una guida per la guida. L'alloggiamento dell'encoder singolo ha due fori nella parte posteriore per il montaggio delle guide trasversali. Il doppio alloggiamento dell'encoder è semplicemente due alloggiamenti singoli fusi insieme ad angolo retto.

Ho progettato questi supporti su fusion360 per adattarsi alla mia scelta di encoder e binari, l'albero dell'encoder ha un breve pezzo di guaina in gomma a fionda, per aiutarlo a stringere meglio l'albero in acciaio inossidabile.

Si desidera che l'albero scorra liberamente e cada attraverso l'alloggiamento quando è tenuto verticalmente, tuttavia deve esercitare una pressione sufficiente sull'encoder per non scivolare. Ciò che ha funzionato per me è stato consentire alla slitta per l'albero di sovrapporsi all'albero dell'encoder di 0,5 mm. La gomma della fionda è abbastanza morbida da deformarsi di quella quantità e fornire una buona trazione.

Passaggio 3: schema elettrico

Schema elettrico
Schema elettrico

Il circuito è molto semplice. Gli optosensori richiedono un po' di corrente per i diodi emettitori IR, una massa e resistori di pull-up per i fotodiodi.

Ho deciso per 5 mA per i diodi emettitori in serie, in questo particolare encoder la caduta di tensione sui diodi è di 3,65 V. Sto usando un'alimentazione a 5 V dall'Arduino, che lascia 1,35 V per il resistore, a 5 mA risulta essere 270 ohm.

Sono stati selezionati 10k ohm per i pull-up poiché i fotodiodi possono assorbire solo una piccola corrente, 10k ohm sono stati utilizzati anche per il pulsante. C'è un pulsante disponibile per l'uso sulla scheda prototipo già collegata a terra, basta dotarla di una resistenza di pull-up e collegarla al pin di ingresso desiderato.

Passaggio 4: codice Arduino

Codice Arduino
Codice Arduino
Codice Arduino
Codice Arduino
Codice Arduino
Codice Arduino

Il codice necessita di una piccola spiegazione in quanto il suo funzionamento potrebbe non essere immediatamente ovvio, tuttavia doveva essere ottimizzato in questo modo per poter elaborare 3 codificatori abbastanza rapidamente.

Innanzitutto vogliamo elaborare i dati di direzione solo SE c'è stato un cambiamento nella posizione dell'encoder.

modifiche = nuovo_valore ^ valore memorizzato;

Per ottenere una maggiore risoluzione dai miei encoder ho dovuto elaborare sia i fronti di salita che di discesa.

Sulla mia configurazione la mia risoluzione è di 24 clic per 1 cm.

Questo ci lascia con alcuni scenari.

S1 è costante 0 e S2 commutato da 0 a 1

S1 è costante 0 e S2 commutato da 1 a 0

S1 è costante 1 e S2 passa da 0 a 1

S1 è costante 1 e S2 passa da 1 a 0

S2 è costante 0 e S1 commutato da 0 a 1

S2 è costante 0 e S1 commutato da 1 a 0

S2 è costante 1 e S1 passa da 0 a 1

S2 è costante 1 e S1 passa da 1 a 0

Queste condizioni sono meglio comprese nelle tabelle di verità sopra, inoltre ogni condizione produce una "direzione", arbitrariamente denominata 0 o 1.

I grafici ci danno due indizi vitali:

1) un grafico è l'inverso completo dell'altro, quindi se ne abbiamo uno, possiamo facilmente calcolare l'altro semplicemente invertendo l'output. Invertiamo l'output solo se cambia un pin e non l'altro, possiamo sceglierne uno arbitrariamente.

2) il grafico stesso è semplicemente lo XOR dei segnali S1 e S2. (l'altro grafico è il NON di questo).

Ora capire il codice è semplice.

// legge in PORT in parallelo//ricorda che le coppie adiacenti appartengono allo stesso stato dell'encoder = PINB & 0x3f; // quali pin sono cambiati se ce ne sono diff = hold ^ state; // Segnali XOR adiacenti S1 e S2 per ottenere la tabella di verità // il modo più semplice è fare una copia dello stato corrente // e spostarlo a destra di un bit lookup = state >> 1; // ora i bit sono allineati per XOR dir = lookup ^ state; // ricorda, la tabella deve essere invertita se uno // degli input è rimasto costante, non abbiamo bisogno di un'istruzione IF // per questo. Attualmente il bit di direzione desiderato // è il bit di destra di ogni coppia nella variabile 'dir' // il bit di sinistra non ha significato // la variabile 'diff' ha il bit che ha cambiato 'set' // quindi abbiamo '01' o '10' // XOR questo con il byte 'dir' // invertirà o meno il bit significativo. dir ^= diff; // ora aggiorna la variabile di attesa hold = state; // se uno dei due bit è cambiato per questo codificatore if(diff & 0x03) { // determina la direzione if(dir & 0x01) { // in base al tuo hardware e cablaggio ++ o -- --z; } else { ++z; } } // idem per il resto if(diff & 0x0c) { if(dir & 0x04) { ++y; } else { --y; } } if(diff & 0x30) { if(dir & 0x10) { --x; } else { ++x; } }

Quando si preme il pulsante, inviamo il valore XYZ corrente a un programma terminale.

I dati seriali sono lenti, ma durante il normale funzionamento le posizioni degli encoder non cambieranno comunque durante questo tempo.

I dati vengono inviati come conteggi grezzi. Potresti fare i conti e inviare i dati in mm o pollici, ecc. Trovo che i valori grezzi siano altrettanto buoni perché possiamo ridimensionare l'oggetto in un secondo momento nel software.

Passaggio 5: prima scansione

Prima scansione
Prima scansione
Prima scansione
Prima scansione
Prima scansione
Prima scansione
Prima scansione
Prima scansione

La raccolta dei punti è un processo lento, appoggio la sonda nell'angolo in alto a sinistra e resetto Arduino.

Questo azzera la posizione come home.

Quindi sposta la sonda nella posizione sul bersaglio, tienila ferma e premi il pulsante "istantanea".

Per questo campione piuttosto grande ho preso solo ~140 punti, quindi il dettaglio non è eccezionale sul prodotto finale.

Salva i dati in un file. PCD e aggiungi l'intestazione

#. PCD v.7 - Formato file dati nuvola di puntiVERSIONE.7 CAMPI x y z DIMENSIONE 4 4 4 TIPO F F F CONTEGGIO 1 1 1 LARGHEZZA (il tuo conteggio dei punti) ALTEZZA 1 PUNTO DI VISTA 0 0 0 1 0 0 0 PUNTI (il tuo conteggio dei punti)

Metti il conteggio dei punti nell'intestazione, questo è facile su qualsiasi editor che ti fornisce i numeri di riga.

Sopra i punti possono essere visualizzati in freeCad, vengono quindi esportati da freeCad come file. PLY.

Apri. PLY su MeshLab e fai emergere l'oggetto. Fatto!!

Consigliato: