Nota

¡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 [Aquí] y únete hoy!

1.3.2 Servo

Introducción

En esta lección, aprenderemos a hacer girar un servo.

Componentes

../_images/list_1.3.21.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.

../_images/image1211.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í.

../_images/image1221.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.

../_images/image1231.jpeg

Diagrama Esquemático

../_images/image337.png

Procedimientos Experimentales

Paso 1: Construir el circuito.

../_images/image125.png

Paso 2: Acceder a la carpeta del código.

cd ~/davinci-kit-for-raspberry-pi/c/1.3.2

Paso 3: Compilar.

gcc 1.3.2_Servo.c -lwiringPi

Paso 4: Ejecutar el archivo ejecutable.

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.

Nota

Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory", consulta ¿El código en C no funciona?.

Código

#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>

#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

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.

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.

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.

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.