Magnetometro gy273 non funziona

Buongiorno, due giorni fa ho ricevuto un magnetometro HMC5883L GY-273 comprato su eBay ma ho problemi a farlo funzionare. Ho collegato SDA al pin 20 (ho Arduino Mega), SCL al 21 e VCC al 3.3V di Arduino (infatti il venditore dice che funzioni a 3.3). Ho provato diversi codici, tra cui questo di Adafruit, che segna sempre 0 (so che è per GY-271 ma pensavo fossero più o meno uguali) ed altri come il primo di questo thread. Il test per verificare la presenza di I2C però ne consta la presenza. Ho anche provato anche a fare un pull-up sui bus con resistenze da 10k ma niente..! Suggerimenti?

Arduino MEGA ha già incorporate sulla board le resistenze di pull-up, quindi NON serve aggiungerne altre. Per fare lo scan del bus I2C utilizza qauanto trovi QUI e verifica a quale indirizzo trova il device, riportalo qui sul forum e metti il tuo programma che stai usando per prova (… mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra).

Guglielmo

gpb01:
Per fare lo scan del bus I2C utilizza qauanto trovi QUI e verifica a quale indirizzo trova il device, riportalo qui sul forum e metti il tuo programma che stai usando per prova

Ciao Guglielmo, quel codice è quello a cui mi riferivo ed ha riportato 0x0D.

Il programma è questo:

#include <Wire.h> //I2C Arduino Library

#define addr 0x0D //I2C Address for The HMC5883

void setup()
{
  
  Serial.begin(9600);
  Wire.begin();
  
  
  Wire.beginTransmission(addr); //start talking
  Wire.write(0x02); // Set the Register
  delay(100);
  Wire.write(0x00); // Tell the HMC5883 to Continuously Measure
  Wire.endTransmission();
}


void loop()
{
  
  int x,y,z; //triple axis data

  //Tell the HMC what regist to begin writing data into
  Wire.beginTransmission(addr);
  Wire.write(0x03); //start with register 3.
  Wire.endTransmission();
  
 
 //Read the data.. 2 bytes for each axis.. 6 total bytes
  Wire.requestFrom(addr, 6);
  if(6<=Wire.available()){
    x = Wire.read()<<8; //MSB  x 
    x |= Wire.read(); //LSB  x
    z = Wire.read()<<8; //MSB  z
    z |= Wire.read(); //LSB z
    y = Wire.read()<<8; //MSB y
    y |= Wire.read(); //LSB y
  }
  
  // Show Values
  Serial.print("X Value: ");
  Serial.println(x);
  Serial.print("Y Value: ");
  Serial.println(y);
  Serial.print("Z Value: ");
  Serial.println(z);
  Serial.println();
  
  delay(1000);
}

Quel modulo, secondo lo schema elettrico (sempre che sia corretto, ovviamente), ha gia un LDO a bordo, che regola il 3.3V per il chip, quindi andrebbe alimentato a 5V ... inoltre le pull-up interne da 4K7 portano le linee di comunicazione al 3.3V, quindi dovrebbe essere in grado di funzionare anche con le MCU alimentate a 5V (il valore dato nell'absolute maximum rating per la tensione del chip e' 4.8V, se le R di pull-up interne fanno un partitore con quelle esterne, in teoria tale valore non lo dovrebbe superare ... in teoria) se anche lui viene alimentato con il 5V ... pero' mi sa che se gli dai 3.3V al VCC, l'LDO fa cadere troppa tensione per permettere poi al tutto di funzionare correttamente ... ;)

Non so se lo schema sia quello perché il venditore ha scritto di aver messo il datasheet nella descrizione ma non c'è..! Quindi cosa consigli di fare?

Hai un link alla pagina del venditore, cosi da poter cercare di capire esattamente che scheda e' ?

Sì, è questo. Scusate se non l'ho postato prima ma non ricordavo se il regolamento lo consentisse.

Si, lo schema dovrebbe essere quello (a parte uno dei condensatori filtro che l'hanno disegnato sull'uscita mentre invece e' sull'ingresso) ... monta a bordo un LDO in case SOT23, XC6206P332MR (marcato 662K), quindi andrebbe alimentato fra 3.6V e 5V per avere i 3.3V in uscita ...

L'unica cosa e' che chi ha fatto lo schema ha sbagliato a numerare i pin ...

Ah? Perché il produttore ha scritto nella descrizione "2.16-3.6VDC supply range", quindi avevo capito che andasse alimentato a 3v..! Più tardi provo ad alimentarlo a 5 e faccio sapere, grazie!

La descrizione sembra copiata brutalmente da un sito che vende solo il chip ...

"Comes in a low-height, LCC surface mount package. For a breakout board, see below."

... ma lui sta gia vendendo una breakout ... :D

Niente, non va nemmeno con l'alimentazione a 5v, non capisco..! Domattina ci penserò un po' su!

Vedo che nel tuo programma NON controlli mai il vallore di ritorno della chiamate alla "Wire.endTransmission()" che invece va controllato perché ti da un indicazione sul possibile errore riscontrato ... che magari aiuta ;)

Guglielmo

Ho seguito il tuo consiglio, ma Wire.endTransmission() stampa 0, che corrisponde a "success"..! Sempre più strano!

Edit: comunque il led dell'RX lampeggia di continuo, quindi è come se i dati gli arrivassero, o no?

Eureka! Praticamente il problema era nel fatto che il modulo non è un HMC5883l, come dichiarato dal venditore e come impresso sul modulo bensì un QMC5883 e difatti utilizzando questa libreria funziona! Come mi hanno fatto notare sul forum inglese, il chip originale centrale riporta la scritta l883 mentre il fake DA5883...! Ora devo solo vedere bene quale parte del modulo sia la "punta" ..! Grazie a tutti per le risposte!!

Cricri: ... Ora devo solo vedere bene quale parte del modulo sia la "punta" ..!

Se intendi la direzione degli assi, basta consultare il datasheet (pagina 4) ... ;)

Grazie per il datasheet, per fortuna almeno questa è stampata correttamente sul modulo con delle freccette..! In ogni caso quel che serve a me è ottenere l'angolo riportato ad esempio sulle bussole, se non erro si calcola con la formula :

atan2(y, x);

dove y ed x sono le misure lette dal magnetometro sui due assi, è corretto? (ovviamente la misura ottenuta va convertita in gradi)

Edit: nel caso servisse a qualcuno, la direzione verso cui punta il sensore e del quale esso calcola l'angolo rispetto al nord corrisponde alla punta della freccia dell'asse X stampata sul modulo.