Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Custom_LSM303 Custom_UBloxGPS LRAT-mbed-os USBDevice mbed-lora-radio-drv stm32EEPROM
Fork of LRAT-example-lorawan by
Diff: main.cpp
- Revision:
- 32:f211b8c28273
- Parent:
- 31:f03c183e2bf6
--- a/main.cpp Fri Aug 03 16:34:24 2018 +0000 +++ b/main.cpp Wed Aug 08 20:12:26 2018 +0000 @@ -29,6 +29,9 @@ #include "mbed-trace/mbed_trace.h" #define TRACE_GROUP "MAIN" +// Huot Added LSM303AGR_ACC +#include "LSM303AGRAccSensor.h" + using namespace events; // Max payload size can be LORAMAC_PHY_MAXPAYLOAD. @@ -37,6 +40,12 @@ uint8_t tx_buffer[30]; uint8_t rx_buffer[30]; +// ACCELEROMETER AXES VARIABLE INITIALIZATION +int x = 0; +bool interruptOccured = false; + +int32_t axes[3]; + /* * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing */ @@ -96,11 +105,21 @@ double mylat; double mylon; -#define NEOM8M_ADR_GPS (0x42 >> 1) -#define LSM303_ADR_ACC (0x32 >> 1) -#define LSM303_ADR_MAG (0x3C >> 1) +#define NEOM8M_ADR_GPS 0x42 +#define LSM303_ADR_ACC 0x32 +#define LSM303_ADR_MAG 0x3C + +// ------ HUOT Change +// Had to change I2C to use DevI2C to get below LSM303AGRAccSensor Constructor to function +static DevI2C i2c(PB_9, PB_8); -I2C i2c(PB_9, PB_8); +static LSM303AGRAccSensor accel(&i2c, LSM303_ADR_ACC, PB_14); + +InterruptIn accelPin(PB_14); + +void accelRunning(); +void accelSetup(); + /** * Entry point for application @@ -115,6 +134,30 @@ printf("\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n"); + // HUOT -- ACCCELEROMETER SENSOR SETUP + accelSetup(); + + while (true) { + if (interruptOccured) { + printf("+++++++ INTERRUPT COUNTER: %d +++++++ \r\n", x); + + // Write to all accel regs to configure interrupt. + accel.write_reg(LSM303AGR_ACC_INT1_CFG, 0x2A); + printf("Enable X and Y Axes High Interrupt Events. \r\n"); + + // READ SOURCE DATA + uint8_t data = 0; + accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &data); + printf("DATA = %02x \r\n", data); + + interruptOccured = false; + } else { + printf("========= No Interrupt on this pass... ========= \r\n"); + } + + wait(4); + } + mytime = 0; mybatt = 15; mylat = 51.06509; @@ -198,12 +241,11 @@ printf("Clock: %d\r\n", tNow); mytime = tNow; char cmd[2]; - /* - char buf[1024]; - buf[0] = 0x00; - buf[1] = 0x00; - buf[2] = 0x00; - */ + + //char buf[1024]; + +// ---------- HUOT COMMENT BLOCK OUT ------ +/* char buf; //cmd[0] = 0xFF; //i2c.write(NEOM8M_ADR_GPS, cmd, 1); @@ -212,10 +254,18 @@ cmd[1] = 0x57; i2c.write(LSM303_ADR_ACC, cmd, 2); cmd[0] = 0x20; - i2c.write(LSM303_ADR_ACC, cmd, 1); + //i2c.write(LSM303_ADR_ACC, cmd, 1); i2c.read(LSM303_ADR_ACC, &buf, 1); //i2c.read(LSM303_ADR_ACC, buf, 1); printf("Return Value: %02x", buf); +*/ + +/* HUOT -- TEST OF ACCELEROMETER GET DATA FROM AXES + if (x % 2 == 0) { + accel.get_x_axes(axes); + printf("LSM303AGR [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + } +*/ int ilat = (int)(mylat * 100000); int ilon = (int)(mylon * 100000); packet_len = 11; @@ -253,6 +303,9 @@ } printf("\r\n %d bytes scheduled for transmission \r\n", retcode); + + x += 1; + memset(tx_buffer, 0, sizeof(tx_buffer)); } @@ -340,4 +393,109 @@ } } +void accelRunning() +{ + interruptOccured = true; + x++; + +// printf("++++++++++++++ Interrupt Called! Get Drunk! +++++++++++++++++++ \r\n"); + +// printf("COUNTER: ---- %d \r\n", x++); + +// uint8_t srcData; +// accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &srcData); +// printf("SRC DATA = %02x \r\n", srcData); + + // accel.get_x_axes(axes); + // printf("LSM303AGR [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); +} + +// ---- HUOT ACCEL SETUP +void accelSetup() +{ + int initCode = accel.init(NULL); + printf("INIT CODE = %d \r\n", initCode); + + int enableCode = accel.enable(); + printf("ENABLE CODE = %d \r\n", enableCode); + +/* HP FILTER BYPASS + // SETUP INTERRUPT + // ODR = 100 Hz + accel.write_reg(LSM303AGR_ACC_CTRL_REG1, 0x67); + printf("ODR Set \r\n"); + // High-Pass filter Disabled + accel.write_reg(LSM303AGR_ACC_CTRL_REG2, 0x00); + printf("HP Filter Disabled \r\n"); + // Interrupt Driven to INT1 pad + accel.write_reg(LSM303AGR_ACC_CTRL_REG3, 0x40); + printf("INT1 Pad \r\n"); + // Full Scale = 2 g + accel.write_reg(LSM303AGR_ACC_CTRL_REG4, 0x00); + printf("Full Scale set at 2G's \r\n"); + // Interrupt Latched + accel.write_reg(LSM303AGR_ACC_CTRL_REG5, 0x08); + printf("Interrupt Latched \r\n"); + // Threshold = 250 mg + accel.write_reg(LSM303AGR_ACC_INT1_THS, 0x01); + printf("Threshold set at XXX mg's \r\n"); + // Duration Set + accel.write_reg(LSM303AGR_ACC_INT1_DURATION, 0x00); + printf("Duration set to 0"); + // Enable X-High and Y-High Interrupt Generation + accel.write_reg(LSM303AGR_ACC_INT1_CFG, 0x05); + printf("Enable X and Y Axes High Interrupt Events. \r\n"); +*/ + // SETUP INTERRUPT + // ODR = 100 Hz + accel.write_reg(LSM303AGR_ACC_CTRL_REG1, 0x67); + printf("ODR Set \r\n"); + // High-Pass filter Enabled + accel.write_reg(LSM303AGR_ACC_CTRL_REG2, 0x09); + printf("HP Filter Enabled \r\n"); + // Interrupt Driven to INT1 pad + accel.write_reg(LSM303AGR_ACC_CTRL_REG3, 0x40); + printf("INT1 Pad \r\n"); + // Full Scale = 2 g + accel.write_reg(LSM303AGR_ACC_CTRL_REG4, 0x00); + printf("Full Scale set at 2G's \r\n"); + // Interrupt Latched + accel.write_reg(LSM303AGR_ACC_CTRL_REG5, 0x08); + printf("Interrupt Latched \r\n"); + + accel.write_reg(LSM303AGR_ACC_INT1_THS, 0x01); + printf("Threshold set at XXX mg's \r\n"); + // Duration Set + accel.write_reg(LSM303AGR_ACC_INT1_DURATION, 0x00); + printf("Duration set to 0"); + + // DUMMY READ TO FORCE HP FILTER TO CURRENT ACCELERATION VALUE + uint8_t read_ref; + accel.read_reg(LSM303AGR_ACC_REFERENCE, &read_ref); + + // Enable X-High, Y-High and Z-High Interrupt Generation + accel.write_reg(LSM303AGR_ACC_INT1_CFG, 0x2A); + printf("Enable X and Y Axes High Interrupt Events. \r\n"); + + accelPin.rise(&accelRunning); + + // ATTEMPT TO READ SOURCE DATA + uint8_t data = 0; + accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &data); + printf("DATA = %02x \r\n", data); + + +// uint8_t data = 0; +// +// accel.read_reg(, &data); +// printf("DATA = %02x \r\n", data); +// +// uint8_t srcData; +// accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &srcData); +// printf("SRC DATA = %02x \r\n", srcData); + + + +} + // EOF