2022-03-25 18:26:57 +00:00
|
|
|
#include <cstdio>
|
|
|
|
#include "pico/stdlib.h"
|
|
|
|
|
|
|
|
#include "servo2040.hpp"
|
|
|
|
|
|
|
|
/*
|
|
|
|
Shows how to create servos with different common
|
|
|
|
calibrations, modify a servo's existing calibration,
|
|
|
|
and create a servo with a custom calibration.
|
|
|
|
*/
|
|
|
|
|
|
|
|
using namespace servo;
|
|
|
|
|
|
|
|
// Function for printing out the details of a Calibration object
|
|
|
|
void print_calibration(const Calibration &calib) {
|
|
|
|
printf("Calibration(");
|
|
|
|
|
|
|
|
uint size = calib.size();
|
|
|
|
printf("size = %d", size);
|
|
|
|
|
|
|
|
printf(", pairs = {");
|
|
|
|
for(uint i = 0; i < size; i++) {
|
|
|
|
const Calibration::Pair &pair = calib.pair(i);
|
|
|
|
printf("{%f, %f}",pair.pulse, pair.value);
|
|
|
|
if(i < size - 1)
|
|
|
|
printf(", ");
|
|
|
|
}
|
|
|
|
printf("}, limit_lower = %s", calib.has_lower_limit() ? "true" : "false");
|
|
|
|
printf(", limit_upper = %s", calib.has_upper_limit() ? "true" : "false");
|
|
|
|
printf(")\n\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
stdio_init_all();
|
|
|
|
|
|
|
|
// Sleep 8 seconds to give enough time to connect up a terminal
|
|
|
|
sleep_ms(8000);
|
|
|
|
|
|
|
|
// -----------------------------------------------------
|
|
|
|
// Create and modify the calibration of an angular servo
|
|
|
|
// -----------------------------------------------------
|
|
|
|
|
|
|
|
// Create an angular servo on pin 0. By default its value ranges from -90 to +90
|
|
|
|
Servo angular_servo = Servo(servo2040::SERVO_1, ANGULAR);
|
|
|
|
|
|
|
|
// Get a reference to the calibration and print it out
|
|
|
|
Calibration &acal = angular_servo.calibration();
|
|
|
|
printf("Angular Servo: ");
|
|
|
|
print_calibration(acal);
|
|
|
|
|
|
|
|
// The range we want the anglular servo to cover
|
|
|
|
constexpr float WIDE_ANGLE_RANGE = 270.0f;
|
|
|
|
|
|
|
|
// Lets modify the calibration to increase its range
|
2022-03-27 12:48:58 +01:00
|
|
|
acal.first_value(-WIDE_ANGLE_RANGE / 2);
|
|
|
|
acal.last_value(WIDE_ANGLE_RANGE / 2);
|
2022-03-25 18:26:57 +00:00
|
|
|
|
|
|
|
// As the calibration was a reference, the servo has already
|
|
|
|
// been updated, but lets access it again to confirm it worked
|
|
|
|
printf("Wide Angle Servo: ");
|
|
|
|
print_calibration(angular_servo.calibration());
|
|
|
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------
|
|
|
|
// Create and modify the calibration of a linear servo
|
|
|
|
// ---------------------------------------------------
|
|
|
|
|
|
|
|
// The range we want the linear servo to cover
|
|
|
|
constexpr float LINEAR_RANGE = 50.0f;
|
|
|
|
|
|
|
|
// Create a linear servo on pin 1. By default its value ranges from 0.0 to 1.0
|
|
|
|
Servo linear_servo = Servo(servo2040::SERVO_2, LINEAR);
|
|
|
|
|
|
|
|
// Update the linear servo so its max value matches the real distance travelled
|
|
|
|
Calibration &lcal = linear_servo.calibration();
|
2022-03-27 12:48:58 +01:00
|
|
|
lcal.last_value(LINEAR_RANGE);
|
2022-03-25 18:26:57 +00:00
|
|
|
|
|
|
|
// As the calibration was a reference, the servo has already
|
|
|
|
// been updated, but lets access it again to confirm it worked
|
|
|
|
printf("Linear Servo: ");
|
|
|
|
print_calibration(linear_servo.calibration());
|
|
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------
|
|
|
|
// Create and modify the calibration of a continuous rotation servo
|
|
|
|
// ----------------------------------------------------------------
|
|
|
|
|
|
|
|
// The speed we want the continuous servo to cover
|
|
|
|
constexpr float CONTINUOUS_SPEED = 10.0f;
|
|
|
|
|
|
|
|
// Create a continous rotation servo on pin 2. By default its value ranges from -1.0 to +1.0
|
|
|
|
Servo continuous_servo = Servo(servo2040::SERVO_3, CONTINUOUS);
|
|
|
|
|
|
|
|
// Update the continuous rotation servo so its value matches its real speed
|
|
|
|
Calibration &ccal = continuous_servo.calibration();
|
2022-03-27 12:48:58 +01:00
|
|
|
ccal.first_value(-CONTINUOUS_SPEED);
|
|
|
|
ccal.last_value(CONTINUOUS_SPEED);
|
2022-03-25 18:26:57 +00:00
|
|
|
|
|
|
|
// As the calibration was a reference, the servo has already
|
|
|
|
// been updated, but lets access it again to confirm it worked
|
|
|
|
printf("Continuous Servo: ");
|
|
|
|
print_calibration(continuous_servo.calibration());
|
|
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------------------
|
|
|
|
// Create a custom calibration and build a servo using it
|
|
|
|
// ------------------------------------------------------
|
|
|
|
|
|
|
|
// Create an empty calibration
|
|
|
|
Calibration ecal = Calibration();
|
|
|
|
|
|
|
|
// Give it a range of -45 to 45 degrees, corresponding to pulses of 1000 and 2000 microseconds
|
|
|
|
ecal.apply_two_pairs(1000, 2000, -45, 45);
|
|
|
|
|
|
|
|
// Turn off the lower and upper limits, so the servo can go beyond 45 degrees
|
|
|
|
ecal.limit_to_calibration(false, false);
|
|
|
|
|
|
|
|
// Create a servo on pin 3 using the custom calibration and confirmed it worked
|
|
|
|
Servo custom_servo = Servo(servo2040::SERVO_4, ecal);
|
|
|
|
printf("Custom Servo: ");
|
|
|
|
print_calibration(custom_servo.calibration());
|
|
|
|
}
|