Schwarz auf Weiß

Auch als Buch mit dem Titel '10 Selbstbauprojekte', ISBN-Nr. 978-3-7448-3433-9 und als e-book mit der ISBN-Nr. 9783744806299 erschienen.

Besuchen Sie auch meine Art site https://khomet.de

Sonntag, 28. Januar 2018

Kompass mit LIS3MDL und PIC32MX340F512

Inhaltsverzeichnis

Motivation
Aufbau
Schaltplan
Signal
Entwicklungsumgebung
Software
Links
Downloads


Motivation
Der Kompass ist als Orientierungshilfe für ein autonomes Roboter-Auto gedacht. Die Deklination (Abweichung zwischen tatsächlicher Himmelsrichtung und der von einem Kompass angezeigten Richtung) ist nicht berücksichtigt. Zum Beispiel sind das in Aachen 0° und in Berlin -2° . Die magnetische Flussdichte des Erdmagnetfeldes beträgt ca. 0,5 G oder 50µT.


Aufbau
Das Kompass-Breakout mit dem LIS3MDL-Chip findet Platz auf einem OLIMEX-Board mit dem PIC32MX340F512. Um den Einfluss von Fremdmagnetfeldern zu minimieren, ist das Breakout in ca, 65 mm Höhe über dem Prozessorboard montiert.  Direkt in der Nähe befindliche stromführenden Leitungen dürfen nicht mit mehr als 10 mA beaufschlagt sein. Dies ist mit dieser Anordnung auf jeden Fall ausgeschlossen. Die X-Achse zeigt in Richtung Auto-Front (die beiden Ultraschallsensoren) und die Y-Achse nach links Bauelemente Seite nach oben). Das Breakboard ist parallel zum OLIMEX-Board ausgerichtet.




Anordnung des LIS3MDL Breakouts auf dem OLIMEX Board.
Rechts oben sieht man die Ultraschall-Distanz-Sensoren, die die Front des späteren Roboter Autos markieren. Das Prozessorboard ist nach Westen ausgerichtet, die Kompassnadel auf dem OLED zeigt an, in welcher Richtung sich, relativ zum OLIMEX Board, Norden befindet.Links daneben bedeutet 270 270°, also Westen. Darüber die 1 zeigt X an und -279 Y. Links unten im Bild sieht man den PIC32MX340F512.



Ansicht des LIS3MDL Breakouts von unten

Schaltplan


Das LIS3MDL Breakout wird vom OLIMEX Board mit 3,3 V an Pin VDD (hinter dem Onboard Spannungsregler) versorgt. Die Stromaufnahme beträgt je nach Betriebsart bis ca. 500 µA. Der Datenaustausch findet über den I2C2 Bus statt. Da die Clock Rate 400 kHz ist, müssen die pullup Widerstände entsprechend niedrig sein. Die Device Adresse ist vom Hersteller festgelegt und kann an SDO noch variiert werden. Mit CS an +3,3 V wird I2C als Bus gewählt (Standard, die Leitung kann auch offen bleiben, da ein interner pullup von 10k diese nach H zieht). DRDY löst einen Interrupt am INT4 des PIC32 aus und signalisiert, dass neue Daten zur Verfügung stehen.


Signal
Der LIS3MDL kommuniziert über den I2C2 Bus mit dem PIC32. Es stehen
16 Bit Daten für X, Y und Z zur Verfügung. Für dieses Projekt werden nur die X und Y-Achse verwendet. Der Chip ist ab Werk feldstärkekalibriert. Um aber die Daten für eine Winkelermittlung verwenden zu können, müssen X und Y offsetkorrigiert werden. Der Messbereich wird auf +/-16 G eingestellt, da nur eine geringe Empfindlichkeit (584 uG) notwendig ist. Das Rauschen begrenzt allerdings die Empfindlichkeit z. B. bei medium performance auf 4,6 mG.Mit dem DRDY Pin des Breakboards wird im PIC32 ein Interrupt INT4 ausgelöst. In der Interruptserviceroutine werden XH, XL, YH und YL abgerufen und jeweils zu einem 16 Bit Wert verechnet. Um die Signale zu glätten, wird ein gleitender, gewichteter Durchschnitt für X und Y gebildet. 



Der aktuelle Winkel wird wie folgt berechnet:

wenn Y>0                                 Winkel=90 - [arcTAN(x/Y)] * 180 / π
wenn Y<0                                 Winkel=270 - [arcTAN(x/Y)] * 180 / π
wenn Y=0 & X<0                      Winkel = 180°
wenn Y=0 & X>0                      Winkel = 0°

Entwicklungsumgebung
Als Entwicklungsumgebung wird das kostenlose MPLAB X IDE von Microchip unter Windows 10 eingesetzt. Als Compiler wird die C32 suite verwendet. Um eine bessere Unterstützung zu bekommen, ist noch das Harmony Plugin eingebunden. Der PICKit3.5 kommt als Incircuit Emulator in Einsatz. Compiler und Emulator werden in einer Toolchain festgelegt. Im MPLAB X hat man die Wahl entweder mit Debug Code oder standalone zu compilieren. Im Debug Mode kann man in der freien Version bis zu 6 Programm Haltepunkte und bis zu 2 Daten Haltepunkte setzen.Um sich den Inhalt von Variablen anzusehen, muss der Debugger angehalten werden. Es findet keine Code Optimierung statt. Die Peripheral Libraries sind nicht mehr enthalten und müssen extra installiert werden.
Da das OLIMEX Board eine eigene Stromversorgung hat, muss in den Projekteigenschaften unter PICkit3 'Power target circuit from PICkit3' ausgeschaltet werden. Um beim Debuggen die Variablen angezeigt zu bekommen, muss in den Projekteigenschaften unter 'pic32-as', 'General', 'Have symbols in production build' eingeschaltet werden.

Software
Das Programm ist in C für den C32 Compiler geschrieben. Aus Gründen der Übersichtlichkeit wird nicht das ganze, bisherige Programm für das Roboter Auto vorgestellt, sondern nur die den Kompass betreffenden Teile. Teilweise ist in den Variablennamen SM303D statt LIS3MDL verwendet. Dieser Chip hat noch einen Accelerator-Sensor on Board, hier wird aber der LIS3MDL verwendet. Die Routinen für das OLED sind nicht enthalten. Alle fb_draw ... schreiben in einen Grafik Buffer, der dann im Polling ins OLED geschrieben wird.


Links
MPLAB X Win10 64 Bit: http://www.microchip.com/development-tools/downloads-archive
MPLAB Harmony:          http://www.microchip.com/mplab/mplab-harmony

LIS3MDL:      http://www.st.com/content/ccc/resource/technical/document/datasheet/54/2a/85/76/e3/97/42/18/DM00075867.pdf/files/DM00075867.pdf/jcr:content/translations/en.DM00075867.pdf

Breakout Board:             https://www.pololu.com/product/2737

Prozessorboard:             https://www.olimex.com/Products/PIC/Proto/PIC-32MX/

OLED:                             https://pic-projekte.de/blog/ssd1306/

Downloads
Programm snippet:              main.c

Stichworte
MPLAB X
PIC32
PIC32MX
PIC32MX340F512
Magnetometer
LIS3MDL
Kompass