lunedì 5 settembre 2016

DIY - Realizzare uno scanner 3D con Arduino (alta risoluzione a basso costo)

Perché dovrei realizzare uno scanner 3D?
Diversi sono i motivi che mi spingono a farlo tra cui quello di realizzare dei busti a tutto tondo per poi fresarli su legno con il quarto asse, realizzare una specie di fotografia in 3D.

La fresatrice l'ho costruita, il quarto asse pure, quello che mi manca per raggiungere lo scopo è un modello 3D della figura e l'unico modo per ottenerlo è con uno scanner 3D.
Tempo fa avevo tentato di realizzare il modello 3D di un busto con il sensore Kinect ma purtroppo ha una scarsa qualità e i dettagli più piccoli di 15 mm vanno perduti.

Non ho di certo intenzione di comprarmi uno scanner da 600 euro ma con pochi componenti è possibile realizzarselo da soli.



Documentandomi un pò ho scoperto che ci sono diverse tecniche per ottenere un modello 3D e quella più economica è la fotogrammetria.
In pratica consiste nel dare in pasto ad un software una sequenza di immagini, possibilmente in alta risoluzione. C'è chi utilizza una webcam ma ritengo sia molto meglio una reflex (per chi ne possiede una ovviamente).

Componenti necessari per realizzare uno scanner 3D

Avendo a disposizione una Fujifilm Finepix S9500 ho pensato di adibirla allo scopo.
Essendo il software a fare tutto il "lavoro sporco" non resta che concentrarsi sulla qualità delle immagini.


Arduino servirà solo per gestire il movimento di un sistema rotante e di scattare le immagini.
Quasi tutte le fotocamere hanno un ingresso per gestire lo scatto remoto ed anche la mia Finepix tramite il protocollo RR-80.

Ho ordinato su Ebay un cavetto RR-80


Infine serve una scheda Arduino, un driver pololu A4988, un motore stepper, un relè, un pezzo di piastra millefori e qualche morsettiera da saldare.





Lo schema di collegamento dei componenti è molto semplice.











Sketch Arduino - download

In sostanza Arduino dovrà eseguire 2 operazioni ripetute.
  1. Ruotare il motore di un dato numero di gradi
  2. Azionare il relè per far eseguire lo scatto alla fotocamera

Ho scritto un breve sketch per poter pilotare i componenti sia con due pulsanti che a linea di comando tramite stringhe passate via console seriale; 
ad esempio se volessi fare scatti ogni 10° basta digitare "scan-10" oppure scan-20 = scatti ogni 20°.
Ho aggiunto anche altri comandi per poter fare il timelapse escludendo la rotazione del motore specificando nel comando quanti scatti fare e dopo quanti secondi uno dall'altro.

clicca qui per scaricare lo sketch per Arduino.

Nota bene: E' necessario caricare nelle librerie di Arduino il componente AccelStepper scaricabile gratuitamente da questo link.


Preparazione supporto girevole

Per scansionare un volto dovrebbe essere la camera a doversi muovere ed il soggetto a rimanere fermo ma prima vorrei testare tutto il sistema su oggetti piccoli e capire qual'è il dettaglio minimo catturabile.

Mi sono costruito un disco graduato con un foro di fissaggio al motore stepper.









Ho calibrato gli step del motore con i gradi incisi sul disco ed ho iniziato a fare la prima scansione di un giocattolo di mia figlia.




Acquisizione immagini

Ho eseguito una scansione con scatti ogni 10° e tutte le immagini le ho date in pasto ad un software di fotogrammetria chiamato Agisoft Photoscan che è possibile scaricare in modalità demo.





Elaborazione con Agisoft Photoscan







I dettagli del modello sono molto precisi nonostante abbia scattato le foto in condizioni di poca luce ed anche con una lieve sfocatura.

Per aumentare i dettagli sarà sufficiente eseguire scatti anche in altre angolazioni.

Box Elettronica

Per contenere i pochi compomenti elettronici ho realizzato una scatola in multistrati da 10 mm sulla quale ho inciso con il laser le indicazioni dei led e pulsanti.
L'ho fatta abbastanza capiente perchè all'interno di essa ci metterò anche un alimentatore per il motore stepper.



Avevo dei vecchi componenti (interruttori, pulsanti, led) inutilizzati che ho riciclato ed il tutto ha preso un leggero stile vintage.






Risoluzione infinita...

Il bello di utilizzare la tecnica della fotogrammetria è che si possono ottenere risoluzioni molto alte perché dipende solo dall'ottica della fotocamera che si utilizza.

Ho provato a scansionare un oggetto molto piccolo con l'opzione macro ed il risultato è andato ben oltre le mie aspettative.


36 scatti ogni 10°













Alcune immagini






The next Step: Ottenere un modello 3D di un volto...

Per riuscire a fare la scansione dei volti non resta altro da fare che costruire un meccanismo rotante tramite il motore stepper che possa far ruotare la fotocamera e dal lato opposto un pannello di sfondo di colore verde.

Per ora è tutto, seguirà un aggiornamento.
Grazie per la lettura.



38 commenti:

  1. Bravo. Riusciresti a fare lo stesso senza l'uso della tavola rotante?
    Armando
    armfer333@gmail.com

    RispondiElimina
  2. ciao Armando, la tecnica della fotogrammetria non obbliga l'utilizzo di una tavola rotante è sufficiente che vengano scattate tante foto attorno all'oggetto per cui se non vuoi realizzare un piano che ruota puoi sempre girare tu attorno all'oggetto con una fotocamera, l'unica cosa è che l'illuminazione se non è perfetta il risultato finale sarà piuttosto scarso.
    saluti

    RispondiElimina
  3. ciao, le caratteristiche del motore stepper? grazie Giuseppe

    RispondiElimina
  4. Ciao sono molto interessato al tuo progetto e vorrei realizzare anche io uno scanner 3d.
    L idea e davvero bella, posso cogliere l occasione anche di utilizzare Arduino e dei motori passo passo visto che non li ho mai utilizzati

    RispondiElimina
  5. Ma si potrebbe fare la stessa cosa con una fotocamera di Arduino charmed labs LLC(Scusa se magari la domanda non ha senso perché non c'entra niente, ma è curiosità)

    RispondiElimina
    Risposte
    1. la tecnica della fotogrammetria richiede alte risoluzioni e una buona qualità della luce, se la camera non è di alto livello il risultato sarà di bassissima qualità e a volte il software non riesce neanche a generare il modello 3d.

      Elimina
  6. Per una cosa un po' diversa che rileva solo forme semplici come quadrati o triangoli e possibile utilizzare i sensori di movimento?

    RispondiElimina
  7. Vittore Ceccarelli2 marzo 2020 alle ore 14:46

    Salve, posso usare come macchina fotografica una Sony DSC-HX350?

    RispondiElimina
    Risposte
    1. Ciao Vittore, dipende, se la macchina possiede un'entrata per poter gestire lo scatto da remoto allora puoi usarla.
      saluti

      Elimina
  8. La possibilità di mettere il comando remoto c'è ma non trovo il cavo rr80 per adattarlo. Se prendo un comando remoto posso applicarci io il jack?

    RispondiElimina
    Risposte
    1. mi verrebbe da dirti di si, comunque su ebay si trova, ecco il link: https://www.ebay.it/itm/Cavo-Met-K-Compatibile-Mit-Dem-Dispositivo-di-Scatto-a-Distanza-Fujifilm-RR-80/302641813887?hash=item4676db997f:g:peIAAOSwD~FbwLjF

      Elimina
  9. Veramente bravo, complimenti per ingegno e manualità!

    RispondiElimina
  10. ciao.. un ottimo progetto.. ho replicato il tuo progetto è a livello hardware funziona tutto..ho solo un problema. quando importo le immagini lui dopo aver allineato le foto le mette tutte sovrapposte una con l'altra. non riesco a capire..mi dai una mano per favore perche non capisco..Grazie caro.

    RispondiElimina
    Risposte
    1. ciao, ormai è passato molto tempo e non credo di avere più installato quel software per poterci guardare però quello che posso dirti è che PhotoScan è particolarmente pignolo sull'illuminazione per cui il consiglio che posso darti è di regolare meglio l'illuminazione del soggetto da scansionare e in ogni caso seguire scrupolosamente le indicazioni della documentazione del software.

      Elimina
  11. Ciao, complimenti per il progetto. Mi potesti dire come hai fatto a collegare il relé (quale hai usato?) alla macchina fotografica?
    Grazie

    RispondiElimina
  12. Ciao Mirco, potresti rispondere alle domande che ti ho fatto? Ho realizzato il tuo progetto ma mi sono fermato al collegamento della macchina fotografica; in più non riesco a capire come mai il led system non si accende mai.
    Grazie

    RispondiElimina
    Risposte
    1. ciao, potresti darmi qualche info in più riguardo al collegamento della macchina fotografica, in che punto ti sei fermato? Riguardo al led system sicuramente c'è qualcosa nei cablaggi che non è a posto. Senza poter vedere il lavoro che hai fatto e con così poche informazioni non ho alcuna idea su come poterti aiutare. scrivimi a mirco.slepko (at) gmail.com inviandomi materiale utile (foto, video, schemi, ecc) a farmi comprendere meglio la questione.
      ciao

      Elimina
  13. Complimenti per il bel lavoro svolto, molto interessante

    RispondiElimina
  14. Ciao... e complimenti! Anche io avevo provato con la fotogrammetria ma il set fotografico deve essere fatto veramente bene per avere foto di qualità da dare in pasto a photoscan. Poi ho optato per uno scanner a luce strutturata con cui mi trovo veramente bene. Ora vorrei uno scanner lidar portatile (tipo quello di iPhone 12 pro appena uscito) ma mi mancano quei 1500 euro per comprarlo.... Secondo te si potrebbe realizzare con arduino e qualche sensore??? Magari collegato ad uno smartphone per vedere in tempo reale la ricostruzione? Vorrei scansione con precisione millimetrica piccoli bassorilievi per poi fresare con cnc... Grazie

    RispondiElimina
    Risposte
    1. ciao, non conoscevo lo scanner lidar ma facendo una ricerca veloce sul web ho trovato questo interessante progetto con Arduino, prova a vedere se fa al caso tuo.

      https://create.arduino.cc/projecthub/TravisLedo/arduino-lidar-scanning-java-rendering-6b2124

      saluti

      Elimina
    2. ciao Mic, se ti può interessare ho trovato questo simpatico progetto di uno scanner LiDAR: https://www.instructables.com/Project-Lighthouse-360-Mini-Arduino-LiDAR/

      Elimina
  15. ciao Mirco grazie per il progetto, non so come collegare il cavo rr80 su modulo 2 relè , preso tutto come da tue indicazione per acquisto , grazie

    RispondiElimina
    Risposte
    1. ciao Giuseppe, se guardi lo schema in alto i 2 poli del cavo vanno collegati rispettivamente al COM (comune) e al N/O (normalmente aperto) in questo modo quando il relè scatta i 2 fili verranno messi in contatto e la macchina dovrebbe scattare.
      ciao

      Elimina
  16. grazie e dalla parte relè A1 e A2 a cosa corrispondono : GND/INPUT FOR R1/INPUT FOR R2 /POWER SUPPLY
    perdona la mia ignoranza ma sono ai primi passi

    RispondiElimina
    Risposte
    1. A1 e A2 non sono altro che i poli della bobina del relè, dove un capo lo colleghi a massa e l'altro al pin di arduino n.7

      Elimina
  17. Ciao Mirco, grazie per il progetto. Una domanda: "Sto utilizzando uno stepper con un riduttore. Come posso aumentare o diminuire gli step affinchè riesca a fare un giro completo da 360 gradi? ho provato a fare delle modifiche allo sketch ma non riesco a ottenere una misura precisa ". Grazie mille in anticipo per la risposta!

    RispondiElimina
    Risposte
    1. ciao,
      il mio progetto iniziale prevedeva l'utilizzo di un motore senza riduttore per cui tutto è stato calcolato con il rapporto 1:1.
      Se il tuo motore ha un riduttore è prima di tutto fondamentale conoscerne il rapporto esatto per poter poi moltiplicare il parametro che gestisce il movimento angolare.
      nel file .ino troverai questo calcolo:

      num_spassi_motore = (3200 /360) * gradi;

      considerando che 3200 sono i passi (dovuti al fatto che c'è un microstep) che dovrà fare il motore per compiere un giro dovrai moltiplicarlo per il rapporto del tuo motore, ad esempio se il tuto riduttore è 1:2 il valore 3200 dovrà essere moltiplicato x 2 diventando 6400.

      spero di averti aiutato.
      saluti

      Elimina
  18. Ciao Mirco, grazie per la risposta. Ho già provato a modificare quel valore ma prende solo multipli di 360... quindi non riesco ad essere preciso.

    Es.
    num_spassi_motore = 4200 / num_step;


    00:46:05.325 -> Arduino Received: goto-360
    00:46:05.362 -> goto
    00:46:05.362 -> 360
    00:46:05.362 ->
    00:46:05.362 -> Rotazione in corso..
    00:46:05.400 -> 360
    00:46:05.400 -> 3960.00

    quindi anche se imposto 4200 lui ne fa comunque solo 3960 (360x11)

    che ne pensi?

    Grazie Lorenzo
    (scusa se scrivo come anonimo ma nn riesco a loggarmi)

    RispondiElimina
    Risposte
    1. Ciao Lorenzo,
      attenzione che c'è in 2 punti del codice il valore 3200 da sostituire.
      prova a fare un find per la stringa 3200...

      Elimina
    2. ciao, si ho provato a cambiarlo sia qui:
      float num_spassi_motore = 4000 / num_step;
      che qui:
      float num_spassi_motore = (4000 /360) * gradi;

      ma si muove solo di blocchi da 360 passi

      ciao e grazie ancora
      Lorenzo

      Elimina
    3. molto strana questa cosa...
      sei sicuro di aver impostato bene il microstep sul driver, dovrebbe essere 1/16 se non ricordo male.
      Se il microstep non è impostato bisogna rivedere tutti i conteggi dei passi.

      Elimina
    4. Risolto! Ho inserito un coefficiente correttivo e riesco a fargli fare il numero di passi esatto per un giro completo.

      float num_spassi_motore = (3200 /360) * gradi/0.7529;

      Grazie mille!

      PS. comunque ho realizzato la piastra rotante e fatto le mie prove di scansione e stampa 3d. Ho già realizzato diversi pezzi (la piastra è molto robusta, ci ho messo su anche mio figlio...).

      Elimina
  19. Ciao sono affascinato dal tuo progetto ma mancano diverse foto e video, sopratutto per ciò che riguarda lo schema di collegamento dell'elettronica...sarebbe possibile ricaricare tutte le foto comprese quelle mancanti?

    RispondiElimina
    Risposte
    1. Ciao, non capisco per quale motivo alcune immagini sono sparite, dammi qualche giorno, provo a ricaricarle sperando di trovarle...

      Elimina