TLV493D 3D Magnetic Field Sensor Module
Nim wrapper for the TLV493D 3-axis magnetic field sensor.
The TLV493D is a low-power 3D magnetic sensor that can measure magnetic field strength in X, Y, and Z axes. It's useful for position sensing, proximity detection, joystick applications, and rotary encoding.
Features:
- 3-axis magnetic field measurement
- Temperature sensor
- Low power consumption with multiple power modes
- I2C interface only
- Configurable measurement rates
- Magnetic field resolution: 0.098 mT per LSB
Example:
import nimphea import nimphea/dev/tlv493d var sensor: Tlv493dI2C var config: Tlv493dConfig # Configure I2C transport config.transport_config.address = TLV493D_ADDRESS1 config.transport_config.periph = I2C_PERIPH_1 config.transport_config.speed = I2C_400KHZ config.transport_config.scl = seed.GetPin(11) # PB8 config.transport_config.sda = seed.GetPin(12) # PB9 if sensor.init(config) == TLV493D_OK: while true: sensor.updateData() let x = sensor.getX() # in mT let y = sensor.getY() # in mT let z = sensor.getZ() # in mT let temp = sensor.getTemp() # in °C let amount = sensor.getAmount() # total field strength let azimuth = sensor.getAzimuth() # angle in XY plane # Use sensor data...
Types
Tlv493dAccessMode {.importcpp: "daisy::Tlv493d<daisy::Tlv493dI2CTransport>::AccessMode_e", size: 4.} = enum POWERDOWNMODE = 0, ## Power down mode (1000ms delay) FASTMODE = 1, ## Fast mode (no delay) LOWPOWERMODE = 2, ## Low power mode (10ms delay) ULTRALOWPOWERMODE = 3, ## Ultra low power mode (100ms delay) MASTERCONTROLLEDMODE = 4 ## Master controlled mode (10ms delay)
- Power and measurement access modes Source Edit
Tlv493dConfig {.importcpp: "daisy::Tlv493dI2C::Config", bycopy.} = object transport_config* {.importcpp: "transport_config".}: Tlv493dI2CTransportConfig
- TLV493D device configuration Source Edit
Tlv493dI2C {.importcpp: "daisy::Tlv493dI2C", bycopy.} = object
- TLV493D sensor with I2C transport Source Edit
Tlv493dI2CTransport {.importcpp: "daisy::Tlv493dI2CTransport", bycopy.} = object
- I2C transport for TLV493D Source Edit
Tlv493dI2CTransportConfig {.importcpp: "daisy::Tlv493dI2CTransport::Config", bycopy.} = object periph* {.importcpp: "periph".}: I2CPeripheral speed* {.importcpp: "speed".}: I2CSpeed scl* {.importcpp: "scl".}: Pin sda* {.importcpp: "sda".}: Pin address* {.importcpp: "address".}: uint8
- I2C transport configuration Source Edit
Tlv493dResult {.importcpp: "daisy::Tlv493d<daisy::Tlv493dI2CTransport>::Result", size: 4.} = enum TLV493D_OK = 0, ## Success TLV493D_ERR = 1 ## Error
- Operation result Source Edit
Consts
TLV493D_ADDRESS1 = 0x5E'u8
- I2C address 1 Source Edit
TLV493D_ADDRESS2 = 0x1F'u8
- I2C address 2 Source Edit
TLV493D_B_MULT = 0.098'f32
- Magnetic field LSB multiplier (mT) Source Edit
Procs
proc enableTemp(this: var Tlv493dI2C; enable: bool) {. importcpp: "#.EnableTemp(#)", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Enable or disable temperature measurements
Parameters:
- enable - true to enable temperature sensor, false to disable
proc getAmount(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetAmount()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the total magnetic field strength
Calculates sqrt(x² + y² + z²)
Returns: Total magnetic field magnitude in mT
Source Edit proc getAzimuth(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetAzimuth()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the azimuth angle in the XY plane
Calculates arctan(y/x)
Returns: Azimuth angle in radians
Source Edit proc getMeasurementDelay(this: var Tlv493dI2C): uint16 {. importcpp: "#.GetMeasurementDelay()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the current measurement delay in milliseconds
The delay depends on the current access mode.
Returns: Measurement delay in ms
Source Edit proc getPolar(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetPolar()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the polar angle
Calculates arctan(z/sqrt(x² + y²))
Returns: Polar angle in radians
Source Edit proc getTemp(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetTemp()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the temperature reading
Returns: Temperature in degrees Celsius
Source Edit proc getX(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetX()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the X-axis magnetic field strength
Returns: X-axis magnetic field in mT (millitesla)
Source Edit proc getY(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetY()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the Y-axis magnetic field strength
Returns: Y-axis magnetic field in mT (millitesla)
Source Edit proc getZ(this: var Tlv493dI2C): cfloat {.importcpp: "#.GetZ()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Get the Z-axis magnetic field strength
Returns: Z-axis magnetic field in mT (millitesla)
Source Edit proc init(this: var Tlv493dI2C; config: Tlv493dConfig): Tlv493dResult {. importcpp: "#.Init(#)", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Initialize the TLV493D sensor
Parameters:
- config - Configuration struct with transport settings
Returns: TLV493D_OK on success, TLV493D_ERR on failure
Source Edit proc initTlv493dConfig(): Tlv493dConfig {.constructor, importcpp: "daisy::Tlv493dI2C::Config(@)", header: "dev/tlv493d.h".}
- Initialize device config with defaults Source Edit
proc initTlv493dI2CTransportConfig(): Tlv493dI2CTransportConfig {.constructor, importcpp: "daisy::Tlv493dI2CTransport::Config(@)", header: "dev/tlv493d.h".}
- Initialize I2C transport config with defaults Source Edit
proc setAccessMode(this: var Tlv493dI2C; mode: Tlv493dAccessMode) {. importcpp: "#.SetAccessMode(#)", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Set the power/measurement access mode
Parameters:
- mode - Access mode (power down, fast, low power, ultra low power, or master controlled)
proc setInterrupt(this: var Tlv493dI2C; enable: bool) {. importcpp: "#.SetInterrupt(#)", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Enable or disable interrupts
Parameters:
- enable - true to enable interrupts, false to disable
proc updateData(this: var Tlv493dI2C) {.importcpp: "#.UpdateData()", header: "dev/tlv493d.h", ...raises: [], tags: [], forbids: [].}
-
Update sensor readings
Call this regularly to fetch new magnetic field and temperature data. Respects the measurement delay based on the current access mode.
Source Edit