1.) Put library code in the Arduino/libraries folder and #include them from there, not in the directory of the ino
2.) It's a good idea to host library code on GitHub for ease of cloning/installing and version control - it also makes it easier for us to look at it
3.) Try this:
ino:
#include <Servo.h>
#include <walk.h>
int iteration = 0;
// Instantiate robot class. Default constructor attaches the servos to pins.
Robot robot;
void setup() {
robot.begin();
delay(1000);
// calibrate motors to rest position.
goToRestPos(robot);
}
void loop() {
// put your main code here, to run repeatedly:
if (iteration<10) {
walkOneStep(robot);
iteration++;
}
}
robot.h:
#include <Arduino.h>
#include <Servo.h>
class Robot {
public:
Servo servo_front_right_top;
Servo servo_front_right_bot;
Servo servo_front_left_top;
Servo servo_front_left_bot;
Servo servo_back_right_top;
Servo servo_back_right_bot;
Servo servo_back_left_top;
Servo servo_back_left_bot;
const int ANGLE_rest_front_right_topShaft = 125;
const int ANGLE_rest_front_left_topShaft = 55;
const int ANGLE_rest_back_left_topShaft = 90;
const int ANGLE_rest_back_right_topShaft = 90;
const int ANGLE_rest_botShaft = 45;
const int SWEEP_ANGLE_front = 20; // size of step
const int SWEEP_ANGLE_back = 35; // size of step
const int ANGLE_res = 10;
void begin() {
// Assign motor pins
servo_front_right_top.attach(7);
servo_front_right_bot.attach(6);
servo_front_left_top.attach(2);
servo_front_left_bot.attach(3);
servo_back_right_top.attach(9);
servo_back_right_bot.attach(8);
servo_back_left_top.attach(5);
servo_back_left_bot.attach(4);
}
};
walk.h:
#include <Servo.h>
#include <robot.h>
void walkOneLeg(Servo servo, int targetAngle, int restAngle, int stepSize);
void liftLeg(Servo servo);
void restLeg(Servo servo);
void goToRestPos(Robot robot);
void walkOneStep(Robot robot);
void turnRightOneStep();
void turnLeftOneStep();
walk.cpp:
#include <Arduino.h>
#include <walk.h>
#include <Servo.h>
void walkOneLeg(Servo servo, int targetAngle, int restAngle, int stepSize, Robot robot) {
int counter = 0;
while (counter < (stepSize/robot.ANGLE_res)) {
counter++;
int ANGLE_topShaft = map(counter, 1, (stepSize/robot.ANGLE_res), restAngle, targetAngle);
servo.write(ANGLE_topShaft);
delay(50);
}
delay(50);
}
void liftLeg(Servo servo, Robot robot) {
servo.write(robot.ANGLE_rest_botShaft+30);
delay(50);
}
void restLeg(Servo servo, Robot robot) {
servo.write(robot.ANGLE_rest_botShaft);
delay(50);
}
void goToRestPos(Robot robot) {
robot.servo_front_right_top.write(robot.ANGLE_rest_front_right_topShaft);
robot.servo_front_right_bot.write(robot.ANGLE_rest_botShaft);
robot.servo_front_left_top.write(robot.ANGLE_rest_front_left_topShaft);
robot.servo_front_left_bot.write(robot.ANGLE_rest_botShaft);
robot.servo_back_right_top.write(robot.ANGLE_rest_back_right_topShaft);
robot.servo_back_right_bot.write(robot.ANGLE_rest_botShaft);
robot.servo_back_left_top.write(robot.ANGLE_rest_back_left_topShaft);
robot.servo_back_left_bot.write(robot.ANGLE_rest_botShaft);
delay(500);
}
void walkOneStep(Robot robot) {
liftLeg(robot.servo_back_right_bot, robot);
walkOneLeg(
robot.servo_back_right_top,
robot.ANGLE_rest_back_right_topShaft - robot.SWEEP_ANGLE_back,
robot.ANGLE_rest_back_right_topShaft,
robot.SWEEP_ANGLE_back, robot);
restLeg(robot.servo_back_right_bot, robot);
liftLeg(robot.servo_back_left_bot, robot);
walkOneLeg(
robot.servo_back_left_top,
robot.ANGLE_rest_back_left_topShaft + robot.SWEEP_ANGLE_back,
robot.ANGLE_rest_back_left_topShaft,
robot.SWEEP_ANGLE_back, robot);
restLeg(robot.servo_back_left_bot, robot);
liftLeg(robot.servo_front_right_bot, robot);
walkOneLeg(
robot.servo_front_right_top,
robot.ANGLE_rest_front_right_topShaft - robot.SWEEP_ANGLE_front,
robot.ANGLE_rest_front_right_topShaft,
robot.SWEEP_ANGLE_front, robot);
restLeg(robot.servo_front_right_bot, robot);
liftLeg(robot.servo_front_left_bot, robot);
walkOneLeg(
robot.servo_front_left_top,
robot.ANGLE_rest_front_left_topShaft + robot.SWEEP_ANGLE_front,
robot.ANGLE_rest_front_left_topShaft,
robot.SWEEP_ANGLE_front, robot);
restLeg(robot.servo_front_left_bot, robot);
goToRestPos(robot);
}
void turnRightOneStep(Robot robot) {
liftLeg(robot.servo_back_right_bot, robot);
walkOneLeg(
robot.servo_back_right_top,
robot.ANGLE_rest_back_right_topShaft + robot.SWEEP_ANGLE_back,
robot.ANGLE_rest_back_right_topShaft,
robot.SWEEP_ANGLE_back, robot);
restLeg(robot.servo_back_right_bot, robot);
delay(100);
liftLeg(robot.servo_back_left_bot, robot);
walkOneLeg(robot.servo_back_left_top,
robot.ANGLE_rest_back_left_topShaft + robot.SWEEP_ANGLE_back,
robot.ANGLE_rest_back_left_topShaft,
robot.SWEEP_ANGLE_back, robot);
restLeg(robot.servo_back_left_bot, robot);
delay(100);
liftLeg(robot.servo_front_right_bot, robot);
walkOneLeg(
robot.servo_front_right_top,
robot.ANGLE_rest_front_right_topShaft + robot.SWEEP_ANGLE_front,
robot.ANGLE_rest_front_right_topShaft,
robot.SWEEP_ANGLE_front, robot);
restLeg(robot.servo_front_right_bot, robot);
delay(100);
liftLeg(robot.servo_front_left_bot, robot);
walkOneLeg(robot.servo_front_left_top,
robot.ANGLE_rest_front_left_topShaft + robot.SWEEP_ANGLE_front,
robot.ANGLE_rest_front_left_topShaft,
robot.SWEEP_ANGLE_front, robot);
restLeg(robot.servo_front_left_bot, robot);
delay(100);
goToRestPos(robot);
}
void turnLeftOneStep(Robot robot) {
liftLeg(robot.servo_back_right_bot, robot);
walkOneLeg(
robot.servo_back_right_top,
robot.ANGLE_rest_back_right_topShaft - robot.SWEEP_ANGLE_back,
robot.ANGLE_rest_back_right_topShaft,
robot.SWEEP_ANGLE_back, robot);
restLeg(robot.servo_back_right_bot, robot);
delay(100);
liftLeg(robot.servo_back_left_bot, robot);
walkOneLeg(
robot.servo_back_left_top,
robot.ANGLE_rest_back_left_topShaft - robot.SWEEP_ANGLE_back,
robot.ANGLE_rest_back_left_topShaft,
robot.SWEEP_ANGLE_back, robot);
restLeg(robot.servo_back_left_bot, robot);
delay(100);
liftLeg(robot.servo_front_right_bot, robot);
walkOneLeg(
robot.servo_front_right_top,
robot.ANGLE_rest_front_right_topShaft - robot.SWEEP_ANGLE_front,
robot.ANGLE_rest_front_right_topShaft,
robot.SWEEP_ANGLE_front, robot);
restLeg(robot.servo_front_right_bot, robot);
delay(100);
liftLeg(robot.servo_front_left_bot, robot);
walkOneLeg(
robot.servo_front_left_top,
robot.ANGLE_rest_front_left_topShaft - robot.SWEEP_ANGLE_front,
robot.ANGLE_rest_front_left_topShaft,
robot.SWEEP_ANGLE_front, robot);
restLeg(robot.servo_front_left_bot, robot);
delay(100);
goToRestPos(robot);
}