2024年3月5日火曜日

地磁気センサQMC5883Lにハマりかける

前回、ATD5883Lを1つ焼いてしまったので、Amazonで格安の類似品を注文。3つで\769と格安。(https://www.amazon.co.jp/dp/B0CFQSW2TG

aitendoで買ったATD5883Lでうまくいったコードを動かしてみると、そもそもI2Cのアドレスが0x0D (13)と表示され、アドレスを変えて動かすも、なぜかセンサの値が3軸とも0になる。

よくよく調べてみると、このチップは「QMC5883L」というレジスタアドレスが互換ではない似て非なるチップとのこと。
https://leico.github.io/TechnicalNote/Arduino/esp32-qmc5883l-basicにて先人がレジスタをまとめてくださっているので、有難く参照する。

要所は以下の通り。

  • 出力レジスタが異なる
    • MAG_X:0x00-01
    • MAG_Y:0x02-03
    • MAG_Z:0x04-05
  • 出力レジスタ16bitがリトルエンディアンの並び順
  • 連続モードの設定方法が異なる
    • 0x0Bに0x01を書き込み
    • 0x09に0x1Dを書き込み


UI FLOWだと上記の通り。
以下はmicropython。

pin0 = machine.Pin(22, mode=machine.Pin.OUT, pull=0x00)
pin0.off()
i2c0 = i2c_bus.easyI2C((23, 19), 0x00, freq=10000)
wait_ms(100)
print('----start')
print(i2c0.scan())
print(i2c0.available())
wait_ms(100)
i2c0.addr=(0x0d)
wait_ms(100)
i2c0.write_u8(0x0b, 0x01)
i2c0.write_u8(0x09, 0x1d)
print(i2c0.read_reg(0x0D, 1))
while True:
  print(str([i2c0.read_u16(0x00, byteorder="little"), i2c0.read_u16(0x02, byteorder="little"), i2c0.read_u16(0x04, byteorder="little")]))
  wait_ms(100)
  wait_ms(2)

この例では、m5atom liteの3.3V側の端子5pinにセンサを直結している。G22を0V出力にして、G23, 19をI2Cに割り当てればOK。

これでうまく地磁気を読み取れて、めでたしめでたし。

0 件のコメント:

コメントを投稿