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