Wer ein GY271-Modul (3Achs Digital-Kompass-Modul mit HMC5883L-Chip) ansteuern will, kann diese Library benutzen.
An dieser Stelle ein DANKE an ”Joerg” der mir den Sensor zugesendet hat.
Es gibt eine Funktion zum initialisieren und eine Funktion um die Daten vom Sensor
auszulesen (diese Funktion muss gepollt werden) .
Nach dem auslesen steht der Status vom Sensor und der aktuelle Winkel
(als Gradwert 0 bis 359) in einer Struktur.
Der Messbereich kann mit einer 3ten Funktion eingestellt werden
(von +/- 0,8 Gauss bis +/- 8Gauss)
Und per START/STOP-Calibration kann ein Kalibrations Modus realisiert werden.
Der Sensor muss in diesem Modus in alle Lagen gedreht werden um die Min-Max-Werte
zu erfassen, die für die Nullpunkt Kalibration notwendig sind)
Es wird die I2C-LoLevel-Library benutzt (mit I2C1)
Hinweis-1 : Mein Sensor Funktioniert nach der Kalibration komischerweise besser, wenn die Platine vom Modul nicht waagrecht sondern senkrecht gehalten wird. Keine Ahnung warum.
Hinweis-2 : Der Sensor reagiert sehr empfindlich gegen alles metalische (auch die Zuleitungen und andere Elektronik) und gegen elektrische Magnetefelder
(dafür ist der Magnetfeld-Sensor ja da
Hinweis-3 : Für die Umrechnung der Rohdaten in einen Winkelwert wird die C-Funktion “atan2(…)” benutzt. Dafür wird die included. Um diese Bibliothek beim compilieren hinzuzufügen, muss bei CoIDE unter “Configuration/Link/Misc Controls” der Schalter “-lm” manuell hinzugefügt werden !!
Beispielbild :
Benutzte Pins :
1 2 | SCL an PB6 SDA an PB7 |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : keine Benutzte Librarys : STM32_UB_I2C1 |
Enumerationen :
1 2 3 4 5 6 7 8 | HMC5883_0G8 = 0, // +/- 0,88 Gauss HMC5883_1G3, // +/- 1,3 Gauss (default) HMC5883_1G9, // +/- 1,9 Gauss HMC5883_2G5, // +/- 2,5 Gauss HMC5883_4G0, // +/- 4,0 Gauss HMC5883_4G7, // +/- 4,7 Gauss HMC5883_5G6, // +/- 5,6 Gauss HMC5883_8G1 // +/- 8,1 Gauss |
Struktur :
1 2 3 4 5 | typedef struct { HMC5883_STATUS_t status; // status vom Sensor uint16_t winkel; // Winkel in Grad [0 bis 359] }HMC5883_t; HMC5883_t HMC5883; |
Funktionen :
1 2 3 4 5 | ErrorStatus UB_HMC5883_Init(void); // zum initialisieren vom Sensor ErrorStatus UB_HMC5883_Read(void); // zum auslesen vom Sensor ErrorStatus UB_HMC5883_SetScale(HMC5883_SCALE_t scale); // zum einstellen vom Messbereich void UB_HMC5883_Start_Calibration(void); // zum starten der Kalibration void UB_HMC5883_Stop_Calibration(void); // zum stoppen der Kalibration |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | //-------------------------------------------------------------- // File : main.c // Datum : 21.12.2014 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der HMC5883-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_hmc5883.h" #include "stm32_ub_led.h" int main(void) { ErrorStatus check; uint8_t led_mode=1; SystemInit(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // init vom HMC5883 check=UB_HMC5883_Init(); if(check!=SUCCESS) { // bei einem Fehler gruen und rot einschalten UB_Led_On(LED_RED); UB_Led_On(LED_GREEN); while(1); // stop } else { // Sensor auf "unempfindlich" einstellen UB_HMC5883_SetScale(HMC5883_8G1); } while(1) { // sensor pollen UB_HMC5883_Read(); // check ob Sensor Daten ok sind if(HMC5883.status==HMC5883_OK) { // zuerst alle LEDs auschalten UB_Led_Off(LED_GREEN); UB_Led_Off(LED_RED); UB_Led_Off(LED_ORANGE); UB_Led_Off(LED_BLUE); // dann eine LED je nach Winkel einschalten if((HMC5883.winkel>=60) && (HMC5883.winkel<=120)) led_mode=1; if((HMC5883.winkel>=150) && (HMC5883.winkel<=210)) led_mode=2; if((HMC5883.winkel>=240) && (HMC5883.winkel<=300)) led_mode=3; if((HMC5883.winkel>=330) || (HMC5883.winkel<=30)) led_mode=4; if(led_mode==1) UB_Led_On(LED_BLUE); if(led_mode==2) UB_Led_On(LED_GREEN); if(led_mode==3) UB_Led_On(LED_ORANGE); if(led_mode==4) UB_Led_On(LED_RED); } else { // bei einem Fehler gruen und rot einschalten UB_Led_On(LED_RED); UB_Led_On(LED_GREEN); UB_Led_Off(LED_ORANGE); UB_Led_Off(LED_BLUE); } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
wieder eine tolle Lib, danke!
Habe den Sensor schon einige Monate in der Schublade liegen gehabt, da er mit meiner eigenen Software aber nicht stabil lief, blieb er dort.
Demoprogramm aufgespielt, läuft
Im nächsten Schritt noch die Libs für Display, Font und Stringwandlung eingefügt, funktioniert perfekt, DANKE, dass du deine Arbeit mit uns teilst.
Hallo! Großen Beitrag !! Haben Sie mit der GY-521-Modul gearbeitet? (Gyroskop + Beschleunigungsmesser)
Herzlichen Dank!
nein.