Mach ja nix wenn der Betrag schon etwas älter ist
Hab mir die aktuelle Beschreibung des CMPS03 auf robotikhardware.de angesehen und festgestellt das die mittlerweile geändert wurde.
Ich habe meinen Kompass mit der Pin Methode kalibriert nicht über I2C - im Endeffekt habe ich den Sensor 5x kalibriert Nord/Ost/Süd/West/Nord , dann hats funktioniert.
Bei mir ist der Kompass ganz vorne auf der Erweiterungsplatine montiert. Gemessen habe ich nur im Stillstand, während der Fahrt habe ich nie gemessen, so hatte ich keine Probleme damit.
Zur Abschirmung wäre wohl µ-Metall (http://de.wikipedia.org/wiki/Mu-Metall) am besten geeignet - aber woher nehmen.
--
Hab grad festgestellt das ich mein laufendes Programm gar nicht mehr hier reingestellt habe.
Das Programm gibt die Richtung mit Kommastelle auf dem LCD aus und über die Serielle Schnittstelle die Version, Richtung und Akkuspannung. Es lässt sich sicher alles besser lösen - aber es läuft. Das Programm benutzt die Stopwatches für die M128 von Dirk https://www.roboternetz.de/community...ight=stopwatchCode:/******************************************************************************* * RP6 C-Control PRO M128 Erweiterungsmodul * ---------------------------------------------------------------------------- * RP6 - M128 - CMPS03 Kompassmodul Test / Display Test * ---------------------------------------------------------------------------- * by ScummVM ******************************************************************************/ // RP6CCLib einbinden #include "RP6CCLib.cc" // RP6 Master Lib einbinden #include "RP6MasterLib.cc" // Stopwatch einbinden #include "RP6StopwatchesCClib.cc" // I²C Bus Adresse des Controllers auf dem Mainboard #define RP6_BASE_ADR 10 // Die I²C Adresse des CMPS03 ist 0xC0: #define CMPS03_ADR 0xC0 // CMPS03 Daten Register: #define VERSION 0 // Firmware Version #define LOW 1 // Lowbyte #define HIGH 2 // Highbyte #define CALIBRATE 15 // Kalibrierung //CMPS03 DATEN REGISTER AUSLESEN float grad, value; word messung; char result[2]; byte messung_low, messung_high, version; void readCMPS03(void) { I2C_Start(); I2C_Write(0xC0); I2C_Write(0xC2); // Register 2 lesen I2C_Stop(); I2C_Start(); I2C_Write(0xC1); // Register 1 lesen messung_high = I2C_Read_ACK(); messung_low = I2C_Read_NACK(); version = RP6_readRegister(0xC0, 0); messung = (( messung_high << 8 ) + messung_low); I2C_Stop(); RP6_readRegisters(RP6_BASE_ADR, I2C_REG_ADC_UBAT_L, messageBuf, 2); adcBat = (messageBuf[1] << 8) | (messageBuf[0]); if (getStopwatch1() > 500) { value = (adcBat / 102.4); // Spannung umrechnen grad = (messung / 10.0); // Grad umrechnen print("Version: "); // Version seriell printInteger(version); // Version seriell ausgeben print(" | Richtung: "); // Richtung seriell clearLCD(); // LCD löschen printlnLCD("Richtung:",0,0); // Richtung LCD Str_WriteFloat(grad,1,result,0); // Winkel seriell ausgeben Serial_WriteText(0,result); setCursorPosLCD(1,0); // Cursor Position writeStringLCD(result); // Winkel am LCD ausgeben println(" Grad"); // Grad seriell print(" | Akku: "); // Akku seriell Str_WriteFloat(value,2,result,0); // Spannung seriell ausgeben Serial_WriteText(0,result); println(" V"); // Einheit Spannung setCursorPosLCD(1,6); // Cursor Position printLCD("Grad"); // Grad LCD setStopwatch1(0); } } // Mainprogramm void main(void) { RP6_CCPRO_Init(); // Auf Startsignal warten! I2C_Init(I2C_400kHz); newline(); println(" ________________________"); println(" \\| RP6 ROBOT SYSTEM |/"); println(" \\_-_-_-_-_-_-_-_-_-_/ "); newline(); println(" CMPS03 Test "); newline(); showScreenLCD("CMPS03 Test",""); beep(100, 200, 300); setStopwatch1(0); startStopwatch1(); while(true) { readCMPS03(); } }
Gruß
ScummVM
Lesezeichen