Hjälp med kod till arduino och hm55b kompassmodul

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

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:

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("");

}
Senast redigerad av radar 20 mars 2011, 11:26:08, redigerad totalt 1 gång.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av snigelen »

Med risk för att verka vara en riktig suris igen.

Du säger att du behöver hjälp. Men med vad? Jo kompassmodul, det förstår jag. Men Vad funkar/funkar inte?

Annars är ju konsten att få en båt att följa en given kurs ett klassiskt reglerproblem.
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

skulle vilja att programmet läser av vilken kurs det står i när det startas och att när vinkeln ändras -2 grader så öppnas tex pin 12 på kortet tills vinkeln är tillbaka på rätt kurs, och vid +2 grader så öppnas pin 13 tills kursen är tillbaka.

tanken är att pin 12 och 13 skall dra en motor åt vardera håll.

jag har lagt in programkoden som jag visade på arduino kortet kopplat ihop med kompassmodulen så att den visar riktningen och det fungerar.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av vfr »

Du har fortfarande inte talat om vad som inte fungerar, eller på vilket sätt det inte fungerar...

Sedan borde du använda "CODE"-taggar när du gör inlägg med källkod. Det blir mycket mer lättläst då. :D
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

Problemet är att det inte fungerar alls eftersom jag inte kan skriva koden till funktionen jag vill ha och jag hoppades få lite hjälp med det :)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av sodjan »

> Problemet är att det inte fungerar alls...

Att använda CODE taggarna ? Märkligt.
Vad är problemet med det ??
Användarvisningsbild
Icecap
Inlägg: 26618
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av Icecap »

Det finns ett antal problem här:
* Kan du avläsa kompassmodulen och få vettiga värden?
* Förstår du den kod du har hittat? Om inte: lär dig vad den gör!
* Beskriv tydligt exakt VAD som är problemet, "det fungerar inte" beskriver mest DIG...

Dessutom är själva styrsättet fel! Du kommer att få större och större oscilliering i båtens kurs på detta vis!

Det du bör göra är att ta kursen t.ex. varje sekund (eller oftare), jämföra med önskat kurs och addera felet.

När felet sedan överstiger en gräns, vara sig det är i negativ eller positiv riktning, ska du pulsa den rätta utgång en viss, relativ kort tid. Denna pulsning kan du göra adaptiv efter lite erfarenhet, alltså om felet som utlöser en puls uppnås snabbt kan pulsen vara längre, tar det längre tid kan den bli kortare.

Efter varje puls nollas felräknaren och allt börjar om.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av jesse »

Först sätter du dit [code] och [/code] i första inlägget.
Sedan , innan du börjar försöka kolla avvikelsen på 2 grader , så måste du kolla att du verkligen får ut rätt data från kompassen. Jag vet inte vilka möjligheter du har annat än lysdioder, men du kanske kan skicka siffror till serieporten i datorn och på så vis på kompassriktningen verifierad?

När du är säker på att du får rätt data ut kan du börja fundera på en lämplig algoritm för att styra båten.
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

Icecap skrev:Det finns ett antal problem här:
* Kan du avläsa kompassmodulen och få vettiga värden?
* Förstår du den kod du har hittat? Om inte: lär dig vad den gör!
* Beskriv tydligt exakt VAD som är problemet, "det fungerar inte" beskriver mest DIG...

Dessutom är själva styrsättet fel! Du kommer att få större och större oscilliering i båtens kurs på detta vis!

Det du bör göra är att ta kursen t.ex. varje sekund (eller oftare), jämföra med önskat kurs och addera felet.

När felet sedan överstiger en gräns, vara sig det är i negativ eller positiv riktning, ska du pulsa den rätta utgång en viss, relativ kort tid. Denna pulsning kan du göra adaptiv efter lite erfarenhet, alltså om felet som utlöser en puls uppnås snabbt kan pulsen vara längre, tar det längre tid kan den bli kortare.

Efter varje puls nollas felräknaren och allt börjar om.
Japp jag får ut värden av kompassmodulen där N är 0, Ö är +90, V är - 90 och S pendlar +180 ,-180 den visar med andra ord avvikelsen i grader från norr.

Nej jag förstår mig inte på koden jag har hittat eftersom jag är ny på detta och det är därför jag ber om hjälp.

Problemet är att jag bara har en kod som ej är skriven av mig och som visar riktningen på en kompass, men målet är att jag vill få en båt att hålla rak kurs, så jag skulle behöva hjälp med koden.
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

jesse skrev:Först sätter du dit

Kod: Markera allt

 och 
i första inlägget.
Sedan , innan du börjar försöka kolla avvikelsen på 2 grader , så måste du kolla att du verkligen får ut rätt data från kompassen. Jag vet inte vilka möjligheter du har annat än lysdioder, men du kanske kan skicka siffror till serieporten i datorn och på så vis på kompassriktningen verifierad?

När du är säker på att du får rätt data ut kan du börja fundera på en lämplig algoritm för att styra båten.
Så nu är koden med lättläst :)

Tror du har missuppfattat mig...det jag skrev med lysdioder har inte nåt med kompassmodulen att göra utan det vara bara för att beskriva vilken nivå jag är på när det gäller mikroprosessor och programmering, att jag kan få en lysdiod att blinka med hjälp av en kod :)

Med den färdiga koden inlagt så läser jag av värderna från kompassen i datorn via serieporten.

problemet är att jag inte kan skriva en lämplig algoritm för att styra båten.
Användarvisningsbild
Icecap
Inlägg: 26618
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av Icecap »

Du får nog plugga en hel del för att fatta koden först...

Men OK, vi går vidare och anser att du faktisk kan programmera.

Du har den faktiska kurs och du känner din önskade kurs, alltså ska du kolla skillnaden. Detta görs enklast vid att subtrahera dom ifrån varandra, då ska du få ett värde mellan ±180°.

Men vänta, det var ju inte så enkelt...

Säg att du vill åka 1° och båthelvetet pekar 359°.
Då är differensen (Mål - Verklighet =) -358°... Men lugn, vi kör bara ett par steg mer!

om(Differens > 180) Differens = Differens - 360;
om(Differens < -180) Differens = Differens + 360;
Första steg gör inget i detta fall men andra steget får värdet att bli 2. Låter OK.
Men motsatsen då? 359° och 1°? Detta ger då 358° och första extrasteg får det att bli -2°, andra extrasteg gör inget.

Så det duger fint också och då har du ditt kurs-fel i storlekar om ±180°.
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

Var nog ingen smart ide att skaffa ett arduino om det ska vara så svårt :( kanske lika bra att lägga ner.
Användarvisningsbild
Icecap
Inlägg: 26618
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av Icecap »

Den är varken lättare eller svårare än andra, du behöver bara inte bygga elektroniken först.

Att programmera är inte lätt (sa han för att putsa sin egen gloria...) men att ge upp nu är ju dumt! Nu har du alla saker som behövs, du kanske bara ska fixa en mer vettig tidplan?
radar
Inlägg: 32
Blev medlem: 23 februari 2011, 19:31:20

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av radar »

eller nån bra litteratur....har du något att rekomendera ? vet inte ens vad programmerings språket som används på arduino heter.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med kod till arduino och hm55b kompassmodul

Inlägg av sodjan »

> vet inte ens vad programmerings språket som används på arduino heter.

Heter och heter. Det är väl unikt för just Arduino. Själva verkar de kalla
det för "Arduino programming language", vilket ju är ett bra namn.
Det bör vara komplett dokumenterat på Arduino hemsidan....
Skriv svar