.. note:: ¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte Experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprende y Comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Avances Exclusivos**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos. - **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos. - **Promociones y Sorteos Festivos**: Participa en sorteos y promociones de temporada. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo! .. _1.3.2_c: 1.3.2 Servo =================== Introducción ---------------- En este proyecto, aprenderemos a hacer que el servo gire. Componentes Necesarios -------------------------------- En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/list_1.3.2.png Es definitivamente conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ARTÍCULOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado en los enlaces a continuación. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DEL COMPONENTE - ENLACE DE COMPRA * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_servo` - |link_servo_buy| Diagrama Esquemático ----------------------- .. image:: ../img/image337.png Procedimientos Experimentales -------------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/image125.png **Paso 2**: Ve a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/c/1.3.2 **Paso 3**: Compila el código. .. raw:: html .. code-block:: gcc 1.3.2_Servo.c -lwiringPi **Paso 4**: Ejecuta el archivo ejecutable. .. raw:: html .. code-block:: sudo ./a.out Después de ejecutar el programa, el servo rotará de 0 grados a 180 grados, y luego de 180 grados a 0 grados, en un ciclo continuo. .. note:: Si no funciona después de ejecutarlo, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", por favor consulta :ref:`install_wiringpi`. **Código** .. code-block:: c #include #include #include #define ServoPin 1 //define the servo to 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){ //Create a funtion to control the angle of the 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){ //when initialize wiring failed,print message to screen printf("setup wiringPi failed !"); return 1; } softPwmCreate(ServoPin, 0, 200); //initialize PMW pin of servo while(1){ for(i=0;i<181;i++){ // Let servo rotate from 0 to 180. setAngle(ServoPin,i); delay(2); } delay(1000); for(i=181;i>-1;i--){ // Let servo rotate from 180 to 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){ //Create a funtion to control the angle of the 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 de pulso debe cambiar dentro del rango de 0.5ms a 2.5ms cuando el período es de 20ms; en la función, ``softPwmCreate()``, hemos establecido que el período es 200x100us = 20ms, por lo que necesitamos mapear 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); * ``pin``: Cualquier pin GPIO de Raspberry Pi puede configurarse como pin PWM. * ``initialValue``: El ancho de pulso inicial es ese initialValue multiplicado por 100us. * ``pwmRange``: el período del PWM es ese pwmRange multiplicado por 100us. Imagen del Fenómeno ------------------------- .. image:: ../img/image126.jpeg