Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
AUTOMATIZACIÓN DEL
BRAZO ROBÓTICO KSR10
Nombre del proyecto:
"Robotic_Arm_KSR10_y_SD.ino" (Versión 2)
1
Al principio tengo una breve descripción y las fotos del proceso. Y al final, desde la página 29 a la 50, tengo
escrito todo el programa realizado en Arduino 1.05.r2
“”Está ajustado para una tensión de alimentación a los drivers L298N de 9 V DC.””
Direcciones descarga documento”Version 1”: http://issuu.com/joaquinin/docs/proyecto_brazo_robotico_ksr10__ener
http://www.slideshare.net/joaquinin1/proyecto-brazo-robotico-ksr10-enero-marzo-2015-46138135
/*proyecto "Robotic_Arm_KSR10_y_SD" (versión 2) .El código está más compacto y los motores con
Autor: JOAQUÍN BERROCAL PIRIS mayor Torque.
Fecha: finales de Marzo 2015
Videos en youtube: https://youtu.be/FPJ2WEjW-uY y en https://youtu.be/98JHhiSq_Go
/*proyecto "Robotic_Arm_KSR10_y_SD"
"""Versión 2""">>> más rápida mayor velocidad
Autor: JOAQUÍN BERROCAL PIRIS
Fecha: final Marzo 2015
BREVE EXPLICACIÓN:
El proyecto está realizado sobre
una ARDUINO MEGA 2560 por necesitar más pines que los de la
UNO 3.Consiste en controlar de forma automática, mediante joystick, el
movimiento de un brazo robótico de la marca KSR10 de Velleman
con 5 motorcitos de 6 voltios, acepta incluso hasta 12V.
+ El proyecto está comunicado por el USB pines 1-2 para comunicar a través
de puerto serial mensajes varios entre ellos datos de posición.
la tengo como ayuda para ajustar el proyecto.
MATERIALES Y CONEXIONES:
2
-. Brazo robótico 50€ marca KSR10 de velleman
-. Le he colocado 5 potenciómetros 10K para control de posiciones
-. 5 Motores de 6 voltios DC
-. 3 Joystick para control movimiento de los 5 motores
-. 5 Potenciómetros control posición
3
Motor 2 de 50º a 126º
Motor 3 de 97º a 64º
Motor 4 de 42º a 135º
Motor 5 de 120º a 70º (Realmente acepta 127º a 63º pero para evitar
las inercias y que choque con palanca potenciómetro 5)
-. Posición HOME: valores potenciométros entre 89º a 91º . Es decir un +/- 1º respecto a 90º
para permitir una cierta histéresis que impida estén fluctuando el accionamiento de los
motores para mantenr la posición.
+Cuando se va acercando a 90º reduzco la velocidad entorno a 50 / 110 para mejor ajuste.
-. Posición JOYSTICK posición neutra de los joystick para evitar accionamientos indeseados
neutra de 80 a 94. todo en LOW / LOW / LOW (el enable y int 1 int 2 del amplificador L298N)
- Si el valor leído del joystic < 80 giro en un sentido: LOW / HIGH
- si el valor leído del joystic > 94 giro en sentido contrario: HIGH / LOW
En la función; Joystick ( int pinanalogico, int pinPWM, int int1, int int2, char letra)
tengo el accionamiento manual de los motores mas chequeo interruptores de grabar o secuenciar
desde esta función evito sobrepasar los grados de giro para el motor 1 de la pinza y del motor
5 del giro transversal del brazo.
-.en Joystic valor global de accionamiento 180, motor 1 a 80, motor 2 a 150
-.en ActivarMotores valor global de accionamiento 200, motor 1 a 90, motor 2 a 170
motor 5 a 200 lo puedo suprimir***
Para trabajar con LA LCD 4X16 utilizando 2 hilos el de reloj SCL y el de Datos
utilizar SDA --- 20 SCL -- 21 ("En este proyecto no la utilizo")
*/
F O T O S PROCESO CONSTRUCCIÓN
4
Modelo KSR10 DE vELLEMAN
6
7
8
9
10
11
12
13
PRIMERAS PRUEBAS
14
¿CÓMO COLOCAR LOS POTENCIÓMETROS DE POSCIÓN MOTORES? 1er intento
15
¡¡¡¡Segundo intento de colocación potenciómetros, algo más elaborada y más exitosa!!!
16
17
18
Se continúa haciendo pruebas….
19
Tablero de control con un sólo Joystick y dos potenciómetros, dos drivers L298N ..
20
21
Utilizo la placa ETHERNET por tener lector de micro tarjetas SD donde mi intención será grabar los movimientos
que desee utilizando los Joystick ara luego secuenciarlos de forma repetitiva y automática.
(Más adelante cuando me llegue la placa micro SD dejaré de utilizar la ETHERNET.)
COLOCACIÓN DE LOS NUEVOS POTENCIÓMETROS CON LOS QUE FINALMENTE SE QUEDARÁ EL PROYECTO.
(tardaron mucho de china, lo que supuso un problema para poder avanzar.)
22
23
24
ESTO YA ES OTRA COSA. MÁS ESTABLES Y FIELES LOS VALORES LEÍDOS
25
26
POR ÚLTIMO ME DECIDO A CONTROLAR TAMBIÉN EL MOVIMIENTO GIRATORIO CON EL MOTOR 5
(Gran complicación debido a no tener muy claro dónde y cómo fijarlo con su palanca de accionamiento)
27
28
/*proyecto "Robotic_Arm_KSR10_y_SD" (versión 2)
Autor: JOAQUÍN BERROCAL PIRIS
Fecha: finalización finales de Marzo 2015
Videos en youtube: https://youtu.be/FPJ2WEjW-uY y en https://youtu.be/98JHhiSq_Go
/*proyecto "Robotic_Arm_KSR10_y_SD"
"""Versión 2""">>> más rápida mayor velocidad
Autor: JOAQUÍN BERROCAL PIRIS
Fecha: final Marzo 2015
BREVE EXPLICACIÓN:
El proyecto está realizado sobre
una ARDUINO MEGA 2560 por necesitar más pines que los de la
UNO 3.Consiste en controlar de forma automática, mediante joystick, el
movimiento de un brazo robótico de la marca KSR10 de Velleman
con 5 motorcitos de 6 voltios, acepta incluso hasta 12V.
29
por consiguiente hasta que no esté en esa posición no se permitirá
grabar ni secuenciar los movimientos. Esperar a que se encienda
el led verde para permitir grabar los movimientos
o el led Azul para q se secuencien los movimientos grabados en la SD.
+ El proyecto está comunicado por el USB pines 1-2 para comunicar a través
de puerto serial mensajes varios entre ellos datos de posición.
la tengo como ayuda para ajustar el proyecto.
MATERIALES Y CONEXIONES:
30
Motor 5-----6 --- 30 / 31
-. Posición HOME: valores potenciométros entre 89º a 91º . Es decir un +/- 1º respecto a 90º
para permitir una cierta histéresis que impida estén fluctuando el accionamiento de los
motores para mantenr la posición.
+Cuando se va acercando a 90º reduzco la velocidad entorno a 50 / 110 para mejor ajuste.
-. Posición JOYSTICK posición neutra de los joystick para evitar accionamientos indeseados
neutra de 80 a 94. todo en LOW / LOW / LOW (el enable y int 1 int 2 del amplificador L298N)
- Si el valor leído del joystic < 80 giro en un sentido: LOW / HIGH
- si el valor leído del joystic > 94 giro en sentido contrario: HIGH / LOW
En la función; Joystick ( int pinanalogico, int pinPWM, int int1, int int2, char letra)
tengo el accionamiento manual de los motores mas chequeo interruptores de grabar o secuenciar
desde esta función evito sobrepasar los grados de giro para el motor 1 de la pinza y del motor
5 del giro transversal del brazo.
-.en Joystic valor global de accionamiento 180, motor 1 a 80, motor 2 a 150
-.en ActivarMotores valor global de accionamiento 200, motor 1 a 90, motor 2 a 170
motor 5 a 200 lo puedo suprimir***
Para trabajar con LA LCD 4X16 utilizando 2 hilos el de reloj SCL y el de Datos
utilizar SDA --- 20 SCL -- 21 ("En este proyecto no la utilizo")
*/
31
#include <SD.h>
File miarchivo;
byte FlagGrabar = 0;
byte FlagSecuenciar = 0;
int i = 0; //variable global
int valorInt ; //para convertir los valores de los grados a enteros y activar el motor
char c ;
String valorString = "";
32
{
digitalWrite(rojo,HIGH); //se enciende avisi movimiento a HOME
digitalWrite(verde,LOW); //se enciende permite grabar movimientos
digitalWrite(azul,LOW); //se enciende para indicar secuencia de movimientos
}
void ledVerde() //activa led Verde
{
digitalWrite(rojo,LOW);
digitalWrite(verde,HIGH);
digitalWrite(azul,LOW);
}
void ledAzul() //activa led Azul
{
digitalWrite(rojo,LOW);
digitalWrite(verde,LOW);
digitalWrite(azul,HIGH);
}
void apagarLeds() //activa led Azul
{
digitalWrite(rojo,LOW);
digitalWrite(verde,LOW);
digitalWrite(azul,LOW);
}
}
// ---- CONTROL INTERRUPTOR 7 de Grabacion --------
if ((digitalRead(Interruptor_grabar) == LOW)and (FlagGrabar) == 0) //pin 7 a cero para grabar movimientos
33
{
if (digitalRead(Interruptor_grabar) == LOW)
{
int valorPotX = analogRead (pinAnalogico+5);//al Joystic A0 le corresponde el Potenciometro A5
valorPotX = map (valorPotX,0,1023,0,180);
apagarLeds ();
}
if (digitalRead(Interruptor_secuenciar) == LOW)
{
Secuenciar_movimientos(); // si interruptor 8 a cero; "Secuenciar_movimientos()"
} // fin del if (digitalRead((Interruptor_secuenciar) == LOW))
34
FlagSecuenciar = 0; // Iniciamos el flag
apagarLeds();
}
//----------------------------------------------------
//------ INSTRUCCIONES PARA MOVER LOS MOTORES CON LOS JOYSTICK ---
Serial.print ("Joystick sensor ");
Serial.print (pinAnalogico);
Serial.print (" ");
Serial.print (servoVal);
Serial.println (" Grados");
}
//---------------------------------------------
35
if ((valorPotX > 108) and (pinAnalogico == 0))
{
//tiende a abrir para evitar bloqueo M1
analogWrite (pinPWM,90);
digitalWrite (int1,HIGH);
digitalWrite (int2,LOW);
}
// evita que el M5 choque con patilla Potenciometro 5 margen 70º izda a 121º dcha
analogWrite (pinPWM,180);
digitalWrite (int1,HIGH);
digitalWrite (int2,LOW);
}
//--------------------------------------------------------------------
analogWrite (pinPWM,90);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
// evita que el M5 choque con patilla Potenciometro 5 margen real 63 izda a 127 dcha
// aunque ponga 70º a 120º para tener mas garantía por las inercias.
if ((valorPotX < 70)and (pinAnalogico == 4))
{
analogWrite (pinPWM,180); // se podría quizas mejor poner antes StopMotores()***
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
//--------------------------------------------------------------------
// ----------------------------------------------------------
//-----------FUNCIÓN ir a Posicion HOME ---------------------
int Home (int PotMotorX,String motor,int pinPWM,int int1,int int2)
36
// ----------------------------------------------------------
{
Serial.print (motor);
Serial.print (" ");
Serial.print (servoVal);
Serial.println (" Grados");
int valorPWM = 180; //valor Global para los motores salvo para el 1 y 2
if (motor == "motor 1")
{
valorPWM = 80;
}
if (motor == "motor 2")
{
valorPWM = 150;
}
while (1)
{
servoVal = analogRead (PotMotorX);
delayMicroseconds(100);
servoVal = map (servoVal,0,1023,0,180);
//------------------------
Serial.print (motor);
Serial.print (" ");
Serial.print (servoVal);
Serial.println (" Grados");
//------------------------
if ((servoVal>= 89)and (servoVal <= 91)) //Como veo q esta muy estable pondre 89 a 91
{
digitalWrite (pinPWM,LOW);
digitalWrite (int1,LOW);
digitalWrite (int2,LOW);
37
}
analogWrite (pinPWM,valorPWM);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
if ((servoVal >= 83) and (servoVal < 89) and (motor == "motor 1")) // REDUCIR VELOCIDAD
{
analogWrite (pinPWM,50);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
if ((servoVal >= 83) and (servoVal < 89) and (motor == "motor 2")) // REDUCIR VELOCIDAD ****
{
analogWrite (pinPWM,100);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
if ((servoVal >= 83) and (servoVal < 89) and (motor != "motor 1")and (motor != "motor 2")) // REDUCIR
VELOCIDAD
{
analogWrite (pinPWM,110);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
38
}
if ((servoVal >= 92)and(servoVal <= 95) and (motor == "motor 2"))
{
analogWrite (pinPWM,100);
digitalWrite (int1,HIGH);
digitalWrite (int2,LOW);
}
if ((servoVal >= 92) and (servoVal <= 95)and (motor != "motor 1")and (motor != "motor 2"))
{
analogWrite (pinPWM,110);
digitalWrite (int1,HIGH);
digitalWrite (int2,LOW);
//---------------------------------------------------------
//-------Función de Stop Paro de Todos los motors----------
//---------------------------------------------------------
void StopMotores ()
{
int i = 0;
digitalWrite (2,LOW);// PONE A 0 las señales PWM de los enables motores
digitalWrite (3,LOW);
digitalWrite (5,LOW);
digitalWrite (6,LOW);
digitalWrite (7,LOW);
for (i=0; i<10; i++)
{
digitalWrite((22+i),LOW); // Pone a cero de la salida 22 a la 31
} // fin del for (i=0; i<10; i ++)
39
Home (9,"motor 5",6,30,31); //Preferible en primer lugar el motor 5 giro transversal
// se evita que si el M4 esta muy bajo y el giro del 5 es grande
//choque el la columna del M4 con el potenciometro del M5
//-------------------------------------------------------
//--------------------------------------------------------------------
//FUNCIÓN para secuenciar los movimientos
void Secuenciar_movimientos()
//--------------------------------------------------------------------
{
//Ya están declaradas como globales
40
String valorString = ""; //Valor para convertir mas tarde a decimal entero
int valorInt = 0 ; //para iniciar su valor NO BORRAR
char c ;
servoVal = (miarchivo.read());
c = char(servoVal); // pasa a carácter el valor decimal
if ((servoVal!=13)and (servoVal!=10))//
{
//----------------------
valorString.concat(c);//
valorInt = valorString.toInt();
//----------------------
41
// NOTA no es necesario reiniciar "valorInt" al haber reiniciado: valorString = "" ;
valorString = "" ;
valorString = "" ;
valorString = "" ;
valorString = "" ;
42
} //fin del if (c == 'E')
if (digitalRead(Interruptor_secuenciar) == HIGH)
{
StopMotores();
miarchivo.close();//cierra el archivo
while (1)
{
//1º se leen la posicion del potenciómetro de los motores
//para comparar después con el que debe tener
servoVal = analogRead (PotMotorX);
delayMicroseconds(100);
servoVal = map (servoVal,0,1023,0,180);
43
if (servoVal != valorAnterior) //para evitar repetir ciclos
{
//------------------------
Serial.print ("motor: ");
Serial.print (PotMotorX); //motor 0 a 4
Serial.print ("--");
Serial.print (servoVal);
Serial.println (" Grados");
//------------------------
{
digitalWrite (pinPWM,LOW);
digitalWrite (int1,LOW);
digitalWrite (int2,LOW);
digitalWrite (pinPWM,LOW);
digitalWrite (int1,LOW);
digitalWrite (int2,LOW);
//StopMotores();
break; //salir
}
analogWrite (pinPWM,valorPWM);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
//PARA REDUCIR VELOCIDAD AL M 1
if (servoVal >= (valorInt-7)and (servoVal< valorInt)and (PotMotorX == 5))
44
{
analogWrite (pinPWM,50);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
//el resto de motores a velocidad 110
if (servoVal >= (valorInt-7)and (servoVal< valorInt)and (PotMotorX != 5))
{
analogWrite (pinPWM,110);
digitalWrite (int1,LOW);
digitalWrite (int2,HIGH);
}
// El PotMotorX == 5 es el Motor 1
if (servoVal <= (valorInt+7)and (servoVal >= (valorInt+1)and (PotMotorX == 5))) // +1 para compensación
{ //se puede suprimir el +1
analogWrite (pinPWM,50);
digitalWrite (int1,HIGH);
digitalWrite (int2,LOW);
}
//Resto de los Motores a velocidad de 110
if (servoVal <= (valorInt+7)and (servoVal >= (valorInt+1)and (PotMotorX != 5))) // +1 para compensacion
{ //se puede suprimir el +1
analogWrite (pinPWM,110);
digitalWrite (int1,HIGH);
digitalWrite (int2,LOW);
valorAnterior = servoVal;
//-------------------------------
void setup() {
//---------------------------------
// pin 7 y 8 como entradas
pinMode (Interruptor_grabar,INPUT); // Pin 7 como entrada nivel 0 para grabar movimiento
pinMode (Interruptor_secuenciar,INPUT); // Pin 8 como entrada nivel 0 para secuenciar
//el movimiento grabado
45
pinMode(rojo,OUTPUT); //LED rojo pin 9 salida
pinMode(verde,OUTPUT); //LED verde pin 10 salida
pinMode(azul,OUTPUT); //LED azul pin 11 salida
46
//----------------------------------------------------
pinMode(10,OUTPUT);
pinMode(53,OUTPUT);//Necesario para la librería SD en Arduino Mega 2560
Serial.print("Initializing SD card...");
if (SD.begin(53)== 0)
{
Serial.println ("Error de lectura en SD o bien; no hay Tarjeta");
while (SD.begin(53)== 0)//cuando sea 1 salir
{
delay(5); //Buble infinito hasta que se inserte tarjeta SD
}
} //fin del if (SD.begin(53)== 0)
//---------------------------------------------------------
void loop()
//---------------------------------------------------------
{
/*
*/
47
Joystick(0,2,22,23,'A'); //motor 1 (pinza)le asigno A al motor 1
// ---------- F I N D E L P R O G R A M A -----------------
//----------------------------------------------------
48
Serial.println(servoVal);
delay(3000);
*/
/*
// 3º PARA LOS POTENCIÓMETROS ""NO BORRAR para hacer pruebas""
while (1)
{
servoVal = analogRead (5); //
servoVal = map(servoVal,0,1023,0,179);
Serial.print("MOTOR 1 ");
Serial.println(servoVal);
delay(2000);
49
Serial.print("MOTOR 5 ");
Serial.println(servoVal);
delay(2000);
}
*/
Tutorial: Uso de Driver L298N para motores DC y paso a paso con Arduino
El siguiente tutorial esta basado en el Driver dual para motores (Full-Bridge) – L298N, ofrecido por
ELECTRONILAB.CO. Puedes adquirir este módulo en nuestra tienda.
Este módulo basado en el chip L298N te permite controlar dos motores de corriente continua o un motor
paso a paso bipolar de hasta 2 amperios.
El módulo cuenta con todos los componentes necesarios para funcionar sin necesidad de elementos
adicionales, entre ellos diodos de protección y un regulador LM7805 que suministra 5V a la parte lógica
del integrado L298N.
Cuenta con jumpers de selección para habilitar cada una de las salidas del módulo (A y B).
La salida A esta conformada por OUT1y OUT2
La salida B por OUT3 y OUT4.
Los pines de habilitación son ENA y ENB respectivamente.deben estar a nivel alto para estar operativo
Echemos un vistazo a cómo controlar sólo uno de los motores, Motor1. Con el fin de activar el motor, la
línea ENABLE1 debe ser alta. A continuación, controlar el motor y su dirección mediante la aplicación
de una señal LOW o HIGH a las líneas Input1 y INPUT2, como se muestra en esta tabla.
Input1 Input2 Acción
0 0 Roturas de motor y paradas *
1 0 El motor gira hacia adelante
0 1 El motor gira hacia atrás
1 1 Roturas de motor y paradas *
* Para costa un motor a una parada más lento, aplique una señal de baja a la línea ENABLE1.
En la parte inferior se encuentran los pines de control del módulo, marcados como IN1, IN2, IN3 e IN4.
50
Conexión de alimentación
Este módulo se puede alimentar de 2 maneras gracias al regulador integrado LM7805.
.
Características
51
Admite entradas de señal PWM para el control de velocidad.
Dimensiones: 43 mm x 23,9 mm x 43 mm.
Salidas: para 2 motores de DC o para un motor bipolar paso a paso.
Partes
Esquema
Más información:
52