Skip to content

Commit 2eb75ed

Browse files
added compensation
1 parent 6d0d104 commit 2eb75ed

File tree

5 files changed

+59
-46
lines changed

5 files changed

+59
-46
lines changed

attitude.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import math
2+
3+
def angle(imu_data):
4+
x,y,z = imu_data
5+
roll = math.atan(x/math.sqrt(y**2+z**2))
6+
pitch = math.atan(y/math.sqrt(x**2+z**2))
7+
return (roll, pitch)

bma2x2.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
'''
2727

2828
import machine
29+
from time import sleep_ms as sleep
2930

3031
# from stackoverflow J.F. Sebastian
3132
def _twos_comp(val, bits=8):
@@ -54,7 +55,7 @@ def __init__(self, i2c):
5455
except OSError:
5556
raise OSError('no BMA2X2 connected')
5657
self.set_range(16) # default range 16g
57-
self.set_filter_bw(125) # default filter bandwith 125Hz
58+
self.set_filter_bw(128) # default filter bandwith 125Hz
5859

5960
def _read_accel(self, addr):
6061
"""return accel data from addr"""
@@ -78,19 +79,45 @@ def set_range(self, accel_range):
7879
return self.get_range()
7980

8081
def get_range(self):
81-
return self.i2c.readfrom_mem(self.acc_addr, 0x0F, 1)
82+
return {3:2,5:4,8:8,12:16}[self.i2c.readfrom_mem(self.acc_addr, 0x0F, 1)[0]]
8283

8384
def set_filter_bw(self, freq):
84-
freqs = {8:b'\x08', 16:b'\x09', 32:b'\x0A', 63:b'\x0B', 125:b'\x0C', 250:b'\x0D', 500:b'\x0E', 1000:b'\x0F'}
85+
freqs = {8:b'\x08', 16:b'\x09', 32:b'\x0A', 64:b'\x0B', 128:b'\x0C', 256:b'\x0D', 512:b'\x0E', 1024:b'\x0F'}
8586
try:
8687
freq_byte = freqs[freq]
8788
except:
88-
raise ValueError('invalid filter bandwith, use 8, 16, 32, 63, 125, 250, 500 or 1000')
89+
raise ValueError('invalid filter bandwith, use 8, 16, 32, 64, 128, 256, 512 or 1024')
8990
self.i2c.writeto_mem(self.acc_addr, 0x10, freq_byte)
9091
return self.get_filter_bw()
9192

9293
def get_filter_bw(self):
93-
return self.i2c.readfrom_mem(self.acc_addr, 0x10, 1)
94+
return 2**(self.i2c.readfrom_mem(self.acc_addr, 0x10, 1)[0]-5)
95+
96+
def compensation(self, active=None):
97+
accel_range = self.get_range()
98+
self.set_range(2)
99+
self.i2c.writeto_mem(self.acc_addr, 0x37, b'\x21') # settings x0y0z1 10Hz
100+
self.i2c.writeto_mem(self.acc_addr, 0x36, b'\x80') # reset
101+
if active is None: # trigger fast comp
102+
active = 'compensated'
103+
print(self.i2c.readfrom_mem(self.acc_addr, 0x36, 1))
104+
self.i2c.writeto_mem(self.acc_addr, 0x36, b'\x20') # x
105+
sleep(100)
106+
print(self.i2c.readfrom_mem(self.acc_addr, 0x36, 1))
107+
self.i2c.writeto_mem(self.acc_addr, 0x36, b'\x40') # y
108+
sleep(100)
109+
print(self.i2c.readfrom_mem(self.acc_addr, 0x36, 1))
110+
self.i2c.writeto_mem(self.acc_addr, 0x36, b'\x60') # z
111+
sleep(100)
112+
print(self.i2c.readfrom_mem(self.acc_addr, 0x36, 1))
113+
elif active: # activate slow comp
114+
self.i2c.writeto_mem(self.acc_addr, 0x36, b'\x07')
115+
elif not active: # deactivate slow comp
116+
self.i2c.writeto_mem(self.acc_addr, 0x36, b'\x00')
117+
else:
118+
raise TypeError('pass a boolean or no argument')
119+
self.set_range(accel_range)
120+
return active
94121

95122
def x(self):
96123
return self._read_accel(0x02)

bmx055.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
SOFTWARE.
2626
'''
2727

28+
import machine
2829
from bma2x2 import BMA2X2
2930
from bmg160 import BMG160
3031
from bmm050 import BMM050
@@ -35,5 +36,5 @@ class BMX055():
3536
def __init__(self, i2c):
3637

3738
self.accel = BMA2X2(i2c)
38-
# self.gyro = BMG160(i2c)
39+
self.gyro = BMG160(i2c)
3940
# self.mag = BMM050(self.i2c)

boot.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# boot.py -- run on boot-up
2+
# can run arbitrary Python, but best to keep it minimal
3+

main.py

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,15 @@
1-
# main.py -- put your code here!
2-
3-
from machine import I2C, Pin
4-
from bmx055 import BMX055
5-
import time
6-
7-
# for atsamd21
8-
#i2c_bus = I2C(scl=Pin.board.SCL, sda=Pin.board.SDA, freq=400000)
9-
#i2c_bus.init()
10-
11-
# for esp8266 (if this doesn't work switch 4 and 5)
12-
i2c_bus = I2C(scl=Pin(5), sda=Pin(4))
13-
print(i2c_bus.scan())
14-
try:
15-
print('1:', i2c_bus.readfrom_mem(0x18, 0x00, 1))
16-
except:
17-
print('2:', i2c_bus.readfrom_mem(0x18, 0x00, 1))
18-
19-
imu = BMX055(i2c_bus)
20-
21-
print(imu.accel.i2c.readfrom_mem(imu.accel.acc_addr, 0, 63))
22-
23-
print('temperature:', imu.accel.temperature())
24-
print('resolution:', imu.accel._resolution)
25-
print('accel:', imu.accel.xyz())
26-
#print('gyro:', imu.gyro.xyz())
27-
print('set range 4:', imu.accel.set_range(4))
28-
print('get range:', imu.accel.get_range())
29-
print('set range 8:', imu.accel.set_range(8))
30-
print('set filter 8:', imu.accel.set_filter_bw(8))
31-
print('get filter:', imu.accel.get_filter_bw())
32-
print('set filter 250:', imu.accel.set_filter_bw(250))
33-
print('accel:', imu.accel.xyz())
34-
35-
t_end = time.ticks_ms() + 10*1000
36-
while time.ticks_ms() < t_end:
37-
print(imu.accel.xyz())
38-
time.sleep_ms(100)
39-
40-
i2c_bus.deinit()
1+
from bmx055 import BMX055
2+
from servo import Servo
3+
from machine import Pin, I2C
4+
5+
#imu = BMX055(I2C(sda=Pin(4), scl=Pin(5)))
6+
7+
#right = Servo(Pin(2))
8+
#left = Servo(Pin(15))
9+
10+
for i in range(17):
11+
try:
12+
Servo(Pin(i)).write_angle(180)
13+
except:
14+
print(i)
15+
#sgeht

0 commit comments

Comments
 (0)