Inhaltsverzeichnis:

XYZ-Punktscanner mit geborgenen Drehgebern - Gunook
XYZ-Punktscanner mit geborgenen Drehgebern - Gunook

Video: XYZ-Punktscanner mit geborgenen Drehgebern - Gunook

Video: XYZ-Punktscanner mit geborgenen Drehgebern - Gunook
Video: Grenzwissenschaft Classics Videos, Folge #30: Dreamland: Das Geheimnis von Area 51 (UFOs) 2024, Juli
Anonim
XYZ-Punktscanner mit geborgenen Drehgebern
XYZ-Punktscanner mit geborgenen Drehgebern

Nachdem ich eine ziemlich große Anzahl von ausrangierten optischen Drehgebern von meinem Arbeitsplatz erworben hatte, beschloss ich schließlich, etwas Spaßiges / Nützliches damit zu machen.

Ich habe vor kurzem einen neuen 3D-Drucker für mein Zuhause gekauft und was könnte ihn besser ergänzen als ein 3D-Scanner! Dieses Projekt bot mir auch die perfekte Gelegenheit, meinen 3D-Drucker zur Herstellung der benötigten Teile einzusetzen.

Lieferungen

Optische Encoder und entsprechende optische Sensoren

Arduino UNO

optionaler Prototyping-Schild

Stahlstangenschienen

Zugang zu einem 3D-Drucker

Schritt 1: Die optischen Encoder

Die optischen Encoder
Die optischen Encoder
Die optischen Encoder
Die optischen Encoder
Die optischen Encoder
Die optischen Encoder

Für dieses Projekt kann fast jeder Drehgeber verwendet werden, solange er Ihnen eine relativ hohe Anzahl von "Klicks" pro mm bietet. Natürlich erfordern unterschiedliche Encoder eine geeignete Montagelösung.

Ich habe einen Durchgangsmesser verwendet, um den Schaltplan für die Fotosensoren zu verfolgen.

Schritt 2: 3D-gedruckte Teile

3D-gedruckte Teile
3D-gedruckte Teile
3D-gedruckte Teile
3D-gedruckte Teile

Diese Teile beherbergen die Drehgeber und bieten einen Schlitten für die Schiene. Das Single-Encoder-Gehäuse hat auf der Rückseite zwei Löcher für die Montage der Querschienen. Das Dual-Encoder-Gehäuse besteht einfach aus zwei einzelnen Gehäusen, die im rechten Winkel miteinander verschmolzen sind.

Ich habe diese Halterungen auf fusion360 so entworfen, dass sie meiner Wahl von Encodern und Schienen entsprechen. Die Welle des Encoders hat ein kurzes Stück Schleuder-Gummihülle, um die Edelstahlwelle besser zu greifen.

Die Welle soll frei gleiten und durch das Gehäuse fallen, wenn sie senkrecht gehalten wird, aber sie muss genügend Druck auf den Drehgeber ausüben, damit sie nicht verrutscht. Was für mich funktionierte, war, den Schieber für die Welle mit der Encoderwelle um 0,5 mm überlappen zu lassen. Der Schleudergummi ist weich genug, um sich um diesen Betrag zu verformen und bietet eine gute Traktion.

Schritt 3: Schaltplan

Schaltplan
Schaltplan

Die Schaltung ist sehr einfach. Die Optosensoren benötigen etwas Strom für die IR-Emitterdioden, eine Masse und Pullup-Widerstände für die Fotodioden.

Ich habe mich für 5 mA für die in Reihe geschalteten Emitterdioden entschieden, bei diesem speziellen Encoder beträgt der Spannungsabfall über den Dioden 3,65 V. Ich verwende eine 5V-Versorgung vom Arduino, die 1,35V für den Widerstand übrig lässt, bei 5mA ergibt dies 270 Ohm.

Für die Pull-Ups wurden 10k Ohm gewählt, da die Fotodioden nur einen geringen Strom aufnehmen können, auch für den Taster wurden 10k Ohm verwendet. Auf der bereits mit Masse verbundenen Prototypenplatine steht ein Taster zur Verfügung. Versehen Sie ihn einfach mit einem Pull-up-Widerstand und verdrahten Sie ihn mit dem gewünschten Eingangspin.

Schritt 4: Arduino-Code

Arduino-Code
Arduino-Code
Arduino-Code
Arduino-Code
Arduino-Code
Arduino-Code

Der Code bedarf einer kleinen Erklärung, da seine Funktionsweise vielleicht nicht sofort ersichtlich ist, aber er musste so optimiert werden, um 3 Encoder schnell genug verarbeiten zu können.

Zunächst wollen wir nur Richtungsdaten verarbeiten, WENN es eine Änderung der Geberposition gegeben hat.

Änderungen = neuer_Wert ^ gespeicherter Wert;

Um mehr Auflösung von meinen Encodern zu bekommen, musste ich sowohl steigende als auch fallende Flanken verarbeiten.

Bei meinem Setup beträgt meine Auflösung 24 Klicks pro 1cm.

Dies lässt uns mit ein paar Szenarien.

S1 ist konstant 0 und S2 wird von 0 auf 1 umgeschaltet

S1 ist konstant 0 und S2 wird von 1 auf 0 umgeschaltet

S1 ist konstant 1 und S2 wechselt von 0 auf 1

S1 ist konstant 1 und S2 wechselt von 1 auf 0

S2 ist konstant 0 und S1 wird von 0 auf 1 umgeschaltet

S2 ist konstant 0 und S1 ist von 1 auf 0 umgeschaltet

S2 ist konstant 1 und S1 wechselt von 0 auf 1

S2 ist konstant 1 und S1 wechselt von 1 auf 0

Diese Bedingungen werden in den obigen Wahrheitstabellen besser verstanden, außerdem ergibt jede Bedingung eine 'Richtung', die willkürlich 0 oder 1 genannt wird.

Die Diagramme geben uns zwei wichtige Hinweise:

1) Ein Diagramm ist die vollständige Umkehrung des anderen. Wenn wir also eines haben, können wir das andere leicht berechnen, indem wir einfach die Ausgabe invertieren. Wir invertieren den Ausgang nur, wenn sich ein Pin ändert und der andere nicht, wir können einen beliebig auswählen.

2) das Diagramm selbst ist einfach das XOR der S1- und S2-Signale. (das andere Diagramm ist das NICHT davon).

Jetzt ist es einfach, den Code zu verstehen.

// PORT parallel einlesen // daran denken, dass benachbarte Paare zum gleichen Encoder-Zustand gehören = PINB & 0x3f; // Welche Pins haben sich geändert, wenn überhaupt diff = hold ^ state; // XOR benachbarte S1- und S2-Signale, um die Wahrheitstabelle zu erhalten // Der einfachste Weg ist, eine Kopie des aktuellen Zustands // zu erstellen und ihn um ein Bit nach rechts zu verschieben lookup = state >> 1; // jetzt werden Bits für XOR ausgerichtet dir = lookup ^ state; // Denken Sie daran, dass die Tabelle invertiert werden muss, wenn eine // der Eingaben konstant geblieben ist, wir brauchen dafür keine // IF-Anweisung. Derzeit ist das gewünschte Richtungsbit // das rechte Bit jedes Paares in der 'dir'-Variablen // das linke Bit ist bedeutungslos // die 'diff'-Variable hat das geänderte Bit 'set' // also haben wir entweder '01' oder '10' // XOR dies mit dem 'dir' Byte wird entweder // das bedeutungsvolle Bit invertieren oder nicht. dir ^= diff; // Jetzt Hold-Variable aktualisieren hold = state; // wenn sich eines der Bits für diesen Encoder geändert hat if(diff & 0x03) { // Richtung bestimmen if(dir & 0x01) { // basierend auf Ihrer Hadware und Verkabelung entweder ++ oder -- --z; } sonst { ++z; } } // dito für den Rest if(diff & 0x0c) { if(dir & 0x04) { ++y; } sonst { --y; }} if(diff & 0x30) { if(dir & 0x10) { --x; } sonst { ++x; } }

Beim Drücken der Schaltfläche senden wir den aktuellen XYZ-Wert an ein Terminalprogramm.

Die seriellen Daten sind langsam, aber während des normalen Betriebs ändern sich die Positionen der Encoder während dieser Zeit sowieso nicht.

Die Daten werden als Rohzählungen gesendet. Sie könnten rechnen und die Daten in mm oder Zoll usw. senden. Ich finde Rohwerte genauso gut, weil wir das Objekt später in der Software skalieren können.

Schritt 5: Erster Scan

Erster Scan
Erster Scan
Erster Scan
Erster Scan
Erster Scan
Erster Scan
Erster Scan
Erster Scan

Das Sammeln der Punkte ist ein langsamer Prozess, ich lege die Sonde in die obere linke Ecke und setze das Arduino zurück.

Dadurch wird die Position als Zuhause auf Null gesetzt.

Bewegen Sie dann die Sonde an die Position auf dem Ziel, halten Sie sie ruhig und drücken Sie die 'Schnappschuss'-Taste.

Für dieses ziemlich große Musterstück habe ich nur ~140 Punkte genommen, daher sind die Details am Endprodukt nicht so toll.

Speichern Sie die Daten in einer. PCD-Datei und fügen Sie den Header hinzu

#. PCD v.7 - Punktwolken-DatendateiformatVERSION.7 FELDER x y z GRÖSSE 4 4 4 TYP F F F ZÄHLUNG 1 1 1 BREITE (Ihre Punktzahl) HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 PUNKTE (Ihre Punktzahl)

Geben Sie Ihre Punktzahl in die Kopfzeile ein, dies ist für jeden Editor, der Ihnen Zeilennummern liefert, einfach.

Oben sind die Punkte in freeCad zu sehen, sie werden dann aus freeCad als. PLY-Datei exportiert.

Öffnen Sie die. PLY auf MeshLab und tauchen Sie das Objekt auf. Fertig!!

Empfohlen: