Skip to content

Commit ed98bae

Browse files
committed
pca9685 test on Lab Robot
motor shake, maybe the battery cap is not enough
1 parent 8ea1aae commit ed98bae

File tree

3 files changed

+189
-0
lines changed

3 files changed

+189
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include <Arduino.h>
2+
#include "Actuator.h"
3+
#include "Adafruit_PWMServoDriver.h"
4+
5+
6+
/**
7+
*
8+
* ^ Y
9+
* |
10+
* back |---> X forward
11+
* Z
12+
*
13+
*/
14+
Actuator::Actuator()
15+
{
16+
// init servo driver, default address 0x40
17+
pwm = new Adafruit_PWMServoDriver();
18+
19+
}
20+
21+
22+
void Actuator::init()
23+
{
24+
Serial.println("init pwm driver");
25+
pwm->begin();
26+
pwm->setPWMFreq(freq);
27+
Serial.println("init legs");
28+
legFL = new Leg();
29+
legFR = new Leg();
30+
legRR = new Leg();
31+
legRL = new Leg();
32+
LegPtr legs[4] {legFL, legFR, legRR, legRL};
33+
// 1 the same with axis, -1 the opposite
34+
const int8_t servo_dir[12]{1, -1, -1, 1, 1, 1, -1, 1, 1, -1, -1, -1};
35+
const float init_ang[12]{35, 90, 180, 125, 83, 5, 40, 85, 180, 127, 83, 0};
36+
for (uint8_t i = 0; i < 4; i++)
37+
{
38+
legs[i]->sRoll = new Servo(i * 3, servo_dir[i * 3], init_ang[i * 3]);
39+
legs[i]->sPitch = new Servo(i * 3 + 1, servo_dir[i * 3 + 1], init_ang[i * 3 + 1]);
40+
legs[i]->sKnee = new Servo(i * 3 + 2, servo_dir[i * 3 + 2], init_ang[i * 3 + 2]);
41+
}
42+
}
43+
44+
45+
void Actuator::set_servo_pulse(ServoPtr servo, double pulse)
46+
{
47+
double pulseleng;
48+
pulseleng = 1000000; // 1,000,000 per second
49+
pulseleng /= freq;
50+
pulseleng /= resolution;
51+
pulse *= 1000; // convert to us
52+
pulse /= pulseleng;
53+
pwm->setPWM(servo->id, 0, pulse);
54+
}
55+
56+
57+
void Actuator::write_servo_ang(ServoPtr servo , float angle)
58+
{
59+
double pulse;
60+
pulse = 0.5 + angle / 90.0;
61+
set_servo_pulse(servo, pulse);
62+
servo->angle = angle;
63+
}
64+
65+
66+
void Actuator::adjust() {
67+
// adjust front left leg
68+
write_servo_ang(legFL->sRoll, legFL->sRoll->init_ang);
69+
write_servo_ang(legFL->sPitch, legFL->sPitch->init_ang);
70+
write_servo_ang(legFL->sKnee, legFL->sKnee->init_ang);
71+
72+
write_servo_ang(legFR->sRoll, legFR->sRoll->init_ang);
73+
write_servo_ang(legFR->sPitch, legFR->sPitch->init_ang);
74+
write_servo_ang(legFR->sKnee, legFR->sKnee->init_ang);
75+
76+
write_servo_ang(legRR->sRoll, legRR->sRoll->init_ang);
77+
write_servo_ang(legRR->sPitch, legRR->sPitch->init_ang);
78+
write_servo_ang(legRR->sKnee, legRR->sKnee->init_ang);
79+
80+
write_servo_ang(legRL->sRoll, legRL->sRoll->init_ang);
81+
write_servo_ang(legRL->sPitch, legRL->sPitch->init_ang);
82+
write_servo_ang(legRL->sKnee, legRL->sKnee->init_ang);
83+
}
84+
85+
86+
Actuator::~Actuator()
87+
{
88+
delete pwm;
89+
pwm = nullptr;
90+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#ifndef ACTUATOR_H
2+
#define ACTUATOR_H
3+
4+
#include <Arduino.h>
5+
#include "Actuator.h"
6+
#include "Adafruit_PWMServoDriver.h"
7+
8+
9+
struct Servo
10+
{
11+
uint8_t id;
12+
int8_t dir;
13+
float init_ang; // in degrees
14+
float angle; // current angle in degrees
15+
Servo(uint8_t _id, int8_t _dir, float _init_ang) {
16+
id = _id;
17+
dir = _dir;
18+
init_ang = _init_ang;
19+
angle = _init_ang;
20+
}
21+
};
22+
typedef Servo* ServoPtr;
23+
24+
25+
struct Leg
26+
{
27+
ServoPtr sRoll;
28+
ServoPtr sPitch;
29+
ServoPtr sKnee;
30+
};
31+
typedef Leg* LegPtr;
32+
33+
34+
class Actuator
35+
{
36+
private:
37+
const uint8_t dof{12};
38+
const uint8_t freq{50}; // Hz
39+
const uint16_t resolution{4096}; // 12 bits
40+
Adafruit_PWMServoDriver *pwm;
41+
LegPtr legFL;
42+
LegPtr legFR;
43+
LegPtr legRR;
44+
LegPtr legRL;
45+
46+
void set_servo_pulse(ServoPtr servo, double pulse);
47+
void write_servo_ang(ServoPtr servo, float ang);
48+
49+
public:
50+
Actuator(/* args */);
51+
~Actuator();
52+
void init();
53+
void adjust();
54+
55+
};
56+
57+
#endif
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include "Actuator.h"
2+
3+
Actuator Act;
4+
5+
void setup() {
6+
// put your setup code here, to run once:
7+
Serial.begin(9600);
8+
Serial.setTimeout(10);
9+
while (!Serial);
10+
// wait for ready
11+
while (Serial.available() && Serial.read()); // empty buffer
12+
delay(1000);
13+
14+
Act.init();
15+
16+
Serial.print(
17+
"Please select from menu: \n"
18+
" 1. adjust\n"
19+
" 2. stand\n"
20+
);
21+
}
22+
23+
void loop() {
24+
// put your main code here, to run repeatedly:
25+
String serial_in_str {""};
26+
while(Serial.available() > 0) {
27+
char inChar = Serial.read();
28+
serial_in_str += (char)inChar;
29+
// wait for input buffer read
30+
delay(10);
31+
}
32+
if(serial_in_str != "")
33+
{
34+
Serial.print("Command received: ");
35+
Serial.println(serial_in_str);
36+
int command_code = serial_in_str.toInt();
37+
38+
Act.adjust();
39+
40+
41+
}
42+
}

0 commit comments

Comments
 (0)