Brazo robótico proyecto

Hola, estoy estudiando ing Industrial tengo una clase de robótica, me pudieron programar y armar un brazo robótico, la indicación fue que el brazo se moviera tomara un objeto y lo cambiara de lugar, programado con Arduino, por las clases virtuales es muy poco lo que vemos me pueden ayudar gracias!
Saludos!
BRAZO ROBOTICO 2.0

#include <Servo.h>
#include <Stepper.h>
#define STEPS 32
#define temp 25

//MOTOR PASO A PASO
volatile boolean TurnDetected;
volatile boolean rotationdirection;
const int PinCLK=2;
const int PinDT=3;
int RotaryPosition=0;
int PrevPosition;
int StepsToTake;
Stepper small_stepper(STEPS, 4, 6, 5, 7);
void isr () {
delay(4); // delay for Debouncing
if (digitalRead(PinCLK))
rotationdirection= digitalRead(PinDT);
else
rotationdirection= !digitalRead(PinDT);
TurnDetected = true;
}

//SERVOMOTORES
int i=0,j=0,x=0;
Servo servomotor3; //Servomotor pinza
int boton_sub3=0;
int boton_baj3=0;
Servo servomotor2; //Servomotor en medio
int boton_sub2=0;
int boton_baj2=0;
Servo servomotor1; //Servomotor abajo
int boton_sub1=0;
int boton_baj1=0;

void setup(){
//MOTOR PASO A PASO
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
attachInterrupt (0,isr,FALLING);

//SERVOMOTORES
servomotor3.attach(13);
servomotor3.write(0);
pinMode(A4,INPUT);
pinMode(A5,INPUT);

servomotor2.attach(12);
servomotor2.write(0);
pinMode(A2,INPUT);
pinMode(A3,INPUT);

servomotor1.attach(11);
servomotor1.write(0);
pinMode(A0,INPUT);
pinMode(A1,INPUT);
}

void loop(){
//MOTOR PASO A PASO
small_stepper.setSpeed(700);
if (TurnDetected) {
PrevPosition = RotaryPosition;
if (rotationdirection) {
RotaryPosition=RotaryPosition-1;}
else {RotaryPosition=RotaryPosition+1;}
TurnDetected = false;
if ((PrevPosition + 1) == RotaryPosition) {
StepsToTake=50;
small_stepper.step(StepsToTake);}
if ((RotaryPosition + 1) == PrevPosition) {
StepsToTake=-50;
small_stepper.step(StepsToTake);}
}
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);

//SERVOMOTOR pinza
boton_sub3=digitalRead(A4);
boton_baj3=digitalRead(A5);
if(boton_sub3==HIGH){
i++;
servomotor3.write(i);
delay(temp);
}
if(boton_baj3==HIGH){
i–;
servomotor3.write(i);
delay(temp);
}
//SERVOMOTOR en medio
boton_sub2=digitalRead(A2);
boton_baj2=digitalRead(A3);
if(boton_sub2==HIGH){
j++;
servomotor2.write(j);
delay(temp);
}
if(boton_baj2==HIGH){
j–;
servomotor2.write(j);
delay(temp);
}
//SERVOMOTOR abajo
boton_sub1=digitalRead(A0);
boton_baj1=digitalRead(A1);
if(boton_sub1==HIGH){
x++;
servomotor1.write(x);
delay(temp);
}
if(boton_baj1==HIGH){
x–;
servomotor1.write(x);
delay(temp);
}
}

Hola @Karench, menudo cacao tenias :slightly_smiling_face:
Vamos a ver te he redefinido algunas entradas a IMPUT_PULLUP, por si acaso. En las variable i,j,x cuado la restabas 1 ponias " i-" debes poner " i–", como cuando la aumentas con ++
En cuanto al trozo que maneja el motor paso a paso, (no lo decias y no se que pinta en un brazo robot, explicalo), creo que estabam mal encadenados los if-else, (creo que faltaban “{”, pero sin saber lo que quieres hacer con ese motor no se si ese trozo esta bien rehecho.
Parece ser que ese motor provoca una interrupcción , ten en cuenta que una isr de interrupción no funcionan ni los delays ni los millis.
En fin si quitamos lo del motor paso a paso no veo problemas en que funcionen los servos, aunque las lecturas de los botones asociados podrian mejorarse.
Te dejo el código que me sale, pruebalo y se comenta los resultados.

#include <Servo.h>
#include <Stepper.h>
#define STEPS 32
#define temp 25

//MOTOR PASO A PASO
volatile boolean TurnDetected;
volatile boolean rotationdirection;
const int PinCLK=2;
const int PinDT=3;
int RotaryPosition=0;
int PrevPosition;
int StepsToTake;
Stepper small_stepper(STEPS, 4, 6, 5, 7);



//SERVOMOTORES
int i=0,j=0,x=0;
Servo servomotor3; //Servomotor pinza
int boton_sub3=0;
int boton_baj3=0;
Servo servomotor2; //Servomotor en medio
int boton_sub2=0;
int boton_baj2=0;
Servo servomotor1; //Servomotor abajo
int boton_sub1=0;
int boton_baj1=0;

void setup(){
//MOTOR PASO A PASO
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
attachInterrupt (0,isr,FALLING);

//SERVOMOTORES
servomotor3.attach(13);
servomotor3.write(0);
pinMode(A4,INPUT_PULLUP);
pinMode(A5,INPUT_PULLUP);

servomotor2.attach(12);
servomotor2.write(0);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);

servomotor1.attach(11);
servomotor1.write(0);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
}

void loop(){
//MOTOR PASO A PASO
small_stepper.setSpeed(700);
if (TurnDetected) {
    PrevPosition = RotaryPosition;
    if (rotationdirection) {
       RotaryPosition=RotaryPosition-1;
       }
    else {RotaryPosition=RotaryPosition+1;}
          TurnDetected = false;
          if ((PrevPosition + 1) == RotaryPosition) {
              StepsToTake=50;
              small_stepper.step(StepsToTake);
              }
if ((RotaryPosition + 1) == PrevPosition) {
    StepsToTake=-50;
    small_stepper.step(StepsToTake);
    }
}

digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);

//SERVOMOTOR pinza
boton_sub3=digitalRead(A4);
boton_baj3=digitalRead(A5);
if(boton_sub3==HIGH){
  i++;
  servomotor3.write(i);
  delay(temp);
  }
if(boton_baj3==HIGH){
  i--;
  servomotor3.write(i);
  delay(temp);
  }
//SERVOMOTOR en medio
boton_sub2=digitalRead(A2);
boton_baj2=digitalRead(A3);
if(boton_sub2==HIGH){
  j++;
  servomotor2.write(j);
  delay(temp);
  }
if(boton_baj2==HIGH){
  j--;
  servomotor2.write(j);
  delay(temp);
  }

//SERVOMOTOR abajo
boton_sub1=digitalRead(A0);
boton_baj1=digitalRead(A1);
if(boton_sub1==HIGH){
  x++;
  servomotor1.write(x);
  delay(temp);
  }
if(boton_sub1==HIGH){
  x--;
  servomotor1.write(x);
  delay(temp);
  }
}


void isr () {
    //delay(4); // delay for Debouncing//En una funcion ISR no funcionan los delays
    if (digitalRead(PinCLK)){
       rotationdirection= digitalRead(PinDT);
       }
    else {
         rotationdirection= !digitalRead(PinDT);
         TurnDetected = true;
         }
}

Saludos.

Hola @gonpezzi muchas gracias por la contestacion, el motor paso a paso si hace su funcion, no logro hacer que los pulsadores muevan los servomotores, no se que mas hacer? :frowning: me siento frustrada, llevo mas de una semana investigando que puedo hacer y no he tenido exito.

Saludos!

KCH

Hola @gonpezzi estoy pensando tal vez la manera de contactar? Gracias

Hola, si va a ser de como has hecho las conexiones.
He montado en la protoboard el circuito solo para un servo (el abajo) y he visto que:
Las lecturas de los puertos son erraticas ya que al no pulsar el boton, el puerto esta
al aire, (aunque este la r 220 conectada a el). Si quieres que te funcione el codigo como
esta tendrias que colocar una R a masa de unos 4k7, (pull_down), Pero algo asi
ya te lo imaginabas porque veo en la foto un cable que va de la union de la R y boton a
no se ve donde. ¿a donde va conectado ese cable?.
Yo particularmente cambiaria harware y software asi me ahorraria esa nueva
resistencia. lo acabo de probar y va de lujo.
En lugar de esa R220 conectada al positivo (que le exige demasiado al puerto, unos
20ma),he hecho el siguiente montaje:
puerto--------R480ohmios--------Boton----------Masa
y en el codigo unos cambios minimos:
Definicion de los puertos:

pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);

con esto el chip coloca unas resistencias PULL_UP y ya no las tienes que colocar tu
y en el codigo del Servo:

//SERVOMOTOR abajo
boton_sub1=digitalRead(A0);
boton_baj1=digitalRead(A1);
if(boton_sub1 == LOW){
  x++;
  if (x>180){x=180;}
   servomotor1.write(x);
  delay(temp);
  }
if(boton_baj1 == LOW){ 
   x--;
   if (x<0){x=0;}
   servomotor1.write(x);
  delay(temp);
  }
Me ha funcionado a la primera.Pruevalo y veras.
Saludos.
````Preformatted text`

Moderador:
Por favor @ karench lee las normas y edita tu código inicial usando etiquetas. Observa como la modificación de @gonpezzi se lee correctamente y la tuya es texto plano fuera de las normas.

Hola estoy estudiando y me pidieron de proyecto un brazo robótico, la verdad no sé nada de programación no sé si me puedan ayudar se los agradecería enormemente

Yo creo que un problema como éste merece una explicación mas detallada, o el profesor simplemente te dijo Karen haz un brazo robótico y no tiene objetivos de ningún tipo.
Lo que te pide @gonpezzi es excatamente contextualizar el problema para poder ayudarte adecuadamente.
Quedo a la espera de esto para brindar mi ayuda.

Hola @karench , me he dado cuenta de otra cosa en la foto uno de los pulsadore, (el tercero), esta girado 90º, con lo cual esta en cortocircuito, es decir como pulsado. ¿ O ese esta bien y los otros mal?, revisalos.
Saludos.

Hola @gonpezzi estoy estudiando ing Industrial tengo una clase de robótica, solo me pudieron que el brazo se moviera tomara un objeto, programado con Arduino, por las clases virtuales es muy poco lo que vemos y la verdad por eso pedí ayuda por este medio, te agradezco mucho el que estés ayudando soy de México.

Te mando una foto de mis conecciones la otra no se observa bien, lo poco que se es por qué he visto tutoriales. Asi que es mínimo.

Saludos!

Hol @karench ¿pero has hecho lo que te he dicho en los dos ultimos post?.

Si, muchas gracias!! :grinning:

te mando video de como quedo saludos!!