SCL3300 sensor 3-axis inclinometer with angle output and digital SPI interface
SCL3300.h@0:e8ba98a758d0, 20 months ago (annotated)
- Committer:
- sameera0824
- Date:
- Mon Aug 15 19:17:10 2022 +0000
- Revision:
- 0:e8ba98a758d0
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sameera0824 | 0:e8ba98a758d0 | 1 | /****************************************************************************** |
sameera0824 | 0:e8ba98a758d0 | 2 | SCL3300.h |
sameera0824 | 0:e8ba98a758d0 | 3 | SCL3300 Arduino Library Header File |
sameera0824 | 0:e8ba98a758d0 | 4 | David Armstrong |
sameera0824 | 0:e8ba98a758d0 | 5 | Version 3.2.0 - September 3, 2021 |
sameera0824 | 0:e8ba98a758d0 | 6 | https://github.com/DavidArmstrong/SCL3300 |
sameera0824 | 0:e8ba98a758d0 | 7 | |
sameera0824 | 0:e8ba98a758d0 | 8 | Resources: |
sameera0824 | 0:e8ba98a758d0 | 9 | Uses SPI.h for SPI operation |
sameera0824 | 0:e8ba98a758d0 | 10 | |
sameera0824 | 0:e8ba98a758d0 | 11 | Development environment specifics: |
sameera0824 | 0:e8ba98a758d0 | 12 | Arduino IDE 1.8.9, 1.8.11, 1.8.12, 1.8.13, 1.8.15 |
sameera0824 | 0:e8ba98a758d0 | 13 | |
sameera0824 | 0:e8ba98a758d0 | 14 | This code is released under the [MIT License](http://opensource.org/licenses/MIT). |
sameera0824 | 0:e8ba98a758d0 | 15 | Please review the LICENSE.md file included with this example. |
sameera0824 | 0:e8ba98a758d0 | 16 | Distributed as-is; no warranty is given. |
sameera0824 | 0:e8ba98a758d0 | 17 | |
sameera0824 | 0:e8ba98a758d0 | 18 | This file prototypes the SCL3300 class, as implemented in SCL3300.cpp |
sameera0824 | 0:e8ba98a758d0 | 19 | |
sameera0824 | 0:e8ba98a758d0 | 20 | ******************************************************************************/ |
sameera0824 | 0:e8ba98a758d0 | 21 | |
sameera0824 | 0:e8ba98a758d0 | 22 | // ensure this library description is only included once |
sameera0824 | 0:e8ba98a758d0 | 23 | #ifndef __SCL3300_h |
sameera0824 | 0:e8ba98a758d0 | 24 | #define __SCL3300_h |
sameera0824 | 0:e8ba98a758d0 | 25 | |
sameera0824 | 0:e8ba98a758d0 | 26 | // Uncomment the following line for debugging output |
sameera0824 | 0:e8ba98a758d0 | 27 | //#define debug_scl3300 |
sameera0824 | 0:e8ba98a758d0 | 28 | |
sameera0824 | 0:e8ba98a758d0 | 29 | // Need the following define for SAMD processors |
sameera0824 | 0:e8ba98a758d0 | 30 | #if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL) |
sameera0824 | 0:e8ba98a758d0 | 31 | #define Serial_SCL SERIAL_PORT_USBVIRTUAL |
sameera0824 | 0:e8ba98a758d0 | 32 | #else |
sameera0824 | 0:e8ba98a758d0 | 33 | #define Serial_SCL Serial |
sameera0824 | 0:e8ba98a758d0 | 34 | #endif |
sameera0824 | 0:e8ba98a758d0 | 35 | |
sameera0824 | 0:e8ba98a758d0 | 36 | #include <stdint.h> |
sameera0824 | 0:e8ba98a758d0 | 37 | |
sameera0824 | 0:e8ba98a758d0 | 38 | #if defined(ARDUINO) && ARDUINO >= 100 |
sameera0824 | 0:e8ba98a758d0 | 39 | #include "Arduino.h" |
sameera0824 | 0:e8ba98a758d0 | 40 | #else |
sameera0824 | 0:e8ba98a758d0 | 41 | #include "WProgram.h" |
sameera0824 | 0:e8ba98a758d0 | 42 | #endif |
sameera0824 | 0:e8ba98a758d0 | 43 | |
sameera0824 | 0:e8ba98a758d0 | 44 | #include <SPI.h> // SPI library is used for...SPI. |
sameera0824 | 0:e8ba98a758d0 | 45 | |
sameera0824 | 0:e8ba98a758d0 | 46 | #ifndef SCL3300_SPI_CLOCK |
sameera0824 | 0:e8ba98a758d0 | 47 | #ifdef ARDUINO_ARCH_ESP32 |
sameera0824 | 0:e8ba98a758d0 | 48 | #define SCL3300_SPI_CLOCK 4000000 |
sameera0824 | 0:e8ba98a758d0 | 49 | #else |
sameera0824 | 0:e8ba98a758d0 | 50 | #define SCL3300_SPI_CLOCK 4000000 |
sameera0824 | 0:e8ba98a758d0 | 51 | #endif |
sameera0824 | 0:e8ba98a758d0 | 52 | #endif |
sameera0824 | 0:e8ba98a758d0 | 53 | |
sameera0824 | 0:e8ba98a758d0 | 54 | #ifndef SCL3300_SPI_MODE |
sameera0824 | 0:e8ba98a758d0 | 55 | #define SCL3300_SPI_MODE SPI_MODE0 |
sameera0824 | 0:e8ba98a758d0 | 56 | #endif |
sameera0824 | 0:e8ba98a758d0 | 57 | |
sameera0824 | 0:e8ba98a758d0 | 58 | //Define allowed commands to SCL3300 inclinometer |
sameera0824 | 0:e8ba98a758d0 | 59 | #define RdAccX 0x040000f7 |
sameera0824 | 0:e8ba98a758d0 | 60 | #define RdAccY 0x080000fd |
sameera0824 | 0:e8ba98a758d0 | 61 | #define RdAccZ 0x0c0000fb |
sameera0824 | 0:e8ba98a758d0 | 62 | #define RdSTO 0x100000e9 |
sameera0824 | 0:e8ba98a758d0 | 63 | #define EnaAngOut 0xb0001f6f |
sameera0824 | 0:e8ba98a758d0 | 64 | #define RdAngX 0x240000c7 |
sameera0824 | 0:e8ba98a758d0 | 65 | #define RdAngY 0x280000cd |
sameera0824 | 0:e8ba98a758d0 | 66 | #define RdAngZ 0x2c0000cb |
sameera0824 | 0:e8ba98a758d0 | 67 | #define RdTemp 0x140000ef |
sameera0824 | 0:e8ba98a758d0 | 68 | #define RdStatSum 0x180000e5 |
sameera0824 | 0:e8ba98a758d0 | 69 | #define RdErrFlg1 0x1c0000e3 |
sameera0824 | 0:e8ba98a758d0 | 70 | #define RdErrFlg2 0x200000c1 |
sameera0824 | 0:e8ba98a758d0 | 71 | #define RdCMD 0x340000df |
sameera0824 | 0:e8ba98a758d0 | 72 | #define ChgMode1 0xb400001f |
sameera0824 | 0:e8ba98a758d0 | 73 | #define ChgMode2 0xb4000102 |
sameera0824 | 0:e8ba98a758d0 | 74 | #define ChgMode3 0xb4000225 |
sameera0824 | 0:e8ba98a758d0 | 75 | #define ChgMode4 0xb4000338 |
sameera0824 | 0:e8ba98a758d0 | 76 | #define SetPwrDwn 0xb400046b |
sameera0824 | 0:e8ba98a758d0 | 77 | #define WakeUp 0xb400001f |
sameera0824 | 0:e8ba98a758d0 | 78 | #define SWreset 0xb4002098 |
sameera0824 | 0:e8ba98a758d0 | 79 | #define RdWHOAMI 0x40000091 |
sameera0824 | 0:e8ba98a758d0 | 80 | #define RdSer1 0x640000a7 |
sameera0824 | 0:e8ba98a758d0 | 81 | #define RdSer2 0x680000AD |
sameera0824 | 0:e8ba98a758d0 | 82 | #define RdCurBank 0x7c0000b3 |
sameera0824 | 0:e8ba98a758d0 | 83 | #define SwtchBnk0 0xfc000073 |
sameera0824 | 0:e8ba98a758d0 | 84 | #define SwtchBnk1 0xfc00016e |
sameera0824 | 0:e8ba98a758d0 | 85 | |
sameera0824 | 0:e8ba98a758d0 | 86 | // Structure to hold raw sensor data |
sameera0824 | 0:e8ba98a758d0 | 87 | // We need to populate all this every time we read a set of data |
sameera0824 | 0:e8ba98a758d0 | 88 | struct SCL3300data { |
sameera0824 | 0:e8ba98a758d0 | 89 | public: |
sameera0824 | 0:e8ba98a758d0 | 90 | int16_t AccX; |
sameera0824 | 0:e8ba98a758d0 | 91 | int16_t AccY; |
sameera0824 | 0:e8ba98a758d0 | 92 | int16_t AccZ; |
sameera0824 | 0:e8ba98a758d0 | 93 | int16_t STO; |
sameera0824 | 0:e8ba98a758d0 | 94 | int16_t TEMP; |
sameera0824 | 0:e8ba98a758d0 | 95 | int16_t AngX; |
sameera0824 | 0:e8ba98a758d0 | 96 | int16_t AngY; |
sameera0824 | 0:e8ba98a758d0 | 97 | int16_t AngZ; |
sameera0824 | 0:e8ba98a758d0 | 98 | uint16_t StatusSum; |
sameera0824 | 0:e8ba98a758d0 | 99 | uint16_t WHOAMI; |
sameera0824 | 0:e8ba98a758d0 | 100 | }; |
sameera0824 | 0:e8ba98a758d0 | 101 | |
sameera0824 | 0:e8ba98a758d0 | 102 | // SCL3300 library interface description |
sameera0824 | 0:e8ba98a758d0 | 103 | class SCL3300 { |
sameera0824 | 0:e8ba98a758d0 | 104 | // user-accessible "public" interface |
sameera0824 | 0:e8ba98a758d0 | 105 | public: |
sameera0824 | 0:e8ba98a758d0 | 106 | SPISettings spiSettings{SCL3300_SPI_CLOCK, MSBFIRST, SCL3300_SPI_MODE}; |
sameera0824 | 0:e8ba98a758d0 | 107 | |
sameera0824 | 0:e8ba98a758d0 | 108 | SCL3300data sclData; |
sameera0824 | 0:e8ba98a758d0 | 109 | boolean setMode(int mode); |
sameera0824 | 0:e8ba98a758d0 | 110 | boolean begin(void); |
sameera0824 | 0:e8ba98a758d0 | 111 | boolean begin(uint8_t csPin); |
sameera0824 | 0:e8ba98a758d0 | 112 | boolean begin(SPIClass &spiPort, uint8_t csPin); |
sameera0824 | 0:e8ba98a758d0 | 113 | //Functions to retrieve sensor data |
sameera0824 | 0:e8ba98a758d0 | 114 | boolean isConnected(); |
sameera0824 | 0:e8ba98a758d0 | 115 | boolean available(void); |
sameera0824 | 0:e8ba98a758d0 | 116 | void setFastReadMode(); |
sameera0824 | 0:e8ba98a758d0 | 117 | void stopFastReadMode(); |
sameera0824 | 0:e8ba98a758d0 | 118 | double getCalculatedAngleX(void); |
sameera0824 | 0:e8ba98a758d0 | 119 | double getCalculatedAngleY(void); |
sameera0824 | 0:e8ba98a758d0 | 120 | double getCalculatedAngleZ(void); |
sameera0824 | 0:e8ba98a758d0 | 121 | double getTiltLevelOffsetAngleX(void); |
sameera0824 | 0:e8ba98a758d0 | 122 | double getTiltLevelOffsetAngleY(void); |
sameera0824 | 0:e8ba98a758d0 | 123 | double getTiltLevelOffsetAngleZ(void); |
sameera0824 | 0:e8ba98a758d0 | 124 | double getCalculatedAccelerometerX(void); |
sameera0824 | 0:e8ba98a758d0 | 125 | double getCalculatedAccelerometerY(void); |
sameera0824 | 0:e8ba98a758d0 | 126 | double getCalculatedAccelerometerZ(void); |
sameera0824 | 0:e8ba98a758d0 | 127 | uint16_t getErrFlag1(void); |
sameera0824 | 0:e8ba98a758d0 | 128 | uint16_t getErrFlag2(void); |
sameera0824 | 0:e8ba98a758d0 | 129 | unsigned long getSerialNumber(void); |
sameera0824 | 0:e8ba98a758d0 | 130 | double getCalculatedTemperatureCelsius(void); |
sameera0824 | 0:e8ba98a758d0 | 131 | double getCalculatedTemperatureFarenheit(void); |
sameera0824 | 0:e8ba98a758d0 | 132 | double angle(int16_t SCL3300_ANG); //two's complement value expected |
sameera0824 | 0:e8ba98a758d0 | 133 | double acceleration(int16_t SCL3300_ACC); |
sameera0824 | 0:e8ba98a758d0 | 134 | bool crcerr, statuserr; |
sameera0824 | 0:e8ba98a758d0 | 135 | uint16_t powerDownMode(void); |
sameera0824 | 0:e8ba98a758d0 | 136 | uint16_t WakeMeUp(void); |
sameera0824 | 0:e8ba98a758d0 | 137 | uint16_t reset(void); |
sameera0824 | 0:e8ba98a758d0 | 138 | |
sameera0824 | 0:e8ba98a758d0 | 139 | // library-accessible "private" interface |
sameera0824 | 0:e8ba98a758d0 | 140 | private: |
sameera0824 | 0:e8ba98a758d0 | 141 | SPIClass *_spiPort = NULL; //The generic connection to user's chosen spi hardware |
sameera0824 | 0:e8ba98a758d0 | 142 | |
sameera0824 | 0:e8ba98a758d0 | 143 | uint8_t scl3300_csPin = 10; // Default SPI chip select pin |
sameera0824 | 0:e8ba98a758d0 | 144 | uint8_t scl3300_mode = 4; // Default inclinometer mode |
sameera0824 | 0:e8ba98a758d0 | 145 | uint8_t SCL3300_CMD, SCL3300_CRC; |
sameera0824 | 0:e8ba98a758d0 | 146 | uint16_t SCL3300_DATA; |
sameera0824 | 0:e8ba98a758d0 | 147 | double Temperature, X_angle, Y_angle, Z_angle; |
sameera0824 | 0:e8ba98a758d0 | 148 | bool setFastRead = false; |
sameera0824 | 0:e8ba98a758d0 | 149 | |
sameera0824 | 0:e8ba98a758d0 | 150 | void initSPI(); |
sameera0824 | 0:e8ba98a758d0 | 151 | void beginTransmission(); |
sameera0824 | 0:e8ba98a758d0 | 152 | void endTransmission(); |
sameera0824 | 0:e8ba98a758d0 | 153 | uint8_t CalculateCRC(uint32_t Data); |
sameera0824 | 0:e8ba98a758d0 | 154 | uint8_t CRC8(uint8_t BitValue, uint8_t SCL3300_CRC); |
sameera0824 | 0:e8ba98a758d0 | 155 | unsigned long transfer(unsigned long value); |
sameera0824 | 0:e8ba98a758d0 | 156 | |
sameera0824 | 0:e8ba98a758d0 | 157 | union FourByte { |
sameera0824 | 0:e8ba98a758d0 | 158 | unsigned long bit32; |
sameera0824 | 0:e8ba98a758d0 | 159 | unsigned int bit16[2]; |
sameera0824 | 0:e8ba98a758d0 | 160 | unsigned char bit8[4]; |
sameera0824 | 0:e8ba98a758d0 | 161 | }; |
sameera0824 | 0:e8ba98a758d0 | 162 | unsigned long modeCMD[5] = { 0, ChgMode1, ChgMode2, ChgMode3, ChgMode4 }; |
sameera0824 | 0:e8ba98a758d0 | 163 | }; |
sameera0824 | 0:e8ba98a758d0 | 164 | #endif |