Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Berry
Inlägg: 5
Blev medlem: 4 september 2020, 20:38:43

Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av Berry »

Hej, ny på forumet och någorlunda ny med arduino.
Jag håller på med en autopilot till båt som använder ett arduino nano och en cmps12 kompass via I2C.
länk till kompassens datablad: https://www.robot-electronics.co.uk/files/cmps12.pdf

Allting fungerar fint i båten förutom att kompassriktningen ibland ändras, båten kan svänga upp till ca 90grader ibland men kompassriktningen visar samma värde, den flyttar alltså värdet på kursen jag håller.

Jag tänkte försöka ge mig på att kalibrera kompassen men jag blir inte klok på hur jag ska addressera genom I2c för att komma åt att spara kalibreringen!
Har försökt med massa olika koder men har nu gett upp och insett att jag behöver hjälp!

Jag har kommit så långt att jag tror att jag kan läsa ut kalibreringsstatus då jag har sett enstaka nollor ändras till ettor när jag rör kompassen i vissa riktningar men för att vara säker på att jag kan spara kalibreringsvärdena så har jag även försökt radera kalibreringsvärdena med följande kod:

Kod: Markera allt

#include <Wire.h>

#define ADDRESS 0x60

void setup(){
  Wire.begin();
  Serial.begin(9600);
  //while(!Serial);
  calibrate();
}

void loop(){
}

void calibrate(){
  Serial.println("Radera värden");
  delay(1000);  //1 second before starting
  Serial.println("Start");

  Wire.beginTransmission(ADDRESS);
 Wire.write(0);
  Wire.write(0xF0);
  Wire.endTransmission();
   delay(20);
  

  Wire.beginTransmission(ADDRESS);
 Wire.write(0);
  Wire.write(0xF5);
  Wire.endTransmission();
   delay(20);
   
  Wire.beginTransmission(ADDRESS);
  Wire.write(0);
  Wire.write(0xF6);
  Wire.endTransmission();
   delay(20);
  Serial.println("klar");

} 
Vilket borde ge enbart nollor när jag sedan läser ut kalibreringsstatus men jag får bara ettor! jag har även provat utan att addressera "0" för varje gång. jag har provat att "maskera" adressen 0 som en byte då jag läste någonstans att wire.h kan ha en bugg som gör att nollor inte fungerar men jag lyckas inte ändå!
Jag skulle behöva en sorts I2C for dummies kurs då jag har läst allt jag kan hitta men ändå inte riktigt förstår hur jag kan läsa / skriva till enskilda register eller hur jag vet hur många bytes jag ska begära från en read?

Någon på detta forum som har tålamod att lära en bilmekaniker om I2c? :)
Senast redigerad av Berry 4 september 2020, 22:23:33, redigerad totalt 1 gång.
Användarvisningsbild
rvl
Inlägg: 5721
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av rvl »

Tips, använd codetaggarna runt inklistrad kod, så blir det mer läsligt. Symbolen (den femte från vänster) ser ut såhär: </>

Kod: Markera allt

#include <iostream>

using namespace std;

int main() {
    cout << "Använd [code]-taggar!\n";
}
Berry
Inlägg: 5
Blev medlem: 4 september 2020, 20:38:43

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av Berry »

Snyggt! ja jag försökte med det men på ett annat forum så räcker det med att skriva koden innanför <>! inte på detta tydligen :) redigerar mitt inlägg!
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av ToPNoTCH »

Generellt svar.

Ett vanligt fel är att man missuppfattar adressen. Många device har en "grund adress" som man lägger på en trailing 0 eller 1 beroende på om man skall skriva eller läsa.
Tror det finns ett "I2C Sniffer" program med i de exempel som följer med I2C biblioteket. Det kan man använda för att säkerställa att man hittar sitt device på bussen och man ser även adressen.

Jag ser inget kommando i koden som läser ut något. Bara skrivande.
Normalt brukar det finnas "Wire.requestFrom" vid utläsning.
Berry
Inlägg: 5
Blev medlem: 4 september 2020, 20:38:43

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av Berry »

ja det stämmer att det inte finns någon utläsning i koden, koden som är infogad här är enbart för att radera kalibreringsprofilen, databladet säger "If you wish to erase the stored profile so your module powers into a default state write the following to the command register 0xE0, 0xE5, 0xE2 with a 20ms delay after each of the three bytes" vilket är vad jag ha försökt uppnå med denna kod! adressen är rätt då jag kan läsa ut kurs och alla andra värden ur cmps det jag inte får till är att radera / lagra kalibreringsprofilen
Användarvisningsbild
hawkan
Inlägg: 2586
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av hawkan »

Det enklaste är att googla "arduino cmps12" och det är inte menat som nån pik just i detta fallet utan allmänt så finns det alltid nån som har kopplat upp en enhet till arduino och det är bara att googla och titta efter hur de gjort det, lära av det och göra på sitt sätt efter det.
Här är två länkar som kan vara till nytta, men det finns en hel del om cmps12 på båtforum märker jag.
https://roboticboat.uk/Arduino/Due/Ardu ... ass12.html
http://www.robot-electronics.co.uk/file ... 12_i2c.ino
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av TomasL »

Jag hade nog också laddat ned det riktiga databladet för att få en riktig referenshandling.
Användarvisningsbild
hawkan
Inlägg: 2586
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av hawkan »

Länge sedan jag laddade ner ett datablad för att få något att fungera med en arduino.
Berry
Inlägg: 5
Blev medlem: 4 september 2020, 20:38:43

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av Berry »

jo alltså tro mig.. jag har googlat och det sitter tyvärr långt inne för mig att be om hjälp men nu måste jag! Och för att förtydliga så är det inte autopiloten som är problemet! den är fungerande! jag använder den varje gång jag är ut men problemet jag upplever är att bäringen ändras och jag måste justera kursen kontinuerligt, det är därför jag vill kalibrera cmps12 vilket jag inte hittar någon info om alls förutom att "det görs genom några enkla rörelser" och att man sedan ska kunna lagra kalibreringsprofilen genom :
"To store a profile write the following to the command register 0xF0, 0xF5, 0xF6 with a 20ms delay after each of the three bytes."

Dom tidigare cmps11 fungerade lite annorlunda och man var tvungen att utföra kalibreringen med kommandon under en specifik tid, cmps12 är självkalibrerande.

jag tror att jag har lyckats läsa ut kalibreringsstatusen (0x1E) genom följande kod:

Kod: Markera allt

#include <WSWire.h>

#define CMPS12_ADDRESS 0x60 

byte CALIB_STATUS;

void setup()
{
Serial.begin(9600); // Start serial port
Wire.begin();
//digitalWrite(A4, LOW);
//digitalWrite(A5, LOW);
}

void loop()
{
  Serial.println("Omstart");
 Wire.beginTransmission(CMPS12_ADDRESS);
  Wire.write(0x1E);                   
 int error = Wire.endTransmission();
Serial.print("endtransmission:");
Serial.println(error);
  Wire.requestFrom(CMPS12_ADDRESS, 1);
  Serial.print("Request");
  //while (Wire.available() < 1);
  byte calState = Wire.read();
  Serial.print(bitRead(calState, 7));
  Serial.print(bitRead(calState, 1));
  Serial.print(bitRead(calState, 2));
  Serial.print(bitRead(calState, 3));
  Serial.print(bitRead(calState, 4));
  Serial.print(bitRead(calState, 5));
  Serial.print(bitRead(calState, 6));
  Serial.println(bitRead(calState, 7));

  delay(500);
men för att säkerställa att det lyckas så har jag försökt radera profilen med den första koden jag postade vilket då enligt databladet borde göra alla register till nollor vilket inte sker och då vet jag heller inte om det fungerar att lagra profilen!
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av ToPNoTCH »

Varje skrivning till de tre olika registren verkar ju returnera 0X55
Returns ok (0x55)
.

Kan det vara så att det blir problem i och med att du inte läser ut dessa mellan skrivningarna ?
Berry
Inlägg: 5
Blev medlem: 4 september 2020, 20:38:43

Re: Arduino + cmps12 kalibrering (Hjälp med I2C och addressering)

Inlägg av Berry »

jo jag funderade på det jag med, men det är endast i "serial mode" som det står att den returnerar "ok" jag kan inte hitta någon referens till att den skulle göra det i i2c mode? men jag ska prova

Edit, provade att lägga en wire.requestfrom() mellan varje send men utan resultat!
Skriv svar