-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServoDriver.cpp
More file actions
78 lines (60 loc) · 1.57 KB
/
ServoDriver.cpp
File metadata and controls
78 lines (60 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/***************************************************
Library for 2 DC motor & 16 Servo driver
by DOIT. http://www.doit.am
****************************************************/
#include "ServoDriver.h"
#include <Wire.h>
#if defined(__AVR__)
#define WIRE Wire
#elif defined(CORE_TEENSY)
#define WIRE Wire
#else // Arduino Due
#define WIRE Wire
#endif
ServoDriver::ServoDriver(uint8_t addr) {
_i2caddr = addr;
}
void ServoDriver::begin(void) {
WIRE.begin();
reset();
}
void ServoDriver::reset(void) {
write8(PCA9685_MODE1, 0x0);
}
void ServoDriver::setPWMFreq(float freq) {
freq *= 0.9;
float prescaleval = 25000000;
prescaleval /= 4096;
prescaleval /= freq;
prescaleval -= 1;
uint8_t prescale = floor(prescaleval + 0.5);
uint8_t oldmode = read8(PCA9685_MODE1);
uint8_t newmode = (oldmode&0x7F) | 0x10;
write8(PCA9685_MODE1, newmode);
write8(PCA9685_PRESCALE, prescale);
write8(PCA9685_MODE1, oldmode);
delay(5);
write8(PCA9685_MODE1, oldmode | 0xa1);
}
void ServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
WIRE.beginTransmission(_i2caddr);
WIRE.write(LED0_ON_L+4*num);
WIRE.write(on);
WIRE.write(on>>8);
WIRE.write(off);
WIRE.write(off>>8);
WIRE.endTransmission();
}
uint8_t ServoDriver::read8(uint8_t addr) {
WIRE.beginTransmission(_i2caddr);
WIRE.write(addr);
WIRE.endTransmission();
WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)1);
return WIRE.read();
}
void ServoDriver::write8(uint8_t addr, uint8_t d) {
WIRE.beginTransmission(_i2caddr);
WIRE.write(addr);
WIRE.write(d);
WIRE.endTransmission();
}