Skip to content

Commit a3319a1

Browse files
committed
add licences to example
1 parent 7261e46 commit a3319a1

File tree

4 files changed

+136
-7
lines changed

4 files changed

+136
-7
lines changed

adafruit_lsm6ds/__init__.py

Lines changed: 94 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@
5555
__version__ = "0.0.0-auto.0"
5656
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS.git"
5757

58+
import struct
5859
from time import sleep
5960
from math import radians
6061
from micropython import const
6162
from adafruit_bus_device import i2c_device
6263

6364
from adafruit_register.i2c_struct import ROUnaryStruct, Struct
6465
from adafruit_register.i2c_bits import RWBits
65-
from adafruit_register.i2c_bit import RWBit
66+
from adafruit_register.i2c_bit import RWBit, ROBit
6667

6768
try:
6869
from typing import Tuple, Optional
@@ -139,22 +140,34 @@ class AccelHPF(CV):
139140

140141
LSM6DS_CHIP_ID = const(0x6C)
141142

143+
_LSM6DS_MLC_INT1 = const(0x0D)
142144
_LSM6DS_WHOAMI = const(0xF)
143145
_LSM6DS_CTRL1_XL = const(0x10)
144146
_LSM6DS_CTRL2_G = const(0x11)
145147
_LSM6DS_CTRL3_C = const(0x12)
146148
_LSM6DS_CTRL8_XL = const(0x17)
147149
_LSM6DS_CTRL9_XL = const(0x18)
148150
_LSM6DS_CTRL10_C = const(0x19)
151+
_LSM6DS_ALL_INT_SRC = const(0x1A)
149152
_LSM6DS_OUT_TEMP_L = const(0x20)
150153
_LSM6DS_OUTX_L_G = const(0x22)
151154
_LSM6DS_OUTX_L_A = const(0x28)
155+
_LSM6DS_MLC_STATUS = const(0x38)
152156
_LSM6DS_STEP_COUNTER = const(0x4B)
157+
_LSM6DS_TAP_CFG0 = const(0x56)
153158
_LSM6DS_TAP_CFG = const(0x58)
154-
159+
_LSM6DS_MLC0_SRC = const(0x70)
155160
_MILLI_G_TO_ACCEL = 0.00980665
156161

157162

163+
_LSM6DS_EMB_FUNC_EN_A = const(0x04)
164+
_LSM6DS_EMB_FUNC_EN_B = const(0x05)
165+
_LSM6DS_FUNC_CFG_ACCESS = const(0x01)
166+
_LSM6DS_FUNC_CFG_BANK_USER = const(0)
167+
_LSM6DS_FUNC_CFG_BANK_HUB = const(1)
168+
_LSM6DS_FUNC_CFG_BANK_EMBED = const(2)
169+
170+
158171
class LSM6DS: # pylint: disable=too-many-instance-attributes
159172

160173
"""Driver for the LSM6DSOX 6-axis accelerometer and gyroscope.
@@ -171,7 +184,10 @@ class LSM6DS: # pylint: disable=too-many-instance-attributes
171184
_raw_accel_data = Struct(_LSM6DS_OUTX_L_A, "<hhh")
172185
_raw_gyro_data = Struct(_LSM6DS_OUTX_L_G, "<hhh")
173186
_raw_temp_data = Struct(_LSM6DS_OUT_TEMP_L, "<h")
174-
187+
_emb_func_en_a = Struct(_LSM6DS_EMB_FUNC_EN_A, "<b")
188+
_emb_func_en_b = Struct(_LSM6DS_EMB_FUNC_EN_B, "<b")
189+
_mlc0_src = Struct(_LSM6DS_MLC0_SRC, "<b")
190+
# _all_int = Struct(_LSM6DS_ALL_INT_SRC, "<bbbbbbbb")
175191
# RWBits:
176192
_accel_range = RWBits(2, _LSM6DS_CTRL1_XL, 2)
177193
_accel_data_rate = RWBits(4, _LSM6DS_CTRL1_XL, 4)
@@ -187,13 +203,22 @@ class LSM6DS: # pylint: disable=too-many-instance-attributes
187203
_i3c_disable = RWBit(_LSM6DS_CTRL9_XL, 1)
188204
_pedometer_reset = RWBit(_LSM6DS_CTRL10_C, 1)
189205
_func_enable = RWBit(_LSM6DS_CTRL10_C, 2)
206+
_mem_bank = RWBit(_LSM6DS_FUNC_CFG_ACCESS, 7)
207+
_mlc_status = ROBit(_LSM6DS_MLC_STATUS, 0)
208+
_i3c_disable = RWBit(_LSM6DS_CTRL9_XL, 0)
209+
_block_data_enable = RWBit(_LSM6DS_CTRL3_C, 4)
210+
_route_int1 = RWBit(_LSM6DS_MLC_INT1, 0)
211+
_tap_latch = RWBit(_LSM6DS_TAP_CFG0, 0)
212+
_tap_clear = RWBit(_LSM6DS_TAP_CFG0, 6)
190213
_ped_enable = RWBit(_LSM6DS_TAP_CFG, 6)
191214
pedometer_steps = ROUnaryStruct(_LSM6DS_STEP_COUNTER, "<h")
192215
"""The number of steps detected by the pedometer. You must enable with `pedometer_enable`
193216
before calling. Use ``pedometer_reset`` to reset the number of steps"""
194217
CHIP_ID = None
195218

196-
def __init__(self, i2c_bus: I2C, address: int = LSM6DS_DEFAULT_ADDRESS) -> None:
219+
def __init__(
220+
self, i2c_bus: I2C, address: int = LSM6DS_DEFAULT_ADDRESS, ucf: str = None
221+
) -> None:
197222
self._cached_accel_range = None
198223
self._cached_gyro_range = None
199224

@@ -215,6 +240,10 @@ def __init__(self, i2c_bus: I2C, address: int = LSM6DS_DEFAULT_ADDRESS) -> None:
215240

216241
self.accelerometer_range = AccelRange.RANGE_4G # pylint: disable=no-member
217242
self.gyro_range = GyroRange.RANGE_250_DPS # pylint: disable=no-member
243+
# Load and configure MLC if UCF file is provided
244+
print(ucf)
245+
if ucf is not None:
246+
self.load_mlc(ucf)
218247

219248
def reset(self) -> None:
220249
"Resets the sensor's configuration into an initial state"
@@ -376,3 +405,64 @@ def temperature(self) -> float:
376405
return (temp - 2 ** 13) * 0.0625
377406

378407
return temp * 0.0625
408+
409+
def set_embedded_functions(self, enable, emb_ab=None):
410+
"""DocString Here"""
411+
self._mem_bank = 1
412+
if enable:
413+
self._emb_func_en_a = emb_ab[0]
414+
self._emb_func_en_b = emb_ab[1]
415+
else:
416+
emb_a = self._emb_func_en_a
417+
emb_b = self._emb_func_en_b
418+
print(emb_a)
419+
print(emb_b)
420+
self._emb_func_en_a = (emb_a[0] & 0xC7,)
421+
self._emb_func_en_b = (emb_b[0] & 0xE6,)
422+
emb_ab = (emb_a, emb_b)
423+
424+
self._mem_bank = 0
425+
return emb_ab
426+
427+
def load_mlc(self, ucf):
428+
"""DOCString Here"""
429+
buf = bytearray(2)
430+
with self.i2c_device as i2c:
431+
# Load MLC config from file
432+
with open(ucf, "r") as ucf_file:
433+
for line in ucf_file:
434+
if line.startswith("Ac"):
435+
command = [int(v, 16) for v in line.strip().split(" ")[1:3]]
436+
print(line)
437+
buf[0] = command[0]
438+
buf[1] = command[1]
439+
i2c.write(buf)
440+
441+
emb_ab = self.set_embedded_functions(False)
442+
443+
# Disable I3C interface
444+
self._i3c_disable = 1
445+
446+
# Enable Block Data Update
447+
self._block_data_enable = 1
448+
449+
# Route signals on interrupt pin 1
450+
self._mem_bank = 1
451+
self._route_int1 &= 1
452+
self._mem_bank = 1
453+
454+
# Configure interrupt pin mode
455+
self._tap_latch = 1
456+
self._tap_clear = 1
457+
458+
self.set_embedded_functions(True, emb_ab)
459+
460+
def read_mlc_output(self):
461+
"""DOCString here"""
462+
buf = None
463+
if self._mlc_status:
464+
# junk = self._all_int
465+
self._mem_bank = 1
466+
buf = self._mlc0_src
467+
self._mem_bank = 0
468+
return buf

adafruit_lsm6ds/lsm6dsox.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class LSM6DSOX(LSM6DS): # pylint: disable=too-many-instance-attributes
5050

5151
CHIP_ID = LSM6DS_CHIP_ID
5252

53-
def __init__(self, i2c_bus: I2C, address: int = LSM6DS_DEFAULT_ADDRESS) -> None:
54-
super().__init__(i2c_bus, address)
53+
def __init__(
54+
self, i2c_bus: I2C, address: int = LSM6DS_DEFAULT_ADDRESS, ucf: str = None
55+
) -> None:
56+
super().__init__(i2c_bus, address, ucf)
5557
self._i3c_disable = True

examples/lsm6ds_lsm6dsox_mlc_test.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
# LSM6DSOX IMU MLC (Machine Learning Core) Example.
5+
# Download the raw UCF file, copy to storage and reset.
6+
7+
# NOTE: The pre-trained models (UCF files) for the examples can be found here:
8+
# https://github.com/STMicroelectronics/STMems_Machine_Learning_Core/tree/master/application_examples/lsm6dsox
9+
10+
import board
11+
from adafruit_lsm6ds.lsm6dsox import LSM6DSOX
12+
from adafruit_lsm6ds import Rate, AccelRange, GyroRange
13+
14+
i2c = board.STEMMA_I2C() # uses board.SCL and board.SDA
15+
16+
17+
# Vibration detection example
18+
UCF_FILE = "lsm6dsox_vibration_monitoring.ucf"
19+
UCF_LABELS = {0: "no vibration", 1: "low vibration", 2: "high vibration"}
20+
# NOTE: Selected data rate and scale must match the MLC data rate and scale.
21+
lsm = LSM6DSOX(i2c, ucf=UCF_FILE)
22+
lsm.gyro_range = GyroRange.RANGE_2000_DPS
23+
lsm.accelerometer_range = AccelRange.RANGE_4G
24+
lsm.accelerometer_data_rate = Rate.RATE_26_HZ
25+
lsm.gyro_data_rate = Rate.RATE_26_HZ
26+
# Head gestures example
27+
# UCF_FILE = "lsm6dsox_head_gestures.ucf"
28+
# UCF_LABELS = {0:"Nod", 1:"Shake", 2:"Stationary", 3:"Swing", 4:"Walk"}
29+
# NOTE: Selected data rate and scale must match the MLC data rate and scale.
30+
# lsm = LSM6DSOX(i2c, gyro_odr=26, accel_odr=26, gyro_scale=250, accel_scale=2, ucf=UCF_FILE)
31+
32+
print("MLC configured...")
33+
34+
while True:
35+
buf = lsm.read_mlc_output()
36+
if buf is not None:
37+
print(UCF_LABELS[buf[0]])

examples/lsm6ds_lsm6dsox_simpletest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import board
66
from adafruit_lsm6ds.lsm6dsox import LSM6DSOX
77

8-
i2c = board.I2C() # uses board.SCL and board.SDA
8+
i2c = board.STEMMA_I2C() # uses board.SCL and board.SDA
99
sensor = LSM6DSOX(i2c)
1010

1111
while True:

0 commit comments

Comments
 (0)