Mostrando entradas con la etiqueta Servos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Servos. Mostrar todas las entradas

viernes, 1 de diciembre de 2017

Arduino: Coche RC Maisto Drift XboxRC24

Buenas a todos los Arduineros y Arduineras!!

Ahora le toca el paso a los coches RC!!! Estos son los que siempre ha sido mi preferencia en cuanto a radio control. Y ahora voy a ver que tal le sienta a Arduino el control de este tipo de vehículos. En principio con todo lo visto en el blog sobre los módulos de comunicación nRF2401 podríais montar uno sin ningún tipo de problemas.

En los archivos para la descarga incluyo también el del mando de Xbox modificado ya que también esta modificado para soportar nuevas funciones y ajustes que voy incluyendo poco a poco.

Bueno para este proyecto voy a utilizar la misma plantilla del archivo .ino que use con el tanque RC.

Esto me obliga también ha hacer cambios en casi todo lo que tengo así que iré publicando los archivos cuando crea que la versión esta lista.

La base de este proyecto es un coche RC que me cayo en mis manos hace años y haremos que vuelva a andar como el primer día... o mejor ;)

Arduino Maisto Monster Drift Arduino Maisto Monster Drift

Se llama Maisto Monster Drift y ya le hice unas modificaciones anteriormente, bueno viendo la fecha... hacer bastante tiempo.

Lo primero que había que modificar era la dirección. Así que lo primero que tenemos que hacer es quitar la electrónica original para dar cabida al servo, al Arduino NANO y al driver L293.

Del integrado L923 solo usaremos la mitad del chip ya que solo tenemos que alimentar uno de los motores.


Arduino Maisto Monster Drift
Quitar la parte superior

Arduino Maisto Monster Drift
Electrónica que tenemos que no vamos a usar


Arduino Maisto Monster Drift
Maisto Monster Drift sin electrónica

martes, 15 de noviembre de 2016

Arduino: Brazo robot con servos ( Robot arm ) Parte 2

Buenas a todos!!!

Buenas a todos!!! Como ya publique hace un tiempo, tenia este brazo robot de 4 ejes hecho con una impresora 3D, en la primera entrada no publique código por un problema que tuve con el PC, pero esta vez va completo.

Bueno todo empezó cuando buscando algo, vaya usted a saber que... encontré un viejo gamepad USB, (a decir verdad encontré varios) y se me ocurrió la idea de usar los thumbsticks o joys para controlar los movimientos del brazo.


Después de desmontar el mando en este modelo vienen los dos joys montados en una misma plaquita. 

Con la ayuda de un multímetro identificamos alimentación y las salidas de los potenciómetros además de los dos pulsadores que tiene cada joy, en mi caso solo tuve que seguir las pistas y hacer una pequeña modificación con la resistencia que venia de casa en el joypad.

Solo nos hace falta:

  • Arduino UNO o NANO
  • 4 microservos del tipo 9g
  • 2 Joystick de 2 ejes y pulsador

Una vez tengamos todas las piezas el montaje es el siguiente:

Los ejes de los joystick controlan los movimientos y los pulsadores que llevan incorporados se utilizan para abrir y cerrar la pinza.

lunes, 16 de febrero de 2015

Arduino: Brazo robot con servos ( Robot arm )

Muy buenas a todos Arduineros y Arduineras!!!

Infotronikblog tiene ahora su propio brazo robot. En total 3 ejes más pinza, aunque es el modelo básico, el modelo completo tiene 4 ejes más pinza. Puedes descargar el modelo en Thingiverse.

Este diseño es más que suficiente para enseñar como funciona un brazo robot y las 3 posiciones espaciales (X Y Z) en las que se moverá el brazo. Los ejes de referencia son:

  • Eje X: Es el movimiento de izquierda a derecha.
  • Eje Y: Es el movimiento de arriba o abajo.
  • Eje Z: Es el movimiento de avance o retroceso.

Ahora que ya sabemos por donde nos movemos, estos son los componentes que moverán los ejes que componen el brazo:

  • Arduino UNO o NANO.
  • 4 servos de tipo 9g.
  • 4 pulsadores.
  • 1 potenciómetro.

La parte blanca esta impresa en ABS y la parte azul es PLA, ya que es de las primeras cosas impresas y querían probar los diferentes materiales. Después de montarlo, creo que es mejor el PLA, ya que es mas rígido.

Los movimientos corren a cargo de 4 servos de 9g que van conectados a los pines 2, 3, 4, 5 de Arduino. Para la primera prueba (solo la pinza) utilice dos pulsadores, uno para abrir y otro para cerrar muy parecido al segundo ejemplo del articulo "Arduino moviendo un servo".


Para la segunda prueba (bazo completo) utilice cuatro pulsadores conectados a los pines 6, 7, 8, 9 asignado a cada uno de los servos y un potenciómetro en el pin A0 para darle movimiento. De tal manera que si pulsamos uno de los botones mientras movemos el potenciómetro accionaremos el servo asignado a ese pulsador.



Pulsando el botón y moviendo el potenciómetro podemos mover el brazo en cualquiera de sus ejes.


Si bien el sistema no es del todo perfecto, ya que si no movemos el potenciómetro antes de accionar el pulsador el servo adquiere la posición del ultimo movimiento. Pero es más que suficiente para este ejemplo.

Una mejora puede ser también implementar la memoria EPROOM para almacenar los movimientos en determinadas posiciones y para después reproducirlos en secuencia haciendo así una tarea repetitiva.

Aquí tenéis un vídeo para que veáis un poco mejor como funciona:


Y aquí el código que hace que funcione:


#include <servo.h>

#define POT A0
#define SWITCH1 2
#define SWITCH2 3
#define SWITCH3 4
#define SWITCH4 5
#define SERVO1 6
#define SERVO2 7
#define SERVO3 8
#define SERVO4 9


int posServo1 = 90; // Angulo servo 1 (base)
int posServo2 = 90; // Angulo servo 1 (antebrazo)
int posServo3 = 90; // Angulo servo 1 (brazo)
int posServo4 = 90; // Angulo servo 1 (pinza)


void setup() 
{ 
  Serial.begin(115200);

  servo.attach(sp1);
  pinMode(SWITCH1, INPUT_PULLUP);
  pinMode(SWITCH2, INPUT_PULLUP);
  pinMode(SWITCH3, INPUT_PULLUP);
  pinMode(SWITCH4, INPUT_PULLUP);
  
}

void loop() 
{
  
  // Show the value of the buttons on the serial monitor
  Serial.print("b1=");
  Serial.println(digitalRead(b1));
  Serial.print("b2=");
  Serial.println(digitalRead(b2));

  int potValue = analogRead(POT)
  int position = map(potValue, 0, 1023, 0, 180);
  
  
  if (digitalRead(SWITCH1) == HIGH)  servo1.write(position);
  else if (digitalRead(SWITCH1) == HIGH)  servo1.write(position);
  else if(digitalRead(SWITCH1) == HIGH)  servo1.write(position);
  else (digitalRead(SWITCH1) == HIGH)  servo1.write(position);

}

Saludos a todos!!

viernes, 6 de febrero de 2015

Arduino: moviendo un servo

Buenas Arduineros y Arduineras!!

Después de ver como funcionan los leds, pulsadores y pantallas LCD, ahora le toca el turno practicar con dispositivos de salida como son los servos.


¿Que es un servo?

Un servo o servomotor es un dispositivo muy similar a un motor de corriente continua con la peculiaridad de poder posicionar su eje una posición determinada dentro de un rango de aproximadamente unos 180º. Se puede modificar tanto su posición como velocidad.

Servo 9G

Arduino tiene una biblioteca para este tipo de dispositivos llamada servo.h. Con ella podemos controlar cualquier servo de manera independiente.

Algo a tener en cuenta es que dependiendo del tipo de servo y de la cantidad de los mismos, seguramente no podrás alimentarlo desde la misma placa de Arduino.

Para este ejemplo y dado que el servo a utilizar es de los más pequeños, no habrá problema ninguno en conectarlo directamente a la placa Arduino.


¿Como trabaja un servo?

Los servos utilizan la modulación por ancho de pulsos (PWM) para controlar tanto la dirección como la posición del motor de de corriente continua.

La mayoría de los servos trabajan a una frecuencia de 50Hz con la señal PWM de un periodo de 20 milisegundos.

La electrónica incorporada en estos dispositivos responde al ancho de la señal modulada.


La señal PWM

Si recibe una señal de entre 0,5 a 1,4 milisegundos, el servo se moverá en sentido horario.


                _      _     _          _    _    _
               | |    | |   | |        | |  | |  | |
               | |    | |   | |        | |  | |  | |
      _________| |____| |___| |________| |__| |__| |___________

Si la señal es de 1,6 a 2 milisegundos el giro sera antihorario:


                ______      ______     ______     ______    ______
               |      |    |      |   |      |   |      |  |      |
               |      |    |      |   |      |   |      |  |      |
      _________|      |____|      |___|      |___|      |__|      |____

Y si la señal recibida es de 1,5 milisegundos su estado sera neutro:


                 ___      ___     ___     ___    ___    ___
                |   |    |   |   |   |   |   |  |   |  |   |
                |   |    |   |   |   |   |   |  |   |  |   |
       _________|   |____|   |___|   |___|   |__|   |__|   |_____

📚La blioteca servo.h:

La biblioteca Servo.h es una librería estándar incluida en el IDE de Arduino que permite controlar servomotores de forma sencilla. Gestiona la generación de señales PWM necesarias para posicionar servomotores estándar de 0° a 180°.

  • Compatibilidad: Funciona en todas las placas Arduino (Uno, Nano, Mega, etc.).

  • Límites: Controla hasta 12 servos en Arduino Uno/Nano (24 en Mega).

  • Precisión: Usa temporizadores internos (Timer1 en Uno) para generar señales estables.

  • Voltaje: Recomendado 5V (igual que la lógica del servo).

  • Documentación: Es oficial desde Arduino Reference - Servo Library

⚙️Funciones principales:

  • attach(): Fija el pin digital donde estará conectado el servo

  • writer():Escribe un valor en el servo, controlando su eje en consecuencia.
    Su valor esta dado en grados de 0 a 180. En un servo de rotación continua cambiara la velocidad del servo, siendo 0 toda la velocidad en una dirección y 180 en otra dirección y un valor de 90 aproximadamente sin movimiento.

  • writeMicroseconds(): Escribe un valor en microsegundos (uS) en el servo controlando su eje en consecuencia.
    En un servo estándar si el valor del parámetro es 1000 el eje girará completamente a la izquierda, con un valor de 2000 es completamente a la derecha y con un valor de 1500 se sitúa en el centro.
    Según el fabricante estos valores pueden variar, normalmente entre 700 y 2300.
    Se puede comprobar pero hay que tener en cuenta que llegar al limite puede producir daños en el servo.
    Normalmente lo adivinaras por por el ruido infernal que hará el servo.
    NO ES RECOMENDABLE pasar de esos parámetros ya que pueden producir daños en el servo.
    Para los servos de rotación continua writeMicroseconds() funciona de una manera análoga a write().

  • read(): Lee el angulo actual del servo (el ultimo valor pasado por la llamada write().

  • attached(): Comprueba si la variable servo esta unida a un pin.

  • detach(): Separa la variable servo de un pin. Si se separan todas las variables de servo, los pines 9 y 10 pueden utilizarse como PWM mediante analogWrite().

Programación:

Primer programa para un servo, mover el servo de manera simple:



#include "servo.h" 	// Cargamos la biblioteca "Servo.h"
 
int Pin = 9;		// Cargamos un 9 en la variable "Pin"
 
Servo servo1;		// Nombramos al primer servo
  
// Configuración
void setup()
{        
  servo1.attach(Pin);   // Adjuntamos el pin 9 a servo1
} 
 
//Programa principal
void loop()             
{                                 
    servo1.write(0);     // Mandamos a servo1 a la posición 0 grados      
    delay(1500);         // Hace una pausa de 1,5 segundos
    servo1.write(90);    // Mandamos a servo1 a la posición 90 grados       
    delay(1500);         // Hace una pausa de 1,5 segundos
    servo1.write(180);   // Mandamos a servo1 a la posición 180 grados        
    delay(1500);         // Hace una pausa de 1,5 segundos
    servo1.write(90);    // Mandamos a servo1 a la posición 900 grados       
    delay(1500);         // Hace una pausa de 1,5 segundos
}


Segundo programa para un servo, mover el servo con pulsadores:



#include "servo.h"

int servovar1=90;   // Indicamos la posicion inicial de servo1
Servo servo1;       // Nombramos al primer servo

int Pulsador1=6;   // Cargamos un 6 en la variable "pulsador1"
int Pulsador2=7;   // Cargamos un 7 en la variable "pulsador2"

void setup() {
  servo1.attach(9);    // Adjuntamos el pin 9 a servo1
  pinMode(Pulsador1, INPUT);  // Pulsador 1 en pin 6 es una entrada
  pinMode(Pulsador2, INPUT);  // Pulsador 2 en pin 7 es una entrada
}

void loop() {
    if(digitalRead(Pulsador1) == HIGH && digitalRead(Pulsador2) == LOW){  
      servovar1++;		// Presionamos el pulsador1 para que vaya a la izquierda
}
    else if(digitalRead(Pulsador1) == LOW && digitalRead(Pulsador2) == HIGH){  
      servovar1--;	// Presionamos el pulsador2 para que vaya a la derecha
    }
  
  servo1.write(servovar1);
  delay(10);	// Pausa de 10 milisegundos (Para más velocidad 
  				// quitar esta linea y para ir más lento aumentar el valor)
}


Un vídeo del servo con Arduino funcionando:


Ahora que ya sabes como funcionan los servos con Arduino, aquí tienes algunos artículos aplicando este código:

Moviendo desvíos con servos y Arduino

Arduino: Brazo robot con servos ( Robot arm )

Arduino: Brazo robot con servos ( Robot arm ) Parte 2

Saludos!!!