Einen Feelspace Belt mit Arduino bauen und programmieren (Teil 3): GY-271 und HMC/QMC5883L

In diesem Teil beschäftigen wir uns nun mit den Daten aus dem Kompasssensor, die wir benötigen, um unsere Motoren immer gen Norden vibrieren zu lassen. Und hier lernen wir zunächst, dass es manchmal durchaus sinnvoll sein kann, lieber gleich bei namhaften Herstellern zu kaufen. Ich bestellte nämlich ursprünglich ein generisches GY-271 Breakout Board aus Hong Kong, das normalerweise mit einem HMC5883L Chip bestückt ist. Ich bekam aber auf Gedeih und Verderben mit keiner Bibliothek und keinem Code aus dem Internet Signale ausgelesen. Frustriert gab ich auf und bestellte einen generischen MPU9250 aus China. Und was geschah? Auch nicht auslesbar. Das ist das Problem mit Knockoff-Bauteilen aus China: Man kann sich selten darauf verlassen, dass auch drin ist, was draufsteht. Zwar zahlt man nur einen Bruchteil des Geldes, handelt sich aber wochenlange Wartezeiten und gelegentlich Chips ein, die einfach nicht sind, was sie vorgeben zu sein. Das Skurrilste am „MPU9250“ Board war, dass ich herausfand, dass es auch die Temperatur misst. Das war aber auch alles an Daten, was ich (absolut zuverlässig) heraus bekam.

An dieser Stelle kann es sich lohnen, einen I2C-Scan laufen zu lassen, den findet man hier bei Arduino direkt. Der ergab bei meinem angeblichen „GY-271/HMC5883L“ eine Registeradresse, 0x0D. Als ich beides zusammen googlete, beförderte ich massenweise Forenthreads von frustrierten Bastlern zutage, die mit dem bei Amazon ausgesprochen häufig verkauften China-Modul Probleme hatten. Ein User, dem mein ewiger Dank nachschleichen wird, stellte fest, dass bei einer Serie ein QMC statt ein HMC Chip verbaut wurde (eine andere Serie scheint komplett unbrauchbar zu sein). Diese hatte eben die Adresse 0x0D. Besagter User hat entsprechend eine passende Bibliothek geschrieben, an der wir uns nun orientieren werden: Hier der Link.

Das GY-271 ist ein dreiachsiges Magnetometer, es misst entsprechend Tesla (ja, genau der mit den Blitzspulen!), die magnetische Flussdichte, und zwar auf der X-, Y- und Z-Achse. Uns interessiert erst einmal nur eine einzige Achse. Welche das ist, hängt maßgeblich davon ab, wie herum ihr später den Sensor anbringt. Auf jeden Fall haben wir jetzt einen digitalen Kompass.

Hookup für meinen Knockoff-GY271 mit falschem QMC5883L ist allerdings identisch. VCC auf 5V, GND auf GND, SDA auf A4, SCL auf A5. Wir kommunizieren über das I2C-Protokoll, mit dem man mehrere Module hintereinander schalten kann. SDA ist in dem Fall der serielle Datenkanal, SCL steht für Serial Clock, denn Timing ist für die Signalübertragung nun einmal entscheidend. Um das Signal zu verbessern, schalten wir zwei Pullup-Widerstände zu 5k Ohm in diese Leitungen.

Hier dann noch der Code, um die Daten aus diesem China-Imitat auszulesen und direkt in eine Gradangabe umzuwandeln:

#include <Wire.h>
#include <MechaQMC5883.h>

MechaQMC5883 qmc;

void setup() {
 Wire.begin();
 Serial.begin(9600);
 qmc.init();
 //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
}

void loop() {
 int x, y, z;
 int azimuth;
 //float azimuth; //is supporting float too
 qmc.read(&x, &y, &z);
 //azimuth = qmc.azimuth(&y,&x);//you can get custom azimuth
 Serial.print("x: ");
 Serial.print(x);
 Serial.print(" y: ");
 Serial.print(y);
 Serial.print(" z: ");
 Serial.print(z);
 Serial.println();

float heading = atan2(x, y);

// Set declination angle on your location and fix heading
 // You can find your declination on: http://magnetic-declination.com/
 // (+) Positive or (-) for negative
 // For Bytom / Poland declination angle is 4'26E (positive) for Kiel +2,49°
 // Formula: (deg + (min / 60.0)) / (180 / M_PI);
 float declinationAngle = (2.0 + (49.0 / 60.0)) / (180 / M_PI);
 heading += declinationAngle;

// Correct for heading < 0deg and heading > 360deg
 if (heading < 0)
 {
 heading += 2 * PI;
 }

if (heading > 2 * PI)
 {
 heading -= 2 * PI;
 }

// Convert to degrees
 float headingDegrees = heading * 180/M_PI;

// Output
 Serial.print(" Heading = ");
 Serial.print(heading);
 Serial.print(" Degress = ");
 Serial.print(headingDegrees);
 Serial.println();

 delay(1000);
}

Ein paar Hinweise noch: Je nachdem, in welche Richtung der Chip montiert wurde, müssen natürlich die Variablen für die float heading Berechnung (x,y) eventuell durch andere ersetzt werden. Wie im Quelltext schon steht, sollte man der Präzision wegen seine magnetische Deklination in Erfahrung bringen. Das kann man unter Angabe der Stadt bei www.magnetic-declination.com, in meinem Fall ist es Kiel mit 2’49°. Der delay am Schluss ist nur auf 1000ms gesetzt, um die Beobachtung der Messergebnisse einfacher zu machen, er kann für den Betrieb deutlich herabgesetzt werden.

Was bei Beobachtung der Messergebnisse schnell auffällt, ist, dass die Gradangaben natürlich deutlich unpräziser ausfallen und schwanken, wenn das Magnetometer in eine bestimmte Richtung gekippt oder erschüttert wird. Dafür muss ich mir noch etwas einfallen lassen.

So, nun haben wir alle Einzelteile zusammen und programmiert. Im nächsten Teil basteln wir das gesamte Gerät zusammen und gehen in den Selbstversuch!

Wir basteln uns einen sechsten Sinn: Einen Feelspace Belt mit Arduino bauen und programmieren (Teil 1)

Wer kennt das nicht? Mal wieder zu viele Comics gelesen, da träumt man davon, Superkräfte zu haben. Zum Beispiel Spider-Mans Spinnensinn oder das Supergehör von Daredevil. Noch besser wären natürlich telepathische Fähigkeiten wie Professor X, aber begnügen wir uns doch erst einmal mit dem, was machbar ist: Ein sechster Sinn für 30€. Klingt gut? Folgt mir ins Labor!

Vibrier mir das Lied vom Wal, Baby!

Vor über zehn Jahren stolperte ich im Internet über ein Paper, in dem Wissenschaftler den Feelspace Belt vorstellten. Das Konzept war simpel, die Ergebnisse erstaunlich. Das Gerät wurde, wie der Name schon sagt, wie ein Gürtel getragen und enthielt mehrere Vibratoren, die immer dort vibrierten, wo sich gerade Norden befand. Spannenderweise berichteten Probanden, dass sich ihre Orientierungsfähigkeit in fremdem Gelände durch das Tragen des Gürtels deutlich verbesserte. Nach einigen Wochen konnten sie auch ohne das Tragen des Gürtels zuverlässig sagen, in welche Richtung gerade Norden liegt.

Neulich erinnerte ich mich daran und dachte mir: „So ein sechster Sinn für das Erdmagnetfeld, das ist schon praktisch, dann kann ich bald wie ein Wal stranden.“ Das ursprüngliche Paper habe ich nicht wieder gefunden, allerdings scheint der Feelspace Belt bald auch kommerziell vertrieben zu werden, mit allerlei Zusatzfunktionen, z.B. zur Navigation: www.feelspace.de

Da ich allerdings wenig Lust hatte, über 800€ für ein Gerät zu bezahlen, das ich für um die 30€ selbst zusammen bauen und programmieren kann, habe ich damit jetzt einfach einmal angefangen. Mir ist mein innerer Daniel Düsentrieb tatsächlich wertvoller als eine schwarze American Express.

Die Hardware

 

Als Hauptplatine verwende ich zunächst einen Elegoo Uno R3. Absolut baugleich zum Arduino, aber deutlich günstiger. Genau genommen ist ein Elegoo Uno R3 auch nicht die günstigste Alternative: Deutlich leistungsstärker, kleiner und mit WLAN (das wir nicht brauchen) ausgestattet wäre ein ESP8266 NodeMCU TE689. Den würde ich auch empfehlen und auf den werde ich den Code und die Schaltung auch portieren. Ich habe ihn für ungefähr 3,50€ bei Amazon im Mehrpack bekommen. Da der TE689 erst recht absolut Overkill ist, gucke ich irgendwann mal nach der minimalsten Hardware, auf der man die Schaltung und Programmierung realisieren kann. Der Uno R3 wird erst einmal für den Prototypen verwendet, um einfacher stecken zu können und da die meisten einen Arduino Uno R3 zuhause haben. Außerdem habe ich für den TE689 momentan kein passendes Breadboard zum Prototypenbau.

Möchte man mehrere Motoren unabhängig voneinander ansteuern können, bekommt man bald ein Anschlussproblem. Hierfür gibt es eine einfache Lösung: ein 4auf16-Multiplexer Breakout Board. Bekommt man ab 1,50€ bei eBay, dann kommen aber die Versandkosten hinzu, habe im Mehrpack 2,22€ bezahlt. Ein Multiplexer ermöglicht einem, mehrere Ausgänge über die selben Anschlüsse auf dem Board anzusteuern. Die Wahl fiel auf das CD74HC4067 TE669 Modul. Hat keine Gründe – hat ein Freund ausgesucht.

Die Daten, die wir brauchen, werden natürlich über einen geeigneten Sensor erfasst. Ich danke der metaphysischen Entität Ihrer Wahl für Hong Kong, China und die praktische Alles-Bestellbarkeit jedes noch so speziellen Elektronikbauteils, wobei sich Kompass/Gyroskopmodule natürlich durch die hohe Nachfrage für Mobiltelefone und Robotik erklären lassen. Für läppische 3,42€ habe ich also ein GY-271 HMC5883L Kompassmodul bestellt.

Nun war nur noch die Frage nach den Motoren zu klären. Vibrationsmotoren für Handys bekommt man in jeder Größe, Form und Stärke nachgeschmissen, trotzdem sind sie aufgrund der Stückzahl der größte Kostenfaktor in der ganzen Geschichte. Also 20 Micromotoren mit 10mm Durchmesser bestellt, 5 Stück zu 3,40€. Verbaut werden 16 (maximale Anzahl der Multiplexerausgänge), ich denke, die sensorische Auflösung in 16 Felder dürfte reichen. Die Dinger, die ich bestellt habe, sind auf 3,3 Volt schon recht kräftig, auf 5 Volt vibriert der Tisch mit. Warm werden sie auf 5 Volt, eventuell wird Intervallbetrieb nötig, da sie auf 4,5V ausgelegt sind, aber ich habe keine Lust, die Schaltung unnötig kompliziert zu machen. Wie sie sich in der Praxis bewähren, muss man sehen. Da sie auch mit einer Klebefläche versehen sind, macht das die Montage auch einfacher. Dann braucht man keine Heißklebepistole. Obwohl ich Heißklebepistolen liebe.

In der Gesamtschau also:

1 x NodeMCU ESP8266 TE689: 4,99€
1 x CD74HC4067 TE669 Multiplexer: 2,22€
1 x GY-271 HMC5883L Kompassmodul: 3,42€
16 x Microvibrationsmotoren: 0.68 x 16 = 10,88€

Summe: 21.51€

Von mir aus rechnen wir noch einen billigen Gürtel, Draht und Lötzinn dazu, dann kommen wir auf maximal 30€. Sollte die sensorische Auflösung in 16 Felder nicht reichen, müsste man ggf. noch einmal mit einem weiteren Multiplexer nachrüsten und den Code umbauen. Das kann ich mir aber ehrlich gesagt kaum vorstellen. Mir hätten schon 12 gereicht.

Über die Stromversorgung beim Tragen mache ich mir Gedanken, wenn der Prototyp fertig ist, aber auch daran wird der 9V-Block das Teuerste sein. Aufgrund der WiFi-Anbindung des ESP8266 ergeben sich viele Möglichkeiten, ein Board mit Bluetooth könnte auch bequem an Mobiltelefone verbunden werden, um wie bei der kommerziellen Version beispielsweise Navigation zu ermöglichen.

Die Schaltung

Man nagele mich bitte noch nicht darauf fest, ich muss sehen, inwiefern das in der Programmierung so hinhaut, wie ich es mir vorstelle. Hier aber vorab der mit Fritzing erstellte Bauplan, der sich natürlich nach Prototypenbau noch deutlich verändern wird.

Bitte keine Kritik an der Hässlichkeit, ich habe leider keinen Bachelor in Schaltplandesign. Der Aufbau sollte aber klar werden: Die 16 Motoren bekommen 5V über den Multiplexer zugeschaltet und vibrieren dann, alle müssen natürlich auch über GND an einen Minuspol angeschlossen sein. Der Multiplexer wird über vier Signale gesteuert, macht qua Kombinatorik die 16 Ausgänge. Das Kompassmodul wird ganz normal an VCC und GND angeschlossen, zwei Pins liefern über analogen Anschluss gyroskopische Daten.

Mit den Bauteilen im Einzelnen und der Programmierung beschäftigen wir uns im nächsten Teil.