From 85ea4e995a75abe061f6fc375ea0481084dddd43 Mon Sep 17 00:00:00 2001 From: schererleander Date: Tue, 20 Jan 2026 08:34:54 +0100 Subject: initial commit --- libraries/ESP32Servo/examples/Knob/Knob.ino | 85 +++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 libraries/ESP32Servo/examples/Knob/Knob.ino (limited to 'libraries/ESP32Servo/examples/Knob') diff --git a/libraries/ESP32Servo/examples/Knob/Knob.ino b/libraries/ESP32Servo/examples/Knob/Knob.ino new file mode 100644 index 0000000..326679b --- /dev/null +++ b/libraries/ESP32Servo/examples/Knob/Knob.ino @@ -0,0 +1,85 @@ +/* + Controlling a servo position using a potentiometer (variable resistor) + by Michal Rinott + + modified on 8 Nov 2013 + by Scott Fitzgerald + + modified for the ESP32 on March 2017 + by John Bennett + + see http://www.arduino.cc/en/Tutorial/Knob for a description of the original code + + * Different servos require different pulse widths to vary servo angle, but the range is + * an approximately 500-2500 microsecond pulse every 20ms (50Hz). In general, hobbyist servos + * sweep 180 degrees, so the lowest number in the published range for a particular servo + * represents an angle of 0 degrees, the middle of the range represents 90 degrees, and the top + * of the range represents 180 degrees. So for example, if the range is 1000us to 2000us, + * 1000us would equal an angle of 0, 1500us would equal 90 degrees, and 2000us would equal 1800 + * degrees. + * + * Circuit: (using an ESP32 Thing from Sparkfun) + * Servo motors have three wires: power, ground, and signal. The power wire is typically red, + * the ground wire is typically black or brown, and the signal wire is typically yellow, + * orange or white. Since the ESP32 can supply limited current at only 3.3V, and servos draw + * considerable power, we will connect servo power to the VBat pin of the ESP32 (located + * near the USB connector). THIS IS ONLY APPROPRIATE FOR SMALL SERVOS. + * + * We could also connect servo power to a separate external + * power source (as long as we connect all of the grounds (ESP32, servo, and external power). + * In this example, we just connect ESP32 ground to servo ground. The servo signal pins + * connect to any available GPIO pins on the ESP32 (in this example, we use pin 18. + * + * In this example, we assume a Tower Pro SG90 small servo connected to VBat. + * The published min and max for this servo are 500 and 2400, respectively. + * These values actually drive the servos a little past 0 and 180, so + * if you are particular, adjust the min and max values to match your needs. + */ + +// Include the ESP32 Arduino Servo Library instead of the original Arduino Servo Library +#include + +Servo myservo; // create servo object to control a servo + +// Possible PWM GPIO pins on the ESP32: 0(used by on-board button),2,4,5(used by on-board LED),12-19,21-23,25-27,32-33 +// Possible PWM GPIO pins on the ESP32-S2: 0(used by on-board button),1-17,18(used by on-board LED),19-21,26,33-42 +// Possible PWM GPIO pins on the ESP32-S3: 0(used by on-board button),1-21,35-45,47,48(used by on-board LED) +// Possible PWM GPIO pins on the ESP32-C3: 0(used by on-board button),1-7,8(used by on-board LED),9-10,18-21 +int servoPin = 18; // GPIO pin used to connect the servo control (digital out) +// Possible ADC pins on the ESP32: 0,2,4,12-15,32-39; 34-39 are recommended for analog input +// Possible ADC pins on the ESP32-S2: 1-20 are recommended for analog input +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) +int potPin = 10; // GPIO pin used to connect the potentiometer (analog in) +#elif defined(CONFIG_IDF_TARGET_ESP32C3) +int potPin = 4; // GPIO pin used to connect the potentiometer (analog in) +#else +int potPin = 34; // GPIO pin used to connect the potentiometer (analog in) +#endif +int ADC_Max = 4096; // This is the default ADC max value on the ESP32 (12 bit ADC width); + // this width can be set (in low-level oode) from 9-12 bits, for a + // a range of max values of 512-4096 + +int val; // variable to read the value from the analog pin + +void setup() +{ + // Allow allocation of all timers + ESP32PWM::allocateTimer(0); + ESP32PWM::allocateTimer(1); + ESP32PWM::allocateTimer(2); + ESP32PWM::allocateTimer(3); + myservo.setPeriodHertz(50);// Standard 50hz servo + myservo.attach(servoPin, 500, 2400); // attaches the servo on pin 18 to the servo object + // using SG90 servo min/max of 500us and 2400us + // for MG995 large servo, use 1000us and 2000us, + // which are the defaults, so this line could be + // "myservo.attach(servoPin);" +} + +void loop() { + val = analogRead(potPin); // read the value of the potentiometer (value between 0 and 1023) + val = map(val, 0, ADC_Max, 0, 180); // scale it to use it with the servo (value between 0 and 180) + myservo.write(val); // set the servo position according to the scaled value + delay(200); // wait for the servo to get there +} + -- cgit v1.3.1