Skip to content

Commit 7f6d9fc

Browse files
authored
Merge pull request #51 from adafruit/accel_config
Added ability to configure accelerometer
2 parents 2064bdb + 8f165ab commit 7f6d9fc

File tree

1 file changed

+241
-1
lines changed

1 file changed

+241
-1
lines changed

adafruit_bno055.py

Lines changed: 241 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,71 @@
5656
NDOF_FMC_OFF_MODE = const(0x0B)
5757
NDOF_MODE = const(0x0C)
5858

59+
ACCEL_2G = const(0x00) # For accel_range property
60+
ACCEL_4G = const(0x01) # Default
61+
ACCEL_8G = const(0x02)
62+
ACCEL_16G = const(0x03)
63+
ACCEL_7_81HZ = const(0x00) # For accel_bandwidth property
64+
ACCEL_15_63HZ = const(0x04)
65+
ACCEL_31_25HZ = const(0x08)
66+
ACCEL_62_5HZ = const(0x0C) # Default
67+
ACCEL_125HZ = const(0x10)
68+
ACCEL_250HZ = const(0x14)
69+
ACCEL_500HZ = const(0x18)
70+
ACCEL_1000HZ = const(0x1C)
71+
ACCEL_NORMAL_MODE = const(0x00) # Default. For accel_mode property
72+
ACCEL_SUSPEND_MODE = const(0x20)
73+
ACCEL_LOWPOWER1_MODE = const(0x40)
74+
ACCEL_STANDBY_MODE = const(0x60)
75+
ACCEL_LOWPOWER2_MODE = const(0x80)
76+
ACCEL_DEEPSUSPEND_MODE = const(0xA0)
77+
78+
GYRO_2000_DPS = const(0x00) # Default. For gyro_range property
79+
GYRO_1000_DPS = const(0x01)
80+
GYRO_500_DPS = const(0x02)
81+
GYRO_250_DPS = const(0x03)
82+
GYRO_125_DPS = const(0x04)
83+
GYRO_523HZ = const(0x00) # For gyro_bandwidth property
84+
GYRO_230HZ = const(0x08)
85+
GYRO_116HZ = const(0x10)
86+
GYRO_47HZ = const(0x18)
87+
GYRO_23HZ = const(0x20)
88+
GYRO_12HZ = const(0x28)
89+
GYRO_64HZ = const(0x30)
90+
GYRO_32HZ = const(0x38) # Default
91+
GYRO_NORMAL_MODE = const(0x00) # Default. For gyro_mode property
92+
GYRO_FASTPOWERUP_MODE = const(0x01)
93+
GYRO_DEEPSUSPEND_MODE = const(0x02)
94+
GYRO_SUSPEND_MODE = const(0x03)
95+
GYRO_ADVANCEDPOWERSAVE_MODE = const(0x04)
96+
97+
MAGNET_2HZ = const(0x00) # For magnet_rate property
98+
MAGNET_6HZ = const(0x01)
99+
MAGNET_8HZ = const(0x02)
100+
MAGNET_10HZ = const(0x03)
101+
MAGNET_15HZ = const(0x04)
102+
MAGNET_20HZ = const(0x05) # Default
103+
MAGNET_25HZ = const(0x06)
104+
MAGNET_30HZ = const(0x07)
105+
MAGNET_LOWPOWER_MODE = const(0x00) # For magnet_operation_mode property
106+
MAGNET_REGULAR_MODE = const(0x08) # Default
107+
MAGNET_ENHANCEDREGULAR_MODE = const(0x10)
108+
MAGNET_ACCURACY_MODE = const(0x18)
109+
MAGNET_NORMAL_MODE = const(0x00) # for magnet_power_mode property
110+
MAGNET_SLEEP_MODE = const(0x20)
111+
MAGNET_SUSPEND_MODE = const(0x40)
112+
MAGNET_FORCEMODE_MODE = const(0x60) # Default
113+
59114
_POWER_NORMAL = const(0x00)
60115
_POWER_LOW = const(0x01)
61116
_POWER_SUSPEND = const(0x02)
62117

63118
_MODE_REGISTER = const(0x3D)
64119
_PAGE_REGISTER = const(0x07)
120+
_ACCEL_CONFIG_REGISTER = const(0x08)
121+
_MAGNET_CONFIG_REGISTER = const(0x09)
122+
_GYRO_CONFIG_0_REGISTER = const(0x0A)
123+
_GYRO_CONFIG_1_REGISTER = const(0x0B)
65124
_CALIBRATION_REGISTER = const(0x35)
66125
_OFFSET_ACCEL_REGISTER = const(0x55)
67126
_OFFSET_MAGNET_REGISTER = const(0x5B)
@@ -113,7 +172,7 @@ def __set__(self, obj, value):
113172
obj.mode = last_mode
114173

115174

116-
class BNO055:
175+
class BNO055: # pylint: disable=too-many-public-methods
117176
"""
118177
Base class for the BNO055 9DOF IMU sensor.
119178
"""
@@ -126,6 +185,9 @@ def __init__(self):
126185
self._write_register(_POWER_REGISTER, _POWER_NORMAL)
127186
self._write_register(_PAGE_REGISTER, 0x00)
128187
self._write_register(_TRIGGER_REGISTER, 0x00)
188+
self.accel_range = ACCEL_4G
189+
self.gyro_range = GYRO_2000_DPS
190+
self.magnet_rate = MAGNET_20HZ
129191
time.sleep(0.01)
130192
self.mode = NDOF_MODE
131193
time.sleep(0.01)
@@ -392,6 +454,184 @@ def gravity(self):
392454
def _gravity(self):
393455
raise NotImplementedError("Must be implemented.")
394456

457+
@property
458+
def accel_range(self):
459+
""" Switch the accelerometer range and return the new range. Default value: +/- 4g
460+
See table 3-8 in the datasheet.
461+
"""
462+
self._write_register(_PAGE_REGISTER, 0x01)
463+
value = self._read_register(_ACCEL_CONFIG_REGISTER)
464+
self._write_register(_PAGE_REGISTER, 0x00)
465+
return 0b00000011 & value
466+
467+
@accel_range.setter
468+
def accel_range(self, rng=ACCEL_4G):
469+
self._write_register(_PAGE_REGISTER, 0x01)
470+
value = self._read_register(_ACCEL_CONFIG_REGISTER)
471+
masked_value = 0b11111100 & value
472+
self._write_register(_ACCEL_CONFIG_REGISTER, masked_value | rng)
473+
self._write_register(_PAGE_REGISTER, 0x00)
474+
475+
@property
476+
def accel_bandwidth(self):
477+
""" Switch the accelerometer bandwidth and return the new bandwidth. Default value: 62.5 Hz
478+
See table 3-8 in the datasheet.
479+
"""
480+
self._write_register(_PAGE_REGISTER, 0x01)
481+
value = self._read_register(_ACCEL_CONFIG_REGISTER)
482+
self._write_register(_PAGE_REGISTER, 0x00)
483+
return 0b00011100 & value
484+
485+
@accel_bandwidth.setter
486+
def accel_bandwidth(self, bandwidth=ACCEL_62_5HZ):
487+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
488+
raise RuntimeError("Mode must not be a fusion mode")
489+
self._write_register(_PAGE_REGISTER, 0x01)
490+
value = self._read_register(_ACCEL_CONFIG_REGISTER)
491+
masked_value = 0b11100011 & value
492+
self._write_register(_ACCEL_CONFIG_REGISTER, masked_value | bandwidth)
493+
self._write_register(_PAGE_REGISTER, 0x00)
494+
495+
@property
496+
def accel_mode(self):
497+
""" Switch the accelerometer mode and return the new mode. Default value: Normal
498+
See table 3-8 in the datasheet.
499+
"""
500+
self._write_register(_PAGE_REGISTER, 0x01)
501+
value = self._read_register(_ACCEL_CONFIG_REGISTER)
502+
self._write_register(_PAGE_REGISTER, 0x00)
503+
return 0b11100000 & value
504+
505+
@accel_mode.setter
506+
def accel_mode(self, mode=ACCEL_NORMAL_MODE):
507+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
508+
raise RuntimeError("Mode must not be a fusion mode")
509+
self._write_register(_PAGE_REGISTER, 0x01)
510+
value = self._read_register(_ACCEL_CONFIG_REGISTER)
511+
masked_value = 0b00011111 & value
512+
self._write_register(_ACCEL_CONFIG_REGISTER, masked_value | mode)
513+
self._write_register(_PAGE_REGISTER, 0x00)
514+
515+
@property
516+
def gyro_range(self):
517+
""" Switch the gyroscope range and return the new range. Default value: 2000 dps
518+
See table 3-9 in the datasheet.
519+
"""
520+
self._write_register(_PAGE_REGISTER, 0x01)
521+
value = self._read_register(_GYRO_CONFIG_0_REGISTER)
522+
self._write_register(_PAGE_REGISTER, 0x00)
523+
return 0b00000111 & value
524+
525+
@gyro_range.setter
526+
def gyro_range(self, rng=GYRO_2000_DPS):
527+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
528+
raise RuntimeError("Mode must not be a fusion mode")
529+
self._write_register(_PAGE_REGISTER, 0x01)
530+
value = self._read_register(_GYRO_CONFIG_0_REGISTER)
531+
masked_value = 0b00111000 & value
532+
self._write_register(_GYRO_CONFIG_0_REGISTER, masked_value | rng)
533+
self._write_register(_PAGE_REGISTER, 0x00)
534+
535+
@property
536+
def gyro_bandwidth(self):
537+
""" Switch the gyroscope bandwidth and return the new bandwidth. Default value: 32 Hz
538+
See table 3-9 in the datasheet.
539+
"""
540+
self._write_register(_PAGE_REGISTER, 0x01)
541+
value = self._read_register(_GYRO_CONFIG_0_REGISTER)
542+
self._write_register(_PAGE_REGISTER, 0x00)
543+
return 0b00111000 & value
544+
545+
@gyro_bandwidth.setter
546+
def gyro_bandwidth(self, bandwidth=GYRO_32HZ):
547+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
548+
raise RuntimeError("Mode must not be a fusion mode")
549+
self._write_register(_PAGE_REGISTER, 0x01)
550+
value = self._read_register(_GYRO_CONFIG_0_REGISTER)
551+
masked_value = 0b00000111 & value
552+
self._write_register(_GYRO_CONFIG_0_REGISTER, masked_value | bandwidth)
553+
self._write_register(_PAGE_REGISTER, 0x00)
554+
555+
@property
556+
def gyro_mode(self):
557+
""" Switch the gyroscope mode and return the new mode. Default value: Normal
558+
See table 3-9 in the datasheet.
559+
"""
560+
self._write_register(_PAGE_REGISTER, 0x01)
561+
value = self._read_register(_GYRO_CONFIG_1_REGISTER)
562+
self._write_register(_PAGE_REGISTER, 0x00)
563+
return 0b00000111 & value
564+
565+
@gyro_mode.setter
566+
def gyro_mode(self, mode=GYRO_NORMAL_MODE):
567+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
568+
raise RuntimeError("Mode must not be a fusion mode")
569+
self._write_register(_PAGE_REGISTER, 0x01)
570+
value = self._read_register(_GYRO_CONFIG_1_REGISTER)
571+
masked_value = 0b00000000 & value
572+
self._write_register(_GYRO_CONFIG_1_REGISTER, masked_value | mode)
573+
self._write_register(_PAGE_REGISTER, 0x00)
574+
575+
@property
576+
def magnet_rate(self):
577+
""" Switch the magnetometer data output rate and return the new rate. Default value: 20Hz
578+
See table 3-10 in the datasheet.
579+
"""
580+
self._write_register(_PAGE_REGISTER, 0x01)
581+
value = self._read_register(_MAGNET_CONFIG_REGISTER)
582+
self._write_register(_PAGE_REGISTER, 0x00)
583+
return 0b00000111 & value
584+
585+
@magnet_rate.setter
586+
def magnet_rate(self, rate=MAGNET_20HZ):
587+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
588+
raise RuntimeError("Mode must not be a fusion mode")
589+
self._write_register(_PAGE_REGISTER, 0x01)
590+
value = self._read_register(_MAGNET_CONFIG_REGISTER)
591+
masked_value = 0b01111000 & value
592+
self._write_register(_MAGNET_CONFIG_REGISTER, masked_value | rate)
593+
self._write_register(_PAGE_REGISTER, 0x00)
594+
595+
@property
596+
def magnet_operation_mode(self):
597+
""" Switch the magnetometer operation mode and return the new mode. Default value: Regular
598+
See table 3-10 in the datasheet.
599+
"""
600+
self._write_register(_PAGE_REGISTER, 0x01)
601+
value = self._read_register(_MAGNET_CONFIG_REGISTER)
602+
self._write_register(_PAGE_REGISTER, 0x00)
603+
return 0b00011000 & value
604+
605+
@magnet_operation_mode.setter
606+
def magnet_operation_mode(self, mode=MAGNET_REGULAR_MODE):
607+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
608+
raise RuntimeError("Mode must not be a fusion mode")
609+
self._write_register(_PAGE_REGISTER, 0x01)
610+
value = self._read_register(_MAGNET_CONFIG_REGISTER)
611+
masked_value = 0b01100111 & value
612+
self._write_register(_MAGNET_CONFIG_REGISTER, masked_value | mode)
613+
self._write_register(_PAGE_REGISTER, 0x00)
614+
615+
@property
616+
def magnet_mode(self):
617+
""" Switch the magnetometer power mode and return the new mode. Default value: Forced
618+
See table 3-10 in the datasheet.
619+
"""
620+
self._write_register(_PAGE_REGISTER, 0x01)
621+
value = self._read_register(_MAGNET_CONFIG_REGISTER)
622+
self._write_register(_PAGE_REGISTER, 0x00)
623+
return 0b01100000 & value
624+
625+
@magnet_mode.setter
626+
def magnet_mode(self, mode=MAGNET_FORCEMODE_MODE):
627+
if self.mode in [0x08, 0x09, 0x0A, 0x0B, 0x0C]:
628+
raise RuntimeError("Mode must not be a fusion mode")
629+
self._write_register(_PAGE_REGISTER, 0x01)
630+
value = self._read_register(_MAGNET_CONFIG_REGISTER)
631+
masked_value = 0b00011111 & value
632+
self._write_register(_MAGNET_CONFIG_REGISTER, masked_value | mode)
633+
self._write_register(_PAGE_REGISTER, 0x00)
634+
395635
def _write_register(self, register, value):
396636
raise NotImplementedError("Must be implemented.")
397637

0 commit comments

Comments
 (0)