hola buenas tengo un problema con un brazo robótico de 4 grados de libertad. Este es el proyecto que estoy desarrollando para presentarlo.
En resumen, tengo un brazo y una cinta transportadora que están controladas por un arduino mega. Los movimientos que tiene que realizar el brazo dependen de unas salidas digitales de un PLC siemens que dependiendo de la salida que se encienda, el arduino lo lee como entrada digital y hace un movimiento u otro.
Mi problema es que sin tener ninguna señal de entrada para que el brazo haga movimientos, este no se porque reconoce entrada y hace los movimientos aunque no tenga ni las entradas físicamente conectadas. Al hacer pruebas guardo en una variable y me esta leyendo entradas cuando no se le esta mandando ninguna señal ni nada.
por lo tanto no encuentro donde puede estar el problema. El programa que lo tenéis aquí completo, hasta que un sensor en una cinta no detecta que hay pieza y además tiene que tener en HIGH algún entrada digital no tendría que moverse el brazo pero este cuando me detecta una pieza se mueve independientemente de que haya detectado una entrada digital y me estoy volviendo loco en poder resolver este problema.
ante todo quiero decir que soy muy novato, esta es mi primera experiencia con el arduino así que ser buenos si veis algún desastre en la programación.
// esta es la biblioteca que controla los sevos, esta biblioteca ademas nos da la posibilidad
//de poder controlar la velocidad del giro de los servos y si queremos que sea a la vez o uno a uno.
#include <VarSpeedServo.h>
// Declaramos la variable para controlar el servo con la biblioteca VarSpeedServo.h
VarSpeedServo servo1; //servo de la base giratoria
VarSpeedServo servo2; //servo que controla el ombro del brazo
VarSpeedServo servo3; //servo que controla el codo del brazo
VarSpeedServo servo4; //servo que controla la muñeca del blazo
VarSpeedServo servo5; // servo que controla la pinza
VarSpeedServo servo6; //declaramos el motor servo que controla la cinta transportadora
// guardamos los pines usados para las entadas digitales en variables, una por cada pin usado
void setup() { //en void setup, hace primero la lectura al iniciar el programa.
// Lo primero es configurar las entradas digitales, en arduino los pines digitales pueden ser
// tanto entradas como salidas asi que tenemos que indicar que son entradas poninedo INPUT
Serial.begin(9600);
pinMode(22,INPUT);//entrada digital para la casilla 1
pinMode(24,INPUT);//entrada digital para la casilla 2
pinMode(26,INPUT);//entrada digital para la casilla 3
pinMode(28,INPUT);//entrada digital para la casilla 4
pinMode(30,INPUT);//entrada digital para la casilla 5
pinMode(32,INPUT);//entrada digital para la casilla 6
pinMode(34,INPUT);//entrada digital para la casilla 7
pinMode(36,INPUT);//entrada digital para la casilla 8
pinMode(4,INPUT); //entada digital para la lectura del sensor
//hacemos la configuración de los servos para que sean de 0 a 180 grados y ademas le decimos
// en que pines tenemos las señales de los servos.
servo1.attach(5,650,2350);
servo2.attach(6,650,2350);
servo3.attach(9,650,2350);
servo4.attach(10,650,2350);
servo5.attach(11,650,2350);
servo6.attach(12,650,2350);
// como seguimos en setup, ponemos como queremos que esten los servos cuando se inicie el programa
servo1.write(73,25,true);
servo2.write(0,25,true);
servo3.write(180,25,true);
servo4.write(90,25,true);
servo5.write(0,25,true);
}
void loop() { //iniciamos el programa que se lee continuamente
// guardamos los pines usados para las entadas digitales en variables booleanas ya que solo queremos saber si esta en 1 o 0 (HIGH O LOW)
bool pin1 = digitalRead(22); //variable para el pin de la casilla 1 y 9
bool pin2 = digitalRead(24); //variable para el pin de la casilla 2 y 9
bool pin3 = digitalRead(26); //variable para el pin de la casilla 3
bool pin4 = digitalRead(28); //variable para el pin de la casilla 4
bool pin5 = digitalRead(30); //variable para el pin de la casilla 5
bool pin6 = digitalRead(32); //variable para el pin de la casilla 6
bool pin7 = digitalRead(34); //variable para el pin de la casilla 7
bool pin8 = digitalRead(36); //variable para el pin de la casilla 8
bool sensor = digitalRead(4); //variable para el pin del sensor
//le decimos a la mesa transportadora que cuando el sensor tenga un 1 de señal, la mesa este girando
// y cuando detecte una pieza, mandará un 0 y esta se detendrá
if(sensor == HIGH){
servo6.write(120);
}
else if(sensor == LOW){
servo6.write(90);
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 1 (digitalread 22)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin1 == HIGH && pin2 == LOW && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 1
servo1.write(40,25,true);
servo2.write(105,25,true);
servo3.write(145,25,true);
delay(1000);
servo4.write(90,20,true);
delay(1000);
servo5.write(75);
delay(1000);
servo1.write(40,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
}
//finaliza movimiento dejar pieza en casilla 1
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 2 (digitalread 24)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin2 == HIGH && pin1 == LOW && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 2
servo1.write(69,25,true);
servo2.write(105,25,true);
servo3.write(150,25,true);
delay(1000);
servo4.write(90,20,true);
delay(1000);
servo5.write(75);
delay(1000);
servo1.write(69,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
//finaliza movimiento dejar pieza en casilla 2
}
if (pin3 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 3
servo1.write(95,25,true);
servo2.write(105,25,true);
servo3.write(145,25,true);
delay(1000);
servo4.write(90,20,true);
delay(1000);
servo5.write(75);
delay(1000);
servo1.write(95,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
//finaliza movimiento dejar pieza en casilla 3
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 3 (digitalread 26)
//este activado y el sensor tambiém haya detectado que tiene pieza
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 4 (digitalread 28)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin4 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 4
servo1.write(48,25,true);
servo2.write(115,25,true);
servo3.write(100,25,true);
delay(1000);
servo4.write(0,25,true);
servo3.write(110,25,true);
servo2.write(118,25,true);
delay(1000);
servo5.write(75);
delay(1000);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo4.write(90,25,true);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
//finaliza movimiento dejar pieza en casilla 4
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 5 (digitalread 30)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin5 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 5
servo1.write(69,25,true);
delay(1000);
servo4.write(40,25,true);
servo2.write(115,25,true);
delay(1000);
servo5.write(75);
delay(1000);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo4.write(90,25,true);
servo1.write(69,25,true);
servo6.write(120);
delay(1000);
//finaliza movimiento dejar pieza en casilla 5
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 6 (digitalread 32)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin6 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 6
servo1.write(89,25,true);
delay(1000);
servo4.write(55,25,true);
servo2.write(115,25,true);
delay(1000);
servo5.write(75);
delay(1000);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo4.write(90,25,true);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
//finaliza movimiento dejar pieza en casilla 6
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 7 (digitalread 34)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin7 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 7
servo1.write(53,25,true);
servo2.write(100,25,true);
servo3.write(100,25,true);
delay(1000);
servo4.write(55,25,true);
servo3.write(95,25,true);
servo2.write(126,25,true);
delay(1000);
servo5.write(75);
delay(1000);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo4.write(90,25,true);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
//finaliza movimiento dejar pieza en casilla 7
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 8 (digitalread 36)
//este activado y el sensor tambiém haya detectado que tiene pieza
if (pin8 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 8
servo1.write(69,25,true);
servo2.write(100,25,true);
servo3.write(100,25,true);
delay(1000);
servo4.write(55,25,true);
servo3.write(95,25,true);
servo2.write(126,25,true);
delay(1000);
servo5.write(75);
delay(1000);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo4.write(90,25,true);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
//finaliza movimiento dejar pieza en casilla 8
}
//Ahora para que el brazo funcione se tienen que cumplir las condindiones de que el pin 1 (digitalread 22) y
//el pin 2 (digitalreal 24) este activado y el sensor tambiém haya detectado que tiene pieza
if (pin1 == HIGH && pin2 == HIGH && sensor == LOW) {
//comenzamos a coger la pieza
servo1.write(0,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(70);
delay(500);
servo2.write(90,25,true);
delay(1000);
servo4.write(40,25,true);
servo3.write(125,25,true);
servo2.write(95,25,true);
delay(1000);
servo3.write(127,25,true);
delay(1000);
servo5.write(0);
delay(1000);
servo2.write(60,25,true);
servo3.write(124,25,true);
delay(500);
servo1.write(73,25,true);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
//final movimiento coger pieza con pinza
//movimiento depositar pieza casilla 9
servo1.write(82,25,true);
servo2.write(100,25,true);
servo3.write(100,25,true);
delay(1000);
servo4.write(55,25,true);
servo3.write(95,25,true);
servo2.write(126,25,true);
delay(1000);
servo5.write(75);
delay(1000);
servo2.write(60,25,true);
servo3.write(120,25,true);
delay(1000);
servo5.write(0);
delay(500);
servo4.write(90,25,true);
servo1.write(69,25,true);
delay(1000);
servo6.write(120);
}
//finaliza movimiento dejar pieza en casilla 9
}