.. note::
¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.
**¿Por qué unirse?**
- **Soporte Experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
- **Aprender y Compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
- **Avances Exclusivos**: Accede anticipadamente a anuncios de nuevos productos y avances.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
- **Promociones Festivas y Sorteos**: Participa en sorteos y promociones navideñas.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy!
1.3.2 Servo
==============
Introducción
----------------
En esta lección, aprenderemos a hacer girar un servo.
Componentes
-------------
.. image:: img/list_1.3.2.png
Principio
-----------
**Servo**
Un servo está compuesto generalmente por las siguientes partes: carcasa, eje,
sistema de engranajes, potenciómetro, motor de CC y placa embebida.
.. image:: img/image121.png
Funciona de la siguiente manera: el microcontrolador envía señales PWM al servo,
y la placa embebida en el servo recibe las señales a través del pin de señal y
controla el motor interno para girar. Como resultado, el motor acciona el sistema
de engranajes y luego motiva el eje después de la desaceleración. El eje y el
potenciómetro del servo están conectados entre sí. Cuando el eje gira, acciona
el potenciómetro, que a su vez emite una señal de voltaje a la placa embebida.
Luego, la placa determina la dirección y velocidad de rotación en función de la
posición actual, permitiendo que el servo se detenga exactamente en la posición
definida y se mantenga ahí.
.. image:: img/image122.png
El ángulo se determina por la duración de un pulso que se aplica al cable de
control. Esto se llama Modulación por Ancho de Pulso (PWM). El servo espera
recibir un pulso cada 20 ms. La longitud del pulso determinará cuánto gira el
motor. Por ejemplo, un pulso de 1.5 ms hará que el motor gire a la posición de
90 grados (posición neutral).
Cuando se envía un pulso a un servo que es menor de 1.5 ms, el servo gira a una
posición y mantiene su eje de salida a algunos grados en sentido antihorario
desde el punto neutral. Cuando el pulso es mayor de 1.5 ms, ocurre lo contrario.
El ancho mínimo y máximo del pulso que ordenará al servo girar a una posición
válida son funciones de cada servo. Generalmente, el pulso mínimo será de
aproximadamente 0.5 ms de ancho y el pulso máximo será de 2.5 ms de ancho.
.. image:: img/image123.jpeg
Diagrama Esquemático
------------------------
.. image:: ../img/image337.png
Procedimientos Experimentales
-------------------------------
**Paso 1:** Construir el circuito.
.. image:: ../img/image125.png
**Paso 2**: Acceder a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/1.3.2
**Paso 3**: Compilar.
.. raw:: html
.. code-block::
gcc 1.3.2_Servo.c -lwiringPi
**Paso 4**: Ejecutar el archivo ejecutable.
.. raw:: html
.. code-block::
sudo ./a.out
Al ejecutar el programa, el servo girará de 0 grados a 180 grados, y luego
de 180 grados a 0 grados, de manera circular.
.. note::
Si no funciona después de ejecutarlo, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Código**
.. code-block:: c
#include
#include
#include
#define ServoPin 1 //define el servo en GPIO1
long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){
return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow;
}
void setAngle(int pin, int angle){ //Crea una función para controlar el ángulo del servo.
if(angle < 0)
angle = 0;
if(angle > 180)
angle = 180;
softPwmWrite(pin,Map(angle, 0, 180, 5, 25));
}
int main(void)
{
int i;
if(wiringPiSetup() == -1){ //si la inicialización de wiring falla, imprime un mensaje en pantalla
printf("setup wiringPi failed !");
return 1;
}
softPwmCreate(ServoPin, 0, 200); //inicializa el pin PMW del servo
while(1){
for(i=0;i<181;i++){ // Permite que el servo gire de 0 a 180. setAngle(ServoPin,i);
delay(2);
}
delay(1000);
for(i=181;i>-1;i--){ // Permite que el servo gire de 180 a 0. setAngle(ServoPin,i);
delay(2);
}
delay(1000);
}
return 0;
}
**Explicación del Código**
.. code-block:: c
long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){
return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow;
}
Crea una función Map() para mapear valores en el siguiente código.
.. code-block:: c
void setAngle(int pin, int angle){ //Crea una función para controlar el ángulo del servo.
if(angle < 0)
angle = 0;
if(angle > 180)
angle = 180;
softPwmWrite(pin,Map(angle, 0, 180, 5, 25));
}
Crea una función, setAngle(), para escribir el ángulo en el servo.
.. code-block:: c
softPwmWrite(pin,Map(angle,0,180,5,25));
Esta función puede cambiar el ciclo de trabajo del PWM.
Para hacer que el servo gire de 0 a 180 °, el ancho del pulso debe cambiar
dentro del rango de 0.5 ms a 2.5 ms cuando el período es de 20 ms; en la
función softPwmCreate(), hemos establecido que el período es
200x100us=20ms, por lo que necesitamos mapear de 0 a 180 a 5x100us a 25x100us.
El prototipo de esta función se muestra a continuación.
.. code-block::
int softPwmCreate(int pin,int initialValue,int pwmRange);
**Parámetro pin:** Cualquier pin GPIO de Raspberry Pi puede configurarse como pin PWM.
**Parámetro initialValue:** El ancho del pulso inicial es el valor inicial
multiplicado por 100us.
**Parámetro pwmRange:** el período del PWM es el rango PWM multiplicado por 100us.