Cuprins:

Scaner punct XYZ folosind codificatoare rotative recuperate: 5 pași
Scaner punct XYZ folosind codificatoare rotative recuperate: 5 pași

Video: Scaner punct XYZ folosind codificatoare rotative recuperate: 5 pași

Video: Scaner punct XYZ folosind codificatoare rotative recuperate: 5 pași
Video: RTOPO software, editing XYZ point files, the format "no x y z code" 2024, Iulie
Anonim
Scaner punct XYZ folosind codificatoare rotative recuperate
Scaner punct XYZ folosind codificatoare rotative recuperate

După ce am achiziționat un număr destul de mare de codificatoare optice rotative aruncate de la locul de muncă, am decis în cele din urmă să fac ceva distractiv / util cu ele.

Am achiziționat recent o nouă imprimantă 3D pentru casa mea și ce ar putea să o complimenteze mai bine decât un scaner 3D! Acest proiect mi-a oferit, de asemenea, ocazia perfectă de a folosi imprimanta 3D pentru a fabrica piesele necesare.

Provizii

Codificatoare optice și senzori optici corespunzători

Arduino UNO

scut opțional de prototipare

șine cu bare de oțel

acces la o imprimantă 3D

Pasul 1: Codificatoarele optice

Codificatoarele optice
Codificatoarele optice
Codificatoarele optice
Codificatoarele optice
Codificatoarele optice
Codificatoarele optice

Aproape orice codificator rotativ ar putea fi utilizat pentru acest proiect, atâta timp cât acesta v-a furnizat un număr relativ mare de „clicuri” pe mm. Evident, diferiți codificatori vor necesita o soluție de montare adecvată.

Am folosit un contor de continuitate pentru a urmări schema de conectare a senzorilor foto.

Pasul 2: Părți imprimate 3D

Piese imprimate 3D
Piese imprimate 3D
Piese imprimate 3D
Piese imprimate 3D

Aceste părți găzduiesc codificatoarele rotative și asigură o alunecare pentru șină. Carcasa codificatorului unic are două găuri în spate pentru montarea șinelor transversale. Carcasa duală a codificatorului este pur și simplu două carcase simple, fuzionate împreună în unghiuri drepte.

Am proiectat aceste suporturi pe fusion360 pentru a se potrivi cu alegerile mele de codificatoare și șine, arborele codificatorului are o bucată scurtă de teacă din cauciuc slingshot, pentru a-l ajuta să prindă mai bine arborele din oțel inoxidabil.

Doriți ca arborele să alunece liber și să cadă prin carcasă atunci când este ținut vertical, totuși trebuie să exercite suficientă presiune asupra codificatorului pentru a nu aluneca. Ceea ce a funcționat pentru mine a fost să permit culisarea arborelui să se suprapună cu arborele codificatorului cu 0,5 mm. Cauciucul cu praștie este suficient de moale pentru a se deforma cu această cantitate și pentru a oferi o tracțiune bună.

Pasul 3: Schema de cablare

Schema de conexiuni
Schema de conexiuni

Circuitul este foarte simplu. Opto-senzorii necesită un anumit curent pentru diodele emițătorului IR, o masă și rezistențe de tracțiune pentru foto-diode.

Am decis 5mA pentru diodele emițătoare din serie, în acest codificator special căderea de tensiune pe diode este de 3,65V. Folosesc o sursă de 5V de la Arduino, care lasă 1,35V pentru rezistență, la 5mA, acest lucru este de 270 ohmi.

10k ohm a fost selectat pentru pull-up-uri, deoarece fotodiodele pot scufunda doar un curent mic, 10k ohm a fost, de asemenea, utilizat pentru butonul de apăsare. Există un buton disponibil pentru utilizare pe placa prototip deja conectată la masă, doar furnizați-i un rezistor de tragere și conectați-l la pinul de intrare dorit.

Pasul 4: Cod Arduino

Cod Arduino
Cod Arduino
Cod Arduino
Cod Arduino
Cod Arduino
Cod Arduino

Codul are nevoie de puține explicații, deoarece funcționarea sa poate să nu fie imediat evidentă, totuși a trebuit să fie optimizată astfel pentru a putea procesa 3 codificatoare suficient de rapid.

În primul rând, dorim să procesăm doar datele de direcție DACĂ a existat o modificare a poziției codificatorului.

changes = new_value ^ valoare stocată;

Pentru a obține mai multă rezoluție de la codificatoarele mele, a trebuit să procesez atât marginile ascendente, cât și marginile descendente.

La configurarea mea, rezoluția mea este de 24 de clicuri pe 1cm.

Acest lucru ne lasă câteva scenarii.

S1 este constant 0 și S2 comută de la 0 la 1

S1 este constant 0 și S2 comutat de la 1 la 0

S1 este constantă 1 și S2 comută de la 0 la 1

S1 este constantă 1 și S2 comută de la 1 la 0

S2 este constant 0 și S1 comută de la 0 la 1

S2 este constant 0 și S1 comută de la 1 la 0

S2 este constantă 1 și S1 comută de la 0 la 1

S2 este constantă 1 și S1 comută de la 1 la 0

Aceste condiții sunt mai bine înțelese în tabelele de adevăr de mai sus, de asemenea, fiecare condiție produce o „direcție”, numită în mod arbitrar 0 sau 1.

Graficele ne oferă două indicii vitale:

1) o diagramă este inversul complet al celeilalte, deci dacă avem una, o putem calcula cu ușurință pe cealaltă prin simpla inversare a ieșirii. Inversăm ieșirea numai dacă un pin se schimbă și nu celălalt, putem alege unul în mod arbitrar.

2) graficul în sine este pur și simplu XOR al semnalelor S1 și S2. (cealaltă diagramă este NU din aceasta).

Acum înțelegerea codului este simplă.

// citiți în PORT în paralel // amintiți-vă că perechile adiacente aparțin aceleiași stări de codificare = PINB & 0x3f; // ce pini s-au schimbat dacă există o diferență = hold ^ state; // Semnalele XOR adiacente S1 și S2 pentru a obține tabelul de adevăr // cea mai bună modalitate este de a face o copie a stării curente // și de a o deplasa la dreapta cu un bit căutare = stare >> 1; // acum biții sunt aliniați pentru XOR dir = lookup ^ state; // amintiți-vă, tabelul trebuie inversat dacă unul // din intrări a rămas constant, nu avem nevoie de o instrucțiune IF // pentru asta. În prezent, bitul de direcție dorit // este bitul din dreapta al fiecărei perechi din variabila „dir” // bitul din stânga nu are sens // variabila „diff” are bitul care s-a schimbat „set” // deci fie avem '01' sau '10' // XOR acest lucru cu octetul 'dir' va // inversa sau nu bitul semnificativ. dir ^ = diff; // acum actualizați variabila hold hold = stare; // dacă oricare bit s-a schimbat pentru acest codificator if (diff & 0x03) {// determinați direcția if (dir & 0x01) {// pe baza hadware-ului dvs. și a cablării fie ++, fie - --z; } else {++ z; }} // idem pentru restul if (diff & 0x0c) {if (dir & 0x04) {++ y; } else {--y; }} if (diff & 0x30) {if (dir & 0x10) {--x; } else {++ x; }}

Când butonul este apăsat, trimitem valoarea curentă XYZ către un program terminal.

Datele seriale sunt lente, dar în timpul funcționării normale pozițiile codificatoarelor nu se vor schimba oricum în acest timp.

Datele sunt trimise ca numărare brută. Ați putea face calculele și trimiteți datele în mm sau inci etc. Consider că valorile brute sunt la fel de bune, deoarece putem scala obiectul mai târziu în software.

Pasul 5: Prima scanare

Prima scanare
Prima scanare
Prima scanare
Prima scanare
Prima scanare
Prima scanare
Prima scanare
Prima scanare

Adunarea punctelor este un proces lent, am scos sonda în colțul din stânga sus și resetez Arduino.

Acest lucru anulează poziția ca acasă.

Apoi mutați sonda în locația de pe țintă, mențineți-l constant și apăsați butonul „instantaneu”.

Pentru această piesă de eșantionare destul de mare, am luat doar ~ 140 de puncte, așa că detaliile nu sunt excelente pentru produsul final.

Salvați datele într-un fișier. PCD și adăugați antetul

#. PCD v.7 - Format fișier date Cloud Point VERSIUNE.7 CÂMPURI x y z MĂRIME 4 4 4 TIP F F F COUNT 1 1 1 Lățime (numărul de puncte dvs.) ALTEZĂ 1 VIZIUNE 0 0 0 1 0 0 0 PUNCTE (numărul de puncte)

Puneți numărul de puncte în antet, acest lucru este ușor pentru orice editor care vă oferă numere de linie.

Deasupra punctelor pot fi văzute în freeCad, apoi sunt exportate din freeCad ca fișier. PLY.

Deschideți. PLY pe MeshLab și scoateți la suprafață obiectul. Terminat!!

Recomandat: