Kompass mit GY-271 und Arduino Nano - AZ-Delivery

, esta Vez vamos a construir una Brújula digital. Para ello, necesitamos un Arduino Nano, un GY-271 Módulo y un Anillo de LEDS RGB. El Aparato, y podemos fácilmente a través de una pila de 9V de Pilas de suministro.

Circuito:

El Circuito es muy simple. El GY-271 Módulo y el Anillo de LEDS a través de 5V. Así, GND y Vcc a 5V del Nano, conectar. El Bus I2C del GY-271 con el I2C Puertos del Nano conectado. Y aunque A4 con SDA y A5 con SCL. Para el Anillo de LEDS, conectar el cable de Señal con D4 en el Nano. Para la fuente de Alimentación, conectar el Negativo del pack de pilas con GND y los 9V Positivo a través de un Interruptor con el Vin del Nano.

El Código de

La mayoría de las Bibliotecas existentes para el HMC5883 no sólo diferentes, I2C, Dirección, sino también diferente Registerbelegung tiene. Pero dado que el Control de la QMC5883L es muy fácil esta vez me he en el Uso de una Biblioteca de renuncia.

Podemos fácilmente las Funciones de Arduino I2C de Biblioteca.

En la Soft-Reset, ponemos el Impuesto de Registro-10 y 11. Es interesante el 9 los registros fiscales de los Parámetros principales del QMC5883L puede ajustar.

El Modo Stand-By o continuas de Medición. Con la Salida de Velocidad de transmisión de datos se puede definir como muchas Mediciones por Segundo que se debe. 10 Hz, 50 Hz, 100 Hz y 200 Hz pueden ser elegidos. Cuanto mayor sea la Frecuencia mayor será el Consumo de energía. La Sensibilidad (Rango RNG) devuelve la densidad de flujo magnético de la escala completa en. Aquí puede +/- 2 Gauss o +/- 8 de Gauss para ser elegido. A la elevada Sensibilidad, tenga en cuenta que la perturbadora Influencia de Fremdfeldern aumenta. Por último, usted todavía puede ser la Tasa de Sobremuestreo ajuste. Es de 64, 128, 256 y 512 ajustable. Un Valor más alto reduce el Filtro de ancho de Banda y, por tanto, el Ruido molesto, sin embargo, toma así el Consumo de energía.

Quién más quiere saber esta en laHoja de datos para QMC5883L .

De la lectura de los Valores de x e y, el Ángulo con el campo magnético de la tierra determina. Este Valor sólo está a mitad de camino exactamente si el Módulo es posible, esté en posición horizontal. La Representación, el Ángulo de +/- 180 Grados de 0 a 360 Grados de conversión, a continuación, dividida entre 30, de manera que podamos 12 Secciones, de acuerdo a los 12 LEDs del Anillo de obtener. La Desviación se celebrándose el Brillo de los LED determinar. si la Desviación es negativa la davorliegende LED y de lo contrario, el siguiente LED está encendido. Si el Valor se encuentra exactamente en el medio se encienden los dos LEDs igual de brillantes.

Para el Anillo LED necesitamos la NeoPixelBus.h Biblioteca. La Biblioteca para el Bus I2C Wire.h pertenece a la instalación típica.

Atención Nota importante:tengo al Compilar un interno Kompilerfehler recibir. La investigación en el Internet llegó a la conclusión de que este es un Problema con la última Arduino, Hardware de Biblioteca. Una Instalación de la Versión anterior, eliminó el Problema. En Boardverwalter la Versión que 1.6.22 en lugar de la actual 1.6.23 seleccione y haga clic en Instalar.

 

 

 

#include <Wire.h> //I2C Arduino Librería
#include <NeoPixelBus.h> //library for led strip

//I2C address of the QMC5883L
#define ADDR  0x0d

//values for the QMC5883 de control de registro 1
//operating mode
#define Mode_Standby    0b00000000
#define Mode_Continuous 0b00000001
//Output data rate
#define ODR_10Hz        0b00000000
#define ODR_50Hz        0b00000100
#define ODR_100Hz       0b00001000
#define ODR_200Hz       0b00001100
//Medida range
#define RNG_2G          0b00000000
#define RNG_8G          0b00010000
//Over de muestreo
#define OSR_512         0b00000000
#define OSR_256         0b01000000
#define OSR_128         0b10000000
#define OSR_64          0b11000000

//some constantes for the anillo LED
#define MAXBRIGHT 64
#define LEDCOUNT 12
#define SIGNALPIN 4

//initialize de la tira de LED driver
NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(LEDCOUNT, SIGNALPIN);

//define color black to switch led off
RgbColor black(0,0,0);

//function to write data into a registro on QMC5883L
void writeRegister(uint8_t reg, uint8_t val){   Wire.beginTransmission(ADDR); //start talking   Wire.write(reg);    Wire.write(val);   Wire.endTransmission();
}

//function to read results from QMC5883L
void readData(uint16_t * x, uint16_t * y, uint16_t * por) {   Wire.beginTransmission(ADDR);   Alambre de.escribir(0x00);   Alambre.endTransmission();   Alambre.requestFrom(DIREC, 6);   *x = Cable de.leer(); //LSB x   *x |= Alambre.de lectura() << 8; //MSB x   *y = Alambre.de lectura(); //LSB z   *y |= Alambre.de lectura() << 8; //MSB z   *z = Alambre.de lectura(); //LSB y   *z |= Alambre.de lectura() << 8; //MSB y
}

//función para establecer el registro de control 1 en QMC5883L
vacío setCtrlRegister(uint8_t sobremuestreo, uint8_t gama, uint8_t dataRate, uint8_t modo) {   writeRegister(9,sobremuestreo | gama | dataRate | modo);
}

//función para restablecer QMC5883L
vacío softReset() {   writeRegister(0x0a,0x80);   writeRegister(0x0b,0x01);
}

//preparar el hardware
void setup(){   de Serie.comienzan(9600);   Alambre de.comenzar la();      Serie.println("Inicio");   softReset();   setCtrlRegister(OSR_128,RNG_2G,ODR_100Hz,Mode_Continuous);   Serie.println("init hecho");
}


void loop(){   int x,y,z; //triple eje de datos   float azimut;   uint16_t azi; //azimut sólo positiv as integer   uint8_t led1,led2;   uint8_t val1,val2;   int8_t diff;      // esto restablece todos los neopixels a un estado de apagado   de la tira de.Comenzar();   la tira de.Mostrar();   readData(&x, &y, &z); //leer los datos del sensor   //calcular el ángulo entre x y y   //wechange la signe puesto que los leds en el anillo de pedida de las agujas del reloj   azimut = -atan2(y,x) * 180.0/PI;   //complemento de 180 grados para obtener sólo los valores positivos   azi = azimut+180;   //contamos con 12 leds cada 30 grados   led1=(azi/30) % 12;   //calculamos la diferencia entre el ángulo original   //y led ángulo de visión le da al máximo de +/- 30   diff = azi - led1 *30;   //queremos mostrar tanto los leds a la izquierda y a la derecha a la   //ángulo original   si (diff>0) {     //si la diferencia es positiv hemos establecido los siguientes led     led2 = led1++;     si (led2 > 11) led2 = 0;     val1 = diff;     val2 = 30-diff;    } else {     //si la diferencia es negativa, hemos establecido la anterior led     led2 = led1--;     si (led2<0) led2 = 11;     val1 = -diff;     val2 = 30+diff;   }   //cambiar todos los led apagados   tira.ClearTo(negro);   //establece el wo de led en el valor calculado con el rojo   RgbColor col1(val1*MAXBRIGHT/30,0,0);   tira.SetPixelColor(led1,col1);   RgbColor col2(val2*MAXBRIGHT/30,0,0);   tira.SetPixelColor(led2,col2);   //enviar los datos del anillo del led   de la tira de.Mostrar();   // Mostrar los valores en la línea de serie   de Serie.de la impresión("Valor de X: ");   de Serie.println(x);   Serial.print("Valor de Y: ");   de Serie.println(y);   Serial.print("Valor de Z: ");   de Serie.println(z);   de Serie.impresión("Richtung: ");   De serie.impresión(azimut);   de Serie.println("°");   Serie.de impresión("LED 1 = ");   de Serie.impresión(led1);   Serie.de impresión(" brillante = ");   Serie.println(val1);   Serie.de impresión("LED 2 = ");   de Serie.impresión(led2);   Serie.de impresión(" brillante = ");   Serie.println(val2);   Serie.println();   //espera 1 segundo   de retardo(1000);
}


 

Viel Spass mit dem Kompass

Gerald

 

Für arduinoProjekte für anfänger

13 comentarios

Roland

Roland

Vorsicht mit der I2C-Adresse! Es sind auch Module mit der Adresse 0×1E (ursprüngliche Standardadresse) im Umlauf. Das Datenblatt von Honeywell enthält 0×3C und 0×3D.
Unter https://playground.arduino.cc/Main/I2cScanner/ findet man einen einfachen Adressscanner

Simon

Simon

Hallo, muss das Modul nicht kalibriert werden? Bei mir zeigt er nur 4 LEDs an (Ring getestet) und liefert utopische Werte im Serial Monitor.

LG
Simon

Rüdiger Sachse

Rüdiger Sachse

Ich habe mir den GY-271 besorgt, um mein (Arduino)-Autopilot-Projekt zu verbessern.
Normalerweise ist der AP durchaus in der Lage einen stabilen Kurs zu einem Waypoint zu fahren. Die Navigationsdaten bekommet er von einem GPS-Plotter. Peilung und Crosstrack-Error sind kein Problem, da sich die Werte relativ langsam ändern, aber der aktuelle Kurs und insbesondere die schnelle Kursänderung werden nur verzögert (alle 2-3 Sek) ausgegeben. Das Schiff muss eine gewisse Strecke fahren um den GPS-basierten Kurs zu erhalten. Bei langsamer Fahrt wird die Berechnung immer ungenauer. Mit dem GY-Modul hoffe ich besseren Werte für die schnellen Kursänderungen und damit ein besseres Steuerverhalten zu erzielen.

Hier ist mir etwas merkwürdiges aufgefallen! Die Werte für die X-Y-Z-Achsen werden mit Hilfe der Arduino-Lib Wire.h ausgelesen.
Die Registerinhalte stimmen nicht mit dem Datenblatt überein, Z und Y sind vertauscht!!

code:
Wire.requestFrom(I2C_address, 6); //6 bytes lesen

x = Wire.read()<<8; //X msb //16bit int X-Achse x |= Wire.read(); //X lsb z = Wire.read()<<8; //Z msb //nach datenblatt Y-Achse ?? z |= Wire.read(); //Z lsb y = Wire.read()<<8; //Y msb //nach datenblatt Z-Achse ?? y |= Wire.read(); y+=180; //Y lsb // +180 addieren ??

Die X-Werte liegen symmetrisch zur 0-Linie, bei den Y-Werten muss 180 addiert werden.
Die Z-Werte sind wesentlich höher (bis 900).
Beim Drehen des Moduls um 360 Grad auf dem platten Tisch erhalte ich für X und Y zwei schöne sinusförmige Kurven mit 90 Grad Phasenversatz (COS für X, SIN für Y). Die Minima und Maxima liegen wie zu erwarten bei je 0 (bzw 360), 90, 180 und 270 Grad bezogen auf magnetisch Nord. Die Kurven sind allerdings nicht symmetrisch zur 0-Linie (bei jedem Chip anders), daher muss der Offset-Wert ermittelt werden. Man dreht einen Vollkreis und nimmt die Mitte von Min und Max.

Daraus lässt sich der Radiant, bzw Kompasswinkel mit der Funktion
rad= atan2(y,x) errechnen und bekommt eine tadellose Kompassdarstellung.

Jetzt muss ich nur noch die Einflüsse durch Rollbewegungen kompensieren, aber das ist eine andere Geschichte…

Gerald

Gerald

Hallo Sven offenbar hast Du ein Board mit einem HMC5883. Der Sketch ist für den QMC5883L wie er auf dem Modul von AZ-Delivery verbaut ist. Der HMC5883 hat eine andere I2C Adresse. Folgende Änderung im Sketch ist notwendig damit der HMC5883 funktioniert.
//I2C address of the QMC5883L
#define ADDR 0×17
Dann sollte es funktionieren.

sven

sven

ich habe das problem,
X Value: -1
Y Value: -1
Z Value: -1
Richtung: 135.00°
LED 1 = 11 bright = 15
LED 2 = 10 bright = 15
es zeigt immer die selben werte an.

Beim arduino example HMC5883L geht es.

Ulrich Engel

Ulrich Engel

Hallo Gerald,
nun funktioniert der Kompass wie gewünscht. Es waren aber Änderungen notwendig.
Erst einmal habe ich, auf Anraten eines “Profis”, das GY-271 Modul etwas (8-10 cm) vom Ring und dem Nano entfernt, um Magnetfeldeinflüsse durch Strom zu verhindern. Dann habe ich das Modul untersucht und festgestellt, dass es sich nicht um einen “original/generic” Chip handelt. Man erkennt dieses Original am Aufdruck auf dem kleinen schwarzen Chip auf dem Modul. Beim Original steht “L5883 2120”. Beim Fake, der nicht funktioniert steht “DA 5883 8012”.

Ulrich Engel

Ulrich Engel

Hallo Gerald,
vielen Dank für die Antwort. Ich habe noch einmal gemäß Deiner Beschreibung die Verdrahtung kontrolliert. Dann habe ich den Kompass von Google Maps auf dem Handy eingeschaltet. Der zeigt stabil nach N wenn ich das Handy auf dem Tisch flach drehe.
Eigentlich hatte ich dieses auch für die LEDs im Ring erwartet. Es sollten doch die leuchtenden LEDs (2 Stück) beim flachen Drehen der Schaltung (x-Y des Sensors) immer in die gleiche Richtung zeigen. Nämlich nach N.
Das ist bei mir leider nicht der Fall. Es bleiben immer die gleichen LEDs an und drehen mit.
Ich habe noch kein Projekt mit einem Nano gemacht. Ist es normal, dass der schwarze Chip sehr heiß wird?

Viele Grüße aus Berlin
Ulli

Gerald

Gerald

Hallo Ulrich
Ich habe jetzt die Schaltung nochmals aufgebaut. Beim Erdmagnetfeld sollten die Werte für X und Y in einem Bereich von +/- 2000 liegen und für Z bei -3000 bis -5000. Dein Y Wert ist ziemlich konstant bei etwa -6000. Ich vermute daher, dass ein externes Magnetfeld in Y Richtung vorhanden ist, das den Einfluß des Erdmagnetfeldes überdeckt. Du solltest mal die Schaltung mit Batterie betreiben und möglichst von Störquellen (Elektrogeräte) entfernt testen.

Ulrich Engel

Ulrich Engel

Hallo Gerald,
eigentlich hatte ich erhofft, dass ich Euren Erfahrungsschatz nutzen kann und Unterstützung bei meinem Problem erhalte. Ich würde gerne das Projekt fertig bekommen und bei meinem Geo-Cacher (Projekt von Euch) nutzen.
Viele Grüße
Ulli aus Berlin

Ulrich Engel

Ulrich Engel

Hallo,
super Idee. Tolle Ergänzung zum Tutorial “Geocaching”.
Kompilieren und Hochladen (wenn man auf Old Bootloader umschaltet) funktioniert fehlerfrei.
Mein Problem ist leider, dass die Daten, die auf den serial monitor ausgegeben werden sehr wir sind. Auch bleiben die LEDs immer an der gleichen Stelle an, wenn ich den ganzenAufbau drehe.
Hier ein Auszug. Wo könnte ich den die Ergebnisliste als Datei posten?
Start
init done
X Value: 0Y Value: 0Z Value: 0Richtung:
0.00°LED 1 = 5 bright = 0LED 2 = 6 bright = 30

X Value: -1187Y Value: -8795Z Value: -6610Richtung:
97.69°LED 1 = 10 bright = 7LED 2 = 9 bright = 23

X Value: -1177Y Value: -8857Z Value: -6552Richtung:
97.57°LED 1 = 10 bright = 7LED 2 = 9 bright = 23

X Value: -1245Y Value: -8765Z Value: -6572Richtung:
98.08°LED 1 = 10 bright = 8LED 2 = 9 bright = 22

X Value: -1270Y Value: -6092Z Value: -6647Richtung:
101.78°LED 1 = 10 bright = 11LED 2 = 9 bright = 19

X Value: -1265Y Value: -5975Z Value: -6615Richtung:
101.95°LED 1 = 10 bright = 11LED 2 = 9 bright = 19

X Value: -1335Y Value: -5960Z Value: -6662Richtung:
102.63°LED 1 = 10 bright = 12LED 2 = 9 bright = 18

X Value: -1317Y Value: -5950Z Value: -6657Richtung:
102.48°LED 1 = 10 bright = 12LED 2 = 9 bright = 18

X Value: -1355Y Value: -6017Z Value: -6720Richtung:
102.69°LED 1 = 10 bright = 12LED 2 = 9 bright = 18

X Value: -1302Y Value: -6042Z Value: -6630Richtung:
102.16°LED 1 = 10 bright = 12LED 2 = 9 bright = 18

X Value: -4462Y Value: -6542Z Value: -6672Richtung:
124.30°LED 1 = 11 bright = 4LED 2 = 10 bright = 26

X Value: -4375Y Value: -6430Z Value: -6657Richtung:
124.23°LED 1 = 11 bright = 4LED 2 = 10 bright = 26

X Value: -4197Y Value: -6415Z Value: -6695Richtung:
123.19°LED 1 = 11 bright = 3LED 2 = 10 bright = 27

X Value: -4232Y Value: -6390Z Value: -6705Richtung:
123.52°LED 1 = 11 bright = 3LED 2 = 10 bright = 27

X Value: -4232Y Value: -6425Z Value: -6732Richtung:
123.37°LED 1 = 11 bright = 3LED 2 = 10 bright = 27

Könnte dieses an dem Sensor liegen? Wie ich gelesen habe, werden ja oft auch unter gleichem Namen auch Nicht-Originale angeboten, die man nur am Aufdruck auf dem Chip identifizieren kann.
Ich habe wohl so einen “Fake” erwischt.

Wolfgang

Wolfgang

Danke Gerald,
ich habe die Fehler gefunden.
Das Hochladen des Programmes ohne zusätzliches Modul hat es dann gebracht.
Frohe Ostern an alle
Wolfgang

Gerald

Gerald

Hallo Wolfgang, die Fehlermeldung “stray 302” bedeutet dass ein Sonderzeichen im code vorkommt. Es gibt dazu einen sehr ausführlichen Blog Beitrag, der zeigt wie man diesen Fehler finden und beheben kann. Suche einfach nach “kodierungsfehler-schnell-beheben”.
Im Bereich Posts findest Du dann den Link.

Wolfgang Butenhoff

Wolfgang Butenhoff

Hallo,
bei der Programmzeile:
setCtrlRegister(OSR_128,RNG_2G,ODR_100Hz,Mode_Continuous);
bekomme ich immer wieder die Meldung: " stray’ \302’ in program"
Wo ist der Fehler? Der Hinweis mit Version 1.6.22 ist berücksichtigt.
Für die Software brauche ich Hilfe ….die Hardware ist bestimmt richtig “verdrahtet”.

Deja un comentario

Todos los comentarios son moderados antes de ser publicados