Hi,
Mit folgendem Programm wollte ich testweise einfach die Himmelsrichtung bestimmen.
Ich lese die Register 2 und 3 des CMPS03 via I2C aus und die ergeben zusammen die Himmelsrichtung von 0-3599.
Code:
// Includes:
#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"
#define CMPS03 0xC0
/*****************************************************************************/
// Main:
uint16_t directionCMPS03(void)
{
I2CTWI_initMaster(100);
uint8_t cmpsbuffer[2];
uint16_t direction;
I2CTWI_transmitByte(CMPS03, 2); // Ab dem zweiten Reigster Daten anfordern
I2CTWI_readBytes(CMPS03, cmpsbuffer, 2); // und in dem Array speichern
direction = ((cmpsbuffer[0] * 256) + cmpsbuffer[1])/10;
return direction;
}
// Main
int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1000);
setLEDs(0b100100);
// Main loop
while(true)
{
task_RP6System();
uint16_t direction;
direction = directionCMPS03();
writeString_P("\n Driection=\t");
writeInteger(direction,DEC);
}
return 0;
}
Leider erhalte ich jedoch nur Datenmüll.
Die Werte verhalten sich bei einer Drehung des Roboters Teilweise linear, aber manchmal fällt der Wert, dann steigt er wieder, dann springt er, aber bei mehreren Umdrehungen immer das gleiche Muster.
Start bei 1088
dann springt er auf 2506
und steigt an auf 2623
dann springt er auf 971
und sinkt ab auf 944
und steigt an auf 1139
und sinkt ab auf 1088
und dass soll eine Umdrehung von 360° sein???
Da es ja immer das Gleiche ist, muss der Sensor ja immerhin etwas messen. Also scheint das Programm OK zu sein. Da es jedoch Müll ist, wird der Sensor etweder von außen gestört, oder ist enfach nur kaputt.
Wie kann ich das feststellen oder beheben?
Ich habe den CMS03 alleine auf der Erweiterungsplatine auf einer Steckleiste. Also sind prinzipiell keine großen Magnetfelder vom Rooter in der Nähe. Und wenn der CMS03 nur draußen funktioniert, dann hätte ich das gerne vorher gewusst.
mfg WarChild
Lesezeichen