Innehållsförteckning:

XYZ -punktskanner som använder bärgade roterande kodare: 5 steg
XYZ -punktskanner som använder bärgade roterande kodare: 5 steg

Video: XYZ -punktskanner som använder bärgade roterande kodare: 5 steg

Video: XYZ -punktskanner som använder bärgade roterande kodare: 5 steg
Video: Högskoleprovet Våren 2021 03 13 Provpass 3 Uppgift 14 2024, Juli
Anonim
XYZ -punktskanner som använder bärgade roterande kodare
XYZ -punktskanner som använder bärgade roterande kodare

Efter att ha skaffat ett stort antal kasserade roterande optiska kodare från min arbetsplats bestämde jag mig slutligen för att göra något roligt/användbart med dem.

Jag har nyligen köpt en ny 3D -skrivare för mitt hem och vad kan komplimangera det bättre än en 3D -skanner! Detta projekt gav mig också en perfekt möjlighet att använda min 3D -skrivare för att tillverka nödvändiga delar.

Tillbehör

Optiska givare och motsvarande optiska sensorer

Arduino UNO

valfri prototypsköld

stålskenor

tillgång till en 3D -skrivare

Steg 1: De optiska kodarna

De optiska kodarna
De optiska kodarna
De optiska kodarna
De optiska kodarna
De optiska kodarna
De optiska kodarna

Nästan vilken roterande kodare som helst kan användas för detta projekt, så länge det ger dig ett relativt högt antal "klick" per mm. Uppenbarligen kommer olika kodare att kräva en lämplig monteringslösning.

Jag använde en kontinuitetsmätare för att spåra kopplingsschemat för fotosensorerna.

Steg 2: 3D -tryckta delar

3D -tryckta delar
3D -tryckta delar
3D -tryckta delar
3D -tryckta delar

Dessa delar rymmer de roterande kodarna och ger en bild för skenan. Det enda givarhuset har två hål på baksidan för tvärskenorna att montera på. Det dubbla pulsgivarhuset är helt enkelt två enkla hus som smälts samman i rät vinkel.

Jag konstruerade dessa fästen på fusion360 för att passa mitt val av pulsgivare och skenor, pulsgivarens axel har en kort bit slanghotgummiskede för att hjälpa den att greppa rostfritt stålaxel bättre.

Du vill att axeln ska glida fritt och att falla genom huset när den hålls vertikalt, men den måste utöva tillräckligt med tryck på givaren för att inte glida. Det som fungerade för mig var att låta skaftet för axeln överlappa med givaraxeln med 0,5 mm. Slanggummit är tillräckligt mjukt för att deformeras med den mängden och ger bra dragkraft.

Steg 3: Anslutningsdiagram

Kopplingsschema
Kopplingsschema

Kretsen är väldigt enkel. Optosensorerna kräver lite ström för IR-sändardioderna, ett jord- och uppdragningsmotstånd för fotodioderna.

Jag bestämde mig för 5mA för seriens emitterdioder, i den här givaren är spänningsfallet över dioderna 3,65V. Jag använder en 5V -matning från Arduino, som lämnar 1,35V för motståndet, vid 5mA fungerar detta till 270 ohm.

10k ohm valdes för pull-ups eftersom fotodioderna bara kan sänka en liten ström, 10k ohm användes också för tryckknappen. Det finns en knapp tillgänglig för användning på prototypkortet som redan är ansluten till marken, förse den med ett uppdragningsmotstånd och koppla den till önskad ingångsstift.

Steg 4: Arduino -kod

Arduino -kod
Arduino -kod
Arduino -kod
Arduino -kod
Arduino -kod
Arduino -kod

Koden behöver en liten förklaring eftersom dess funktion kanske inte är direkt uppenbar, men den måste optimeras på detta sätt för att kunna bearbeta 3 kodare tillräckligt snabbt.

För det första vill vi bara bearbeta riktningsdata OM det har skett en förändring i kodarens position.

ändringar = nytt_värde ^ lagrat värde;

För att få mer upplösning från mina pulsgivare var jag tvungen att bearbeta både stigande och fallande kanter.

På min inställning är min upplösning 24 klick per 1 cm.

Detta lämnar oss med några scenarier.

S1 är konstant 0 och S2 växlar från 0 till 1

S1 är konstant 0 och S2 växlade från 1 till 0

S1 är konstant 1 och S2 växlar från 0 till 1

S1 är konstant 1 och S2 växlar från 1 till 0

S2 är konstant 0 och S1 växlade från 0 till 1

S2 är konstant 0 och S1 växlade från 1 till 0

S2 är konstant 1 och S1 växlar från 0 till 1

S2 är konstant 1 och S1 växlar från 1 till 0

Dessa förhållanden förstås bättre i sanningstabellerna ovan, också ger varje villkor en 'riktning', som godtyckligt heter 0 eller 1.

Diagrammen ger oss två viktiga ledtrådar:

1) det ena diagrammet är det fullständiga inverset av det andra, så om vi har ett kan vi enkelt beräkna det andra genom att helt enkelt vända utmatningen. Vi inverterar utgången bara om en stift ändras och inte den andra, vi kan välja en godtyckligt.

2) Själva diagrammet är helt enkelt XOR för S1- och S2 -signalerna. (det andra diagrammet är INTE av detta).

Nu är det enkelt att förstå koden.

// läs parallellt i PORT // kom ihåg att intilliggande par tillhör samma kodarstatus = PINB & 0x3f; // vilka stift har ändrats om någon diff = håll ^ tillstånd; // XOR intilliggande S1 och S2 signaler för att få sanningstabellen // det enklaste sättet är att göra en kopia av det aktuella tillståndet // och flytta det till höger med en bit uppslagning = tillstånd >> 1; // nu är bitarna inriktade för XOR dir = lookup ^ state; // kom ihåg, tabellen måste inverteras om en // av ingångarna förblev konstant, vi behöver inte ett IF // -uttalande för detta. För närvarande är den önskade riktningsbiten // högerbiten för varje par i variabeln "dir" // den vänstra handbiten är meningslös // variabeln "diff" har den bit som ändrade "set" // så vi har antingen '01' eller '10' // XOR detta med 'dir' byte kommer antingen // att invertera eller inte den meningsfulla biten. dir ^= diff; // nu uppdatera håll variabel håll = tillstånd; // om någon av bitarna har ändrats för den här kodaren om (diff & 0x03) {// bestäm riktning om (dir & 0x01) {// baserat på din hadware och ledningar antingen ++ eller ---z; } annat {++ z; }} // ditto för resten om (diff & 0x0c) {if (dir & 0x04) {++ y; } annat {--å; }} if (diff & 0x30) {if (dir & 0x10) {--x; } annat {++ x; }}

När du trycker på knappen skickar vi det aktuella XYZ -värdet till ett terminalprogram.

Seriell data är långsam, men under normal drift kommer positionerna för kodarna inte att förändras under denna tid ändå.

Uppgifterna skickas som raw counts. Du kan göra matematiken och skicka data i mm eller tum etc. Jag tycker att råvärdena är lika bra eftersom vi kan skala objektet senare i programvara.

Steg 5: Första genomsökningen

Första genomsökningen
Första genomsökningen
Första genomsökningen
Första genomsökningen
Första genomsökningen
Första genomsökningen
Första genomsökningen
Första genomsökningen

Att samla poängen är en långsam process, jag golvar sonden i det övre vänstra hörnet och återställer Arduino.

Detta nollställer positionen som hem.

Flytta sedan sonden till platsen på målet, håll den stadigt och tryck på knappen "ögonblicksbild".

För denna ganska stora provbit tog jag bara ~ 140 poäng, så detaljerna är inte bra på slutprodukten.

Spara data i en. PCD -fil och lägg till rubriken

#. PCD v.7 - Point Cloud Data filformatVERSION.7 FÄLT x y z STORLEK 4 4 4 TYPE F F F RÄKNING 1 1 1 WIDTH (ditt poängtal) HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS (ditt poängtal)

Sätt din poängräkning i rubriken, detta är enkelt för alla redaktörer som ger dig radnummer.

Ovanför prickarna kan du se i freeCad, de exporteras sedan från freeCad som. PLY -fil.

Öppna. PLY på MeshLab och ytan på objektet. Gjort!!

Rekommenderad: