Inhoudsopgave:

XYZ-puntscanner met behulp van geborgen roterende encoders - Ajarnpa
XYZ-puntscanner met behulp van geborgen roterende encoders - Ajarnpa

Video: XYZ-puntscanner met behulp van geborgen roterende encoders - Ajarnpa

Video: XYZ-puntscanner met behulp van geborgen roterende encoders - Ajarnpa
Video: Голубая стрела (1958) фильм 2024, Juli-
Anonim
XYZ-puntscanner met behulp van geborgen roterende encoders
XYZ-puntscanner met behulp van geborgen roterende encoders

Nadat ik een behoorlijk groot aantal afgedankte roterende optische encoders van mijn werkplek had gekregen, besloot ik eindelijk iets leuks/nuttigs met ze te doen.

Ik heb onlangs een nieuwe 3D-printer voor mijn huis gekocht en wat zou dit beter kunnen aanvullen dan een 3D-scanner! Dit project bood me ook de perfecte gelegenheid om mijn 3D-printer in te zetten om de benodigde onderdelen te vervaardigen.

Benodigdheden

Optische encoders en bijbehorende optische sensoren

Arduino UNO

optioneel prototype schild

stalen staafrails

toegang tot een 3D-printer

Stap 1: De optische encoders

De optische encoders
De optische encoders
De optische encoders
De optische encoders
De optische encoders
De optische encoders

Vrijwel elke roterende encoder zou voor dit project kunnen worden gebruikt, zolang het maar een relatief hoog aantal 'kliks' per mm oplevert. Het is duidelijk dat verschillende encoders een geschikte montageoplossing vereisen.

Ik heb een continuïteitsmeter gebruikt om het bedradingsschema voor de fotosensoren te traceren.

Stap 2: 3D-geprinte onderdelen

3D-geprinte onderdelen
3D-geprinte onderdelen
3D-geprinte onderdelen
3D-geprinte onderdelen

Deze onderdelen bevatten de roterende encoders en bieden een slede voor de rail. De behuizing van de enkele encoder heeft twee gaten aan de achterkant om de dwarsrails op te monteren. De behuizing met dubbele encoder is eenvoudigweg twee enkele behuizingen die onder de juiste hoeken aan elkaar zijn gefuseerd.

Ik heb deze steunen op fusion360 ontworpen om te passen bij mijn keuze van encoders en rails, de as van de encoder heeft een kort stuk katapultrubber omhulsel, zodat deze de roestvrijstalen as beter vasthoudt.

U wilt dat de as vrij kan schuiven en door de behuizing valt wanneer deze verticaal wordt gehouden, maar hij moet voldoende druk uitoefenen op de encoder om niet te slippen. Wat voor mij werkte, was om de schuif voor de as 0,5 mm te laten overlappen met de encoderas. Het katapultrubber is zacht genoeg om met die hoeveelheid te vervormen en goede tractie te bieden.

Stap 3: Bedradingsschema

Schakelschema
Schakelschema

De schakeling is heel eenvoudig. De opto-sensoren hebben wat stroom nodig voor de IR-emitterdiodes, een massa en optrekweerstanden voor de fotodiodes.

Ik heb gekozen voor 5mA voor de in-serie emitterdiodes, in deze specifieke encoder is de spanningsval over de diodes 3,65V. Ik gebruik een 5V-voeding van de Arduino, die 1.35V overlaat voor de weerstand, bij 5mA komt dit neer op 270 ohm.

Voor de pull-ups is gekozen voor 10k ohm omdat de fotodiodes maar een kleine stroom kunnen zinken, ook voor de drukknop werd 10k ohm gebruikt. Er is een knop beschikbaar voor gebruik op het prototypebord dat al met aarde is verbonden, voorzie het gewoon van een pull-up-weerstand en sluit het aan op de gewenste ingangspin.

Stap 4: Arduino-code

Arduino-code
Arduino-code
Arduino-code
Arduino-code
Arduino-code
Arduino-code

De code heeft wat uitleg nodig omdat de werking misschien niet meteen duidelijk is, maar toch moest deze op deze manier worden geoptimaliseerd om 3 encoders snel genoeg te kunnen verwerken.

Ten eerste willen we alleen richtingsgegevens verwerken ALS er een verandering in de positie van de encoder heeft plaatsgevonden.

wijzigingen = nieuwe_waarde ^ opgeslagen waarde;

Om meer resolutie van mijn encoders te krijgen, moest ik zowel stijgende als dalende flanken verwerken.

Op mijn setup is mijn resolutie 24 klikken per 1 cm.

Dit laat ons met een paar scenario's.

S1 is constant 0 en S2 geschakeld van 0 naar 1

S1 is constant 0 en S2 geschakeld van 1 naar 0

S1 is constant 1 en S2 wisselt van 0 naar 1

S1 is constant 1 en S2 wisselt van 1 naar 0

S2 is constant 0 en S1 geschakeld van 0 naar 1

S2 is constant 0 en S1 geschakeld van 1 naar 0

S2 is constant 1 en S1 wisselt van 0 naar 1

S2 is constant 1 en S1 wisselt van 1 naar 0

Deze voorwaarden worden beter begrepen in de waarheidstabellen hierboven, ook levert elke voorwaarde een 'richting' op, willekeurig 0 of 1 genoemd.

De grafieken geven ons twee essentiële aanwijzingen:

1) de ene grafiek is de volledige inverse van de andere, dus als we er een hebben, kunnen we de andere gemakkelijk berekenen door simpelweg de uitvoer om te keren. We keren de uitvoer alleen om als de ene pin verandert en niet de andere, we kunnen er willekeurig een kiezen.

2) de kaart zelf is gewoon de XOR van de S1- en S2-signalen. (de andere grafiek is de NIET hiervan).

Nu is het begrijpen van de code eenvoudig.

// lees PORT parallel in // onthoud dat aangrenzende paren tot dezelfde encoderstatus behoren = PINB & 0x3f; // welke pinnen zijn veranderd indien diff = hold ^ state; // XOR aangrenzende S1- en S2-signalen om waarheidstabel te krijgen // de gemakkelijkste manier is om een kopie te maken van de huidige status // en deze één bit naar rechts te schuiven lookup = status >> 1; // nu zijn bits uitgelijnd voor XOR dir = lookup ^ state; // onthoud, de tabel moet worden omgekeerd als een // van de invoer constant blijft, we hebben hiervoor geen IF //-statement nodig. Momenteel is het gewenste richtingsbit // het rechterbit van elk paar in de 'dir'-variabele // het linkerbit is betekenisloos // de 'diff'-variabele heeft het bit dat 'set' heeft gewijzigd // dus we hebben ofwel '01' of '10' // XOR dit met de 'dir' byte zal ofwel // de betekenisvolle bit omkeren of niet. dir ^= verschil; // nu update hold variabele hold = state; // als een van beide bits is veranderd voor deze encoder if(diff & 0x03) {// bepaal richting if(dir & 0x01) { // gebaseerd op je hadware en bedrading ofwel ++ of -- --z; } anders { ++z; } } // idem voor de rest if(diff & 0x0c) { if(dir & 0x04) { ++y; } anders { --y; } } if(diff & 0x30) { if(dir & 0x10) { --x; } anders { ++x; } }

Wanneer de knop wordt ingedrukt, sturen we de huidige XYZ-waarde naar een terminalprogramma.

De seriële data is traag, maar tijdens normaal bedrijf zullen de posities van de encoders gedurende deze tijd toch niet veranderen.

De gegevens worden verzonden als onbewerkte tellingen. Je zou de wiskunde kunnen doen en de gegevens in mm of inches enz. kunnen verzenden. Ik vind dat onbewerkte waarden net zo goed zijn omdat we het object later in de software kunnen schalen.

Stap 5: Eerste scan

Eerste scan
Eerste scan
Eerste scan
Eerste scan
Eerste scan
Eerste scan
Eerste scan
Eerste scan

Het verzamelen van de punten is een langzaam proces, ik vloer de sonde in de linkerbovenhoek en reset de Arduino.

Dit zet de positie als thuis op nul.

Verplaats vervolgens de sonde naar de locatie op het doel, houd hem stil en druk op de 'snapshot'-knop.

Voor dit vrij grote voorbeeldstuk heb ik slechts ~ 140 punten genomen, dus detail is niet geweldig voor het eindproduct.

Sla de gegevens op in een. PCD-bestand en voeg de koptekst toe

#. PCD v.7 - Puntenwolkgegevensbestandsindeling VERSIE.7 VELDEN x y z SIZE 4 4 4 TYPE F F F COUNT 1 1 1 BREEDTE (uw puntentelling) HOOGTE 1 UITZICHT 0 0 0 1 0 0 0 PUNTEN (uw puntentelling)

Zet je puntentelling in de koptekst, dit is gemakkelijk voor elke editor die je regelnummers geeft.

Boven de punten zijn te zien in freeCad, ze worden vervolgens vanuit freeCad geëxporteerd als. PLY-bestand.

Open de. PLY op MeshLab en kijk naar het object. Gedaan!!

Aanbevolen: