Cuprins:

Scanner laser Raspberry Pi: 9 pași (cu imagini)
Scanner laser Raspberry Pi: 9 pași (cu imagini)

Video: Scanner laser Raspberry Pi: 9 pași (cu imagini)

Video: Scanner laser Raspberry Pi: 9 pași (cu imagini)
Video: Оригинальная плата EZCAD 2.14.10 LMCV4-FIBER-M Волоконный лазерный маркер своими руками.Часть первая 2024, Iulie
Anonim
Image
Image
Scanner laser Raspberry Pi
Scanner laser Raspberry Pi

Laser Scanner este un dispozitiv de sistem încorporat Raspberry Pi capabil să digitalizeze obiecte în fișiere mesh.obj pentru reproducere utilizând imprimarea 3D. Dispozitivul face acest lucru utilizând un laser de linie și un PiCam integrat pentru a efectua viziunea computerizată. Laserul este poziționat la 45 de grade față de laser și proiectează o linie roșie strălucitoare pe o felie verticală a obiectului. Camera detectează distanța feliei de centru pentru a da o felie de plasă. Obiectul este rotit pe tava rotativă și procesul se repetă până când obiectul complet este scanat. Fișierul.obj generat este în cele din urmă trimis prin e-mail utilizatorului, făcând sistemul complet independent și încorporat.

Acest instructable va parcurge modul în care a fost construit dispozitivul, câteva rezultate și pașii viitori.

Pasul 1: Inspirație

Inspirație
Inspirație
Inspirație
Inspirație

În calitate de producător pasionat, de câțiva ani acum am imprimat 3D și modelat solid. Am lucrat cu o mulțime de instrumente de prototipare diferite, de la routere CNC la tăietoare laser până la imprimante 3D. Un dispozitiv pe care makerspace-ul meu local încă nu l-a cumpărat a fost un scaner 3D - și vă pot spune de ce.

Cele mai ieftine (câteva sute de dolari) nu erau fiabile, necesitau condiții perfecte și totuși au produs rezultate destul de ponosite. Cele scumpe erau … ei bine, scumpe, variind până la câteva mii de dolari, făcând funcția sa să nu merite în multe cazuri. Mai mult decât atât, de mai multe ori, aleg să iau măsurători și să proiectez un model de la zero decât să mă ocup de rețeaua de suprafață generată de o scanare.

Din această cauză, am vrut să construiesc un scaner independent de buget pentru a vedea cât de bine aș putea scana un obiect folosind componentele de pe raft.

După ce am făcut unele cercetări, am văzut că multe scanere 3D foloseau o platformă rotativă și apoi o varietate de senzori diferiți pentru a măsura distanța de centru pentru a construi un model de rotație. Multe dintre acestea au folosit camere duale similare cu cele ale Kinect. În cele din urmă am dat peste Yscanner, care este un scaner cu rezoluție redusă care folosește un laser. Privind simplitatea și fezabilitatea, această tehnică laser, în care un laser este strălucit decalat față de o cameră pentru a măsura distanța de la centru, părea o cale clară înainte.

Pasul 2: Instrumente și piese

Părți:

  • Raspberry Pi 35,00 USD
  • Raspberry Pi Camera V2 30,00 USD
  • LED-uri, rezistențe și fire
  • Filament de imprimare 3D
  • 12x12x0.125 foi de lemn
  • Hardware M3
  • Motor pas cu pas - 14 USD
  • Line Laser - 8 USD
  • LN298 Drivere cu motor pas cu pas - 2,65 USD
  • Buton metalic - 5 USD

Instrumente:

  • Ciocan de lipit
  • Cutter cu laser
  • imprimantă 3d
  • Şurubelniţă
  • Cleşte

Pasul 3: Proiectare la nivel înalt

Proiectare la nivel înalt
Proiectare la nivel înalt
Proiectare la nivel înalt
Proiectare la nivel înalt

Componenta centrală a acestui design este laserul de linie care se proiectează pe o felie verticală a obiectelor. Această proiecție ar putea fi capturată pe camera foto, ar putea fi corectată perspectiva și apoi filtrată înainte de procesarea imaginii. În procesarea imaginii, distanța dintre fiecare segment al liniei de la centrul obiectului ar putea fi colectată. În coordonate radiale, această imagine ar produce atât componentele r, cât și z. Cea de-a treia dimensiune, Θ, este apoi realizată prin rotirea obiectului într-o felie nouă. Acest concept este prezentat în prima figură.

Pentru a efectua acțiunile descrise mai sus, am folosit un Raspberry Pi ca unitate centrală de calcul. Am atașat un motor pas cu pas și un driver de motor la Pi, alimentat de o sursă externă de 5V și controlat de pinii GPIO ai lui Pi. Un laser cu linie a fost pus pe linia de 3,3 V de pe Pi și o PiCam a fost atașată la intrarea camerei de pe Pi. În cele din urmă, a fost instalat un simplu buton tras în jos și un LED de stare pentru a indica utilizatorului în ce stare se află sistemul. Sistemul complet este rezumat într-o diagramă bloc a sistemului.

De la început, a fost planificată adăpostirea componentelor electronice într-o cutie tăiată cu laser, ținută împreună cu sloturi T și hardware M3. Componentele electronice ar fi ascunse de vedere într-un compartiment inferior și un capac ar permite accesul ușor la plasarea obiectelor pe tava rotativă. Acest capac este necesar pentru a minimiza cantitatea de lumină care se scurge în sistem, deoarece această lumină externă poate produce zgomot în scanarea finală.

Pasul 4: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

După cum s-a văzut mai sus, înainte de a începe tăierea cu laser sau imprimarea 3D, am folosit Autodesk Fusion 360 pentru a realiza un model 3D detaliat al designului nostru. Ca o privire de ansamblu, dispozitivul este o cutie simplă cu un capac cu balamale tăiate cu laser. Există două straturi principale ale dispozitivului: patul electronic și patul principal, cu găuri pentru ca firele să ruleze între cele două straturi.

Majoritatea cutiei noastre a fost fabricată cu un tăietor cu laser, modelele fiind produse în Fusion 360 și tăiate pe un tăietor cu laser Epilog Zing 40 W. Desenele noastre sunt prezentate în figurile de mai sus. Din stânga sus, deplasându-se spre dreapta, piesele sunt patul principal, patul electronic, două piese pentru capac, partea din spate, partea din față și cele două piese laterale. În patul principal, există trei decupaje principale: una pentru montarea motorului pas cu pas, una pentru direcționarea firelor de la laser și una pentru direcționarea cablului larg al PiCam. Piesa de pat are găuri de montare pentru fixarea Pi, a plăcii de rulare și a șoferului motorului și o decupare mai mare pentru a accesa motorul pas cu pas. Piesele capacului se fixează simplu pentru a forma piesa triunghiulară văzută mai sus, iar balama este o extrudare simplă, care este lățimea diametrului găurii plăcilor laterale. Partea din spate și una dintre piesele laterale au sloturi pe lateral, astfel încât porturile Pi (HDMI, USB, Ethernet, Power) să poată fi accesate cu ușurință. Fața este o piesă simplă în care am făcut găuri în cele din urmă cu un burghiu manual pentru a monta butonul și LED-ul. După cum se vede pe toate piesele, piesele noastre sunt ținute împreună de hardware M3 folosind articulații T și sloturi. Aceasta este o metodă de a ține piesele tăiate cu laser în mod ortogonal și sigur. Aripioarele bucăților se aliniază cu sloturile pentru alte bucăți, iar tăietura în formă de t de pe margini oferă spațiu pentru ca o piuliță M3 să fie blocată în ele fără a se roti. Acest lucru ne permite să folosim apoi un șurub M3 pentru a bloca piesele împreună cu un spațiu foarte mic, fără ca ansamblul să fie complet permanent.

Am ales să fac majoritatea pieselor noastre cu un tăietor cu laser datorită vitezei și ușurinței sale. Cu toate acestea, a trebuit să imprime 3D unele piese datorită geometriei lor 3D care ar fi mai dificil de creat pe tăietor. Prima piesă a fost suportul laser de linie. Această piesă trebuia să fie montată pe patul principal la 45 de grade față de vizualizarea camerei și să aibă o gaură astfel încât laserul să poată fi încorporat în el prin frecare. De asemenea, a trebuit să creez un suport pentru motor, deoarece arborele motorului era atât de lung. Fricțiunea montării se încadrează în piesele tăiate cu laser și a coborât planul la care a fost atașat motorul, astfel încât platforma rotativă să fie la același nivel cu patul principal.

Pasul 5: Electronică

Electronică
Electronică

Cablajul hardware al acestui proiect a fost foarte simplu, deoarece scanerul 3D nu necesita prea multe periferice. Un motor, un buton, un LED, un laser și o cameră trebuiau conectate la Pi. După cum se arată, m-am asigurat că conectez rezistențele în serie cu fiecare pin pe care l-am folosit pentru a proteja pinii. Un pin GPIO a fost dedicat controlului LED-ului de stare, care se va aprinde atunci când dispozitivul era gata de utilizare și pulsează cu PWM când dispozitivul funcționa. Un alt pin GPIO a fost conectat la un buton tras, înregistrând HIGH când butonul nu a fost apăsat și LOW când butonul a fost apăsat. În cele din urmă, am dedicat patru pini GPIO conducerii motorului pas cu pas.

Întrucât motorul nostru trebuia să pășească doar într-o anumită măsură fără a necesita controlul vitezei, am optat pentru un driver mai simplu pentru motorul cu pas (L298N), care pur și simplu intensifică liniile de control pentru a intra în intrările motorului. Pentru a afla cum să acționeze motoarele pas cu pas la un nivel foarte scăzut, ne-am referit atât la foaia de date L298N, cât și la biblioteca Arduino. Motorele pas cu pas au un miez magnetic cu degete de polaritate alternante. Cele patru fire sunt înfășurate pentru a controla doi electro-magneți care alimentează fiecare celălalt deget opus din motor. Astfel, prin comutarea polarității degetelor, suntem capabili să împingem pasul cu un singur pas. Cu această cunoaștere a modului în care funcționează stepper-urile de la un nivel hardware, am reușit să le controlăm mult mai ușor. Am ales să oprim motorul nostru pas cu pas de la o sursă de alimentare de 5V în laborator, mai degrabă decât Pi, datorită consumului maxim de curent de aproximativ 0,8 A, care este mai mult decât ar putea furniza Pi.

Pasul 6: Software

Software
Software
Software
Software
Software
Software
Software
Software

Software-ul pentru acest proiect poate fi împărțit în patru componente principale care interacționează împreună: Procesarea imaginii, controlul motorului, crearea ochiurilor și funcțiile încorporate.

Ca rezumat al software-ului, ne putem uita la prima figură. Pe măsură ce sistemul pornește,.bashrc se conectează automat la Pi și începe să ruleze codul nostru python. Sistemul aprinde lumina de stare pentru a informa utilizatorul că a fost pornit corect și așteaptă apăsarea butonului. Utilizatorul poate plasa apoi elementul de scanat și închide capacul. După apăsarea butonului, LED-ul pulsează pentru a anunța utilizatorul că dispozitivul funcționează. Dispozitivul va face o buclă între procesarea imaginii și controlul motorului până când rotația completă este completă și toate datele obiectului sunt colectate. În cele din urmă, mesh-ul este creat și fișierul este trimis prin e-mail către un e-mail preselectat. Acest lucru repornește ciclul și aparatul este gata să efectueze o altă scanare la apăsarea unui buton.

Procesarea imaginii

Primul lucru implementat a fost procesarea unei imagini capturate pentru a extrage informațiile stocate în imagine într-un formular care ar putea fi folosit pentru a crea o serie de puncte în spațiu. Pentru a face acest lucru, am început prin a face o fotografie a obiectului de pe platformă, împreună cu tot zgomotul de fundal creat de laserul care strălucește pe partea din spate a cutiei și se dispersează. Această imagine a avut două probleme principale în forma sa brută. În primul rând, obiectul a fost vizualizat într-un unghi cu o perspectivă ridicată și, în al doilea rând, a existat mult zgomot de fond. Primul lucru pe care trebuia să-l fac a fost să iau în considerare acest unghi de vizualizare, deoarece utilizarea fotografiei așa cum este nu ne va permite să determinăm o înălțime consecventă a obiectului. După cum se vede în a doua figură, înălțimea formei „L” cu capul în jos este consistentă; totuși, datorită faptului că o parte este mai lungă decât cealaltă, ele par să aibă înălțimi diferite la marginea cea mai apropiată de privitor.

Pentru a remedia acest lucru, a trebuit să transform spațiul de lucru din imagine într-un dreptunghi din forma trapezoidală în care se afla anterior. Pentru a face acest lucru, am folosit codul furnizat de acest link, care, când i se dă o imagine și patru puncte, decupează imaginea între cele patru puncte și transformă imaginea decupată pentru a compensa perspectiva. Această transformare folosește cele patru puncte pentru a crea un dreptunghi în loc de o formă de tip trapezoid așa cum se vede în a treia figură.

Următoarea problemă care trebuia rezolvată a fost aceea a zgomotului de fond sub formă de lumină exterioară și lumină reflectată de laserul însuși. Pentru a face acest lucru, am filtrat lumina folosind funcția inRange () a OpenCV. Am setat pragul pentru a prelua lumina roșie doar la un anumit nivel. Pentru a obține valoarea corectă, am început cu un prag indulgent și am continuat să cresc nivelul pragului până când singura lumină preluată a fost lumina laser de pe obiectul scanat. Odată ce am avut această imagine, am găsit cel mai luminos pixel din fiecare rând obțineți o linie de un pixel pe rând care se învecinează cu partea cea mai stângă a liniei laser. Fiecare pixel a fost apoi convertit într-un vârf în spațiul 3D și stocat într-o matrice, așa cum este descris în secțiunea de creare a mesh-ului. Rezultatele acestor pași pot fi văzute în figura a patra.

Control motor

După ce am reușit să procesez cu succes o singură imagine pentru a obține felia obiectului, a trebuit să pot roti obiectul pentru a face o nouă fotografie cu un unghi diferit. Pentru a face acest lucru, am controlat motorul pas cu pas de sub platforma pe care stă obiectul scanat. Am construit o bază a funcției noastre de pas prin crearea unei variabile pentru a urmări starea motorului și a microsteppingului prin comutarea fiecăreia dintre cele patru intrări ale motorului.

Pentru a crea o rețea din toate imaginile procesate, a trebuit mai întâi să convertesc fiecare pixel alb din imaginea procesată într-un vârf în spațiul 3D. Deoarece colectez felii individuale ale obiectului cu simetrie cilindrică, a avut sens să începem să colectăm coordonate cilindrice. Acest lucru a avut sens, deoarece înălțimea imaginii ar putea reprezenta axa z, distanța de la centrul mesei rotative ar putea reprezenta axa R, iar rotația motorului pas cu pas ar putea reprezenta axa theta. Cu toate acestea, deoarece am stocat datele noastre în coordonate cilindrice, a trebuit să convertesc fiecare dintre aceste vârfuri în coordonate carteziene.

Odată ce aceste vârfuri au fost create, acestea au fost stocate într-o listă și lista menționată a fost stocată într-o altă listă care conținea listele de vârfuri create pentru fiecare imagine capturată. Odată ce toate imaginile au fost procesate și convertite în vârfuri, a trebuit să selectez vârfurile pe care le doream de fapt reprezentate în rețeaua finală. Am vrut ca vârful de sus și vârful de jos să fie incluse și apoi, pe baza rezoluției, am ales un număr de vârfuri distanțate uniform pentru a fi utilizate pentru fiecare imagine. Deoarece nu toate listele de vârfuri aveau aceeași lungime, a trebuit să le uniformizez găsind lista cu cel mai mic număr de vârfuri și înlăturând vârfurile din toate celelalte liste până când erau toate uniforme. Cu listele de vârfuri create am putut acum creați o plasă. Am ales să ne formatăm mesh-ul după standardul de fișiere.obj, deoarece este simplu și imprimabil 3D.

Funcția încorporată

După ce dispozitivul a funcționat, l-am lustruit adăugând funcționalitate integrată completă. Aceasta a însemnat îndepărtarea tastaturii, mouse-ului și monitorului și trimiterea fără fir a fișierului.obj după terminarea procesării. Pentru a începe, am schimbat codul.bashrc pentru a mă autentifica automat și a lansa programul principal Python la pornire. Acest lucru a fost făcut folosind sudo raspi-config și selectând „Console Autologin” și adăugând linia „sudo python /home/pi/finalProject/FINAL.py” la /home/pi/.bashrc. În plus, a adăugat un buton și LED de stare pentru intrarea și ieșirea utilizatorului. Butonul îi permite utilizatorului să spună dispozitivului când trebuie să înceapă scanarea, iar LED-ul îi spune utilizatorului starea aparatului. Dacă LED-ul este aprins, dispozitivul este gata să înceapă o nouă scanare. Dacă LED-ul pulsează, dispozitivul scanează în prezent. Dacă LED-ul este de birou, există o eroare de software, solicitând o repornire a sistemului. În cele din urmă, am activat dispozitivul să trimită fișierul.obj prin e-mail. Acest lucru a fost făcut utilizând bibliotecile smtplib și e-mail. Această abilitate de a trimite e-mailuri ne-a oferit un mod foarte convenabil și fără fir de a livra fișierul produs utilizatorului pentru a-l accesa pe multe platforme diferite.

Pasul 7: Integrare

Integrare
Integrare

După fabricarea diferitelor piese ale dispozitivului, l-am asamblat împreună. Figura de mai sus arată în ordine:

(a) cutie asamblată în exterior

(b) cutie asamblată în interior cu cameră și laser

(c) vedere din interior a patului electronic

(d) partea din spate a Pi cu acces la porturile Pi și intrarea motorului de 5V

(e) buton cu inel LED și lumină de stare în partea din față a dispozitivului

Pasul 8: Rezultate

Rezultate
Rezultate
Rezultate
Rezultate
Rezultate
Rezultate
Rezultate
Rezultate

Scannerul laser 3D a reușit să scaneze obiecte cu o precizie decentă. Caracteristicile obiectelor sunt distincte și recunoscute, iar piesele au fost foarte ușor de imprimat 3D folosind un software de feliere, cum ar fi Repetier. Figurile de mai sus prezintă câteva exemplare de scanări ale unei bucăți de lemn și ale unei rațe de cauciuc.

Una dintre cele mai mari descoperiri și succese pe care le-am descoperit în timpul testării a fost consistența dispozitivului. De-a lungul mai multor încercări ale aceluiași obiect, scanerul a reușit să producă un fișier.obj care a fost foarte foarte asemănător de fiecare dată, chiar dacă am modificat ușor plasarea obiectului. După cum se vede în cele trei scanări separate, toate arată foarte asemănător, captând aceleași detalii și aceeași cantitate de detalii. În general, am fost foarte impresionat de consistența și robustețea sistemului nostru.

Una dintre variabilele pe care am reușit să o reglez este rezoluția scanărilor. Deoarece există 400 de pași în stepper, pot alege cât de mare este fiecare ΔΘ pentru a dicta rezoluția unghiulară. În mod implicit, am rezoluția unghiulară setată la 20 de iterații, ceea ce înseamnă că fiecare cadru, motorul se rotește cu 20 de pași (400/20 = 20). Acest lucru a fost ales în principal în interesul timpului - durează aproximativ 45 de secunde pentru a finaliza o scanare în acest fel. Cu toate acestea, dacă doresc o scanare de calitate mult mai înaltă, pot crește numărul de iterații până la 400. Acest lucru oferă multe mai multe puncte pentru a construi modelul, făcând o scanare mult mai detaliată. Pe lângă rezoluția unghiulară, pot regla și rezoluția verticală sau câte puncte diferite aleg să sondez de-a lungul feliei laser. Pentru un interes similar în timp, acest set implicit este setat la 20, dar îl pot crește pentru rezultate mai bune. Jucând cu acești parametri de rezoluție unghiulară și rezoluție spațială, am putut compila rezultatele diferitelor scanări de mai jos în ultima figură. Fiecare etichetă este formatată astfel încât să fie rezoluția unghiulară x rezoluția spațială. După cum se vede în setările implicite de scanare, caracteristicile raței sunt recunoscute, dar nu detaliate. Cu toate acestea, pe măsură ce măresc rezoluția, încep să apară caracteristici precise individuale, inclusiv ochii, ciocul, coada și aripile de pe rață. Imaginea cu cea mai înaltă rezoluție a durat aproximativ 5 minute pentru scanare. Vederea acestui nivel ridicat de rezoluție realizabilă a fost un succes foarte mare.

Limitări

În ciuda rezultatelor reușite ale proiectului, există încă câteva limitări ale proiectării și implementării. Odată cu utilizarea laserului, există o mulțime de probleme cu privire la dispersia luminii. Multe obiecte pe care am încercat să le scanez care erau fie translucide, strălucitoare sau foarte întunecate s-au dovedit a fi supărătoare cu modul în care lumina se reflecta de pe suprafață. Dacă obiectul ar fi translucid, lumina ar fi absorbită și dispersată, ceea ce va face o citire foarte zgomotoasă a feliilor. În obiectele strălucitoare și întunecate, lumina ar fi fie reflectată, fie absorbită până la punctul în care ar fi dificil de preluat. În plus, deoarece folosesc o cameră pentru a surprinde caracteristicile obiectelor, detectarea acesteia este limitată de linia sa vizuală, ceea ce înseamnă că obiectele concave și unghiurile ascuțite sunt adesea blocate de alte părți ale obiectului. Acest lucru este prezentat în exemplul nostru de rață de cauciuc, deoarece coada uneori își va pierde curbura în scanare. De asemenea, camera poate detecta doar structuri de suprafață, ceea ce înseamnă că găurile sau geometriile interne nu pot fi capturate. Cu toate acestea, aceasta este o problemă comună pe care o au și multe alte soluții de scanare.

Pasii urmatori

Deși am fost mulțumit de rezultatele proiectului nostru, au existat câteva lucruri care ar putea fi implementate pentru a-l îmbunătăți. Pentru început, în starea actuală, rezoluția de scanare poate fi modificată numai prin modificarea variabilelor de rezoluție codate în codul nostru. Pentru a face proiectul mai încorporat, ar putea fi inclus un potențiometru de rezoluție, astfel încât utilizatorul să poată modifica rezoluția fără a fi nevoie să conecteze un monitor și tastatură la scaner. În plus, scanerul creează imagini care uneori pot părea zimțate. Pentru a remedia acest lucru, tehnicile de netezire a ochiurilor ar putea fi implementate pentru a netezi neregulile și colțurile dure. În cele din urmă, am constatat că coordonatele pixelilor nu se întind bine în lumea reală. Oțelurile pe care le-am creat au fost de 6 până la 7 ori mai mari decât obiectul real. În viitor, ar fi avantajos să implementăm o modalitate de scalare a ochiurilor, astfel încât acestea să fie mai precise la dimensiunea reală a obiectului.

Pasul 9: Resurse

Am inclus codul, fișierele STL pentru imprimare și fișierele DXF pentru tăiere pentru întregul proiect.

Concursul Raspberry Pi 2020
Concursul Raspberry Pi 2020
Concursul Raspberry Pi 2020
Concursul Raspberry Pi 2020

Premiul I la Concursul Raspberry Pi 2020

Recomandat: