Els servomotors són motors elèctrics que incorporen un sistema de control que permet establir la posició angular del seu eix. Això és molt útil quan necessitem una certa precisió en els moviments.
Un servo conté un motor de corrent continu, un sistema d'engranatges per reduir la velocitat i augmentar el parell (la força), i un sistema de control electrònic integrat dins d'una sola carcassa.
Nosaltres utilitzem microservos SG90. El seu eix pot girar en el rang de 0 a 180 graus, i tenen una precissió d'1 grau (podem fer-los girar de grau en grau).
.
Generalment el cable vermell va a 5V, el negre a terra (GND) i el blanc o groc és el que rep el senyal del pin de l'ESP32.
Tots els pins de sortida de l'ESP32 poden generar senyals PWM, que són les que utilitza el servo. Diagrama de pins 👀
Jo he connectat el meu al pin 13
Sobre l'alimentació. En principi els servos necessiten 5V per funcionar. Si només n'utilitzem un podem alimentar-lo des del pin VIN de la placa, que proporciona 5V. Inclús podem arribar a alimentar-lo des del pin d'alimentació de 3.3V.
Si hem d'utilitzar més servos, necessitarem una font d'alimentació externa (assegureu-vos que no sigui superior a 6 V, ja que aquesta és la tensió màxima que poden prendre la majoria dels servos). En aquest cas cal connectar el terminal negatiu de la font d'alimentació externa amb un pin GND de la placa.
.
.
Pinout ESP32
PCA9685
És un controlador de 16 canals que pot controlar 16 sortides PWM a través de la comunicació I2C. Permet, entre altres coses, alliberar les entrades i sortides del microcontrolador i manejar fins a 16 LEDs o servomotors (o qualsevol altre mòdul que prengui un senyal PWM com a entrada) usant només dos pins (SCL i SDA)
Aquest mòdul té 6 ponts per seleccionar la direcció de la placa i així col·locar al mateix bus fins a 62 controladors per a un total de 992 actuadors (adreces disponibles 0x40 a 0x7F).
Podeu manejar sortides PWM amb freqüència ajustable i resolució de 12 bits. El mòdul és compatible amb microcontroladors de 5V i 3.3V.
El control dels servos consisteix a definir la seva posició mitjançant l'enviament de senyals PWM a una freqüència de 50 Hz (50 polsos per segon, que correspon a un pols cada 20 ms).
En funció de l'amplada del pols (entre 1 i 2 ms) obtenim diferents posicions de l'eix.
Recordeu que l'amplada del pols PWM es defineix amb el mètode duty(). Segons aquesta referència 👀 per al servo SG-90 els valors entre 40 i 115 corresponen al moviment de posició de 0-180 graus, sent 77 el valor central (90º).
He anat provant valors. El mínim duty amb que respon en el meu cas és 22, i el màxim, 132. Per tant el mig és 77.
PWM.duty(22) -> 0º
PWM.duty(77) -> 90º
PWM.duty(132) -> 180º
Abans de programar els moviments d'un servo cal saber quins són els angles mínim i màxim a que pot anar sense atascar-se o forçar-se, i definir la seva posició de repòs o d'inici.
Comencem doncs programant el posicionament del servo a 90º (posició central), col·loquem la peça d'acoblament de manera que a 90º quedi vertical. Utilitzeu la protuberància a la part superior del servo com a referència per la posició 90º.
from machine import Pin, PWM
# configuracio objecte servo
servo = PWM(Pin(13),freq=50) # pin de connexio i frequencia dels senyals servo 50 Hz
# configuracio del pols PWM per establir el posicionament del servo
servo.duty(77) # ample del pols corresponent a 90 graus
Ara posicionem a 0º des de la posició de referència. El bracet hauria de girar en sentit antihorari. Si notem que en aquesta posició el servo queda forçat caldrà ajustar el valor.
A continuació posicionem a 180º. El bracet hauria de girar en sentit horari fins a la nova posició.