[SOLUCIONADO] Funcion millis me detiene el programa

Hola muy buenas a tod@s, tengo el siguiente codigo para manejar 3 motores por pasos:

#include <Stepper.h>
 
#define STEPS 200

int poteX = A0;
int poteY = A1;
int poteZ = A2;
 
Stepper motorX(STEPS, 8, 9);
Stepper motorY(STEPS, 10, 11);
Stepper motorZ(STEPS, 12, 13);

unsigned long previousMillisP1 = 0;
unsigned long previousMillisP2 = 0;
unsigned long previousMillisP3 = 0;

const long intervalP1 = 5;
const long intervalP2 = 5;
const long intervalP3 = 5;

void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}
 
void loop()
{
  poteX = analogRead(A0);
  poteX = map(poteX, 0, 1023, 30, 150);
  poteY = analogRead(A1);
  poteY = map(poteY, 0, 1023, 30, 150);
  poteZ = analogRead(A2);
  poteZ = map(poteZ, 0, 1023, 30, 150);

  Serial.print("Valor pote X: ");
  Serial.println(poteX);
  Serial.print("Valor pote Y: ");
  Serial.println(poteY);
  Serial.print("Valor pote Z: ");
  Serial.println(poteZ);
  
  unsigned long currentMillis = millis();
  
  if ((unsigned long)(currentMillis - previousMillisP1) >= intervalP1)
  {
    if((poteX >30) && (poteX <82))
    {
      motorX.setSpeed(poteX);
      motorX.step(200);
    }
    if((poteX >83) && (poteX <91))
    {
      motorX.setSpeed(0);
      motorX.step(0);
    }
    if((poteX >92) && (poteX <150))
    {
      motorX.setSpeed(poteX);
      motorX.step(-200);
    }
  }
  
  if ((unsigned long)(currentMillis - previousMillisP2) >= intervalP2)
  {
    if((poteY >30) && (poteY <69))
    {
      motorY.setSpeed(poteY);
      motorY.step(200);
    }
    if((poteY >70) && (poteY <79))
    {
      motorY.setSpeed(0);
      motorY.step(0);
    }
    if((poteY >80) && (poteY <150))
    {
      motorY.setSpeed(poteY);
      motorY.step(-200);
    }
  }
  
  if ((unsigned long)(currentMillis - previousMillisP3) >= intervalP3)
  {  
    if((poteZ >30) && (poteZ <69))
    {
      motorZ.setSpeed(poteZ);
      motorZ.step(200);
    }
    if((poteZ >70) && (poteZ <79))
    {
      motorZ.setSpeed(0);
      motorZ.step(0);
    }
    if((poteZ >80) && (poteZ <150))
    {
      motorZ.setSpeed(poteZ);
      motorZ.step(-200);
    }
  }
}

La idea es:
Con dos modulos de joystick (tipo playstation) controlar la velocidad y sentido de giro de los 3 motores por pasos, en cuanto al cirtuito me he montado un driver para cada motor (L293D) que quiero controlar con dos cables (por motor).La parte electronica funciona.

El problema:
Cuando manipulo el joystick el motor gira unos segundos y se detiene otros tantos, girar gira bien, si le doy al joy gira en un sentido y otro pero no de forma continua, yo quiero que avance o retroceda mientras tenga presionado el joy. Tambien me ocurre que si doy a joystick a tope el motor se detiene y vibra, tanto a derecha como a izquierda.
Tampoco se si los valores del mapeo

  poteX = analogRead(A0);
  poteX = map(poteX, 0, 1023, 30, 150);
  poteY = analogRead(A1);
  poteY = map(poteY, 0, 1023, 30, 150);
  poteZ = analogRead(A2);
  poteZ = map(poteZ, 0, 1023, 30, 150);

son los mas correctos…

Estoy “peleando” desde hace ya un tiempo con la funcion millis, no se si la estoy usando correctamente. No termino de cogerle el tranquillo.

Espero me puedan echar una mano con el codigo.

Gracias por su tiempo!

El problema es la librería y no tu código.
Usa esta líbrería AccelStepper y has las adaptaciones necesarias

mira sus ventajas

  • Supports acceleration and deceleration
  • Supports multiple simultaneous steppers, with independent concurrent stepping on each stepper <= Esto es lo que necesitas
  • API functions never delay() or block
  • Supports 2, 3 and 4 wire steppers, plus 3 and 4 wire half steppers.
  • Supports alternate stepping functions to enable support of AFMotor ( Adafruit Motor Shield library)
  • Supports stepper drivers such as the Sparkfun EasyDriver (based on 3967 driver chip)
  • Very slow speeds are supported
  • Extensive API
  • Subclass support

Muchas gracias por su rapida y didáctica respuesta! :slight_smile:

He investigado un poco la libreria y los ejemplos que acompaña, he llehado ha esto:

#include <AccelStepper.h>
#include <MultiStepper.h>

int poteX = A0;
int poteY = A1;
int poteZ = A2;
 
AccelStepper motorX(AccelStepper::FULL2WIRE, 8, 9);
AccelStepper motorY(AccelStepper::FULL2WIRE, 10, 11);
AccelStepper motorZ(AccelStepper::FULL2WIRE, 12, 13);

unsigned long previousMillisP1 = 0;
unsigned long previousMillisP2 = 0;
unsigned long previousMillisP3 = 0;

const long intervalP1 = 5;
const long intervalP2 = 5;
const long intervalP3 = 5;

MultiStepper motores;

void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  
  motorX.setMaxSpeed(100);
  motorX.setAcceleration(20);
  motorY.setMaxSpeed(100);
  motorY.setAcceleration(20);
  motorZ.setMaxSpeed(100);
  motorZ.setAcceleration(20);
    
  motores.addStepper(motorX);
  motores.addStepper(motorY);
  motores.addStepper(motorZ);
}
 
void loop()
{
  poteX = analogRead(A0);
  poteX = map(poteX, 0, 1023, 30, 150);
  poteY = analogRead(A1);
  poteY = map(poteY, 0, 1023, 30, 150);
  poteZ = analogRead(A2);
  poteZ = map(poteZ, 0, 1023, 30, 150);

  Serial.print("Valor pote X: ");
  Serial.println(poteX);
  Serial.print("Valor pote Y: ");
  Serial.println(poteY);
  Serial.print("Valor pote Z: ");
  Serial.println(poteZ);
  
  unsigned long currentMillis = millis();
  
  if ((unsigned long)(currentMillis - previousMillisP1) >= intervalP1)
  {
    if((poteX >30) && (poteX <82))
    {
      motorX.setSpeed(50);
      motorX.runSpeed();
    }
    if((poteX >83) && (poteX <91))
    {
      motorX.setSpeed(0);
      motorX.runSpeed();
    }
    if((poteX >92) && (poteX <150))
    {
      motorX.setSpeed(-50);
      motorX.runSpeed();
    }
  }
  
  if ((unsigned long)(currentMillis - previousMillisP2) >= intervalP2)
  {
    if((poteY >30) && (poteY <82))
    {
      motorY.setSpeed(150);
      motorY.runSpeed();
    }
    if((poteY >83) && (poteY <91))
    {
      motorY.setSpeed(0);
      motorY.runSpeed();
    }
    if((poteY >92) && (poteY <150))
    {
      motorY.setSpeed(-150);
      motorY.runSpeed();
    }
  }
  
  if ((unsigned long)(currentMillis - previousMillisP3) >= intervalP3)
  {  
    if((poteZ >30) && (poteZ <82))
    {
      motorZ.setSpeed(50);
      motorZ.runSpeed();
    }
    if((poteZ >73) && (poteZ <91))
    {
      motorZ.setSpeed(0);
      motorZ.runSpeed();
    }
    if((poteZ >92) && (poteZ <150))
    {
      motorZ.setSpeed(-50);
      motorZ.runSpeed();
    }
  }
}

Y me encuentro con el problema que cuando hay mas de un motor conectado a la protoboard los motores no funcionan, vibran … :frowning:

Es curioso, cada uno funciona bien, siempre y cuando no haya otro conectado y recalco conectado porque no es necesario funcionen simultaneamente, sucede solo por estar conectados a la misma placa…

¿Se le ocurre algo?¿ Puede ser error de hardware?

Muchas gracias por su tiempo!

Si los alimentas desde arduino estoy seguro que eso te pasará.
No se que motores usas porque nada dices sobre corrientes pero no uses arduino para alimentar motores.
Usa fuente externa de la tensión que sea. Si fueran 5V busca una fuente que entregue al menos 1A (estoy suponiendo). Arduino no entrega mas de 300mA.

Compartes GND con arduino y todo lo demás igual.

Muchas gracias, llevas razaon, pues los motores son reciclados de impresoras Epson, en la propia etiqueta de los motores figuran algunos datos

Motor OKI 5Z16AC1
DC 3.3V
5.5 Ohm
7.5 DEG/Step

Motor OKI 5Z07AA1
DC 5.6V
7.9 Ohm
7.5 Deg/Step

los alimento con fuente externa de 5V (Regulables), 500mA y GND compartidos

Arduino UNO Rev3 alimentado por USB

¿Crees que será cuentión de amperios?

Por dios, a punto de quemar tu arduino. Mucho cuidado con eso. Arduino no es para entregar grandes corrientes.
NO USEN los 5V para alimentar MOTORES

Lo enfatizo para quien lea esto!!

He puesto una fuente que tenia por aqui que entrega 5V (también regulables) 1000mA y funciona bien, tenias toda la razón Surbyte, perece que era una cuestión de amperios. Muchas gracias! :slight_smile:

Los motores no los alimenté en ningun momento con Arduino, ya leí algun post en el que, precisamente tu, aportabas los datos acerca del amperaje que maneja Arduino.

Gracias por su tiempo

doy por solucionado mi problema, :slight_smile:
cambio el titulo a Solucionado

PD: Ahora el L293 alcanza una temperatura muy elevada, quizá necesite drivres mas potentes...