Notitzen einer IP

Kalendarischer Verlauf + Notizen einer IP zum openLIDAR:

13.8.12:
-Einarbeitung in die Programmierung des Arduino-Microcontrollers: Wie werden Signale ausgegeben und eingelesen (Analog-Digital/IN-OUT), einfache Beschaltungen...
-Anschluss eines Abstandssensors (Sharp blabla) an den Arduino, Aufsetzung eines Codes zum Auslesen der Daten des Sensors
-erste Signalausgabe, ausgegeben werden Werte (zwischen 0 und 1023) umgekehrt proportional zur Entfernung

14.8.12:
-Implementierung eines Codes, der von einer bestimmten Anzahl an vom Abstandssensor ausgelesenen Werten den höchsten und niedrigsten Wert auf Null setzt und die restlichen Werte mittelt
-> geringerer Fehler pro Abstandsmessung
-Aufbau eines einfachen IR-Optokopplers auf dem Laborsteckbrett, mehrere Versuche

15.8.12: Feiertag

16.8.12:
-Berichtigung des Codes vom 14.8.
-Ausgabe nun in Zentimeter
-Skalierung der eingelesenen Werte in Intervalle von je 5cm, hierzu Messung der Grenzwerte zwischen je zwei Intervallen durch einfachen und schnellen Versuchsaufbau; pro Stufe werden zehn Werte gemessen, anschließend Mittelung durch Matlab

17.8.12:
- Aufbau einer Photodiodenschaltung zur Ermittelung des IR-Streulichts um den Sensor
-zunächst Black-Box-Versuchsaufbau mit IR-Optokoppler
-> Ermittlung des maximalen Diodenstroms
-> Calibrierung der einzulesenden Werte aus der Photodiode
- Erweiterung des Programmcodes um einen Code zur Ermittlung des über 50 Werte gemittelten Streulichtwertes durch die Photodiode


20.8.12:
-Erstellung von Referenzsensordaten im dunklen Raum mit weißer Reflektorfläche (Bild!)
-Übertragung der Referenzdaten zur Skalierung in das Programm
-erste Ansteuerung eines Servos (Towerpro sg90) zur horizontalen Bewegung des Abstandssensors
-Implemetierung im Gesamtprogramm, dabei schrittweise Bewegung des Servos jeweils nach der Messung im Bereich von fast 180 Grad (Servo-bedingt weniger!)
-Test

21.8.12:
-Ansteuerung eines zweiten Servos zur Verstellung der Abstandssensor-Einheit zusätzlich in horizontaler Richtung
-dadurch theoretisch der Raum einer Halbkugel abtastbar
-Implementierung im Gesamtprogramm
-Aufbau eines externen Spannungsnetzes zur Versorgung der Servos
-provisorischer Versuchsaufbau mit dem Abstandssensor und den zwei Servos auf einer Schaumstoffhalterung (Bild!)
-Test

22.8.12:
-Einarbeitung in die Kommunikation zwischen Arduino und Matlab, mit dem Ziel die empfangenen Sensordaten grafisch darstellen zu können
-Überlegungen zum Bau eines Abstandssensors, der in der Lage sein soll, genauer und größere Distanzen zu messen
-Zunächst soll die Richtung eines in den LIDAR-Erfassungsbereich auftretenden Hindernisses detektiert werden. Das soll mit Hilfe eines 2x2 großen IR-Photodioden-Arrays mit einem zentral positionierten IR-Emitter (durch einen MOSFET gezündet) geschehen. Aus der Differenz der von den Photodioden (durch OP-Amps verstärkt?) jeweils eingelesenen Werten kann dann die Richtung des Objekts berechnet werden

23.8.12:
-Beginn der Planung eines IR-Abstandssensors:
Sendemodul:
Oszillator erzeugt Rechteckwelle mit Frequenz f0
-> pn-Übergang verhindert negative Spannungen
-> periodisches Aufblitzen des IR-Emitters (evtl. über n-Kanal Mosfet)
Empfangsmodul:
Reflektierte Strahlen treffen mit Zeitverzögerung t_R auf IR-Receiver, geringerer Pegel als bei den Sendeimpulsen + zusätzliches Störrauschen durch Streulicht
-> 2.IR-Receiver (von Sendereflexionen abgeschirmt) ermittelt IR-Streulicht
-> Subtrahierer: zieht Pegel von RecII von RecI ab
-> pn-Übergang: rein positives Signal bleibt übrig -> Spannungsverstärker: passt Empfangspegel auf Sendeniveau an
-> Phasendetektor (Achtung: konstante Verfälschung durch OP-Amp-Delays)
-Vergleich diverser IR-Emitter und IR-Receiver um 950nm (möglichst kurze Anstiegszeit, kleiner Abstrahlwinkel, Emitter mit hoher Leistung...)

24.8.12
-anstelle des ReceiverII-Zweiges besser eine Komparatorschaltung, die einen festen Wert vom ReceiverI-Signal zur Streulichtunterdrückung abzieht? ausprobieren!
-Integrierer: eventuell bereits in einer Art Sample-and-Hold-Funktion nutzbar, dann mit Transistorschaltung Kondensator entladen
-Erstellung eines ersten Signalflussplans
-Erstellung eines Taktfolgediagramms

27.8.12:
-Erstellung des vorerst gültigen Signalflussplans (->Diagramm)
-Erstellung einer Liste sämtlicher auftretenden Verzögerungszeiten (->Liste)
-Erstellung eines Zeitverlaufs inklusive Verzögerungszeiten (->Diagramm)
-Beginn der Aufstellung der Bedingungen, die für die einstellbaren Zeiten gelten müssen (->Formelübersicht)
-Beginn der Auflistung aller benötigten Bauteile (->Liste)
-Gliederung der Entwurfsabschnitte (->Liste)

28.8.12:
-Problem bei der Spannungsverstärkung: Ausgangswert muss immer gleichen Wert haben, unabhängig vom Pegel des Eingangssignals
-deshalb: Zusammenfassung des Subtrahierers und des Spannungsverstärkers in ein Modul, bringt auch Delay-Verbesserung
-spannende Bauteilsuche: Vergleich der Datenblätter diverser Bauteile hinsichtlich bestmöglicher Eigenschaften in Bezug auf den Sensorentwurf
-(vorläufige) Ergebnisse:
~IR-Emitter: SFH4239
~IR-Photodiode: Osram SFH213
~Op-Amps: Analog Device AD8000
~n-MOSFET: Infineon BS0330N02K
~AND-Gatter: MM74HC08
~Timer-Baustein: ALD7555

29.8.12:
-Datenblattwälzen
-Zusammenstellung der Bestellliste
-Skizzierung der Schaltpläne jeder einzelnen Komponenten
-Zusammenfügung zu einem ersten Gesamtschaltplan

30.8.12:
-Datenblattwälzen
-Dimensionierung des Rechtecksignals: Periodendauer + Duty-Cycle durch Festlegung der maximal zu messenden Entfernung
-Verbesserung des Schaltplans, Arduino übernimmt ab jetzt das Schalten zur Entladung des Kondensators im Integrierer
-> DelaystufeII entfällt
-Ungefähre Berechnung der Delaystufe I
-> Verwende drei AND-Dummygatter
-Erstellung eines neuen Schaltplans

31.8.12:
-Berechnung der nötigen Bauteilwerte (Widerstände, Kondensatoren...) und Auswahl realer Größen
-Widerstände am Timer werden jeweils durch einen festen und variablen Teil gebildet (Vorwiderstand + Einstellpotentiometer)
-> Vereinfachte Frequenz und Dutycycle-Einstellung
-Aufbau der Timerschaltung (provisorisch mit NE555), Erstellung eines 3D-Plots mit Matlab zur einfacheren Duty-Cycle-Einstellung
-Das Ausgangssignal des Integrierers wird vor der Abtastung noch durch einen invertierenden Verstärker geschickt (sonst negatives Signal!)
-Aktualisierung des Gesamtschaltplans

3.9.12:
-Matlab
-Arduino Support Package
-Versuch des Aufbaus einer seriellen Kommunikation zwischen Matlab und Arduino

4.9.12:
-Matlab
-Erstellen einfacher kleiner Testprogramme auf dem Arduino zum Testen der Datenübertragung in Matlab
-Schreiben eines m-Files zur Auswertung des Arduinos
-häufiges Problem: wechselhafte Bezeichnung des Ports, an dem der Arduino hängt

5.9.12:
-Matlab
-Schreiben eines Programms zur 2dimensionalen Auswertung von Winkel und Entfernung in Matlab

6.9.12:
-Matlab
-Zwei-dimensionaler Plot eines abgetasteten Profils, bereits abgearbeitete Winkel werden aktualisiert
-Darstellung als Farbige Dreiecke (Bild!)
-noch manuelle Eingabe der Entfernungsdaten

7.9.12:
-To Do: Eingabe per seriellen Port mit Arduino

10.9.12:
-mathematisches Problem: Die Winkelbewegungen, mit denen der Abstandssensor gedreht wird entsprechen nicht direkt den Kugelkoordinaten in Matlab!
-> Bestimmung einer geeigneten Drehmatrix, dadurch Ausgabe in den richtigen Kugelkoordinaten
-Aufsetzen eines neuen Matlabprogramms

11.9.12:
-Fertigstellung des Matlab Programms
-pro gemessener Entfernung wird in einer 3D-Figur ein Polygon geplottet (Bild!)
-wird aus gleichen Winkeln erneut gemessenen, wird der vorherige Plot an dieser Stelle überschrieben
-Erstellung eines Arduino-Programms, das Daten liefert, die vom Matlab-Programm gelesen und weiterverarbeitet werden können

12.9.12:
-Überarbeitung des Arduino-Hauptprogramms: Servos werden in der mit Matlab abgestimmten Reihenfolge bewegt, ausgegebene Daten können direkt von Matlab verarbeitet werden
-Überarbeitung des Matlabprogramms: Winkel- und Entfernungsangaben werden über die serielle Schnittstelle vom Arduino eingelesen
-erster Plot (Bild!)
-Probleme:
-> Plotausgabe erfolgt nicht synchron, sondern erst nach Programmabbruch
-> Plot nicht sonderlich übersichtlich
-> Abstandssensor fährt nicht an seine Grenzen in Bezug auf die gemessene Entfernung
-> Unbedingt noch Taster implementieren, der eine ordnungsgemäße Terminierung des Programms ermöglicht

13.9.12:
-Überarbeitung der Graphik-Ausgabe durch Matlab in Bezug auf die Übersichtlichkeit: Im Gegensatz zur Vorgängerversion, bei der jeder eingelesene Punkt Mittelpunkt eines Polygons war und die Eckpunkte durch die Schnittpunkte der von diesem Punkt bestimmten tangentialen Ebene mit radial nach außen gerichteten Geraden bestimmt wurden, bildet jetzt jeder eingelesene Punkt selbst eine Ecke von ein bis vier Polygonen (abhängig von der Lage im 3D-Gitter)
-Zunächst wird durch Polygone eine Referenzkugel geplottet, die durch die folgenden Entfernungsmessungen verändert wird
-Schwierigkeit: wird eine Entfernung aus einer bereits betrachteten Richtung eingelesen, müssen alle vier umliegenden Polygone erneuert werden

14.9.12:
-Fortführung der Matlab-Code-Überarbeitung
-Einführung geeigneter Matrix- und Vektorvariablen zur Speicherung sämtlicher Informationen über die zu plottenden Punkte und Polygone
-Problem: sehr verschachtelte Ausdrücke -> Übersichtlichkeit trotz zahlreicher Kommentare nicht sonderlich vorhanden
-Aber: immer noch Fehler im Programmcode enthalten, zu überschreibende Polygone werden nicht wie erwartet gelöscht

17.9.12:
-Fehler im neuen Matlab-Programm gefunden und behoben
-Farbliche Anpassung des Vorgänger-Programms: je näher das Polygon um Koordinatenursprung, desto röter dessen Farbe
-> deutlich übersichtlichere Darstellung
-> zwei verschiedene 'Radarschirme' vorhanden; jeweils Vorteil/Nachteil?

18.9.12:
-Austausch der provisorischen und sehr wackligen Styropor-Konstruktion durch den Neubau einer weitaus stabileren (d.h. starren) Halterung für den Abstandssensor (mit Servomechanik) aus 0,8mm Alublech
-> Test mit Arduino-Programm; Ergebnis: praktisch ruckelfreier Aufbau, obwohl die Servos wie auch der Alu-Halter selbst noch nicht verschraubt sondern nur mit Klebeband verklebt sind
-Löten einer kleinen Punktrasterplatine zum einfachen und schnellen Anschluss des Abstandssensors

19.9.12:
-Implementierung einer Interruptroutine, die bei Betätigung eines kleinen Tasters das Abstandssensor-Programm startet und bei nochmaligem Drücken das Werte-Triplet (0 0 0) ausgibt, das vom Matlab-Program erkannt wird und so die Graphische Auswertung ordnungsgemäß beendet und auch die Serielle Verknüpfung gelöscht wird

20.9.12:
-erster Test des Matlab-Programs Plot_Arduino (jeder eingelesene Punkt ist Mittelpunkt eines Polygons -> Polygone frei im Raum), mit ordnungsgemäßer Beendigung
-Gleicher USB-Port kann auch bei nachfolgenden weiteren Programmaufrufen verwendet werden
-erster Test des Matlab-Programms Plot_Arduino2 (jeder eingelesene Punkt ist Eckpunkt eines Polygons -> Polygongitter), mit ordnungsgemäßer Beendigung
-aber: Übersichtlichkeit?
-> logarithmische Skalen?

21.9.12:
-Erweiterung der Punktrasterplatine um einen Schiebeschalter mit Pull-Up-Widerstand
-Implementierung eines Arduino-Programms zur Ausgabesteuerung des Haupt-programms: Solange der (jetzt auch entprellte) Schalter auf "0" steht, wird in einer Schleife permanent eine Folge von drei Nullen (mit abschließendem Line Feed) ausgegeben. Wird der Schalter auf "1" gestellt, führt das Programm seine gewöhnliche Funktion als Abstandsmessung (mit entsprechender Ausgabe) aus. Wird der Schalter erneut verstellt, kehrt das Programm zur Ausgabe von Nullen zurück. Ab diesem Zeitpunkt ist eine "Auto-Off"-Funktion enthalten, die das Programm nach 15 Sekunden zu einer einmaligen Ausgabe von vier Nullen zwingt.
Matlab soll solange Nullen vom Arduino eingelesen werden in eine Art Wartezustand versetzt werden, und bei Übertragung der vier Nullen ordnungsgemäß beendet werden.

24.9.12:
-Aktualisierung des Arduino-Programmes: 3 mögliche Nullvektor-Ausgaben:
-> 3 Nullen: Programm wartet auf eine die erste oder eine erneute Betätigung des Schalters
-> 4 Nullen: Arduino signalisiert dem Matlab-Programm, dass Messpunkte übergeben werden
-> 5 Nullen: Programm wird nach einer Auto-off-Zeit (15 sek) beendet
- Implementierung eines Matlab-Programms zur Auswertung der vom Arduino gesendeten Daten
-Übernahme dieses Programms in das Matlabprogramm Plot_Arduino22 und in das ältere Programm Plot_Arduino

25.9.12:
-siehe gedit-file
-Fehler in der Beschaltung des Timers, Verwechslung der Zeiten t_h und t_l im Datenblatt
-> komplett falsche Frequenz und Duty-Cycle
-Neue Beschaltung durch Widerstände nötig, Duty-Cycle wie erwünscht jedoch nicht realisierbar
-> Negierter Ausgang (mit missbrauchtem NOR-Gatter) aus Timer soll jedoch den gewünschten DC liefern
-Beginn des Lötens der Timerschaltung, der viel zu große Widerstand der Jumperkabel (ungefähr 1Ohm pro Kabel) kann nur so umgangen werden

26.9.12:
-Timerschaltung mit NOR-Gatter fertig gelötet (Bild!)
-Test am Oszilloskop:
-> Frequenz sehr gut einstellbar
-> Duty-Cycle dagegen nur schlecht
-> NOR-Gatter als Inverter funktioniert einwandfrei
-> Timer liefert akzeptables Rechtecksignal (das noch recht ausgeprägte Überschwingen wird durch die anzuhängende Last reduziert werden)
-Lösung für schlechten Duty-Cycle scheint ein kleinerer Kondensator (ursprgl. 100nF jetzt 9,4nF) zu bringen (500ns High-Time), dadurch wird jedoch auch die Frequenz wesentlich kleiner
-> Lösungsmöglichkeiten: größere Widerstand für R_A, nachgeschalteter Frequenzteiler?

27.9.12:
-Kondensator am Timer auf 4,7nF reduziert, Festanteil des Widerstandes R_A auf 15kOhm erhöht
-Ergebnis: Ausgangssignal gut einstellbar mit Periodenlänge von 100us und High-Time von um die 400ns
-> Referenzsignal ist fertig (Ausgang vom NOR-Gatter)
-Zu beachten: Je höher die Temperatur am Timer, desto länger wird die Periode des Referenzsignals (bei konstanter Raumtemperatur jedoch nicht relevant)
-Aufbau der Spannungsversorgung für die Op-Amps (+ und -Vcc) mit dem Dc/Dc-Converter ILC7660
-> 5V jedoch nicht ausreichend!
-Bauteilsuche, Vorbereitung der Bestellung bei Mouser

28.9.12:
-Aufbau der Op-Amp Schaltung zur Wegrechnung des Rauschpegels und zur Verstärkung auf 5V auf dem Steckbrett mit dem (zu langsamen) TL072; kein brauchbares Ergebnis
-> Verwendung einer Komparatorschaltung
-> ebenfalls Versuchsschaltung mit dem TL072; Ergebnis geht in die richtige Richtung, jedoch ist der verwendete Op-Amp viel zu langsam, um bei einem eingehenden Rechtecksimpuls mit einer Dauer von 400nm auch am Ausgang wieder ein Rechteck zu liefern, stattdessen konnte ein mehr oder weniger schönes Trapez erkannt werden
-Versuch zur Streulichtmessung: Anschluss der Photodiode SFH213FA (880nm) ans Oszilloskop; Pegel durch das Streulicht im mit Neonröhren beleuchteten Raum beträgt maximal 280mV

1.10.12:
-Bemessung des vor den invertierenden Eingang des Komparators geschaltenen Spannungsteilers; der Op-Amp-Eingang wird zwischen einem Poti und einem Fest-Widerstand angeschlossen
-Entwurf und Aufbau der symmetrischen Stromversorgung für die Op-Amps:
-> Step-Up-Regler MC34063A mit entsprechender Beschaltung macht aus eingehenden 5V am Ausgang abgreifbare 7V
-> DC-DC-Konverter ICL7660 liefert zusätzlich -7V
-> funktioniert
-Schaltungsentwurf zur Stromversorgung des IR-Emitters mit dem Spannungsregler LM350 (verträgt bis 3A)

2.10.12:
-Überarbeitung der Stromversorgung des IR-Emitters: Anstelle des LM350 wird jetzt eine Schaltung, bestehend aus dem sowieso zu verwendenden n-MOSFET, einem NPN-Transistor und etwas Widerstand, verwendet
-> Einsparung von 4 Bauteilen
-Erstellung des aktuellen Gesamtschaltplans
-Auflöten der Stromversorgung der Op-Amps auf die Lochrasterplatine

3.10.12:
-Feiertag

4.10.12:
-Fertiglöten der Stromversorgung, funktioniert
-Fertigstellung des Gesamt-Schaltplans
-Beginn der Implementierung des Arduino-Programms
-Bauteilbestellung und Abholung bei Conrad (Anschlussbuchse für die Stromversorgung, IC-Sockel, Einstellpotentiometer)

5.10.12:
-Weiterschreiben am Arduino Programm, Implementierung der Wertmittelung aus dem Programm für den Sharp-Sensor
-kleine Lötereien an der Platine (14 Pin DIP Sockel, Buchse für die Stromversorgung des IR-Emitters)
-Problem: Läuft die Entfernungsdetektion durchgehend, hat der Arduino keine Zeit die Werte auch auszugeben, da stets der Kondensator des Integrierers rechtzeitig entladen werden muss
-> Enable/Disable-Signal nötig, das die Entfernungsmessung dadurch aussetzen lässt, dass das Eingangssignal des Integrierers auf Masse gezogen wird

6.10.12:
-Bau einer präzise einstellbaren Halterung aus Acryl-Glas für den IR-Emitter und die IR-Photodiode (Bild); Anlöten der Dioden und Verbindungskabel, Anschluss an Hauptplatine per Stecker

-Verlöten der Stromversorgung des IR-Emitters, Tests

 

7.10.12:

-Aufbau der Komparatorschaltung

-Problem: Stromversorgung des IR-Emitters funktioniert nicht, wie geplant

-> Auslöten der alten Versorgung, Einbau eines einstellbaren Spannungsreglers, bei dem durch ein nachgeschaltetes Poti auch der Strom durch den IR-Emitter eingestellt werden kann; Funzt!

-Überprüfungen am Oszilloskop zeigen, dass das empfangenen Signal an der IR-Photodiode extrem verrauscht ist: 100Hz verursacht durch Leuchtstoffröhren

-> Unbedingt Hochpassfilterung nötig!

 

8.10.12:

-Konstruktion einer kleinen Abschirmung aus Karton: reduziert sowohl Einfall des Umgebungslichts an der Photodiode als auch direkten Signalaustausch mit dem IR-Emitter

-Test mit vom Arduino erzeugten Referenzsignal (100 zu 900ms, dadurch mit Handykamera Funktion des IR-Emitters überprüfbar): IR-Emitter arbeitet einwandfrei, Signal kann trotz 100Hz Rauschen auf kurze Distanz (40cm hin, 40cm zurück, reflektiert an weißem Karton) sauber erkannt werden

-Aufbau einer Op-Amp-Schaltung als Hochpass mit dem LT1227: am Ausgang kommt nur sehr starkes Rauschen raus. Wird dagegen der TS272 verwendet, funktioniert die Schaltung (jedoch nicht für die angestrebten äußerst kurzen Rechteckimpulse geeignet, da zu langsam). Unklarheit über die richtige Verwendung des LT1227, vor allem über die Verwendung des Shutdown-Pins.