Skip to content

Commit 8a19f54

Browse files
committed
add SC7A20 ACCELEROMETER SENSOR
1 parent 5ae4187 commit 8a19f54

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed

‎sensor/SC7A20/READMD.md‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# [mpy-lib](https://github.com/micropython-Chinese-Community/mpy-lib)
2+
3+
## SC7A20 3-AXIS ACCELEROMETER SENSOR
4+
5+
<img width = '200' height ='165' src ="https://www.silan.com.cn/en/upload/2020/03/31/1585637043217ivfnz.png">
6+
7+
- https://www.silan.com.cn/en/index.php/product/details/47.html
8+
9+
The SC7A20 is an acceleration sensor IC, which features abundant functions, low power dissipation, small size, and precision measurement.
10+
11+
## Example
12+
13+
14+
```py
15+
from machine import I2C, Pin
16+
from time import sleep_ms
17+
18+
from SC7A20 import SC7A20
19+
20+
i2c = I2C(0, sda=Pin(4), scl=Pin(16))
21+
22+
sc = SC7A20(i2c)
23+
24+
while True:
25+
print(sc.x(), sc.y(), sc.z())
26+
sleep_ms(100)
27+
```

‎sensor/SC7A20/SC7A20.py‎

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
from machine import I2C
2+
3+
class SC7A20:
4+
5+
def __init__(self, i2c, SDO = 1):
6+
self.i2c = i2c
7+
self.ADDR = 0x19 if SDO == 1 else 0x18
8+
self._ODR = 4
9+
self._LPen = 1
10+
self._FS = 0
11+
self._HR = 1
12+
self.tb = bytearray(1)
13+
self.rb = bytearray(1)
14+
self.init()
15+
16+
def reg_set(self, reg, val):
17+
self.tb[0] = val
18+
self.i2c.writeto_mem(self.ADDR, reg, self.tb)
19+
20+
def reg_get(self, reg):
21+
self.i2c.readfrom_mem_into(self.ADDR, reg, self.rb)
22+
return self.rb[0]
23+
24+
def rw_reg(self, reg, dat, mask):
25+
self.reg_get(reg)
26+
self.rb[0] = (self.rb[0] & mask) | dat
27+
self.reg_set(reg, self.rb[0])
28+
29+
def ODR(self, odr = None):
30+
if odr != None:
31+
self._ODR = odr
32+
self.rw_reg(0x20, odr<<4, 0x0F)
33+
else:
34+
return self._ODR
35+
36+
def LP(self, lp = None):
37+
if lp != None:
38+
self._LPen = lp
39+
self.rw_reg(0x20, lp<<3, 0x08)
40+
else:
41+
return self._LPen
42+
43+
def FS(self, fs = None):
44+
if fs != None:
45+
self._FS = fs
46+
self.rw_reg(0x23, fs<<4, 0xCF)
47+
else:
48+
return self._FS
49+
50+
def HR(self, hr = None):
51+
if hr != None:
52+
self._HR = hr
53+
self.rw_reg(0x23, hr<<3, 0x08)
54+
else:
55+
return self._HR
56+
57+
def on(self):
58+
self.ODR(self._ODR)
59+
60+
def off(self):
61+
self.ODR(0)
62+
63+
def init(self):
64+
# enable TEMP
65+
self.reg_set(0x1F, 255)
66+
# ODR 4 (50Hz), LPEN = 1, XYZen = 1
67+
self.LP(1)
68+
# BDU = BLE = 0, FS = 0 (2G), HR = 1
69+
self.FS(0)
70+
self.HR(1)
71+
self.on()
72+
# int lock
73+
self.reg_set(0x24, 0x0F)
74+
75+
def int16(self, d):
76+
return d if d < 0x8000 else d - 0x10000
77+
78+
def T(self):
79+
return self.reg_get(0x0D)
80+
81+
def rawx(self):
82+
return self.reg_get(0x28) + self.reg_get(0x29)*256
83+
84+
def rawy(self):
85+
return self.reg_get(0x2A) + self.reg_get(0x2B)*256
86+
87+
def rawz(self):
88+
return self.reg_get(0x2C) + self.reg_get(0x2D)*256
89+
90+
def x(self):
91+
return self.int16(self.rawx())>>(4-self._FS)
92+
93+
def y(self):
94+
return self.int16(self.rawy())>>(4-self._FS)
95+
96+
def z(self):
97+
return self.int16(self.rawz())>>(4-self._FS)
98+
99+
100+

0 commit comments

Comments
 (0)