Skip to content

Commit e177362

Browse files
committed
add LSM6DSO
1 parent bbd1872 commit e177362

File tree

5 files changed

+188
-0
lines changed

5 files changed

+188
-0
lines changed

sensor/LSM6DSO/LSM6DSO.py

+145
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# LSM6DSO 3D accelerometer and 3D gyroscope seneor micropython drive
2+
# ver: 1.0
3+
# License: MIT
4+
# Author: shaoziyang ([email protected])
5+
# v1.0 2019.7
6+
7+
LSM6DSO_CTRL1_XL = const(0x10)
8+
LSM6DSO_CTRL2_G = const(0x11)
9+
LSM6DSO_CTRL3_C = const(0x12)
10+
LSM6DSO_CTRL6_C = const(0x15)
11+
LSM6DSO_CTRL8_XL = const(0x17)
12+
LSM6DSO_STATUS = const(0x1E)
13+
LSM6DSO_OUT_TEMP_L = const(0x20)
14+
LSM6DSO_OUTX_L_G = const(0x22)
15+
LSM6DSO_OUTY_L_G = const(0x24)
16+
LSM6DSO_OUTZ_L_G = const(0x26)
17+
LSM6DSO_OUTX_L_A = const(0x28)
18+
LSM6DSO_OUTY_L_A = const(0x2A)
19+
LSM6DSO_OUTZ_L_A = const(0x2C)
20+
21+
LSM6DSO_SCALEA = ('2g', '16g', '4g', '8g')
22+
LSM6DSO_SCALEG = ('250', '125', '500', '', '1000', '', '2000')
23+
24+
class LSM6DSO():
25+
def __init__(self, i2c, addr = 0x6B):
26+
self.i2c = i2c
27+
self.addr = addr
28+
self.tb = bytearray(1)
29+
self.rb = bytearray(1)
30+
self.oneshot = False
31+
self.irq_v = [[0, 0, 0], [0, 0, 0]]
32+
self._power = True
33+
self._power_a = 0x10
34+
self._power_g = 0x10
35+
# ODR_XL=1 FS_XL=0
36+
self.setreg(LSM6DSO_CTRL1_XL, 0x10)
37+
# ODR_G=1 FS_125=1
38+
self.setreg(LSM6DSO_CTRL2_G, 0x12)
39+
# BDU=1 IF_INC=1
40+
self.setreg(LSM6DSO_CTRL3_C, 0x44)
41+
self.setreg(LSM6DSO_CTRL8_XL, 0)
42+
# scale=2G
43+
self._scale_a = 0
44+
self._scale_g = 0
45+
self.scale_a('2g')
46+
self.scale_g('125')
47+
48+
def int16(self, d):
49+
return d if d < 0x8000 else d - 0x10000
50+
51+
def setreg(self, reg, dat):
52+
self.tb[0] = dat
53+
self.i2c.writeto_mem(self.addr, reg, self.tb)
54+
55+
def getreg(self, reg):
56+
self.i2c.readfrom_mem_into(self.addr, reg, self.rb)
57+
return self.rb[0]
58+
59+
def get2reg(self, reg):
60+
return self.getreg(reg) + self.getreg(reg+1) * 256
61+
62+
def r_w_reg(self, reg, dat, mask):
63+
self.getreg(reg)
64+
self.rb[0] = (self.rb[0] & mask) | dat
65+
self.setreg(reg, self.rb[0])
66+
67+
def ax(self):
68+
return self.int16(self.get2reg(LSM6DSO_OUTX_L_A))
69+
70+
def ay(self):
71+
return self.int16(self.get2reg(LSM6DSO_OUTY_L_A))
72+
73+
def az(self):
74+
return self.int16(self.get2reg(LSM6DSO_OUTZ_L_A))
75+
76+
def gx(self):
77+
return self.int16(self.get2reg(LSM6DSO_OUTX_L_G))
78+
79+
def gy(self):
80+
return self.int16(self.get2reg(LSM6DSO_OUTY_L_G))
81+
82+
def gz(self):
83+
return self.int16(self.get2reg(LSM6DSO_OUTZ_L_G))
84+
85+
def get_a(self):
86+
self.irq_v[0][0] = self.ax()
87+
self.irq_v[0][1] = self.ay()
88+
self.irq_v[0][2] = self.az()
89+
return self.irq_v[0]
90+
91+
def get_g(self):
92+
self.irq_v[1][0] = self.gx()
93+
self.irq_v[1][1] = self.gy()
94+
self.irq_v[1][2] = self.gz()
95+
return self.irq_v[1]
96+
97+
def get(self):
98+
self.get_a()
99+
self.get_g()
100+
return self.irq_v
101+
102+
def temperature(self):
103+
try:
104+
return self.int16(self.get2reg(LSM6DSO_OUT_TEMP_L))/256 + 25
105+
except MemoryError:
106+
return self.temperature_irq()
107+
108+
def temperature_irq(self):
109+
self.getreg(LSM6DSO_OUT_TEMP_L+1)
110+
if self.rb[0] & 0x80: self.rb[0] -= 256
111+
return self.rb[0] + 25
112+
113+
def scale_a(self, dat=None):
114+
if dat is None:
115+
return LSM6DSO_SCALEA[self._scale_a]
116+
else:
117+
if type(dat) is str:
118+
if not dat in LSM6DSO_SCALEA: return
119+
self._scale_a = LSM6DSO_SCALEA.index(dat)
120+
else: return
121+
self.r_w_reg(LSM6DSO_CTRL1_XL, self._scale_a<<2, 0xF3)
122+
123+
def scale_g(self, dat=None):
124+
if (dat is None) or (dat == ''):
125+
return LSM6DSO_SCALEG[self._scale_g]
126+
else:
127+
if type(dat) is str:
128+
if not dat in LSM6DSO_SCALEG: return
129+
self._scale_g = LSM6DSO_SCALEG.index(dat)
130+
else: return
131+
self.r_w_reg(LSM6DSO_CTRL2_G, self._scale_g<<1, 0xF1)
132+
133+
def power(self, on=None):
134+
if on is None:
135+
return self._power
136+
else:
137+
self._power = on
138+
if on:
139+
self.r_w_reg(LSM6DSO_CTRL1_XL, self._power_a, 0x0F)
140+
self.r_w_reg(LSM6DSO_CTRL2_G, self._power_g, 0x0F)
141+
else:
142+
self._power_a = self.getreg(LSM6DSO_CTRL1_XL) & 0xF0
143+
self._power_g = self.getreg(LSM6DSO_CTRL2_G) & 0xF0
144+
self.r_w_reg(LSM6DSO_CTRL1_XL, 0, 0x0F)
145+
self.r_w_reg(LSM6DSO_CTRL2_G, 0, 0x0F)

sensor/LSM6DSO/LSM6DSO_demo.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from machine import I2C
2+
import LSM6DSO
3+
4+
i2c = I2C(1)
5+
lsm = LSM6DSO.LSM6DSO(i2c)
6+
lsm.ax()
7+
lsm.get_a()
8+
lsm.get()

sensor/LSM6DSO/LSM6DSO_irq_demo.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from machine import I2C
2+
from pyb import Timer
3+
import LSM6DSO
4+
5+
i2c = I2C(1)
6+
lsm = LSM6DSO.LSM6DSO(i2c)
7+
lsm.ax()
8+
lsm.get_a()
9+
lsm.get()
10+
11+
def tim_irq(t):
12+
print(lsm.get(), lsm.temperature())
13+
14+
tim = Timer(1, freq = 1)
15+
tim.callback(tim_irq)

sensor/LSM6DSO/README.md

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# LSM6DSO sensor
2+
3+
https://www.st.com/zh/mems-and-sensors/lsm6dso.html
4+
5+
## example
6+
7+
```
8+
from machine import I2C
9+
import LSM6DSO
10+
11+
i2c = I2C(1)
12+
lsm = LSM6DSO.LSM6DSO(i2c)
13+
lsm.ax()
14+
lsm.get_a()
15+
lsm.get()
16+
```
17+
18+
From microbit/micropython Chinese community.
19+
www.micropython.org.cn

sensor/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* [ST STTS751 temperature sensor](STTS751)
1111
* [ST LIS2MDL magnetic sensor](LIS2MDL)
1212
* [ST LIS2DW12 motion sensor](LIS2DW12)
13+
* [ST LSM6DSO 3D accelerometer and 3D gyroscope sensor](LSM6DSO)
1314

1415
From microbit/micropython Chinese community.
1516
www.micropython.org.cn

0 commit comments

Comments
 (0)