90-I2C_GY271-Library (STM32F4)

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 :

gy_271

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 :

ub_stm32f4_i2c_hmc5883_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_90_I2C_HMC5883L


3 Antworten auf 90-I2C_GY271-Library (STM32F4)

  1. Cortex-Einsteiger sagt:

    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.

  2. Cristian sagt:

    Hallo! Großen Beitrag !! Haben Sie mit der GY-521-Modul gearbeitet? (Gyroskop + Beschleunigungsmesser)
    Herzlichen Dank!

    • admin_ub sagt:

      nein.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.