28
28
*/
29
29
30
30
#include " Adafruit_PWMServoDriver.h"
31
- #include < Wire.h>
32
31
33
32
// #define ENABLE_DEBUG_OUTPUT
34
33
@@ -62,9 +61,14 @@ Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(const uint8_t addr,
62
61
* @brief Setups the I2C interface and hardware
63
62
* @param prescale
64
63
* Sets External Clock (Optional)
64
+ * @return true if successful, otherwise false
65
65
*/
66
- void Adafruit_PWMServoDriver::begin (uint8_t prescale) {
67
- _i2c->begin ();
66
+ bool Adafruit_PWMServoDriver::begin (uint8_t prescale) {
67
+ if (i2c_dev)
68
+ delete i2c_dev;
69
+ i2c_dev = new Adafruit_I2CDevice (_i2caddr, _i2c);
70
+ if (!i2c_dev->begin ())
71
+ return false ;
68
72
reset ();
69
73
if (prescale) {
70
74
setExtClk (prescale);
@@ -74,6 +78,8 @@ void Adafruit_PWMServoDriver::begin(uint8_t prescale) {
74
78
}
75
79
// set the default internal frequency
76
80
setOscillatorFrequency (FREQUENCY_OSCILLATOR);
81
+
82
+ return true ;
77
83
}
78
84
79
85
/* !
@@ -206,11 +212,15 @@ uint8_t Adafruit_PWMServoDriver::readPrescale(void) {
206
212
/* !
207
213
* @brief Gets the PWM output of one of the PCA9685 pins
208
214
* @param num One of the PWM output pins, from 0 to 15
215
+ * @param off If true, returns PWM OFF value, otherwise PWM ON
209
216
* @return requested PWM output value
210
217
*/
211
- uint8_t Adafruit_PWMServoDriver::getPWM (uint8_t num) {
212
- _i2c->requestFrom ((int )_i2caddr, PCA9685_LED0_ON_L + 4 * num, (int )4 );
213
- return _i2c->read ();
218
+ uint16_t Adafruit_PWMServoDriver::getPWM (uint8_t num, bool off) {
219
+ uint8_t buffer[2 ] = {uint8_t (PCA9685_LED0_ON_L + 4 * num), 0 };
220
+ if (off)
221
+ buffer[0 ] += 2 ;
222
+ i2c_dev->write_then_read (buffer, 1 , buffer, 2 );
223
+ return uint16_t (buffer[0 ]) | (uint16_t (buffer[1 ]) << 8 );
214
224
}
215
225
216
226
/* !
@@ -231,13 +241,15 @@ uint8_t Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on,
231
241
Serial.println (off);
232
242
#endif
233
243
234
- _i2c->beginTransmission (_i2caddr);
235
- _i2c->write (PCA9685_LED0_ON_L + 4 * num);
236
- _i2c->write (on);
237
- _i2c->write (on >> 8 );
238
- _i2c->write (off);
239
- _i2c->write (off >> 8 );
240
- return _i2c->endTransmission ();
244
+ uint8_t buffer[5 ];
245
+ buffer[0 ] = PCA9685_LED0_ON_L + 4 * num;
246
+ buffer[1 ] = on;
247
+ buffer[2 ] = on >> 8 ;
248
+ buffer[3 ] = off;
249
+ buffer[4 ] = off >> 8 ;
250
+ i2c_dev->write (buffer, 5 );
251
+
252
+ return 0 ;
241
253
}
242
254
243
255
/* !
@@ -346,17 +358,12 @@ void Adafruit_PWMServoDriver::setOscillatorFrequency(uint32_t freq) {
346
358
347
359
/* ****************** Low level I2C interface */
348
360
uint8_t Adafruit_PWMServoDriver::read8 (uint8_t addr) {
349
- _i2c->beginTransmission (_i2caddr);
350
- _i2c->write (addr);
351
- _i2c->endTransmission ();
352
-
353
- _i2c->requestFrom ((uint8_t )_i2caddr, (uint8_t )1 );
354
- return _i2c->read ();
361
+ uint8_t buffer[1 ] = {addr};
362
+ i2c_dev->write_then_read (buffer, 1 , buffer, 1 );
363
+ return buffer[0 ];
355
364
}
356
365
357
366
void Adafruit_PWMServoDriver::write8 (uint8_t addr, uint8_t d) {
358
- _i2c->beginTransmission (_i2caddr);
359
- _i2c->write (addr);
360
- _i2c->write (d);
361
- _i2c->endTransmission ();
367
+ uint8_t buffer[2 ] = {addr, d};
368
+ i2c_dev->write (buffer, 2 );
362
369
}
0 commit comments