Robot con stepper 28byj-48 controlado con encoder

Hola a todos, estoy intentando montar un brazo robotico controlado por encoders, he programado una prueba con un motor y encoder y funciona, cuando añado mas motores y encoders, deja de funcionar. He puesto una fuenta de alimentación externa.

Pongo codigo con un solo motor y un encoder (Este me funciona bien)

include "Stepper.h"

define STEPS 32

//-deteccion de giro del encoder- volatile boolean TurnDetected;

//-deteccion del sentido de giro- volatile boolean rotationdirection;

//-encoder1- const int PinCLK=2; const int PinDT=3; const int PinSW=4;

//-posicion encoder1- int RotaryPosition=0; int PrevPosition; int StepsToTake;

//-Declaración de los pines de cada motor- Stepper small_stepper(STEPS, 22, 24, 26, 28);

void isr () { //-lectura encoder1- delay(4); if (digitalRead(PinCLK)) rotationdirection= digitalRead(PinDT); else rotationdirection= !digitalRead(PinDT); TurnDetected = true;

}

void setup () { //- declaracion de los pines de encoder 1- pinMode(PinCLK,INPUT); pinMode(PinDT,INPUT); pinMode(PinSW,INPUT); digitalWrite(PinSW, HIGH); attachInterrupt (0,isr,FALLING);

}

void loop () { //-fijar velocidad motor 1 max 700- small_stepper.setSpeed(600); if (!(digitalRead(PinSW))) { if (RotaryPosition == 0) { } else { small_stepper.step(-(RotaryPosition*10)); RotaryPosition=0; } }

if (TurnDetected) { PrevPosition = RotaryPosition; if (rotationdirection) { RotaryPosition=RotaryPosition-1;} else { RotaryPosition=RotaryPosition+1;}

TurnDetected = false;

//-numeros de pasos por click motor 1- if ((PrevPosition + 1) == RotaryPosition) { StepsToTake=250; small_stepper.step(StepsToTake); }

if ((RotaryPosition + 1) == PrevPosition) { StepsToTake=-250; small_stepper.step(StepsToTake); }

}

}

Pongo codigo con 3 motores y 3 encoder

include "Stepper.h"

define STEPS 32

//-deteccion de giro del encoder- volatile boolean TurnDetected; volatile boolean TurnDetected2; volatile boolean TurnDetected3; //-deteccion del sentido de giro- volatile boolean rotationdirection; volatile boolean rotationdirection2; volatile boolean rotationdirection3; //-encoder1- const int PinCLK=2; const int PinDT=3; const int PinSW=4; //-encoder 2- const int PinCLK2=5; const int PinDT2=6; const int PinSW2=7; //-encoder 3- const int PinCLK3=8; const int PinDT3=9; const int PinSW3=10; //-posicion encoder1- int RotaryPosition=0; int PrevPosition; int StepsToTake; //-posicion encoder2- int RotaryPosition2=0; int PrevPosition2; int StepsToTake2; //-posicion encoder3- int RotaryPosition3=0; int PrevPosition3; int StepsToTake3; //-Declaración de los pines de cada motor- Stepper small_stepper(STEPS, 22, 24, 26, 28); Stepper small_stepper2(STEPS, 30, 32, 34, 36); Stepper small_stepper3(STEPS, 38, 40, 42, 44); void isr () { //-lectura encoder1- delay(4); if (digitalRead(PinCLK)) rotationdirection= digitalRead(PinDT); else rotationdirection= !digitalRead(PinDT); TurnDetected = true; //-lectura encoder2- delay(4); if (digitalRead(PinCLK2)) rotationdirection2= digitalRead(PinDT2); else rotationdirection2= !digitalRead(PinDT2); TurnDetected2 = true; //-lectura encoder3- delay(4); if (digitalRead(PinCLK3)) rotationdirection3= digitalRead(PinDT3); else rotationdirection3= !digitalRead(PinDT3); TurnDetected3 = true; }

void setup () { //- declaracion de los pines de encoder 1- pinMode(PinCLK,INPUT); pinMode(PinDT,INPUT); pinMode(PinSW,INPUT); digitalWrite(PinSW, HIGH); attachInterrupt (0,isr,FALLING); //- declaracion de los pines de encoder 2- pinMode(PinCLK2,INPUT); pinMode(PinDT2,INPUT); pinMode(PinSW2,INPUT); digitalWrite(PinSW2, HIGH); attachInterrupt (0,isr,FALLING); //- declaracion de los pines de encoder 3- pinMode(PinCLK3,INPUT); pinMode(PinDT3,INPUT); pinMode(PinSW3,INPUT); digitalWrite(PinSW3, HIGH); attachInterrupt (0,isr,FALLING); }

void loop () { //-fijar velocidad motor 1 max 700- small_stepper.setSpeed(600); if (!(digitalRead(PinSW))) { if (RotaryPosition == 0) { } else { small_stepper.step(-(RotaryPosition*10)); RotaryPosition=0; } }

if (TurnDetected) { PrevPosition = RotaryPosition; if (rotationdirection) { RotaryPosition=RotaryPosition-1;} else { RotaryPosition=RotaryPosition+1;}

TurnDetected = false;

//-numeros de pasos por click motor 1- if ((PrevPosition + 1) == RotaryPosition) { StepsToTake=250; small_stepper.step(StepsToTake); }

if ((RotaryPosition + 1) == PrevPosition) { StepsToTake=-250; small_stepper.step(StepsToTake); }

} //-fijar velocidad motor 2 max 700- small_stepper2.setSpeed(600); if (!(digitalRead(PinSW2))) { if (RotaryPosition2 == 0) { } else { small_stepper2.step(-(RotaryPosition2*50)); RotaryPosition2=0; } }

if (TurnDetected2) { PrevPosition2 = RotaryPosition2; if (rotationdirection2) { RotaryPosition2=RotaryPosition2-1;} else { RotaryPosition2=RotaryPosition2+1;}

TurnDetected2 = false;

//-numeros de pasos por click motor 2- if ((PrevPosition2 + 1) == RotaryPosition2) { StepsToTake=50; small_stepper2.step(StepsToTake); }

if ((RotaryPosition2 + 1) == PrevPosition2) { StepsToTake=-50; small_stepper2.step(StepsToTake); } //-fijar velocidad motor 3 max 700- small_stepper3.setSpeed(600); if (!(digitalRead(PinSW3))) { if (RotaryPosition3 == 0) { } else { small_stepper3.step(-(RotaryPosition3*50)); RotaryPosition3=0; } }

if (TurnDetected3) { PrevPosition3 = RotaryPosition3; if (rotationdirection3) { RotaryPosition3=RotaryPosition3-1;} else { RotaryPosition3=RotaryPosition3+1;}

TurnDetected3 = false; } //-numeros de pasos por click motor 3- if ((PrevPosition3 + 1) == RotaryPosition3) { StepsToTake=50; small_stepper3.step(StepsToTake); }

if ((RotaryPosition3 + 1) == PrevPosition3) { StepsToTake=-50; small_stepper3.step(StepsToTake); } } }