Statistics
| Branch: | Revision:

adafruit_bno055 / examples / restore_offsets / restore_offsets.ino @ ecdc6229

History | View | Annotate | Download (9.097 KB)

1
#include <Wire.h>
2
#include <Adafruit_Sensor.h>
3
#include <Adafruit_BNO055.h>
4
#include <utility/imumaths.h>
5
#include <EEPROM.h>
6

    
7
/* This driver uses the Adafruit unified sensor library (Adafruit_Sensor),
8
   which provides a common 'type' for sensor data and some helper functions.
9

    
10
   To use this driver you will also need to download the Adafruit_Sensor
11
   library and include it in your libraries folder.
12

    
13
   You should also assign a unique ID to this sensor for use with
14
   the Adafruit Sensor API so that you can identify this particular
15
   sensor in any data logs, etc.  To assign a unique ID, simply
16
   provide an appropriate value in the constructor below (12345
17
   is used by default in this example).
18

    
19
   Connections
20
   ===========
21
   Connect SCL to analog 5
22
   Connect SDA to analog 4
23
   Connect VDD to 3-5V DC
24
   Connect GROUND to common ground
25

    
26
   History
27
   =======
28
   2015/MAR/03  - First release (KTOWN)
29
   2015/AUG/27  - Added calibration and system status helpers
30
   2015/NOV/13  - Added calibration save and restore
31
   */
32

    
33
/* Set the delay between fresh samples */
34
#define BNO055_SAMPLERATE_DELAY_MS (100)
35

    
36
Adafruit_BNO055 bno = Adafruit_BNO055(55);
37

    
38
/**************************************************************************/
39
/*
40
    Displays some basic information on this sensor from the unified
41
    sensor API sensor_t type (see Adafruit_Sensor for more information)
42
    */
43
/**************************************************************************/
44
void displaySensorDetails(void)
45
{
46
    sensor_t sensor;
47
    bno.getSensor(&sensor);
48
    Serial.println("------------------------------------");
49
    Serial.print("Sensor:       "); Serial.println(sensor.name);
50
    Serial.print("Driver Ver:   "); Serial.println(sensor.version);
51
    Serial.print("Unique ID:    "); Serial.println(sensor.sensor_id);
52
    Serial.print("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" xxx");
53
    Serial.print("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" xxx");
54
    Serial.print("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" xxx");
55
    Serial.println("------------------------------------");
56
    Serial.println("");
57
    delay(500);
58
}
59

    
60
/**************************************************************************/
61
/*
62
    Display some basic info about the sensor status
63
    */
64
/**************************************************************************/
65
void displaySensorStatus(void)
66
{
67
    /* Get the system status values (mostly for debugging purposes) */
68
    uint8_t system_status, self_test_results, system_error;
69
    system_status = self_test_results = system_error = 0;
70
    bno.getSystemStatus(&system_status, &self_test_results, &system_error);
71

    
72
    /* Display the results in the Serial Monitor */
73
    Serial.println("");
74
    Serial.print("System Status: 0x");
75
    Serial.println(system_status, HEX);
76
    Serial.print("Self Test:     0x");
77
    Serial.println(self_test_results, HEX);
78
    Serial.print("System Error:  0x");
79
    Serial.println(system_error, HEX);
80
    Serial.println("");
81
    delay(500);
82
}
83

    
84
/**************************************************************************/
85
/*
86
    Display sensor calibration status
87
    */
88
/**************************************************************************/
89
void displayCalStatus(void)
90
{
91
    /* Get the four calibration values (0..3) */
92
    /* Any sensor data reporting 0 should be ignored, */
93
    /* 3 means 'fully calibrated" */
94
    uint8_t system, gyro, accel, mag;
95
    system = gyro = accel = mag = 0;
96
    bno.getCalibration(&system, &gyro, &accel, &mag);
97

    
98
    /* The data should be ignored until the system calibration is > 0 */
99
    Serial.print("\t");
100
    if (!system)
101
    {
102
        Serial.print("! ");
103
    }
104

    
105
    /* Display the individual values */
106
    Serial.print("Sys:");
107
    Serial.print(system, DEC);
108
    Serial.print(" G:");
109
    Serial.print(gyro, DEC);
110
    Serial.print(" A:");
111
    Serial.print(accel, DEC);
112
    Serial.print(" M:");
113
    Serial.print(mag, DEC);
114
}
115

    
116
/**************************************************************************/
117
/*
118
    Display the raw calibration offset and radius data
119
    */
120
/**************************************************************************/
121
void displaySensorOffsets(const adafruit_bno055_offsets_t &calibData)
122
{
123
    Serial.print("Accelerometer: ");
124
    Serial.print(calibData.accel_offset_x); Serial.print(" ");
125
    Serial.print(calibData.accel_offset_y); Serial.print(" ");
126
    Serial.print(calibData.accel_offset_z); Serial.print(" ");
127

    
128
    Serial.print("\nGyro: ");
129
    Serial.print(calibData.gyro_offset_x); Serial.print(" ");
130
    Serial.print(calibData.gyro_offset_y); Serial.print(" ");
131
    Serial.print(calibData.gyro_offset_z); Serial.print(" ");
132

    
133
    Serial.print("\nMag: ");
134
    Serial.print(calibData.mag_offset_x); Serial.print(" ");
135
    Serial.print(calibData.mag_offset_y); Serial.print(" ");
136
    Serial.print(calibData.mag_offset_z); Serial.print(" ");
137

    
138
    Serial.print("\nAccel Radius: ");
139
    Serial.print(calibData.accel_radius);
140

    
141
    Serial.print("\nMag Radius: ");
142
    Serial.print(calibData.mag_radius);
143
}
144

    
145

    
146
/**************************************************************************/
147
/*
148
    Arduino setup function (automatically called at startup)
149
    */
150
/**************************************************************************/
151
void setup(void)
152
{
153
    Serial.begin(115200);
154
    delay(1000);
155
    Serial.println("Orientation Sensor Test"); Serial.println("");
156

    
157
    /* Initialise the sensor */
158
    if (!bno.begin())
159
    {
160
        /* There was a problem detecting the BNO055 ... check your connections */
161
        Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
162
        while (1);
163
    }
164

    
165
    int eeAddress = 0;
166
    long bnoID;
167
    bool foundCalib = false;
168

    
169
    EEPROM.get(eeAddress, bnoID);
170

    
171
    adafruit_bno055_offsets_t calibrationData;
172
    sensor_t sensor;
173

    
174
    /*
175
    *  Look for the sensor's unique ID at the beginning oF EEPROM.
176
    *  This isn't foolproof, but it's better than nothing.
177
    */
178
    bno.getSensor(&sensor);
179
    if (bnoID != sensor.sensor_id)
180
    {
181
        Serial.println("\nNo Calibration Data for this sensor exists in EEPROM");
182
        delay(500);
183
    }
184
    else
185
    {
186
        Serial.println("\nFound Calibration for this sensor in EEPROM.");
187
        eeAddress += sizeof(long);
188
        EEPROM.get(eeAddress, calibrationData);
189

    
190
        displaySensorOffsets(calibrationData);
191

    
192
        Serial.println("\n\nRestoring Calibration data to the BNO055...");
193
        bno.setSensorOffsets(calibrationData);
194

    
195
        Serial.println("\n\nCalibration data loaded into BNO055");
196
        foundCalib = true;
197
    }
198

    
199
    delay(1000);
200

    
201
    /* Display some basic information on this sensor */
202
    displaySensorDetails();
203

    
204
    /* Optional: Display current status */
205
    displaySensorStatus();
206

    
207
   /* Crystal must be configured AFTER loading calibration data into BNO055. */
208
    bno.setExtCrystalUse(true);
209

    
210
    sensors_event_t event;
211
    bno.getEvent(&event);
212
    /* always recal the mag as It goes out of calibration very often */
213
    if (foundCalib){
214
        Serial.println("Move sensor slightly to calibrate magnetometers");
215
        while (!bno.isFullyCalibrated())
216
        {
217
            bno.getEvent(&event);
218
            delay(BNO055_SAMPLERATE_DELAY_MS);
219
        }
220
    }
221
    else
222
    {
223
        Serial.println("Please Calibrate Sensor: ");
224
        while (!bno.isFullyCalibrated())
225
        {
226
            bno.getEvent(&event);
227

    
228
            Serial.print("X: ");
229
            Serial.print(event.orientation.x, 4);
230
            Serial.print("\tY: ");
231
            Serial.print(event.orientation.y, 4);
232
            Serial.print("\tZ: ");
233
            Serial.print(event.orientation.z, 4);
234

    
235
            /* Optional: Display calibration status */
236
            displayCalStatus();
237

    
238
            /* New line for the next sample */
239
            Serial.println("");
240

    
241
            /* Wait the specified delay before requesting new data */
242
            delay(BNO055_SAMPLERATE_DELAY_MS);
243
        }
244
    }
245

    
246
    Serial.println("\nFully calibrated!");
247
    Serial.println("--------------------------------");
248
    Serial.println("Calibration Results: ");
249
    adafruit_bno055_offsets_t newCalib;
250
    bno.getSensorOffsets(newCalib);
251
    displaySensorOffsets(newCalib);
252

    
253
    Serial.println("\n\nStoring calibration data to EEPROM...");
254

    
255
    eeAddress = 0;
256
    bno.getSensor(&sensor);
257
    bnoID = sensor.sensor_id;
258

    
259
    EEPROM.put(eeAddress, bnoID);
260

    
261
    eeAddress += sizeof(long);
262
    EEPROM.put(eeAddress, newCalib);
263
    Serial.println("Data stored to EEPROM.");
264

    
265
    Serial.println("\n--------------------------------\n");
266
    delay(500);
267
}
268

    
269
void loop() {
270
    /* Get a new sensor event */
271
    sensors_event_t event;
272
    bno.getEvent(&event);
273

    
274
    /* Display the floating point data */
275
    Serial.print("X: ");
276
    Serial.print(event.orientation.x, 4);
277
    Serial.print("\tY: ");
278
    Serial.print(event.orientation.y, 4);
279
    Serial.print("\tZ: ");
280
    Serial.print(event.orientation.z, 4);
281

    
282
    /* Optional: Display calibration status */
283
    displayCalStatus();
284

    
285
    /* Optional: Display sensor status (debug only) */
286
    //displaySensorStatus();
287

    
288
    /* New line for the next sample */
289
    Serial.println("");
290

    
291
    /* Wait the specified delay before requesting new data */
292
    delay(BNO055_SAMPLERATE_DELAY_MS);
293
}