Pracował kodował ktoś kiedyś magnetometr / kompas jak QMC5883 albo BMM150?
Kompletnie nie umiem zrobić żeby pokazywały konkretny kierunek. Jakieś pokazuje dane praktycznie nie mające większego związku z kierunkiem albo zupełnie nieliniowo. w datashit nie ma napisane jak liniowe i jakie dane wypluwa tylko wiadomo że pokazuje max 8192
#elektronika #programowanie
7d7d7fbf-c9aa-461f-91c8-405dcc06bda3
Trawienny

Z tego co znalazłem to jest tak:

Czyli musisz patrzeć kiedy dla X a kiedy dla Y są odpowiednio wartości dodanie, kiedy ujemne a kiedy zero.

(https://www.mouser.com/datasheet/2/783/BST-BMM150-DS001-01-786480.pdf)

a812b461-380e-4599-aee0-d5e030baeb00
Fox

@Trawienny gołe wyniki nie mają żadnych ujemnych wartości. Zwykłe bajty składane do 13 bitowej wartości czyli max 8192, ALE jak przyłożę neodym to siega max 4095... to też dziwne. Nie widzę czy w nocie jest gdzieś zaznaczone że któryś np ostatni MSB bit jest minusem.

Fox

@Felonious_Gru z jakiejś przyczyny ten kod mi nic nie dał. Nadal reaguje na zmianę kierunku ale nie jest to liniowe ani nic.

Jakiś śmietnik. Tak zadaptowałem w bascomie:

tu czytam i przesuam bity bo jest ich 13 użytkowych

 Xmag = Xmag_msb

   Shift Xmag , Left , 8

   Xmag = Xmag + Xmag_lsb

   Shift Xmag , Right , 3


tak samo dla osi Y

tu wzór z innej strony


Heading = Atn2(xmag , Ymag)

 Atn2res = Heading * 180

 Atn2res = Atn2res / Pi

 Heading = Atn2res + Declin

   _sec = Heading

Felonious_Gru

@Fox a kalibrowałeś to cudo?

Fox

@Felonious_Gru nie wiem jak.

redve

@Fox ja mam HMC5883 zamiast GMC5883, ale ja normalnie mialem przykladowy kod który zadziałał w arduino ide


void InitializeMagnetometer(){

Serial.println("Initializing Magnetometer");

if(!magnetometer.begin()){

Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");

while(1);

}

Serial.println("Magnetometer initialized");

}


void PrintMagnetometer(){

sensors_event_t event;

magnetometer.getEvent(&event);


float heading = atan2(event.magnetic.y, event.magnetic.x);

float declinationAngle = 0.22;

heading += declinationAngle;


// Correct for when signs are reversed.

if(heading < 0)

heading += 2*PI;

if(heading > 2*PI)

heading -= 2*PI;

earth_angle = heading * 180/M_PI;

}

Fox

@redve co w tej składni oznacza heading + i heading - ?

redve

@Fox heading to kąt jaki tworzy igla kompasu i polnoc ziemi jak rozumiem. 0 to polnoc, 180 poludnie, 90 wschod 270 zachod


Albo odwrotnie xD

Fox

@redve ale cov znaczy + i - znaczy po prostu tak się dodaje w C?

redve

@Fox a, o tym mówisz


heading += 2*PI

oznacza "do obecnej wartości dodaj 2 pi"

analogicznie

heading -= 2*PI odejmuje od obecnej wartosci

Fox

@redve zobacz kod wyżej tak to zaadaptowałem

Zaloguj się aby komentować