Liste der Anhänge anzeigen (Anzahl: 1)
Mach ja nix wenn der Betrag schon etwas älter ist :D
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.
Anhang 19306
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.
Code:
/*******************************************************************************
* 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();
}
}
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=stopwatch
Gruß
ScummVM