Added ServoPin() class to PwmPin.h
Controls a 50-Hz servo motor using ESP32 built-in LED PWM. Allows custom range for microseconds and degrees.
This commit is contained in:
parent
61655845a9
commit
65df97c563
|
|
@ -88,3 +88,44 @@ void PwmPin::HSVtoRGB(float h, float s, float v, float *r, float *g, float *b ){
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
|
||||
ServoPin::ServoPin(uint8_t channel, uint8_t pin, double initDegrees, uint16_t minMicros, uint16_t maxMicros, double minDegrees, double maxDegrees){
|
||||
this->channel=channel & 0x07;
|
||||
this->pin=pin;
|
||||
this->minMicros=minMicros;
|
||||
this->maxMicros=maxMicros;
|
||||
this->minDegrees=minDegrees;
|
||||
microsPerDegree=(double)(maxMicros-minMicros)/(maxDegrees-minDegrees);
|
||||
|
||||
ledc_timer_config_t ledTimer;
|
||||
ledTimer.timer_num=LEDC_TIMER_1;
|
||||
ledTimer.speed_mode=LEDC_HIGH_SPEED_MODE;
|
||||
ledTimer.duty_resolution=LEDC_TIMER_16_BIT;
|
||||
ledTimer.freq_hz=50;
|
||||
ledc_timer_config(&ledTimer);
|
||||
|
||||
ledChannel.gpio_num=pin;
|
||||
ledChannel.speed_mode=LEDC_HIGH_SPEED_MODE;
|
||||
ledChannel.channel=(ledc_channel_t)(this->channel);
|
||||
ledChannel.intr_type=LEDC_INTR_DISABLE;
|
||||
ledChannel.timer_sel=LEDC_TIMER_1;
|
||||
ledChannel.hpoint=0;
|
||||
ledChannel.duty*=micros2duty;
|
||||
set(initDegrees);
|
||||
}
|
||||
|
||||
void ServoPin::set(double degrees){
|
||||
ledChannel.duty=(degrees-minDegrees)*microsPerDegree+minMicros;
|
||||
|
||||
if(ledChannel.duty<minMicros)
|
||||
ledChannel.duty=minMicros;
|
||||
else if(ledChannel.duty>maxMicros)
|
||||
ledChannel.duty=maxMicros;
|
||||
|
||||
ledChannel.duty*=micros2duty;
|
||||
ledc_channel_config(&ledChannel);
|
||||
}
|
||||
|
||||
const double ServoPin::micros2duty=65535.0/20000.0;
|
||||
|
|
|
|||
|
|
@ -24,3 +24,23 @@ class PwmPin {
|
|||
static void HSVtoRGB(float h, float s, float v, float *r, float *g, float *b ); // converts Hue/Saturation/Brightness to R/G/B
|
||||
|
||||
};
|
||||
|
||||
class ServoPin {
|
||||
uint8_t channel; // channel must be in range [0,7] (only HighSpeed Channels will be used)
|
||||
uint8_t pin;
|
||||
uint16_t minMicros;
|
||||
uint16_t maxMicros;
|
||||
double minDegrees;
|
||||
double microsPerDegree;
|
||||
ledc_channel_config_t ledChannel;
|
||||
|
||||
static const double micros2duty;
|
||||
|
||||
public:
|
||||
ServoPin(uint8_t channel, uint8_t pin, double initDegrees, uint16_t minMicros, uint16_t maxMicros, double minDegrees, double maxDegrees);
|
||||
ServoPin(uint8_t channel, uint8_t pin, double initDegrees=0) : ServoPin(channel,pin,initDegrees,1000,2000,-90,90) {};
|
||||
|
||||
void set(double degrees); // sets the Servo to degrees, where degrees is bounded by [minDegrees,maxDegrees]
|
||||
int getPin(){return pin;} // returns the pin number
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -5,7 +5,10 @@
|
|||
#include "PwmPin.h"
|
||||
|
||||
PwmPin yellow(0,16);
|
||||
PwmPin red(1,17);
|
||||
PwmPin red(0,17);
|
||||
|
||||
//ServoPin servo(3,18,-90);
|
||||
ServoPin servo(3,18,0,500,2200,-90,90);
|
||||
|
||||
void setup(){
|
||||
|
||||
|
|
@ -20,6 +23,21 @@ void setup(){
|
|||
|
||||
void loop(){
|
||||
|
||||
|
||||
double STEP=1;
|
||||
|
||||
for(int i=-100*STEP;i<=100*STEP;i++){
|
||||
servo.set((double)i/STEP);
|
||||
delay(10);
|
||||
}
|
||||
|
||||
for(int i=100*STEP;i>=-100*STEP;i--){
|
||||
servo.set((double)i/STEP);
|
||||
delay(10);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
for(int i=0;i<100;i++){
|
||||
red.set(22,i);
|
||||
delay(10);
|
||||
|
|
|
|||
Loading…
Reference in New Issue