56
56
NDOF_FMC_OFF_MODE = const (0x0B )
57
57
NDOF_MODE = const (0x0C )
58
58
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
+
59
114
_POWER_NORMAL = const (0x00 )
60
115
_POWER_LOW = const (0x01 )
61
116
_POWER_SUSPEND = const (0x02 )
62
117
63
118
_MODE_REGISTER = const (0x3D )
64
119
_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 )
65
124
_CALIBRATION_REGISTER = const (0x35 )
66
125
_OFFSET_ACCEL_REGISTER = const (0x55 )
67
126
_OFFSET_MAGNET_REGISTER = const (0x5B )
@@ -113,7 +172,7 @@ def __set__(self, obj, value):
113
172
obj .mode = last_mode
114
173
115
174
116
- class BNO055 :
175
+ class BNO055 : # pylint: disable=too-many-public-methods
117
176
"""
118
177
Base class for the BNO055 9DOF IMU sensor.
119
178
"""
@@ -126,6 +185,9 @@ def __init__(self):
126
185
self ._write_register (_POWER_REGISTER , _POWER_NORMAL )
127
186
self ._write_register (_PAGE_REGISTER , 0x00 )
128
187
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
129
191
time .sleep (0.01 )
130
192
self .mode = NDOF_MODE
131
193
time .sleep (0.01 )
@@ -392,6 +454,184 @@ def gravity(self):
392
454
def _gravity (self ):
393
455
raise NotImplementedError ("Must be implemented." )
394
456
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
+
395
635
def _write_register (self , register , value ):
396
636
raise NotImplementedError ("Must be implemented." )
397
637
0 commit comments