Sida 1 av 2

Hjälp med kod till arduino och hm55b kompassmodul

Postat: 18 mars 2011, 20:27:57
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("");

}

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

Postat: 18 mars 2011, 20:55:15
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.

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

Postat: 18 mars 2011, 22:35:27
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.

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

Postat: 18 mars 2011, 22:39:14
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

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

Postat: 19 mars 2011, 10:14:43
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 :)

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

Postat: 19 mars 2011, 13:55:17
av sodjan
> Problemet är att det inte fungerar alls...

Att använda CODE taggarna ? Märkligt.
Vad är problemet med det ??

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

Postat: 19 mars 2011, 14:24:58
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.

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

Postat: 19 mars 2011, 19:18:05
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.

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

Postat: 20 mars 2011, 11:48:47
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.

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

Postat: 20 mars 2011, 11:58:56
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.

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

Postat: 20 mars 2011, 15:28:59
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°.

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

Postat: 21 mars 2011, 21:15:57
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.

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

Postat: 21 mars 2011, 21:33:07
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?

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

Postat: 22 mars 2011, 22:34:18
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.

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

Postat: 22 mars 2011, 23:11:28
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....