.. note::
¡Hola! Bienvenidos a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros apasionados.
**¿Por qué unirse?**
- **Soporte de Expertos**: Soluciona 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**: Accede anticipadamente a anuncios de nuevos productos y adelantos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones y Sorteos Festivos**: Participa en sorteos y promociones especiales en días festivos.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.
3.1.6 Control de Movimiento
=============================
Introducción
--------------
En esta lección, crearemos un dispositivo simple de detección y control
de movimiento. El MPU6050 se usa como sensor y el motor paso a paso como
dispositivo controlado. Con el MPU6050 montado en un guante, podrás controlar
el motor paso a paso girando tu muñeca.
Componentes
-------------
.. image:: img/list_Motion_Control.png
:align: center
Diagrama de Circuito
-----------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO18 Pin 12 1 18
GPIO23 Pin 16 4 23
GPIO24 Pin 18 5 24
GPIO25 Pin 22 6 25
SDA1 Pin 3
SCL1 Pin 5
============ ======== ======== ===
.. image:: img/Schematic_three_one6.png
:align: center
Procedimientos Experimentales
-------------------------------
**Paso 1:** Construye el circuito.
.. image:: img/image251.png
:alt: 3.1.6 Motion Control_bb
:width: 800
:align: center
**Paso 2**: Dirígete a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.6/
**Paso 3**: Compila el código.
.. raw:: html
.. code-block::
gcc 3.1.6_MotionControl.c -lwiringPi -lm
**Paso 4**: Ejecuta el archivo ejecutable.
.. raw:: html
.. code-block::
sudo ./a.out
Cuando se ejecuta el código, si el ángulo de inclinación de **mpu6050** en
el eje `Y `__-`axis `__ es mayor a **45** °, el motor paso a paso rota en sentido
antihorario; si es menor a **-45** °, el motor rota en sentido horario.
.. note::
Si no funciona después de ejecutar el código, o aparece el mensaje de error: \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`.
**Explicación del Código**
.. code-block:: c
double mpu6050(){
acclX = read_word_2c(0x3B);
acclY = read_word_2c(0x3D);
acclZ = read_word_2c(0x3F);
acclX_scaled = acclX / 16384.0;
acclY_scaled = acclY / 16384.0;
acclZ_scaled = acclZ / 16384.0;
double angle=get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled);
return angle;
}
mpu6050 obtiene el ángulo de inclinación en la dirección del eje Y.
.. 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);
}
}
}
Si la dirección **key** recibida es \'**c**\', el motor paso a paso rota
en sentido horario; si la **key** es \'**a**\', el motor rota en sentido
antihorario. Consulta :ref:`1.3.3_stepper_c_pi5` para más detalles sobre
el cálculo de la dirección de rotación del motor paso a paso.
.. code-block:: c
int main()
{
setup();
double angle;
while(1) {
angle = mpu6050();
if (angle >=45){rotary('a');}
else if (angle<=-45){rotary('c');}
}
return 0;
}
El ángulo de inclinación en la dirección del eje Y se lee desde **mpu6050**.
Si es mayor a **45** °, el motor paso a paso rota en sentido antihorario;
si es menor a **-45** °, el motor rota en sentido horario.