Skocz do zawartości

Moduł HMC5883L nie działa


krzywy187

Pomocna odpowiedź

Witam, mam problem z w/w czujnikiem, dla nie wtajemniczonych jest to magnetometr, dzięki niemu można skonstruować kompas. Problem polega na tym że gdy podłącze do arduino i wgram jakikolwiek przykładowy program to wartości xyz zawsze pokazuje albo tylko same zera albo jedynki, np. że x=1 y=1 z=1. Sprawdzałem podłączenie kilka razy, zasilanie itp. Wykrywa adres 0d gdy wgram i2c scanner ale domyślnie te moduły chyba działają na adresie 1E. Załaczam program na którym bazowałem. Jest to ten sam którym bawił się Elektromaras na yt i jemu działało xd

/* Include the standard Wire library */
#include <Wire.h>

/* The I2C address of the module */
#define HMC5803L_Address 0x1E

/* Register address for the X Y and Z data */
#define X 3
#define Y 7
#define Z 5

void setup() 
{
 Serial.begin(9600);
 /* Initialise the Wire library */
 Wire.begin();

 /* Initialise the module */ 
 Init_HMC5803L();
 delay(300);
}

void loop() 
{
 /* Read each sensor axis data and output to the serial port */
 Serial.print("X=");
 Serial.print(HMC5803L_Read(X));
 Serial.print(" ");
 Serial.print("Y=");
 Serial.print(HMC5803L_Read(Y));
 Serial.print(" ");
 Serial.print("Z=");
 Serial.println(HMC5803L_Read(Z));

 /* Wait a little before reading again */
 delay(200);
}


/* This function will initialise the module and only needs to be run once
  after the module is first powered up or reset */
void Init_HMC5803L(void)
{
 /* Set the module to 8x averaging and 15Hz measurement rate */
 Wire.beginTransmission(HMC5803L_Address);
 Wire.write(0x00);
 Wire.write(0x70);

 /* Set a gain of 5 */
 Wire.write(0x01);
 Wire.write(0xA0);
 Wire.endTransmission();
}


/* This function will read once from one of the 3 axis data registers
and return the 16 bit signed result. */
int HMC5803L_Read(byte Axis)
{
 int Result;

 /* Initiate a single measurement */
 Wire.beginTransmission(HMC5803L_Address);
 Wire.write(0x02);
 Wire.write(0x01);
 Wire.endTransmission();
 delay(6);

 /* Move modules the resiger pointer to one of the axis data registers */
 Wire.beginTransmission(HMC5803L_Address);
 Wire.write(Axis);
 Wire.endTransmission();

 /* Read the data from registers (there are two 8 bit registers for each axis) */  
 Wire.requestFrom(HMC5803L_Address, 2);
 Result = Wire.read() << 8;
 Result |= Wire.read();

 return Result;
}
Link do komentarza
Share on other sites

Nie masz absolutnie żadnej diagnostyki, nie wiesz nawet czy udało się zaadresowanie modułu, czy wysłałeś jakikolwiek bajt, nic. Twój program działałby dokładnie tak samo gdyby moduł fizycznie był odłączony (co może mieć miejsce) lub gdyby nie był zasilany (opcja nr 2) lub miał inny adres (co także jest możliwe bo są dwie metody określania adresów). Za każdym razem zakładasz, że każda operacja I/O się udała a potem się dziwisz, że nie ma wyników.

Może zacznij od typowego programu skanującego I2C - jest standardowym przykładem w Arduino, pewnie w wire lub w okolicach. Jeśli on nie pokaże obecności magnetometru (jestem wtajemniczony), to inne rzeczy też nie zadziałają. Obejrzyj ten program i to samo (nie cały skan ale sprawdzenie obecności wybranego adresu) zrób u siebie na początku. Przynajmniej cała reszta kodu nie będzie musiała robić transferów na pusto a Ty dostaniesz komunikat o poważnym błędzie sprzętowym.

Link do komentarza
Share on other sites

typowy program skanujący i2c pokazuje własnie adres 0D jak i inne sketche które znalazłem w internecie. Jedynie co to mówisz to przyda mi się program który pracuję pod konkretnym adresem który go sprawdza. Zgaduje że nie ma nic gotowego i muszę coś wymyśleć xd

Link do komentarza
Share on other sites

No to skoro program skanujący wykrywa coś pod 0D a Ty używasz adresu 1E to jak to ma działać? Musisz wykryć ten moduł prostym narzędziem, inaczej nici z jakiejkolwiek komunikacji. Sprawdź mu podłączenie, obecność oporników podciągających, zasilanie itd..

Może zajrzyj jak zrobił to autor np. tej biblioteki:

https://github.com/jarzebski/Arduino-HMC5883L

Tam jest cała komunikacja: identyfikacja obecności magnetometru, inicjalizacja rejestrów, ustawianie parametrów pracy i odczyty różnych pomiarów właśnie przy użyciu wire. Może to Cię jakoś natchnie?

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.