.. 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.