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 ;)
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.
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.
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);
}
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.
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.
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).
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: