4
4
AccelerationSensor::AccelerationSensor () : BaseSensor(" accelerationSensorTask" , 2048 , 0 ) {}
5
5
6
6
String surfaceClassificationUUID = " B944AF10F4954560968F2F0D18CAB521" ;
7
- // String accUUID = "B944AF10F4954560968F2F0D18CAB522";
8
7
String anomalyUUID = " B944AF10F4954560968F2F0D18CAB523" ;
9
8
int surfaceClassificationCharacteristic = 0 ;
10
9
int anomalyCharacteristic = 0 ;
11
10
12
- Adafruit_MPU6050 mpu;
13
-
14
11
void AccelerationSensor::initSensor ()
15
12
{
16
-
17
- if (!mpu.begin (0x68 , &Wire1))
18
- {
19
- Serial.println (" MPU6050 Chip wurde nicht gefunden" );
20
- return ;
21
- }
22
- else
13
+ // Try initializing MPU6050 first
14
+ if (mpu.begin (0x68 , &Wire1))
23
15
{
24
16
Serial.println (" MPU6050 Found!" );
25
17
mpu.setAccelerometerRange (MPU6050_RANGE_8_G);
26
18
mpu.setGyroRange (MPU6050_RANGE_500_DEG);
27
19
mpu.setFilterBandwidth (MPU6050_BAND_21_HZ);
28
- delay (100 );
29
- };
20
+ activeSensor = MPU6050;
21
+ }
22
+ else if (icm.begin () == 0 )
23
+ {
24
+ // If MPU6050 fails, try ICM42670P
25
+ Serial.println (" ICM42670P Found!" );
26
+ icm.startAccel (21 , 8 ); // Accel ODR = 100 Hz, Full Scale Range = 16G
27
+ icm.startGyro (21 , 500 ); // Gyro ODR = 100 Hz, Full Scale Range = 2000 dps
28
+ activeSensor = ICM42670X;
29
+ }
30
+ else
31
+ {
32
+ Serial.println (" No compatible acceleration sensor found" );
33
+ return ;
34
+ }
30
35
31
36
surfaceClassificationCharacteristic = BLEModule::createCharacteristic (surfaceClassificationUUID.c_str ());
32
37
anomalyCharacteristic = BLEModule::createCharacteristic (anomalyUUID.c_str ());
@@ -46,25 +51,44 @@ float prevAccTime = millis();
46
51
bool AccelerationSensor::readSensorData ()
47
52
{
48
53
bool classified = false ;
49
- sensors_event_t a, g, temp;
54
+
50
55
51
- mpu.getEvent (&a, &g, &temp);
52
-
53
- buffer[ix++] = a.acceleration .x ;
54
- buffer[ix++] = a.acceleration .y ;
55
- buffer[ix++] = a.acceleration .z ;
56
- buffer[ix++] = g.gyro .x ;
57
- buffer[ix++] = g.gyro .y ;
58
- buffer[ix++] = g.gyro .z ;
56
+ if (activeSensor == MPU6050)
57
+ {
58
+ sensors_event_t a, g, temp;
59
+ mpu.getEvent (&a, &g, &temp);
60
+ buffer[ix++] = a.acceleration .x ;
61
+ buffer[ix++] = a.acceleration .y ;
62
+ buffer[ix++] = a.acceleration .z ;
63
+ buffer[ix++] = g.gyro .x ;
64
+ buffer[ix++] = g.gyro .y ;
65
+ buffer[ix++] = g.gyro .z ;
66
+ }
67
+ else if (activeSensor == ICM42670X)
68
+ {
69
+ inv_imu_sensor_event_t imu_event;
70
+ icm.getDataFromRegisters (imu_event);
71
+ buffer[ix++] = (imu_event.accel [0 ]*9.81 )/4096.0 ;
72
+ buffer[ix++] = (imu_event.accel [1 ]*9.81 )/4096.0 ;
73
+ buffer[ix++] = (imu_event.accel [2 ]*9.81 )/4096.0 ;
74
+ buffer[ix++] = (imu_event.gyro [0 ]*2.0 )/6550.0 ;
75
+ buffer[ix++] = (imu_event.gyro [1 ]*2.0 )/6550.0 ;
76
+ buffer[ix++] = (imu_event.gyro [2 ]*2.0 )/6550.0 ;
77
+ }
78
+ else
79
+ {
80
+ return false ; // No sensor active
81
+ }
59
82
60
83
Serial.println (millis () - prevAccTime);
61
84
prevAccTime = millis ();
62
85
63
- // one second inverval
86
+ // one second interval
64
87
if (EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE <= ix)
65
88
{
66
89
classified = true ;
67
- // Turn the raw buffer in a signal which we can the classify
90
+
91
+ // Turn the raw buffer in a signal which we can classify
68
92
signal_t signal;
69
93
int err = numpy::signal_from_buffer (buffer, EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal);
70
94
if (err != 0 )
@@ -76,7 +100,6 @@ bool AccelerationSensor::readSensorData()
76
100
77
101
// Run the classifier
78
102
ei_impulse_result_t result = {};
79
-
80
103
err = run_classifier (&signal, &result, false );
81
104
if (err != EI_IMPULSE_OK)
82
105
{
@@ -95,12 +118,10 @@ bool AccelerationSensor::readSensorData()
95
118
96
119
if (sendBLE)
97
120
{
98
-
99
121
notifyBLE (probAsphalt, probCompact, probPaving, probSett, probStanding, anomaly);
100
122
}
101
123
102
124
ix = 0 ;
103
-
104
125
buffer[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = {};
105
126
}
106
127
0 commit comments