Skip to content

lis2mdl: add magnetometer driver.#2

Merged
nedseb merged 15 commits intomainfrom
magnetometer
Mar 11, 2026
Merged

lis2mdl: add magnetometer driver.#2
nedseb merged 15 commits intomainfrom
magnetometer

Conversation

@Charly-sketch
Copy link
Copy Markdown
Contributor

@Charly-sketch Charly-sketch commented Oct 30, 2025

Closes #7

Add LIS2MDL magnetometer driver

This pull request introduces a new MicroPython driver for the STMicroelectronics LIS2MDL 3-axis magnetometer.

The driver provides an API for reading magnetic field data, calibration, heading computation, and power management via the I²C interface.

@nedseb nedseb force-pushed the magnetometer branch 3 times, most recently from 31e316b to 25eef29 Compare November 3, 2025 09:45
@nedseb nedseb changed the title [lis2mdl] add : Magnetometer driver lis2mdl: add Magnetometer driver Nov 3, 2025
@nedseb
Copy link
Copy Markdown
Contributor

nedseb commented Nov 3, 2025

Can you correct all the mistake identified by ruff ?

@nedseb nedseb self-requested a review November 3, 2025 09:52
@Charly-sketch Charly-sketch changed the title lis2mdl: add Magnetometer driver lis2mdl: add magnetometer driver. Dec 9, 2025
@nedseb nedseb requested a review from Copilot March 10, 2026 08:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new MicroPython library under lib/lis2mdl/ implementing a driver for the ST LIS2MDL 3‑axis magnetometer, along with documentation and example scripts.

Changes:

  • Introduces the LIS2MDL driver (I2C register config, raw/µT reads, calibration helpers, heading + tilt compensation utilities).
  • Adds LIS2MDL register/constants definitions and package exports.
  • Provides a README and multiple example/test scripts for validation and usage.

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
lib/lis2mdl/manifest.py Package manifest stub (currently empty).
lib/lis2mdl/lis2mdl/device.py Main LIS2MDL driver implementation (config, readouts, calibration, heading, power/reset).
lib/lis2mdl/lis2mdl/const.py Register addresses and constants for LIS2MDL.
lib/lis2mdl/lis2mdl/init.py Package export (LIS2MDL).
lib/lis2mdl/exemple/magnet_test.py Large interactive test script covering reads, calibration, heading, power/reset.
lib/lis2mdl/exemple/magnet_fieldForce.py Example loop printing magnetic field magnitude.
lib/lis2mdl/exemple/magnet_compass.py Example loop printing heading + direction label.
lib/lis2mdl/README.md Feature overview, wiring, installation, and usage docs.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/lis2mdl/lis2mdl/const.py
Comment thread lib/lis2mdl/lis2mdl/device.py
Comment thread lib/lis2mdl/README.md Outdated
Comment thread lib/lis2mdl/README.md
Comment thread lib/lis2mdl/lis2mdl/device.py
Comment thread lib/lis2mdl/examples/magnet_compass.py Outdated
Comment thread lib/lis2mdl/lis2mdl/device.py Outdated
Comment thread lib/lis2mdl/README.md
Comment thread lib/lis2mdl/README.md Outdated
Comment thread lib/lis2mdl/lis2mdl/device.py
Copy link
Copy Markdown
Contributor

@nedseb nedseb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Questions/remarques à la relecture de la PR

manifest.py est vide

Le fichier existe mais est vide. Tous les autres drivers complétés (hts221, apds9960, bq27441, etc.) déclarent un metadata() + package(). Il faudrait :

metadata(
    description="Driver for the LIS2MDL 3-axis magnetometer",
    version="0.0.1",
)

package("lis2mdl")

Répertoire exemple/ au lieu de examples/

Tous les autres drivers utilisent examples/ (en anglais, au pluriel). Ici c'est exemple/ (français, singulier). A renommer pour la cohérence du projet.

Valeurs de calibration en dur (lignes 12-17 de device.py)

x_off = -132.0
y_off = -521.5
z_off = -891.0
x_scale = 273.0
y_scale = 313.5
z_scale = 295.0

Ces valeurs sont spécifiques à un capteur particulier. Pour un driver générique distribué en bibliothèque, les défauts devraient être neutres (0.0 pour les offsets, 1.0 pour les scales). L'utilisateur calibre ensuite son propre capteur. Avec les valeurs actuelles, un utilisateur qui oublie de calibrer obtiendra des résultats faux sans avertissement.

_bits définie en double dans magnet_test.py

La fonction _bits est définie ligne 24 et ligne 517 avec le même corps. La deuxième définition est morte ou écrase la première inutilement. Il faut supprimer le doublon (ligne 517).

Convention de nommage mixte dans device.py

Le driver mélange deux styles :

  • camelCase : setReg (L147), _MAG_LSB_TO_uT (L190)
  • snake_case : set_mode, set_odr, read_magnet_raw, etc.

Cependant, en regardant le driver existant hts221/device.py, on constate que setReg/getReg en camelCase est une convention existante du projet. Donc setReg est acceptable pour la cohérence interne, mais les nouvelles méthodes devraient idéalement suivre un seul style.

bare except (lignes 39 et 559 de device.py)

try:
    time.sleep_ms(10)
except:
    pass

L'intention est de supporter à la fois MicroPython (sleep_ms) et CPython (sleep), mais le bare except avale toutes les exceptions, y compris KeyboardInterrupt. Même si E722 est ignoré par ruff dans ce projet, c'est une pratique discutable.

Import wildcard from lis2mdl.const import *

Ignoré par la config ruff (F403/F405), et c'est le même pattern utilisé dans tous les autres drivers (from hts221.const import *). C'est donc cohérent avec le projet — pas de changement nécessaire.

class LIS2MDL(object)

En Python 3, hériter de object est implicite. Cependant, hts221/device.py fait la même chose (class HTS221(object)). C'est donc une convention du projet. On peut le signaler comme amélioration cosmétique mais ce n'est pas bloquant.

Format des commits

Les messages passent la regex CI (^[^!]+: [A-Za-z]+.+ .+.$), donc pas de blocage. Quelques remarques mineures :

Espace avant le : dans 2 commits (lis2mdl : fix...) — inconsistant avec les autres
Typo "exemple" au lieu de "example" dans les messages
Le message "initialise LIS2MDL driver." est un peu vague pour un premier commit

Commentaire erroné dans magnet_fieldForce.py:1)

# exemple of heading reading with direction label
C'est un copier-coller de magnet_compass.py. Le commentaire devrait décrire la lecture de la force du champ magnétique, pas le heading.

le 0x80 dans read_magnet (device.py:221)

buf = self.i2c.readfrom_mem(self.address, LIS2MDL_OUTX_L_REG | 0x80, 6)

Le | 0x80 est le bit d'auto-incrémentation pour la lecture multi-octets. C'est correct pour le LIS2MDL, mais ce magic number mériterait une constante dans const.py (ex: LIS2MDL_AUTO_INC = const(0x80)) pour la lisibilité.

le soft reset dans init (device.py:36)

self.setReg(0x20, LIS2MDL_CFG_REG_A)  # SOFT_RST=1 (not 0x10)

Le commentaire dit not 0x10, ce qui est confus. 0x20 = bit 5 = SOFT_RST, c'est correct. Mais le commentaire semble être un résidu de debug. De plus, 0x20 devrait être 1 << 5 ou une constante nommée pour être cohérent avec le reste du code qui utilise des shifts de bits explicites.

Copy link
Copy Markdown
Contributor

@nedseb nedseb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review après corrections

Bon travail sur les corrections ! Le manifest, le renommage examples/, les calibrations neutres et la typo INT_CTRL_REG sont OK.

Il reste 4 points mineurs à corriger avant d'approuver.

Comment thread lib/lis2mdl/examples/magnet_test.py Outdated
Comment thread lib/lis2mdl/examples/magnet_fieldForce.py Outdated
Comment thread lib/lis2mdl/examples/magnet_compass.py Outdated
Comment thread lib/lis2mdl/lis2mdl/device.py Outdated
@nedseb nedseb added the enhancement New feature or request label Mar 11, 2026
@nedseb nedseb merged commit 2e86d46 into main Mar 11, 2026
3 checks passed
@nedseb nedseb deleted the magnetometer branch March 11, 2026 15:42
@semantic-release-updater
Copy link
Copy Markdown

🎉 This PR is included in version 0.0.2 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

lis2mdl: Add LIS2MDL magnetometer driver

3 participants