Her er basis kode for å styre en Servo, med den innebyggede PWM funksjonaliteten:
Sitat// Servo PWMconst int pwmServoPin = GPIO_NUM_25;const int pwmServoFreq = 50;const int pwmServoChannel = 0;const int pwmServoResolution = 8;int iPos;void setup() {Serial.begin(115200);// configure Servo PWMledcSetup(pwmServoChannel, pwmServoFreq, pwmServoResolution);// attach the channel to the GPIO to be controlledledcAttachPin(pwmServoPin, pwmServoChannel);}void loop() {iPos1=10; //servo posisjon, teoretisk 0-255ledcWrite(pwmServoChannel, iPos);}
Det er gøy å få ting til å bevege seg og servoer er enkle å jobbe med.
En servo er en motor med girkasse og en tilbakekobling for å kunne sjekke sin egen posisjon. Når den får beskjed om å flytte seg til en ny posisjon starter den motoren og stopper når sensoren sier den er kommet dit.
Små billige servoer styres med pulser der bredden på pulsen styrer posisjonen. Den kobles til med 3 ledninger: Pluss, minus og Puls-Signal. Her er noen vanlige fargekodinger:
Det finnes noen Servo biblioteker en kan bruke men noen av den fungerer ikke med ESP32.
Fordi ESP32 har innebygget funksjonalitet for å styre LED med pulsbredde bruker jeg like godt dette istedet.
(Som dere ser ligner koden på viftestyringen i forrige guide)
Forskjellige servoer har forskjellige reaksjoner på pulsbredden. Noen lar motoren gå kontinuerlig på bestemte verdier og mange har bare små puls områder der de reagerer. Kanskje fra 10 til 30.
Jeg anbefaler å eksprimentere med den enkelte servo for å finne endeverdiene.
Om du skal mappe disse til et smarthus system som går fra 0 til 100 % (Som en dimmer) kan du gjøre dette med denne kommandoen:
Så kan du sette de endeverdiene du fant inn i konstanter slik:
Jeg preier likegodt å eksponere både den mappede og den rå posisjonen over MQTT interfacet. (Det koster jo så lite) Så blir testingen (og evnt. rejustering) enklere.
Her er kode for å styre 2 servoer over MQTT med både rå og mappede verdier:
Sitat#define ONBOARD_LED 2 // Onboard LED#include <EspMQTTClient.h>// Servo PWMconst int pwmServo1Pin = GPIO_NUM_25;const int pwmServo2Pin = GPIO_NUM_26;const int pwmServoFreq = 50;const int pwmServo1Channel = 0;const int pwmServo2Channel = 1;const int pwmServoResolution = 8;#define MIN_SERVO1_POS 12#define MAX_SERVO1_POS 30#define MIN_SERVO2_POS 9#define MAX_SERVO2_POS 33int iPos1=MAX_SERVO1_POS; // Start i maxint iPos2=MAX_SERVO2_POS; // Start i max//MQTTEspMQTTClient MQTTclient("ThePromisedLAN", // SSID"Hallelujah!", // WiFi Password"192.168.1.2", // MQTT Broker server ip"", // MQTTUsername Can be omitted if not needed"", // MQTTPassword Can be omitted if not needed"servoClient", // Client name that uniquely identify your device1883 // The MQTT port, default to 1883. this line can be omitted);void setup() {Serial.begin(115200);// Set pin mode for ONBOARD_LEDpinMode(ONBOARD_LED,OUTPUT);digitalWrite(ONBOARD_LED,HIGH);// configure Servo 1 PWMledcSetup(pwmServo1Channel, pwmServoFreq, pwmServoResolution);// attach the channel to the GPIO to be controlledledcAttachPin(pwmServo1Pin, pwmServo1Channel);// configure Servo 2 PWMledcSetup(pwmServo2Channel, pwmServoFreq, pwmServoResolution);// attach the channel to the GPIO to be controlledledcAttachPin(pwmServo2Pin, pwmServo2Channel);// InitledcWrite(pwmServo1Channel, iPos1);ledcWrite(pwmServo2Channel, iPos2);MQTTclient.setKeepAlive(60);}void loop() {MQTTclient.loop();if (MQTTclient.isMqttConnected()) {digitalWrite(ONBOARD_LED,LOW);} else {digitalWrite(ONBOARD_LED,HIGH);}}void onConnectionEstablished(){Serial.println("onConnectionEstablished");MQTTclient.publish("servoClient/status", "started");// Servo 1MQTTclient.subscribe("servoClient/RawAngle1", [](const String & payload) {Serial.print("RawAngle1: ");Serial.println(payload);iPos1=payload.toInt();ledcWrite(pwmServo1Channel, iPos1);});MQTTclient.subscribe("servoClient/Angle1", [](const String & payload) {Serial.print("Angle1: ");Serial.println(payload);iPos1=payload.toInt();iPos1= map(iPos1,0,100,MIN_SERVO1_POS,MAX_SERVO1_POS);ledcWrite(pwmServo1Channel, iPos1);});// Servo 2MQTTclient.subscribe("servoClient/RawAngle2", [](const String & payload) {Serial.print("RawAngle2: ");Serial.println(payload);iPos2=payload.toInt();ledcWrite(pwmServo2Channel, iPos2);});MQTTclient.subscribe("servoClient/Angle2", [](const String & payload) {Serial.print("Angle2: ");Serial.println(payload);iPos2=payload.toInt();iPos2= map(iPos2,0,100,MIN_SERVO2_POS,MAX_SERVO2_POS);ledcWrite(pwmServo2Channel, iPos2);});}
Anbefalte kommentarer
Det er ingen kommentarer å vise.
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.