Controle MUCHOS motores servo utilizando un Joystick, Arduino y PCA9685 Módulo PWM Deja un comentario

VISIÓN DE CONJUNTO

Hemos visto en tutoriales anteriores cómo conectar y controlar Stepper Motors.

Los Stepper Motors son ideales para muchos proyectos, pero pueden ser costosos cuando sus proyectos necesitan muchos de ellos.

Entonces veamos cómo conectar y controlar Servo Motors, que son un poco más baratos.

Los Servo Motors son excelentes cuando su proyecto solo necesita realizar algunos movimientos mecánicos que no necesitan ser tan precisos, como los logrados por Stepper Motors.

Normalmente, para controlar un servo, necesitas 1 pin en tu Arduino, por lo que si tienes 5 de ellos, necesitarás 5 pines.

Dependiendo de su proyecto, eso significa que podría quedarse sin alfileres para otros componentes.

En este tutorial utilizaremos el módulo PCA9685 PWM, que nos permite controlar hasta 16 Servos y solo usar 2 pines en nuestro Arduino UNO, ya que utiliza el protocolo de comunicación I2C.

Incluso puede vincular varios módulos PCA9685 para controlar aún más si es necesario.

SERVO MOTORS INTRODUCCIÓN

Un Servo Motor puede ser un motor de CC, CA u otro tipo de motor e incluye un dispositivo para conocer su posición (por ej .: potenciómetro, codificador digital …).

Dentro de la mayoría de los Servo Motors encontrará: un motor, engranajes, algún tipo de topes que limitarán el movimiento del eje, un potenciómetro de algún tipo para la retroalimentación de posición y algún circuito integrado para mover el servo a una posición específica.

Un Servo estándar tiene alrededor de 180 grados de movimiento. Estos pueden modificarse para hacerlos girar 360 grados o puede comprarlos ya hechos de esta manera.

La modificación implica abrir la caja del Servo, quitar el dispositivo limitador y desconectar el potenciómetro del eje. Una vez hecho, el Servo girará en cualquier dirección sin fin ya que no tiene forma de saber su posición y no hay interruptores de límite para detenerlo.

La mayoría de los motores servo tienen tres cables:

Negro: Tierra

Rojo: voltaje

Blanco o amarillo: cable de control.

Para mover un Servo, envía un pulso al cable de control. Este proceso se refiere a la modulación codificada por pulsos.

Servos estándar espera ver un pulso cada 20 ms. Dependiendo de la duración de este pulso, el Servo se moverá a un ángulo específico.

Por ejemplo, un pulso de 1.5ms hará que el Servo se mueva a la posición de 90 grados (que normalmente es la posición neutral o media).

Un pulso más corto de 1.5ms moverá el Servo más cerca de 0 grados y uno más largo se acercará a 180 grados.

Los servos pueden tener una gran fuerza de torsión para su tamaño y también consumen potencia en proporción a la fuerza con la que trabajan. Entonces si proyecta no está moviendo mucho peso, el Servo no consumirá mucha energía.

CONEXIONES

El uso del PCA9685 PWM Servo módulo hace que las conexiones sean muy fáciles, como puede ver.

Cada uno de los conectores de los servomotores está conectado a las conexiones inferiores PCA9685:

* En este tutorial estamos usando el conector 1-4-8-12.

V + es el cable ROJO del servomotor

GND es el cable negro

PWM es el cable blanco o amarillo

Luego, para alimentar los servomotores, conectamos una fuente de alimentación externa de 5 V al terminal de tornillo V + y GND.

* Tenga en cuenta que el conector de tornillo PCA9685 está protegido en caso de que lo conecte hacia atrás.

Entonces tenemos que hacer la conexión desde la ONU

5V y GND de UNO están conectados a VCC y GND del módulo PCA9685.

* Nota V + en el lado del Módulo PCA9685 se usa para alimentar los Servomotores si no está utilizando el conector de la Terminal de Tornillo. Es mejor utilizar el conector de terminal de tornillo ya que está protegido en caso de que invierta GND y voltaje por error.

A4 (SDA) y A5 (SLC) de UNO están conectados a los pines correspondientes del módulo PCA9685.

* Nota Si está usando la VERSIÓN 2 del código, también necesita conectar el Joystick Switch al Pin 4 de UNO.

EL CÓDIGO

Estamos utilizando la biblioteca HDPC9685 para comunicarnos con el módulo PCA9685 PWM.

Puede encontrar un enlace para descargar la biblioteca en la parte inferior de esta página de tutorial.

Como puede ver en los códigos a continuación, el uso de la biblioteca hace que sea muy fácil mover los Servo Motors a una posición relativa a la posición de nuestro Joystick.

Estamos leyendo el eje X del Joystick para mover los Servo Motors número 0 y 12 y el eje Y para mover los 4 y 8 Servos.

A continuación encontrará 2 formas diferentes (código) para mover los servos:

El primero será proporcional al movimiento del joystick: como el valor analógico del Joystick varía de 0 a 1023 y los movimientos de los Servo Motors son de 0 a alrededor de 420, estamos usando la función MAP para mapear los valores de Joystick para reflejar los límites de Servos.

El segundo mueve los servos hasta que se suelta el joystick y la posición del servo se puede restablecer al medio haciendo clic en el interruptor del joystick.

Como siempre, no olvide ver nuestros videos Tutoriales en el lado izquierdo de esta página para más información.


CÓDIGO VERSIÓN 1:

/ * Control de múltiples motores servo Arduino con el módulo PCA9685 PWM VERSIÓN 1 PROPORCIONAL

 Creado por Yvan / https: // Inteligente - Bits . com

 Este código es  en el dominio público ... Puede: copiarlo, usarlo, modificarlo, compartirlo o simplemente ignóralo ! Gracias ! 

* / 

#include "HCPCA9685.h" // Incluye la biblioteca HCPCA9685 creada por Andrew Davies 

#define I2CAdd 0x40 // Dirección predeterminada del módulo PCA9685 

#define JoyX A0 // Joystick pin X conectado a A0 en el UNO 
#define JoyY A1 // Joystick pin Y conectado a A1 en el UNO 

// Se usa para almacenar el mapeo del Joystick X y Valores Y En t ServoXforward; En t ServoXbackward; En t ServoYforward; En t ServoYbackward;

 HCPCA9685 HCPCA9685 (I2CAdd); // Definir biblioteca para usar comunicación I2C

 Configuración de vacío ()
 {
 HCPCA9685 . Init (SERVO_MODE); // Establecer en modo Servo

 HCPCA9685 . Dormir (falso); // Despierta el módulo PCA9685
 }


 void loop ()
 { En t val1X = analogRead (JoyX); // Lee el valor actual de Joystick 1 Eje X En t val1Y = analogRead (JoyY); // Lee el valor actual de Joystick 1 Eje Y // Correlacionar los valores del eje del joystick con el servo Min. y Posición máxima
 ServoXforward =  mapa (val1X, 0 , 1023 , 420 , 10 ); // Usado para mover Servo 0 ServoXbackward =  mapa (val1X, 0 , 1023 , 10 , 420 ); // Usado para mover Servo 12 invertido

 ServoY hacia adelante =  mapa (val1Y, 0 , 1023 , 10 , 420 ); // Usado para mover Servo 4 ServoYbackward =  mapa (val1Y, 0 , 1023 , 420 , 10 ); // Usado para mover Servo 8 invertido // Mueva los Servos para leer la posición de  Palanca de mando HCPCA9685 . Servo ( 0 , ServoX hacia adelante); // Mover servo 0 HCPCA9685 . Servo ( 12 , ServoXbackward); // Mover servo 12 HCPCA9685 . Servo ( 4 , ServoY hacia adelante); // Mover servo 4 HCPCA9685 . Servo ( 8 , ServoYbackward); // Mover servo 8 retrasar( 1 );
 }
CÓDIGO VERSIÓN 2:

/ * Control de múltiples motores servo Arduino con el módulo PCA9685 PWM VERSIÓN 2 MOVIMIENTO / DETENER / REINICIAR

 Creado por Yvan / https: // Inteligente - Bits . com

 Este código es  en el dominio público ... Puede: copiarlo, usarlo, modificarlo, compartirlo o simplemente ignóralo ! Gracias ! 

* / 


#include "HCPCA9685.h" // Incluye la biblioteca HCPCA9685 creada por Andrew Davies 

#define I2CAdd 0x40 // Dirección predeterminada del módulo PCA9685 

#define JoyX A0 // Joystick pin X conectado a A0 en el UNO 
#define JoyY A1 // Joystick pin Y conectado a A1 en el UNO 
#define JoySwitch 4 // Interruptor de joystick conectado al pin 4 en UNO 

// Variables utilizadas para almacenar la posición de cada Servos En t Servo0Position; En t Servo4Position; En t Servo8Position; En t Servo12Position;

 HCPCA9685 HCPCA9685 (I2CAdd); // Definir biblioteca para usar comunicación I2C

 Configuración de vacío ()
 {

 HCPCA9685 . Init (SERVO_MODE); // Establecer en modo Servo
 HCPCA9685 . Dormir (falso); // Despierta el módulo PCA9685 // Establecer valor de centro para los Servos
 Servo0Position = 250 ;
 Servo4Position = 250 ;
 Servo8Position = 250 ;
 Servo12Position = 250 ; // Movimiento todas Servos al comienzo de la posición central
 HCPCA9685 . Servo ( 0 , Servo0Position); // Mover servo 0 HCPCA9685 . Servo ( 4 , Servo4Position); // Mover servo 4 HCPCA9685 . Servo ( 8 , Servo8Position); // Mover servo 8 HCPCA9685 . Servo ( 12 , Servo12Position); // Mover servo 12 pinMode (JoySwitch, INPUT_PULLUP);

 }


 void loop ()
 { Si ( ! digitalRead (JoySwitch)) { // Si el joystick cambia es clickeado re - centrar todas Servos
 retrasar( 500 ); // retrasar para antirrebote del joystick // Conjunto todas Servos posicionan valores variables de regreso al centro
 Servo0Position = 250 ;
 Servo4Position = 250 ;
 Servo8Position = 250 ;
 Servo12Position = 250 ; // Movimiento todas Servos a la posición central
 HCPCA9685 . Servo ( 0 , Servo0Position); // Mover servo 0 HCPCA9685 . Servo ( 4 , Servo4Position); // Mover servo 4 HCPCA9685 . Servo ( 8 , Servo8Position); // Mover servo 8 HCPCA9685 . Servo ( 12 , Servo12Position); // Mover servo 12 } //  Si Joystick eje X en  no  en movimiento central Servo 0  y  12 en consecuencia Si (analogRead (JoyX) >  800 ) { Si (Servo0Position  420 ) { // Comprobar Si movimiento máximo de Servo alcanzado
 Servo0Position ++ ; // Aumentar Servo 0 Posición variable por 1 } Si (Servo12Position >  10 ) { // Comprobar Si mínimo movimiento de Servo alcanzado
 Servo12Position - ; // Disminuir servo 12 Posición variable por 1 }
 retrasar( 10 ); // Disminuir para hacer que los Servos se muevan más rápido o incrementar para movimiento más lento
 HCPCA9685 . Servo ( 0 , Servo0Position); // Mover servo 0 HCPCA9685 . Servo ( 12 , Servo12Position); // Mover servo 12 } Si (analogRead (JoyX)  300 ) { Si (Servo0Position >  10 ) {
 Servo0Position - ;
 } Si (Servo12Position  420 ) {Servo12Position ++ ;  }
 retrasar( 10 );
 HCPCA9685 . Servo ( 0 , Servo0Position); // Mover servo 0 HCPCA9685 . Servo ( 12 , Servo12Position); // Mover servo 12 } //  Si Joystick Y axis en  no  en movimiento central Servo 4  y  8 en consecuencia Si (analogRead (JoyY) >  800 ) { Si (Servo4Position  420 ) {
 Servo4Position ++ ;
 } Si (Servo8Position >  10 ) {
 Servo8Position - ;
 }
 retrasar( 10 );
 HCPCA9685 . Servo ( 4 , Servo4Position); // Mover servo 4 HCPCA9685 . Servo ( 8 , Servo8Position); // Mover servo 8 } Si (analogRead (JoyY)  300 ) { Si (Servo4Position >  10 ) {
 Servo4Position - ;
 } Si (Servo8Position  420 ) {
 Servo8Position ++ ;
 }
 retrasar( 10 );
 HCPCA9685 . Servo ( 4 , Servo4Position); // Mover servo 4 HCPCA9685 . Servo ( 8 , Servo8Position); // Mover servo 8 }
 }


VIDEO TUTORIAL PARTE 1

VIDEO TUTORIAL PARTE 2

DESCARGAR

Copie el código de Sketch anterior en su software Arduino IDE para programar su placa Arduino.

Bibliotecas usadas:

PCA9685 PWM Module Library creado por Andrew Davies

Descargar The PCA9685 Library

Una vez descargado, simplemente extrae el contenido de los archivos zip dentro de tu ” arduino / en la carpeta “libraries”, y asegúrese de reiniciar el software Arduino IDE (Cerrar y volver a abrir) para que detecte esta biblioteca recién instalada.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?