.. note::
¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en 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 temprano a nuevos anuncios de productos y adelantos.
- **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
- **Promociones festivas y sorteos**: 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_py:
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
- ELEMENTOS 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:** Montar el circuito.
.. image:: ../img/image125.png
**Paso 2**: Ir a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python/
**Paso 3**: Ejecutar el archivo ejecutable.
.. raw:: html
.. code-block::
sudo python3 1.3.2_Servo.py
Después de ejecutar el programa, el servo girará de 0 grados a 180 grados,
y luego de 180 grados a 0 grados, en forma circular.
**Código**
.. note::
Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como ``raphael-kit/python``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import time
SERVO_MIN_PULSE = 500
SERVO_MAX_PULSE = 2500
ServoPin = 18
def map(value, inMin, inMax, outMin, outMax):
return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin
def setup():
global p
GPIO.setmode(GPIO.BCM) # Numerar los GPIOs por BCM
GPIO.setup(ServoPin, GPIO.OUT) # Configurar el modo de ServoPin como salida
GPIO.output(ServoPin, GPIO.LOW) # Establecer ServoPin en bajo
p = GPIO.PWM(ServoPin, 50) # Establecer frecuencia a 50Hz
p.start(0) # Ciclo de trabajo = 0
def setAngle(angle): # hacer que el servo gire a un ángulo específico (0-180 grados)
angle = max(0, min(180, angle))
pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE)
pwm = map(pulse_width, 0, 20000, 0, 100)
p.ChangeDutyCycle(pwm)#mapear el ángulo al ciclo de trabajo y enviarlo
def loop():
while True:
for i in range(0, 181, 5): #hacer que el servo gire de 0 a 180 grados
setAngle(i) # Escribir al servo
time.sleep(0.002)
time.sleep(1)
for i in range(180, -1, -5): #hacer que el servo gire de 180 a 0 grados
setAngle(i)
time.sleep(0.001)
time.sleep(1)
def destroy():
p.stop()
GPIO.cleanup()
if __name__ == '__main__': # El programa empieza aquí
setup()
try:
loop()
except KeyboardInterrupt: # Cuando se presiona 'Ctrl+C', se ejecutará el programa destroy().
destroy()
**Explicación del Código**
.. code-block:: python
p = GPIO.PWM(ServoPin, 50) # set Frequecy to 50Hz
p.start(0) # Duty Cycle = 0
Configura el ServoPin como pin PWM, luego la frecuencia a 50Hz y el periodo a 20ms.
p.start(0): Ejecuta la función PWM y establece el valor inicial en 0.
.. code-block:: python
def setAngle(angle): # make the servo rotate to specific angle (0-180 degrees)
angle = max(0, min(180, angle))
pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE)
pwm = map(pulse_width, 0, 20000, 0, 100)
p.ChangeDutyCycle(pwm)#map the angle to duty cycle and output it
Crea una función, setAngle() para escribir un ángulo que varía de 0 a 180 en el servo.
.. code-block:: python
angle = max(0, min(180, angle))
Este código se utiliza para limitar el ángulo dentro del rango 0-180°.
La función min() devuelve el mínimo de los valores de entrada. Si 180<ángulo, entonces devuelve 180, si no, devuelve ángulo.
El método max() devuelve el elemento máximo en un iterable o el mayor de dos o más parámetros. Si 0>ángulo, entonces devuelve 0, si no, devuelve ángulo.
.. code-block:: python
pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE)
pwm = map(pulse_width, 0, 20000, 0, 100)
p.ChangeDutyCycle(pwm)
Para establecer un rango de 0 ~ 180° en el servo, el ancho de pulso del servo se establece en 0.5ms (500us) - 2.5ms (2500us).
El periodo del PWM es de 20ms (20000us), por lo tanto, el ciclo de trabajo del PWM es (500/20000)% - (2500/20000)%, y el rango 0 ~ 180 se mapea a 2.5 ~ 12.5.
Imagen del Fenómeno
-----------------------
.. image:: ../img/image126.jpeg