3D-Scanner mit Sharp Distanzsensor
Ein selbst gebauter 3D-Scanner auf Basis von zwei Modellbauservos, einem Atmel AVR Mikrocontroller und einem Sharp Infrarot-Distanzsensor
Einleitung
Hier beschreibe ich meinen selbstgebauten 3D-Scanner auf Basis von
zwei Modellbauservos, einem Atmel AVR Mikrocontroller und einem Sharp
GP2Y0A02YK Abstandsmesser/Distanzsensor.
Hinweis
Ich übernehme keinerlei Garantie für die Funktion der hier vorgestellten
Schaltung! Für Schäden an Bauteilen
und/oder Personen oder Schäden anderer Art wird keine Haftung übernommen!
Nachbau und Benutzung erfolgen auf EIGENE GEFAHR!
Aufbau
Der Aufbau ist relativ simpel:
Ein Servo ist für die Rotation um bis zu 180 Grad um die X-Achse
verantwortlich, ein weiteres für die Rotation um die Y-Achse.
Oben ist als Distanzsensor der Sharp GP2Y0A02YK montiert.
Laut Datenblatt lassen sich damit Entfernungen von etwa 20cm bis 150cm erkennen.
Die beiden Servos sind an jeweils einen digtalen Ausgang des µC angeschlossen
und werden von ihm mit variablen Pulsen angesteuert.
Der Ausgang des Distanzsensor ist an einen analogen Eingang des µC (ADC)
angeschlossen.
Der UART ist mit einem MAX232 verbunden, der die Kommunikation über die
serielle Schnittstelle mit einem Laptop ermöglicht.
Arbeitsweise des Sensors
Der Sharp GP2Y0A02YK arbeitet nach dem Prinzip der
Triangulation mittels eines sog. position sensitive device.
Der Sensor beleuchtet dazu das Objekt mit Infrarotlicht und misst den Winkel,
in dem das Licht reflektiert wird. Das Ergebnis wird als analoge Spannung
ausgegeben und kann von µC weiterverarbeitet werden.
Die Kennlinie des Sensors ist im Datenblatt bei Sharp nachzulesen.
Hier ein Schnappschuss der Infrarot-Diode, mit bloßem Auge ist nur ein
leichtes rotes Leuchten erkennbar:
Ansteuerung der Servos
Modellbauservos werden angesteuert, indem man auf der Signalleitung
(meist Gelb oder Blau) ein Rechteck-Signal anlegt bei dem die Pulslänge
variiert. Ein High-Phase von ca. 1ms entspricht der linken Endposition,
eine High-Phase von ca. 2ms entspricht der rechten. Die darauf folgende
Low-Phase sollte etwa 20ms betragen, kann jedoch je nach Servotyp auch
variiert werden.
Es mag kompliziert klingen, die 1ms-2ms Pulse zu erzeugen, ist jedoch mit den
AVRs in einer Idle-Loop sehr einfach zu bewerkstelligen.
Kurzer Code-Ausschnitt:
/* servo ist angeschlossen an PB0 */
sbi(PORTB, PB0); /* high */
/* eine gewisse zeit nichts tun,
* entweder ausrechnen oder experimentell ermitteln
*/
for(delay=0;delay<servo_value;delay++) {
asm("nop"); /* nichts tun */
}
cbi(PORTB,PB0); /* low */
Ablauf eines Scans
Zum Steuern des Scans wird auf dem PC ein Programm benutzt, das dem
µC über die serielle Schnittstelle angibt, wohin sich die Servos bewegen sollen
und dann anschließend den Sensorwert (ebenfalls über RS232) ausliest.
Die rohen Sensordaten werden zusammen mit den Positionsdaten in einer einfachen
Textdatei gespeichert und dann mit Perl-Scripts nachbearbeitet und in die
gewünschten Formate konvertiert, zum Beispiel in Bitmaps.
Beispielscans
Erster Scan, man erkennt deutlich das Multimeter, die Lötstation und den
Lötkolben:
Eine RC-Car Fernbedienung, daneben in Original-Auflösung:
Oberkörper mit verschränkten Armen:
Profil von Oberkörper und Kopf:
Panorama-Scan von Zimmer:
Videos von Scans
|
Video von einem Scan, man sieht den Sensor, sich aus seiner Nullposition
zum Scanbereich bewegend.
Download (AVI; MPEG2; 919Kb)
|
|
Video von einem Scan
Download (AVI; MPEG2; 888Kb)
|
|
Video von einem Scan mit Blick auf die LED hinter der Linse.
Download (AVI; MPEG2; 252Kb)
|
|