-
-
Notifications
You must be signed in to change notification settings - Fork 733
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #786 from Ralim/adding-sc7a20
Adding SC7A20 Accelerometer support
- Loading branch information
Showing
6 changed files
with
173 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
* SC7A20.cpp | ||
* | ||
* Created on: 18 Sep. 2020 | ||
* Author: Ralim | ||
*/ | ||
|
||
#include <SC7A20.hpp> | ||
#include <SC7A20_defines.h> | ||
#include <array> | ||
|
||
bool SC7A20::detect() { | ||
if (FRToSI2C::probe(SC7A20_ADDRESS)) { | ||
//Read chip id to ensure its not an address collision | ||
uint8_t id = 0; | ||
if (FRToSI2C::Mem_Read(SC7A20_ADDRESS, SC7A20_WHO_AMI_I, &id, 1)) { | ||
return id == 0b00010001; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
static const FRToSI2C::I2C_REG i2c_registers[] = { // | ||
// | ||
{ SC7A20_CTRL_REG1, 0b01100111, 0 }, //200Hz, XYZ enabled | ||
{ SC7A20_CTRL_REG2, 0b00000000, 0 }, //Setup filter to 0x00 ?? | ||
{ SC7A20_CTRL_REG3, 0b00000000, 0 }, //int1 off | ||
{ SC7A20_CTRL_REG4, 0b01001000, 0 }, //Block mode off,little-endian,2G,High-pres,self test off | ||
{ SC7A20_CTRL_REG5, 0b00000100, 0 }, //fifo off, D4D on int1 | ||
{ SC7A20_CTRL_REG6, 0x00, 0 }, //INT2 off | ||
//Basically setup the unit to run, and enable 4D orientation detection | ||
{ SC7A20_INT2_CFG, 0b01111110, 0 }, //setup for movement detection | ||
{ SC7A20_INT2_THS, 0x28, 0 }, // | ||
{ SC7A20_INT2_DURATION, 64, 0 }, // | ||
{ SC7A20_INT1_CFG, 0b01111110, 0 }, // | ||
{ SC7A20_INT1_THS, 0x28, 0 }, // | ||
{ SC7A20_INT1_DURATION, 64, 0 } | ||
|
||
// | ||
}; | ||
bool SC7A20::initalize() { | ||
//Setup acceleration readings | ||
//2G range | ||
//bandwidth = 250Hz | ||
//High pass filter on (Slow compensation) | ||
//Turn off IRQ output pins | ||
//Orientation recognition in symmetrical mode | ||
// Hysteresis is set to ~ 16 counts | ||
//Theta blocking is set to 0b10 | ||
|
||
return FRToSI2C::writeRegistersBulk(SC7A20_ADDRESS, i2c_registers, sizeof(i2c_registers) / sizeof(i2c_registers[0])); | ||
|
||
} | ||
|
||
void SC7A20::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { | ||
//We can tell the accelerometer to output in LE mode which makes this simple | ||
uint16_t sensorData[3] = { 0, 0, 0 }; | ||
|
||
if (FRToSI2C::Mem_Read(SC7A20_ADDRESS, SC7A20_OUT_X_L, (uint8_t*) sensorData, 6) == false) { | ||
x = y = z = 0; | ||
return; | ||
} | ||
//Shift 6 to make its range ~= the other accelerometers | ||
x = sensorData[0]; | ||
y = sensorData[1]; | ||
z = sensorData[2]; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* | ||
* BMA223.hpp | ||
* | ||
* Created on: 18 Sep. 2020 | ||
* Author: Ralim | ||
*/ | ||
|
||
#ifndef CORE_DRIVERS_SC7A20_HPP_ | ||
#define CORE_DRIVERS_SC7A20_HPP_ | ||
#include "I2C_Wrapper.hpp" | ||
#include "BSP.h" | ||
#include "SC7A20_defines.h" | ||
|
||
class SC7A20 { | ||
public: | ||
static bool detect(); | ||
static bool initalize(); | ||
//1 = rh, 2,=lh, 8=flat | ||
static Orientation getOrientation() { | ||
uint8_t val = ((FRToSI2C::I2C_RegisterRead(SC7A20_ADDRESS, SC7A20_INT2_SOURCE) >> 2) - 1); | ||
if (val == 1) | ||
return Orientation::ORIENTATION_LEFT_HAND; | ||
else if (val == 4 || val == 0) | ||
return Orientation::ORIENTATION_RIGHT_HAND; | ||
else | ||
return Orientation::ORIENTATION_FLAT; | ||
} | ||
static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z); | ||
|
||
private: | ||
}; | ||
|
||
#endif /* CORE_DRIVERS_BMA223_HPP_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/* | ||
* BMA223_defines.h | ||
* | ||
* Created on: 18 Sep. 2020 | ||
* Author: Ralim | ||
*/ | ||
|
||
#ifndef CORE_DRIVERS_SC7A20_DEFINES_H_ | ||
#define CORE_DRIVERS_SC7A20_DEFINES_H_ | ||
|
||
#define SC7A20_ADDRESS 0x18<<1 | ||
#define SC7A20_WHO_AMI_I 0x0F | ||
#define SC7A20_CTRL_REG1 0x20 | ||
#define SC7A20_CTRL_REG2 0x21 | ||
#define SC7A20_CTRL_REG3 0x22 | ||
#define SC7A20_CTRL_REG4 0x23 | ||
#define SC7A20_CTRL_REG5 0x24 | ||
#define SC7A20_CTRL_REG6 0x25 | ||
#define SC7A20_REFERENCE 0x26 | ||
#define SC7A20_STATUS_REG 0x27 | ||
#define SC7A20_OUT_X_L 0x28 | ||
#define SC7A20_OUT_X_H 0x29 | ||
#define SC7A20_OUT_Y_L 0x2A | ||
#define SC7A20_OUT_Y_H 0x2B | ||
#define SC7A20_OUT_Z_L 0x2C | ||
#define SC7A20_OUT_Z_H 0x2D | ||
#define SC7A20_FIFO_CTRL 0x2E | ||
#define SC7A20_FIFO_SRC 0x2F | ||
#define SC7A20_INT1_CFG 0x30 | ||
#define SC7A20_INT1_SOURCE 0x31 | ||
#define SC7A20_INT1_THS 0x32 | ||
#define SC7A20_INT1_DURATION 0x33 | ||
#define SC7A20_INT2_CFG 0x34 | ||
#define SC7A20_INT2_SOURCE 0x35 | ||
#define SC7A20_INT2_THS 0x36 | ||
#define SC7A20_INT2_DURATION 0x37 | ||
#define SC7A20_CLICK_CFG 0x38 | ||
#define SC7A20_CLICK_SRC 0x39 | ||
#define SC7A20_CLICK_THS 0x3A | ||
#define SC7A20_TIME_LIMIT 0x3B | ||
#define SC7A20_TIME_LATENCY 0x3C | ||
#define SC7A20_TIME_WINDOW 0x3D | ||
#define SC7A20_ACT_THS 0x3E | ||
#define SC7A20_ACT_DURATION 0x3F | ||
|
||
#endif /* CORE_DRIVERS_BMA223_DEFINES_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters