Accelerations in 3D with Analog Devices ADXL362. The PmodACL2 was used but should work with almost any sensor module with the ADXL362. The ADXL362 connects with SPI. The library ADXL362 published by Analog Devises includes the necessary methods for setting up the sensor and reading the acceleration results.

Dependencies:   ADXL362

Files at this revision

API Documentation at this revision

Comitter:
timo_k2
Date:
Wed Apr 28 14:48:15 2021 +0000
Parent:
6:a0b604602460
Commit message:
Sensor reading is in a separate thread. The results can be used in the main thread.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Dec 30 15:19:15 2020 +0000
+++ b/main.cpp	Wed Apr 28 14:48:15 2021 +0000
@@ -36,66 +36,115 @@
 
 #include "mbed.h"
 #include "ADXL362.h"
+#include <cmath>
+#define BUFF_SIZE 6
 
 // ADXL362::ADXL362(PinName CS, PinName MOSI, PinName MISO, PinName SCK) :
 ADXL362 ADXL362(D5,D11,D12,D13);
 
+//Threads
+    Thread detect_thread;
+
 DigitalOut moveLed(D1);
 
 int ADXL362_reg_print(int start, int length);
-void ADXL362_movement_detect();
+int ADXL362_movement_detect();
+int acceleration3D(int8_t ax,int8_t ay,int8_t az);
 
-int main()
-{
+int8_t x,y,z;
+int movementDetected = 0;
+int i = 0;
+
+
+int main(){
+
     ADXL362.reset();
      // we need to wait at least 500ms after ADXL362 reset
     ThisThread::sleep_for(600ms);
     ADXL362.set_mode(ADXL362::MEASUREMENT);
     ADXL362_reg_print(0, 0);
-    ADXL362_movement_detect();
+    detect_thread.start(ADXL362_movement_detect);
+    
+    while(1){
+    moveLed.write(movementDetected);
+    if(movementDetected){
+        i += 1;
+        printf("i = %d\n", i);
+        }
+    printf("Acceleration 3D %d\n", acceleration3D(x,y,z));
+    ThisThread::sleep_for(1s);
+    }
 }
 
-void ADXL362_movement_detect()
+int ADXL362_movement_detect()
 {
-    int8_t x1,y1,z1,x2,y2,z2,x,y,z,dx,dy,dz;
-    int i = 0; 
-    while(1)
-    {
-        
-        while(1) 
-        {
-            x1=ADXL362.scanx_u8();
-            y1=ADXL362.scany_u8();
-            z1=ADXL362.scanz_u8();
-            ThisThread::sleep_for(10ms);
-            x2=ADXL362.scanx_u8();
-            y2=ADXL362.scany_u8();
-            z2=ADXL362.scanz_u8();
-            
-            x=(x1 + x2)/2;
-            y=(y1 + y2)/2;
-            z=(z1 + z2)/2;
+    int8_t x1,y1,z1,x2,y2,z2,dx,dy,dz;
+    int detect;
+    while(1){
+        x1=ADXL362.scanx_u8();
+        y1=ADXL362.scany_u8();
+        z1=ADXL362.scanz_u8();
+        ThisThread::sleep_for(10ms);
+        x2=ADXL362.scanx_u8();
+        y2=ADXL362.scany_u8();
+        z2=ADXL362.scanz_u8();
             
-            dx=abs(x1 - x2);
-            dy=abs(y1 - y2);
-            dz=abs(z1 - z2);
-            
-            if (dx>10 || dy>10 || dz>10)
-            break;
-     
-            printf("x = %3d    y = %3d    z = %3d   dx = %3d    dy = %3d    dz = %3d\r\n",x,y,z,dx,dy,dz);
-            ThisThread::sleep_for(100ms);
+        x=(x1 + x2)/2;
+        y=(y1 + y2)/2;
+        z=(z1 + z2)/2;
+         
+        dx=abs(x1 - x2);
+        dy=abs(y1 - y2);
+        dz=abs(z1 - z2);
+        
+        if (dx>10 || dy>10 || dz>10){
+            detect = 1;
+            }
+            else{
+            detect = 0;
+            }
+        movementDetected = detect;    
+        printf("x = %3d    y = %3d    z = %3d   dx = %3d    dy = %3d    dz = %3d\r\n",x,y,z,dx,dy,dz);
+        ThisThread::sleep_for(100ms);
+        }    
+}
+
+int acceleration3D(int8_t ax,int8_t ay,int8_t az){
+    float acc3D;
+    static int count = 0;
+    static int8_t x1[BUFF_SIZE];
+    static int8_t y1[BUFF_SIZE];
+    static int8_t z1[BUFF_SIZE];
+    float averx;
+    float avery;
+    float averz;
+    
+    if(count >= BUFF_SIZE){
+        count = 0;
         }
-        
-        moveLed = 1;
-        //wait(2);
-        ThisThread::sleep_for(2s);
-        moveLed = 0;
-        i++;
-        printf("%d\r\n", i);
-        
-     }
-}
+    
+    x1[count]=ax;
+    y1[count]=ay;
+    z1[count]=az;
+    
+    count += 1;
+    
+    averx=0.0;
+    avery=0.0;
+    averz=0.0;
+    for(int k=0; k<BUFF_SIZE; k++){
+        averx = averx+(float)x1[k];
+        avery = avery+(float)y1[k];
+        averz = averz+(float)z1[k];
+        }
+    averx=averx/BUFF_SIZE;
+    avery=avery/BUFF_SIZE;
+    averz=averz/BUFF_SIZE;
+    
+    acc3D = sqrtf(pow(averx,2)+pow(avery,2)+pow(averz,2));
+    //acc3D = sqrtf(pow(3.0,2) + pow(3.0,2) + pow(3.0,2));
+    return((int)acc3D); 
+}  
 
 int ADXL362_reg_print(int start, int length)
 /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json	Wed Apr 28 14:48:15 2021 +0000
@@ -0,0 +1,9 @@
+{
+    "target_overrides": {
+        "*": {
+            "platform.stdio-baud-rate": 115200,
+            "platform.stdio-buffered-serial": 1
+            
+        } 
+    }
+}
\ No newline at end of file