Skip to content

Commit b3caec5

Browse files
committed
Show vibration in acc-fields
Uses a moving window to calculate the difference between acceleration min and max values to determin the vibration level.
1 parent f512a5d commit b3caec5

File tree

3 files changed

+111
-26
lines changed

3 files changed

+111
-26
lines changed

MavLink_FrSkySPort/Average.ino

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
uint16_t Volt_AverageBuffer[10];
22
uint16_t Current_AverageBuffer[10];
33

4+
#define accBufferSize 5
5+
int32_t accXBuffer[accBufferSize];
6+
int32_t accYBuffer[accBufferSize];
7+
int32_t accZBuffer[accBufferSize];
8+
int nrSamplesX = 0;
9+
int nrSamplesY = 0;
10+
int nrSamplesZ = 0;
11+
412
//returns the average of Voltage for the 10 last values
513
uint32_t Get_Volt_Average(uint16_t value) {
614
uint8_t i;
@@ -27,3 +35,98 @@ uint32_t Get_Current_Average(uint16_t value) {
2735
return (sum+=value)/10;
2836
}
2937

38+
void storeAccX(int32_t value)
39+
{
40+
if(nrSamplesX < accBufferSize)
41+
{
42+
nrSamplesX++;
43+
}
44+
uint8_t i;
45+
for(i=accBufferSize-1;i>0;i--)
46+
{
47+
accXBuffer[i]=accXBuffer[i-1];
48+
}
49+
accXBuffer[0] = value;
50+
}
51+
void storeAccY(int32_t value)
52+
{
53+
if(nrSamplesY < accBufferSize)
54+
{
55+
nrSamplesY++;
56+
}
57+
uint8_t i;
58+
for(i=accBufferSize-1;i>0;i--)
59+
{
60+
accYBuffer[i]=accYBuffer[i-1];
61+
}
62+
accYBuffer[0] = value;
63+
}
64+
void storeAccZ(int32_t value)
65+
{
66+
if(nrSamplesZ < accBufferSize)
67+
{
68+
nrSamplesZ++;
69+
}
70+
uint8_t i;
71+
for(i=accBufferSize-1;i>0;i--)
72+
{
73+
accZBuffer[i]=accZBuffer[i-1];
74+
}
75+
accZBuffer[0] = value;
76+
}
77+
78+
int32_t fetchAccX()
79+
{
80+
int32_t min=32000;
81+
int32_t max=-32000;
82+
for(int i=0; i<nrSamplesX; i++)
83+
{
84+
if(accXBuffer[i]<min)
85+
{
86+
min = accXBuffer[i];
87+
}
88+
if(accXBuffer[i]>max)
89+
{
90+
max = accXBuffer[i];
91+
}
92+
}
93+
return max - min;
94+
}
95+
96+
int32_t fetchAccY()
97+
{
98+
int32_t min=32000;
99+
int32_t max=-32000;
100+
for(int i=0; i<nrSamplesY; i++)
101+
{
102+
if(accYBuffer[i]<min)
103+
{
104+
min = accYBuffer[i];
105+
}
106+
if(accYBuffer[i]>max)
107+
{
108+
max = accYBuffer[i];
109+
}
110+
}
111+
return max - min;
112+
}
113+
114+
int32_t fetchAccZ()
115+
{
116+
int32_t min=32000;
117+
int32_t max=-32000;
118+
for(int i=0; i<nrSamplesZ; i++)
119+
{
120+
if(accZBuffer[i]<min)
121+
{
122+
min = accZBuffer[i];
123+
}
124+
if(accZBuffer[i]>max)
125+
{
126+
max = accZBuffer[i];
127+
}
128+
}
129+
return max - min;
130+
}
131+
132+

MavLink_FrSkySPort/FrSkySPort.ino

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,13 @@ void FrSkySPort_ProcessSensorRequest(uint8_t sensorId)
176176
FrSkySPort_SendPackage(FR_ID_ADC2,adc2);
177177
break;
178178
case 2:
179-
FrSkySPort_SendPackage(FR_ID_ACCX,ap_accX_old - ap_accX);
179+
FrSkySPort_SendPackage(FR_ID_ACCX, fetchAccX());
180180
break;
181181
case 3:
182-
FrSkySPort_SendPackage(FR_ID_ACCY,ap_accY_old - ap_accY);
182+
FrSkySPort_SendPackage(FR_ID_ACCY, fetchAccY());
183183
break;
184184
case 4:
185-
FrSkySPort_SendPackage(FR_ID_ACCZ,ap_accZ_old - ap_accZ);
185+
FrSkySPort_SendPackage(FR_ID_ACCZ, fetchAccZ());
186186
break;
187187
case 5:
188188
FrSkySPort_SendPackage(FR_ID_T1,gps_status);

MavLink_FrSkySPort/MavLink_FrSkySPort.ino

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,6 @@ uint16_t ap_throttle = 0;
9090
int32_t ap_bar_altitude = 0; // 100 = 1m
9191
int32_t ap_climb_rate=0; // 100= 1m/s
9292

93-
// Message #27 RAW IMU
94-
int32_t ap_accX = 0;
95-
int32_t ap_accY = 0;
96-
int32_t ap_accZ = 0;
97-
98-
int32_t ap_accX_old = 0;
99-
int32_t ap_accY_old = 0;
100-
int32_t ap_accZ_old = 0;
101-
10293
// ******************************************
10394
// These are special for FrSky
10495
int32_t adc2 = 0; // 100 = 1.0V
@@ -115,7 +106,6 @@ uint16_t hb_count;
115106

116107
unsigned long MavLink_Connected_timer;
117108
unsigned long hb_timer;
118-
unsigned long acc_timer;
119109

120110
int led = 13;
121111

@@ -130,7 +120,6 @@ void setup() {
130120
MavLink_Connected = 0;
131121
MavLink_Connected_timer=millis();
132122
hb_timer = millis();
133-
acc_timer=millis();
134123
hb_count = 0;
135124

136125

@@ -176,15 +165,6 @@ void loop() {
176165
FrSkySPort_Process(); // Check FrSky S.Port communication
177166

178167
adc2 =analogRead(0)/4; // Read ananog value from A0 (Pin 14). ( Will be A2 value on FrSky LCD)
179-
180-
if((millis() - acc_timer) > 1000) { // Reset timer for AccX, AccY and AccZ
181-
ap_accX_old=ap_accX;
182-
ap_accY_old=ap_accY;
183-
ap_accZ_old=ap_accZ;
184-
acc_timer=millis();
185-
//debugSerial.println(ap_base_mode);
186-
}
187-
188168
}
189169

190170

@@ -261,9 +241,10 @@ void _MavLink_receive() {
261241
#endif
262242
break;
263243
case MAVLINK_MSG_ID_RAW_IMU: // 27
264-
ap_accX = mavlink_msg_raw_imu_get_xacc(&msg) / 10; //
265-
ap_accY = mavlink_msg_raw_imu_get_yacc(&msg) / 10;
266-
ap_accZ = mavlink_msg_raw_imu_get_zacc(&msg) / 10;
244+
storeAccX(mavlink_msg_raw_imu_get_xacc(&msg) / 10);
245+
storeAccY(mavlink_msg_raw_imu_get_yacc(&msg) / 10);
246+
storeAccZ(mavlink_msg_raw_imu_get_zacc(&msg) / 10);
247+
267248
#ifdef DEBUG_ACC
268249
debugSerial.print(millis());
269250
debugSerial.print("\tMAVLINK_MSG_ID_RAW_IMU: xacc: ");
@@ -307,3 +288,4 @@ void _MavLink_receive() {
307288

308289

309290

291+

0 commit comments

Comments
 (0)