.. 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.3_stepper_c_pi5:
1.3.3 Motor Paso a Paso
===========================
Introducción
----------------
Los motores paso a paso, debido a su diseño único, pueden ser controlados
con un alto grado de precisión sin necesidad de mecanismos de retroalimentación.
El eje de un motor paso a paso, montado con una serie de imanes, es controlado
por un conjunto de bobinas electromagnéticas que se cargan de manera positiva
y negativa en una secuencia específica, moviéndolo hacia adelante o hacia atrás
en pequeños "pasos".
Componentes
--------------
.. image:: img/list_1.3.3.png
Principio
--------------
**Motor Paso a Paso**
Los motores paso a paso, debido a su diseño único, pueden controlarse con un
alto grado de precisión sin ningún mecanismo de retroalimentación. El eje de
un motor paso a paso, montado con una serie de imanes, es controlado por una
serie de bobinas electromagnéticas que se cargan positiva y negativamente en
una secuencia específica, moviéndolo hacia adelante o hacia atrás en pequeños "pasos".
.. image:: img/image129.png
En la figura, en el medio del motor hay un rotor, que es un imán permanente en
forma de engranaje. Alrededor del rotor, del 0 al 5 hay dientes. Más afuera,
hay 8 polos magnéticos, con cada dos opuestos conectados por un devanado de
bobina. Así forman cuatro pares de A a D, lo que se llama una fase. Tiene cuatro
cables de conexión que se conectan a los interruptores SA, SB, SC y SD. Por lo
tanto, las cuatro fases están en paralelo en el circuito, y los dos polos
magnéticos en una fase están en serie.
**Así es como funciona un motor paso a paso de 4 fases:**
Cuando el interruptor SB está encendido, los interruptores SA, SC y SD están
apagados, y los polos magnéticos de la fase B se alinean con los dientes 0 y 3
del rotor. Al mismo tiempo, los dientes 1 y 4 generan dientes desfasados con los
polos de la fase C y D. Los dientes 2 y 5 generan dientes desfasados con los
polos de la fase D y A. Cuando el interruptor SC está encendido, los interruptores SB,
SA y SD están apagados, el rotor gira bajo el campo magnético del devanado de la fase
C y entre los dientes 1 y 4. Luego, los dientes 1 y 4 se alinean con los polos magnéticos
del devanado de la fase C. Mientras tanto, los dientes 0 y 3 generan dientes desfasados
con los polos de la fase A y B, y los dientes 2 y 5 generan dientes desfasados con los polos
magnéticos de las fases A y D. La situación similar continúa. Energiza las fases A, B, C y D en
secuencia, y el rotor girará en el orden de A, B, C y D.
.. image:: img/image130.png
El motor paso a paso de 4 fases tiene tres modos de operación: paso simple
de cuatro pasos, doble paso de cuatro pasos y paso de ocho pasos. El ángulo
de paso para el paso simple de cuatro pasos y el doble paso de cuatro pasos
son los mismos, pero el par motor para el paso simple de cuatro pasos es menor.
El ángulo de paso del modo de ocho pasos es la mitad del del modo de paso simple
y doble de cuatro pasos. Por lo tanto, el modo de operación de ocho pasos puede
mantener un alto par motor y mejorar la precisión del control.
El estator del motor paso a paso que utilizamos tiene 32 polos magnéticos,
por lo que se necesitan 32 pasos para completar un giro. El eje de salida del
motor paso a paso está conectado a un conjunto de engranajes reductores, y la
relación de reducción es de 1/64. Así, el eje de salida final rota un círculo
que requiere 32*64=2048 pasos.
**ULN2003**
Para aplicar el motor en el circuito, es necesario usar una placa de control.
El controlador de motor paso a paso ULN2003 es un circuito inversor de 7 canales. Es decir, cuando el pin de entrada está en alto, el pin de salida del ULN2003 está en bajo, y viceversa. Si suministramos un nivel alto a IN1 y un nivel bajo a IN2, IN3 e IN4, entonces el extremo de salida OUT1 estará en bajo y todos los demás extremos de salida estarán en alto. La estructura interna del chip se muestra a continuación.
.. image:: img/image338.png
El controlador del motor paso a paso constituido por el chip ULN2003 y 4 LEDs
se muestra a continuación. En la placa, IN1, IN2, IN3 e IN4 funcionan como
entradas y los cuatro LEDs, A, B, C, D son indicadores del pin de entrada.
Además, OUT1, OUT2, OUT3 y OUT4 están conectados a SA, SB, SC y SD en el
controlador del motor paso a paso. Cuando el valor de IN1 se establece en un
nivel alto, A se enciende; el interruptor SA está encendido, y el motor paso
a paso gira un paso. El caso similar se repite continuamente. Por lo tanto,
al proporcionar al motor paso a paso una secuencia de tiempo específica, girará
paso a paso. El ULN2003 aquí se utiliza para proporcionar secuencias de tiempo
particulares para el motor paso a paso.
.. image:: img/image132.png
Diagrama Esquemático
-----------------------
.. image:: img/image339.png
Procedimientos Experimentales
----------------------------------
**Paso 1:** Construir el circuito.
.. image:: img/image134.png
:width: 800
**Paso 2**: Acceder a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/1.3.3/
**Paso 3**: Compilar el código.
.. raw:: html
.. code-block::
gcc 1.3.3_StepperMotor.c -lwiringPi
**Paso 4**: Ejecutar el archivo ejecutable.
.. raw:: html
.. code-block::
sudo ./a.out
Al ejecutar el código, el motor paso a paso girará en sentido horario o
antihorario según tu entrada 'a' o 'c'.
.. 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
const int motorPin[] = {1, 4, 5, 6};
int rolePerMinute = 15;
int stepsPerRevolution = 2048;
int stepSpeed = 0;
void rotary(char direction){
if(direction == 'c'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99>>j & (0x08>>i));}
delayMicroseconds(stepSpeed);
}
}
else if(direction =='a'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99<>i));}
delayMicroseconds(stepSpeed);
}
}
}
void loop()
{
char direction = '0';
while (1)
{
printf("select motor direction a=anticlockwise, c=clockwise: ");
delay(100);
direction=getchar();
if (direction == 'c')
{
printf("motor girando en sentido horario\n");
delay(100);
break;
}
else if (direction == 'a')
{
printf("motor running anti-clockwise\n");
delay(100);
break;
}
else
{
printf("input error, please try again!\n");
delay(100);
}
}
while(1)
{
rotary(direction);
}
}
void main(void)
{
if (wiringPiSetup() == -1)
{
printf("setup wiringPi failed !");
return;
}
for (int i = 0; i < 4; i++)
{
pinMode(motorPin[i], OUTPUT);
}
stepSpeed = (60000000 / rolePerMinute) / stepsPerRevolution;
loop();
}
**Explicación del Código**
.. code-block:: c
int rolePerMinute = 15;
int stepsPerRevolution = 2048;
int stepSpeed = 0;
**revolucionesPorMinuto:** revoluciones por minuto, el RPM del motor paso a paso
utilizado en este kit debe estar entre 0 y 17.
**pasosPorRevolucion:** el número de pasos para cada giro, y el motor paso a paso
utilizado en este kit necesita 2048 pasos por revolución.
**velocidadPaso:** el tiempo utilizado para cada paso, y en main(), asignamos los
valores a ellos:「(60000000 / revolucionesPorMinuto) / pasosPorRevolucion」(60,000,000 us=1 minuto)
.. code-block:: c
void loop()
{
char direction = '0';
while (1)
{
printf("select motor direction a=anticlockwise, c=clockwise: ");
direction=getchar();
if (direction == 'c')
{
printf("motor running clockwise\n");
break;
}
else if (direction == 'a')
{
printf("motor running anti-clockwise\n");
break;
}
else
{
printf("input error, please try again!\n");
}
}
while(1)
{
rotary(direction);
}
}
La función loop() se divide en dos partes principales (ubicadas entre dos while(1)):
La primera parte es para obtener el valor de la tecla. Cuando se obtiene 'a' o 'c', se sale del bucle y se detiene la entrada.
La segunda parte llama a rotary(direccion) para hacer funcionar el motor paso a paso.
.. code-block:: c
void rotary(char direction){
if(direction == 'c'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99>>j & (0x08>>i));}
delayMicroseconds(stepSpeed);
}
}
else if(direction =='a'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99<>i));}
delayMicroseconds(stepSpeed);
}
}
}
Para hacer que el motor paso a paso **gire en sentido horario**, el estado de nivel de motorPin se
muestra en la tabla a continuación:
.. image:: img/image340.png
Por lo tanto, la escritura potencial de MotorPin se implementa utilizando un bucle anidado de dos capas.
En el Paso 1, j=0, i=0~4.
motorPin[0] se escribirá en alto (10011001&00001000=1)
motorPin[1] se escribirá en bajo (10011001&00000100=0)
motorPin[2] se escribirá en bajo (10011001&00000010=0)
motorPin[3] se escribirá en alto (10011001&00000001=1)
En el Paso 2, j=1, i=0~4.
motorPin[0] se escribirá en alto (01001100&00001000=1)
motorPin[1] se escribirá en bajo (01001100&00000100=1)
y así sucesivamente.
Y para hacer que el motor paso a paso gire **en sentido antihorario**, el estado de nivel de motorPin se muestra en la siguiente tabla.
.. image:: img/image341.png
En el Paso 1, j=0, i=0~4.
motorPin[0] se escribirá en alto (10011001&10000000=1)
motorPin[1] se escribirá en bajo (10011001&01000000=0)
En el Paso 2, j=1, i=0~4.
motorPin[0] se escribirá en alto (00110010&10000000=0)
motorPin[1] se escribirá en bajo (00110010&01000000=0)
y así sucesivamente.