1
+ /* !
2
+ * @file WipperSnapper_I2C_Driver_AS5600.h
3
+ *
4
+ * Device driver for the AS5600 Magnetic Angle sensor.
5
+ *
6
+ * Adafruit invests time and resources providing this open source code,
7
+ * please support Adafruit and open-source hardware by purchasing
8
+ * products from Adafruit!
9
+ *
10
+ * Copyright (c) Tyeth Gundry 2024 for Adafruit Industries.
11
+ *
12
+ * MIT license, all text here must be included in any redistribution.
13
+ *
14
+ */
15
+ #ifndef WipperSnapper_I2C_Driver_AS5600_H
16
+ #define WipperSnapper_I2C_Driver_AS5600_H
17
+
18
+ #include < Adafruit_AS5600.h>
19
+
20
+ #include " WipperSnapper_I2C_Driver.h"
21
+ #include " Wippersnapper.h"
22
+
23
+ /* *************************************************************************/
24
+ /* !
25
+ @brief Class that provides a driver interface for a AS5600 sensor.
26
+ */
27
+ /* *************************************************************************/
28
+ class WipperSnapper_I2C_Driver_AS5600 : public WipperSnapper_I2C_Driver {
29
+ public:
30
+ /* ******************************************************************************/
31
+ /* !
32
+ @brief Constructor for the AS5600 sensor.
33
+ @param i2c
34
+ The I2C interface.
35
+ @param sensorAddress
36
+ 7-bit device address.
37
+ */
38
+ /* ******************************************************************************/
39
+ WipperSnapper_I2C_Driver_AS5600 (TwoWire *i2c, uint16_t sensorAddress)
40
+ : WipperSnapper_I2C_Driver(i2c, sensorAddress) {
41
+ _as5600 = nullptr ;
42
+ _angle = 0 ;
43
+ }
44
+
45
+ /* ******************************************************************************/
46
+ /* !
47
+ @brief Destructor for an AS5600 sensor.
48
+ */
49
+ /* ******************************************************************************/
50
+ ~WipperSnapper_I2C_Driver_AS5600 () {
51
+ if (_as5600) {
52
+ delete _as5600;
53
+ _as5600 = nullptr ;
54
+ }
55
+ }
56
+
57
+ /* ******************************************************************************/
58
+ /* !
59
+ @brief Initializes the AS5600 sensor and begins I2C.
60
+ @returns True if initialized successfully, False otherwise.
61
+ */
62
+ /* ******************************************************************************/
63
+ bool begin () {
64
+ _as5600 = new Adafruit_AS5600 ();
65
+ if (!_as5600->begin ((uint8_t )_sensorAddress, _i2c)) {
66
+ WS_DEBUG_PRINTLN (" Failed to find AS5600 chip" );
67
+ return false ;
68
+ }
69
+
70
+ if (!configureSensor ()) {
71
+ WS_DEBUG_PRINTLN (" Failed to configure AS5600 sensor" );
72
+ return false ;
73
+ }
74
+ return true ;
75
+ }
76
+
77
+ /* ******************************************************************************/
78
+ /* !
79
+ @brief Configures the AS5600 sensor.
80
+ @returns True if the sensor was configured successfully, False otherwise.
81
+ */
82
+ /* ******************************************************************************/
83
+ bool configureSensor () {
84
+ return _as5600->enableWatchdog (false ) &&
85
+ // Normal (high) power mode
86
+ _as5600->setPowerMode (AS5600_POWER_MODE_NOM) &&
87
+ // No Hysteresis
88
+ _as5600->setHysteresis (AS5600_HYSTERESIS_OFF) &&
89
+ // analog output (0-VCC for 0-360 degrees)
90
+ _as5600->setOutputStage (AS5600_OUTPUT_STAGE_ANALOG_FULL) &&
91
+ // setup filters
92
+ _as5600->setSlowFilter (AS5600_SLOW_FILTER_16X) &&
93
+ _as5600->setFastFilterThresh (AS5600_FAST_FILTER_THRESH_SLOW_ONLY) &&
94
+ // Reset position settings to defaults
95
+ _as5600->setZPosition (0 ) && _as5600->setMPosition (4095 ) &&
96
+ _as5600->setMaxAngle (4095 );
97
+ }
98
+
99
+ /* ******************************************************************************/
100
+ /* !
101
+ @brief Reads the Angle sensor.
102
+ @returns True if the sensor was read successfully, False otherwise.
103
+ */
104
+ /* ******************************************************************************/
105
+ bool readSensor () {
106
+ if (!_as5600->isMagnetDetected ()) {
107
+ WS_DEBUG_PRINTLN (" Magnet not detected!" );
108
+ return false ;
109
+ }
110
+
111
+ // Continuously read and display angle values
112
+ uint16_t rawAngle = _as5600->getRawAngle ();
113
+ uint16_t angle = _as5600->getAngle ();
114
+
115
+ WS_DEBUG_PRINT (" AS5600 Raw: " );
116
+ WS_DEBUG_PRINT (rawAngle);
117
+ WS_DEBUG_PRINT (" | Scaled: " );
118
+ WS_DEBUG_PRINT (angle);
119
+
120
+ // Check status conditions
121
+ if (_as5600->isAGCminGainOverflow ()) {
122
+ WS_DEBUG_PRINTLN (" | MH: magnet too strong" );
123
+ return false ;
124
+ }
125
+ if (_as5600->isAGCmaxGainOverflow ()) {
126
+ WS_DEBUG_PRINTLN (" | ML: magnet too weak" );
127
+ return false ;
128
+ }
129
+ _angle = ((float )angle / 4095.0 ) * 360.0 ;
130
+ return true ;
131
+ }
132
+
133
+ /* ******************************************************************************/
134
+ /* !
135
+ @brief Reads the Angle sensor with short wait for data.
136
+ @param rawEvent
137
+ Angle sensor reading
138
+ @returns True if the sensor event was obtained successfully, False
139
+ otherwise.
140
+ */
141
+ /* ******************************************************************************/
142
+ bool getEventRaw (sensors_event_t *rawEvent) {
143
+ if (!readSensor ()) {
144
+ return false ;
145
+ }
146
+ rawEvent->data [0 ] = _angle;
147
+ return true ;
148
+ }
149
+
150
+ protected:
151
+ float _angle; // /< Current angle reading from the AS5600 sensor
152
+ Adafruit_AS5600 *_as5600; // /< Pointer to AS5600 sensor object
153
+ };
154
+
155
+ #endif // WipperSnapper_I2C_Driver_AS5600
0 commit comments