Hjälp med kod till arduino och hm55b kompassmodul
Postat: 18 mars 2011, 20:27:57
Hej!
har i en tidigare tråd :http://elektronikforumet.com/forum/view ... 19&start=0
diskuterat om det var möjligt att få en båt att hålla rak kurs med hjälp av ett rc-gyro men har blivit rekommenderad att införskaffa mig ett arduino uno programmeringskort och en hm55b kompassmodul vilket jag har gjort, så jag fortsätter tråden här på mikroprocessor.
Jag är nybörjare och har exprimenterat lite med lysdioder osv men jag känner att det är ett stort steg kvar innan jag kan få den funktionen jag vill så jag hoppades få en hjälp på traven här
Funktionen jag vill ha är att vid tex 2 grader ur kurs så öppnas en utgång som drar ett relä till en motor och likadant år andra hållet så att båten stävar efter en rak kurs.
Har hittat en kod till arduino med rätt kompassmodul som visar vinkeln från norr:
har i en tidigare tråd :http://elektronikforumet.com/forum/view ... 19&start=0
diskuterat om det var möjligt att få en båt att hålla rak kurs med hjälp av ett rc-gyro men har blivit rekommenderad att införskaffa mig ett arduino uno programmeringskort och en hm55b kompassmodul vilket jag har gjort, så jag fortsätter tråden här på mikroprocessor.
Jag är nybörjare och har exprimenterat lite med lysdioder osv men jag känner att det är ett stort steg kvar innan jag kan få den funktionen jag vill så jag hoppades få en hjälp på traven här

Funktionen jag vill ha är att vid tex 2 grader ur kurs så öppnas en utgång som drar ett relä till en motor och likadant år andra hållet så att båten stävar efter en rak kurs.
Har hittat en kod till arduino med rätt kompassmodul som visar vinkeln från norr:
Kod: Markera allt
*/
#include <math.h> // (no semicolon)
//// VARS
byte CLK_pin = 8;
byte EN_pin = 9;
byte DIO_pin = 10;
int X_Data = 0;
int Y_Data = 0;
int angle;
//// FUNCTIONS
void ShiftOut(int Value, int BitsCount) {
for(int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, LOW);
if ((Value & 1 << i) == ( 1 << i)) {
digitalWrite(DIO_pin, HIGH);
//Serial.print("1");
}
else {
digitalWrite(DIO_pin, LOW);
//Serial.print("0");
}
digitalWrite(CLK_pin, HIGH);
delayMicroseconds(1);
}
//Serial.print(" ");
}
int ShiftIn(int BitsCount) {
int ShiftIn_result;
ShiftIn_result = 0;
pinMode(DIO_pin, INPUT);
for(int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, HIGH);
delayMicroseconds(1);
if (digitalRead(DIO_pin) == HIGH) {
ShiftIn_result = (ShiftIn_result << 1) + 1;
//Serial.print("x");
}
else {
ShiftIn_result = (ShiftIn_result << 1) + 0;
//Serial.print("_");
}
digitalWrite(CLK_pin, LOW);
delayMicroseconds(1);
}
//Serial.print(":");
// below is difficult to understand:
// if bit 11 is Set the value is negative
// the representation of negative values you
// have to add B11111000 in the upper Byte of
// the integer.
// see: http://en.wikipedia.org/wiki/Two%27s_complement
if ((ShiftIn_result & 1 << 11) == 1 << 11) {
ShiftIn_result = (B11111000 << 8) | ShiftIn_result;
}
return ShiftIn_result;
}
void HM55B_Reset() {
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B0000, 3);
digitalWrite(EN_pin, HIGH);
}
void HM55B_StartMeasurementCommand() {
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B1000, 3);
digitalWrite(EN_pin, HIGH);
}
int HM55B_ReadCommand() {
int result = 0;
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B1100, 3);
result = ShiftIn(3);
return result;
}
void setup() {
Serial.begin(115200);
pinMode(EN_pin, OUTPUT);
pinMode(CLK_pin, OUTPUT);
pinMode(DIO_pin, INPUT);
HM55B_Reset();
}
void loop() {
HM55B_StartMeasurementCommand(); // necessary!!
delay(40); // the data is 40ms later ready
Serial.print(HM55B_ReadCommand()); // read data and print Status
Serial.print(" ");
X_Data = ShiftIn(11); // Field strength in X
Y_Data = ShiftIn(11); // and Y direction
Serial.print(X_Data); // print X strength
Serial.print(" ");
Serial.print(Y_Data); // print Y strength
Serial.print(" ");
digitalWrite(EN_pin, HIGH); // ok deselect chip
angle = 180 * (atan2(-1 * Y_Data , X_Data) / M_PI); // angle is atan( -y/x) !!!
Serial.print(angle); // print angle
Serial.println("");
}