Timo Karppinen / Mbed OS Pmod_ACL2_ADXL362_L432KC_OS6_tk1

Dependencies:   ADXL362

main.cpp

Committer:
timo_k2
Date:
2020-12-30
Revision:
6:a0b604602460
Parent:
5:4d6ef028eeae
Child:
7:652e2c5ad650

File content as of revision 6:a0b604602460:

/*
* Copyright (c) 2006-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************
* Pmod_ACL2_ADXL362_L432KC_OS6
*
* 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. 
*
* Hardware
* ST NUCLEO L432KC or almost any other MbedOS microcontroller, 
* Digilent PmodACL2 sensor module with the ADXL362 acceleration sensor
* A LED with 220 Ohm series resistor for indicating movement 
*
* Connect:
* L432KC D13 - ACL2 4 SCLK   hardware defined for the SPI
* L432KC D12 - ACL2 3 MISO  hardware defined for the SPI
* L432KC D11 - ACL2 2 MOSI 
* L432KC D5  - ACL2 1 CS  or any other free
*  GND     - ACL2 5 GND
*  Vcc     - ACL2 6 Vcc
* The ACL2 pins 7 and 8 will be connected if hardware interrupts will be used.
* L432KC D1 - LED - 220 Ohm - GND
*
* Reference:
* PmodACL2 https://reference.digilentinc.com/reference/pmod/pmodacl2/start
* ADXL362 https://www.analog.com/en/products/adxl362.html
* Datasheet for register reference 
* https://www.analog.com/media/en/technical-documentation/data-sheets/ADXL362.pdf
*
* Timo Karppinen 30.12.2020        Apache-2.0
******************************************************************************/

#include "mbed.h"
#include "ADXL362.h"

// ADXL362::ADXL362(PinName CS, PinName MOSI, PinName MISO, PinName SCK) :
ADXL362 ADXL362(D5,D11,D12,D13);

DigitalOut moveLed(D1);

int ADXL362_reg_print(int start, int length);
void ADXL362_movement_detect();

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();
}

void 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;
            
            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);
        }
        
        moveLed = 1;
        //wait(2);
        ThisThread::sleep_for(2s);
        moveLed = 0;
        i++;
        printf("%d\r\n", i);
        
     }
}

int ADXL362_reg_print(int start, int length)
/*
* The register bit allocations are explained in the datasheet
* https://www.analog.com/media/en/technical-documentation/data-sheets/ADXL362.pdf
* starting on page 23. 
*/
{
    uint8_t i;
    char name[32];
    char note[64];
    
    ADXL362::ADXL362_register_t reg;
    if(start >= 0x00 && start <= 0x2E && length >= 0x00 && (ADXL362.read_reg(ADXL362.DEVID_AD) == 0xAD))
    {
        if(length == 0)
        {
            start = 0;
            length = 47;   
        }
        
        for(i = start; i < start + length; i++)
        {
            switch(i)
            {
                case 0x00:
                    snprintf(name, 32, "DEVID_AD" );
                    snprintf(note, 64, "default 0xAD = I am the ADXL362");
                    reg = ADXL362.DEVID_AD;
                    break;
                case 0x01:
                    snprintf(name, 32, "DEVID_MST" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.DEVID_MST;
                    break;
                case 0x02:
                    snprintf(name, 32, "PARTID" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.PARTID;
                    break;
                case 0x03:
                    snprintf(name, 32, "REVID" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.REVID;
                    break;
                case 0x08:
                    snprintf(name, 32, "XDATA" );
                    snprintf(note, 63, "binary 8bit, two's complement");
                    reg = ADXL362.XDATA;
                    break;
                case 0x09:
                    snprintf(name, 32, "YDATA" );
                    snprintf(note, 64, "binary 8bit, two's complement");
                    reg = ADXL362.YDATA;
                    break;
                case 0x0A:
                    snprintf(name, 32, "ZDATA" );
                    snprintf(note, 64, "binary 8bit, two's complement");
                    reg = ADXL362.ZDATA;
                    break;
                case 0x0B:
                    snprintf(name, 32, "STATUS" );
                    snprintf(note, 64, "typically 0x41, 4=awake, 1=data ready");
                    reg = ADXL362.STATUS;
                    break;
                case 0x0C:
                    snprintf(name, 32, "FIFO_ENTRIES_L" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.FIFO_ENTRIES_L;
                    break;
                case 0x0D:
                    snprintf(name, 32, "FIFO_ENTRIES_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.FIFO_ENTRIES_H;
                    break;
                case 0x0E:
                    snprintf(name, 32, "XDATA_L" );
                    snprintf(note, 64, "binary 12bit, two's complement");
                    reg = ADXL362.XDATA_L;
                    break;
                case 0x0F:
                    snprintf(name, 32, "XDATA_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.XDATA_H;
                    break;
                case 0x10:
                    snprintf(name, 32, "YDATA_L" );
                    snprintf(note, 64, "binary 12bit, two's complement");
                    reg = ADXL362.YDATA_L;
                    break;
                case 0x11:
                    snprintf(name, 32, "YDATA_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.YDATA_H;
                    break;
                case 0x12:
                    snprintf(name, 32, "ZDATA_L" );
                    snprintf(note, 64, "binary 12bit, two's complement");
                    reg = ADXL362.ZDATA_L;
                    break;
                case 0x13:
                    snprintf(name, 32, "ZDATA_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.ZDATA_H;
                    break;
                case 0x14:
                    snprintf(name, 32, "TEMP_L" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.TEMP_L;
                    break;
                case 0x15:
                    snprintf(name, 32, "TEMP_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.TEMP_H;
                    break;
                case 0x1F:
                    snprintf(name, 32, "SOFT_RESET" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.SOFT_RESET;
                    break;
                case 0x20:
                    snprintf(name, 32, "THRESH_ACT_L" );
                    snprintf(note, 64, "Activity threshold value, binary 16bit");
                    reg = ADXL362.THRESH_ACT_L;
                    break;
                case 0x21:
                    snprintf(name, 32, "THRESH_ACT_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.THRESH_ACT_H;
                    break;
                case 0x22:
                    snprintf(name, 32, "TIME_ACT" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.TIME_ACT;
                    break;
                case 0x23:
                    snprintf(name, 32, "THRESH_INACT_L" );
                    snprintf(note, 64, "Inactivity threshold value, binary 16bit");
                    reg = ADXL362.THRESH_INACT_L;
                    break;
                case 0x24:
                    snprintf(name, 32, "THRESH_INACT_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.THRESH_INACT_H;
                    break;
                case 0x25:
                    snprintf(name, 32, "TIME_INACT_L" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.TIME_INACT_L;
                    break;
                case 0x26:
                    snprintf(name, 32, "TIME_INACT_H" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.TIME_INACT_H;
                    break;
                case 0x27:
                    snprintf(name, 32, "ACT_INACT_CTL" );
                    snprintf(note, 64, "default 0x00 = disable, 0x01 = enable");
                    reg = ADXL362.ACT_INACT_CTL;
                    break;
                case 0x28:
                    snprintf(name, 32, "FIFO_CONTROL" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.FIFO_CONTROL;
                    break;
                case 0x29:
                    snprintf(name, 32, "FIFO_SAMPLES" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.FIFO_SAMPLES;
                    break;
                case 0x2A:
                    snprintf(name, 32, "INTMAP1" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.INTMAP1;
                    break;
                case 0x2B:
                    snprintf(name, 32, "INTMAP2" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.INTMAP2;
                    break;
                case 0x2C:
                    snprintf(name, 32, "FILTER_CTL" );
                    snprintf(note, 64, "default 0x13, 1=half samplin freq, 3=freq 100 sampl/sec");
                    reg = ADXL362.FILTER_CTL;
                    break;
                case 0x2D:
                    snprintf(name, 32, "POWER_CTL" );
                    snprintf(note, 64, "default 0x02 = measure 3D");
                    reg = ADXL362.POWER_CTL;
                    break;
                case 0x2E:
                    snprintf(name, 32, "SELF_TEST" );
                    snprintf(note, 64, "-");
                    reg = ADXL362.SELF_TEST;
                    break;
            }
            // Printing register content as hexadecimal and the notes
            printf("register %d  %s  %x  %s\n", i, name, ADXL362.read_reg(reg), note);
        }
    }
    else
    {
        printf("Error");
        return(-1);
    }
    return(0);    
}