
Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-23 15:01

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



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


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

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



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




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:
Meting van versnelling met behulp van ADXL345 en Particle Photon: 4 stappen

Meting van versnelling met behulp van ADXL345 en deeltjesfoton: De ADXL345 is een kleine, dunne, ultralaagvermogen, 3-assige versnellingsmeter met hoge resolutie (13-bits) meting tot ±16 g. Digitale uitvoergegevens zijn geformatteerd als 16-bits tweetallen en zijn toegankelijk via de digitale I2 C-interface. Het meet de
Upgrade de achtergrondverlichting van een VU-meter naar blauwe led met behulp van oude CFL-lamponderdelen: 3 stappen

Upgrade een VU-meterachtergrondverlichting naar blauwe led met behulp van oude CFL-lamponderdelen.: Tijdens het repareren van een oude Sony TC630 reel-to-reel bandrecorder, merkte ik dat een van de glazen bollen voor de achtergrondverlichting van de VU-meter kapot was. Geen hoeveelheid geleidende verf werkte omdat het lood onder het glasoppervlak was afgebroken. De enige vervanger die ik
Berekening van vochtigheid, druk en temperatuur met behulp van BME280 en Photon Interfacing: 6 stappen

Berekening van vochtigheid, druk en temperatuur met behulp van BME280 en Photon Interfacing. We komen verschillende projecten tegen die temperatuur-, druk- en vochtigheidsbewaking vereisen. We realiseren ons dus dat deze parameters eigenlijk een cruciale rol spelen bij het hebben van een schatting van de werkefficiëntie van een systeem bij verschillende atmosferische cond
Digitale klok met netwerktijd met behulp van de ESP8266: 4 stappen (met afbeeldingen)

Digitale netwerkklok met de ESP8266: we leren hoe we een schattige kleine digitale klok kunnen bouwen die communiceert met NTP-servers en de netwerk- of internettijd weergeeft. We gebruiken de WeMos D1 mini om verbinding te maken met een wifi-netwerk, de NTP-tijd te verkrijgen en deze weer te geven op een OLED-module. De video hierboven
Hoe u gebruikersniveaus van NUMA toevoegt aan uw exemplaar van N met behulp van NumADD Firefox AddOn: 4 stappen

Gebruikersniveaus van NUMA toevoegen aan uw exemplaar van N NumADD Firefox-add-on gebruiken: Elke gebruiker van Metanet's N-database op gebruikersniveau NUMA weet hoe onhandig de interface is voor het kopiëren van door gebruikers gemaakte niveaus naar uw exemplaar van het spel. NumADD, elimineert de noodzaak van kopiëren en plakken en maakt het overzetten van niveaus het werk van één muisklik