Problemas con brazo robótico

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

}

Las entradas, como las has definido, están en alta impedancia, no tienen un nivel definido y "leyendo" ruido, por eso hace cualquier cosa cuando no tiene conectado el PLC.

Puedes definir las entradas como INPUT_PULLUP si lo que esperas recibir son niveles bajos o agregar resistencias de 10K a masa (GND) si esperas niveles altos.

Hola bueno ahora me funciona pero no entiendo muy bien el porque.... el caso es que he terminado poniendo esto en cada if de cada movimiento, no lo pongo entero porque ya he puesto mas arriba todo el programa


if (pin1 == LOW && pin2 == HIGH && pin3 == HIGH && pin4 == HIGH && pin5 == HIGH && pin6 == HIGH && pin7 == HIGH && pin8 == HIGH && sensor == LOW) {

Estan todos los pin(...) definidos porque estaba probando mil cosas y no sabia porque me ocurria esto pero bueno no he cambiado y lo he mandado asi
este es el ejemplo del primer movimiento que funciona con la señal de entrada pin1. Para que podáis entender como he realizado la conexión del PLC es que uso un octoacoplador de 8 canales que me pasa de 24v a 5v para el arduino. Ahora me he dado cuenta que sin tener las señales conectadas al PLC, con un multimetro he visto que todas las señales las tengo en 5v y cuando se activan al meter en alguna de las señales del PLC los 24V, esa señal que se activa pasa a 0....
nose muy descolocado me tenia el tema, Almenos ahora me funciona y veo que es cosa del octoacoplador

Tienes que reprogramar todo para que el movimiento de cada servo no sea bloqueante.
Para eso ve a Documentación y lee como usar millis() y máquinas de estados.
Acá te pierdes cada acción mientras se ejecuta algo que por lo visto puede ser erróneo.
Porque programan las cosas sin probar antes lo básico?
Lo básico es ver las entradas y poner simples carteles que muestran que eso se hace bien
Ejemplo

if (pin1 == HIGH && pin2 == LOW && sensor == LOW) {

  //comenzamos a coger la pieza
  Serial.println("Tomamos la pieza");
}

//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) {
  Serial.println("Finaliza movimiento. pieza en casilla 1");

Vas probando estas acciones y te aseguras que cada estado lógico se cumple tal como lo imagináste. Te sorprenderás de lo que puede pasar.
Te hecho te aseguro que cada acción se repite muchas veces.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.