Comandare stepper ULN2003 con Joystick

Buongiorno,

Vorrei come da titolo, comandare uno stepper ULN 2003 tramite Joystick.

Fin qui tutto bene, alquanto facile, ho provato una varietà di sketch presi in rete, per per trovare quello più adatto alle mie esigenze.

Purtroppo, caricando uno sketch è successo un disastro.

Non solo, non funziona, ma ancora peggio, quando collego il nano al pc, le linee TX e RX; restano occupate a ricevere ed inviare chissà quali dati. Impedendomi di caricare qualsiasi altro sketch o di compiere; una qualsivoglia azione, come semplicemente aprire il monitor seriale.

Questi sono tre degli sketch molto simili tra loro, praticamente uguali, solo che uno di questi e forse neanche per colpa di uno di loro, quando collego le linee sono intasate.

Primo:

#include <Stepper.h>

#define STEPS 32

// define stepper motor control pins
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 5

// initialize stepper library
Stepper stepper(STEPS, IN4, IN2, IN3, IN1);

// joystick pot output is connected to Arduino A0
#define joystick A2

void setup()
{
Serial.begin(9600);
}

void loop()
{
// read analog value from the potentiometer
int val = analogRead(joystick);

// if the joystic is in the middle ===> stop the motor
if( (val > 500) && (val < 530) )
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
Serial.print("Sono Fermo");
Serial.print("\n");
delay(500);
}

else
{
// move the motor in the first direction
while (val >= 500)

{
  Serial.print("val prima ");
  Serial.print(val);
  Serial.print("\n");
// map the speed between 5 and 500 rpm
int speed_ = map(val, 1000, 1023, 200, 1000);
 Serial.print("speed_ prima ");
 Serial.print(speed_);
 Serial.print("\n");
// set motor speed
stepper.setSpeed(speed_);

// move the motor (1 step)
stepper.step(1);

val = analogRead(joystick);
}

// move the motor in the other direction
while (val <= 530)
{
   Serial.print("val-500 prima ");
   Serial.print(val);
   Serial.print("\n");
// map the speed between 5 and 500 rpm
int speed_ = map(val, 530, 0, 200, 1000);
 Serial.print("speed_-500 prima ");
 Serial.print(speed_);
 Serial.print("\n");
// set motor speed
stepper.setSpeed(speed_);

// move the motor (1 step)
stepper.step(-1);

val = analogRead(joystick);
}

}

}

Secondo:

// include Arduino stepper motor library
#include <Stepper.h>
 
//  define number of steps per revolution
#define STEPS 32
 
// define stepper  motor control pins
#define IN1  2
#define IN2  3
#define IN3  4
#define IN4  5
 
// initialize stepper library
Stepper stepper(STEPS, IN4, IN2,  IN3, IN1);
 
// joystick pot output is connected to Arduino A0
#define  joystick  A2
 
void setup()
{
Serial.begin(9600);  
}
 
void loop()
{
  //  read analog value from the potentiometer
  int val = analogRead(joystick);
  
  // if the joystic is in the middle ===> stop the motor
  if(  (val > 500)  && (val < 523) )
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    Serial.print("Sono Fermo");
    Serial.print("\n");
    delay(500);
  }
 
  else
  {
    // move the motor in the first direction
    while (val  >= 523)
    {
      // map the speed between 5 and 500 rpm
      int speed_  = map(val, 523, 1023, 5, 500);
       Serial.print("speed_ prima ");
       Serial.print(speed_);
       Serial.print("\n");
      // set motor speed
      stepper.setSpeed(speed_);
  
      // move the motor (1 step)
      stepper.step(1);
 
      val  = analogRead(joystick);
    }
 
    // move the motor in the other direction
    while (val <= 500)
    {
      // map the speed between 5 and 500 rpm
      int speed_ = map(val, 500, 0, 5, 500);
      // set motor speed
      stepper.setSpeed(speed_);
  
      // move the motor (1 step)
      stepper.step(-1);
 
      val  = analogRead(joystick);
    }
 
  }
 
}

Terzo:

/*
 * Unipolar stepper motor speed and direction control with Arduino
 *   and joystick
 * This is a free software with NO WARRANTY.
 * http://simple-circuit.com/
 */
 
// include Arduino stepper motor library
#include <Stepper.h>
 
// define number of steps per revolution
#define STEPS 32
 
// define stepper motor control pins
#define IN1  2
#define IN2  3
#define IN3  4
#define IN4  5
 
// initialize stepper library
Stepper stepper(STEPS, IN4, IN2, IN3, IN1);
 
// joystick pot output is connected to Arduino A0
#define joystick  A2
 
void setup()
{
  
}
 
void loop()
{
  // read analog value from the potentiometer
  int val = analogRead(joystick);
 
  // if the joystic is in the middle ===> stop the motor
  if(  (val > 500) && (val < 523) )
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }
 
  else
  {
    // move the motor in the first direction
    while (val >= 523)
    {
      // map the speed between 5 and 500 rpm
      int speed_ = map(val, 523, 1023, 5, 500);
      // set motor speed
      stepper.setSpeed(speed_);
 
      // move the motor (1 step)
      stepper.step(1);
 
      val = analogRead(joystick);
    }
 
    // move the motor in the other direction
    while (val <= 500)
    {
      // map the speed between 5 and 500 rpm
      int speed_ = map(val, 500, 0, 5, 500);
      // set motor speed
      stepper.setSpeed(speed_);
 
      // move the motor (1 step)
      stepper.step(-1);
 
      val = analogRead(joystick);
    }
 
  }
 
}

Se potreste aiutarmi a capire, se e quale sketch abbia combinato qualcosa ed a capire dove ho sbagliato; per poter rimediare.

Ve ne sarei molto grato.

Cordiali Saluti

Manuel

Che scheda stai usando? (intendo che modello di Arduino)

Ciao, Ale

Arduino Nano

Secondo me primo e' peggio:

I valori si sovrappongono, e' una trappola.
Poi se consideriamo cosa c'e' dentro la trappola...

Quindi come posso fermare questo flusso infinito di informazioni che passano nel bus, anche con il programma arduino chiuso ed il pc riavviato?

Finché non fermo questo flusso non posso agire sulla scheda in nessun modo.

Premi il pulsante di caricamento dello sketch sull’IDE, appena termina la compilazione ed inizia il caricamento premi (velocemente!) il pulsante di reset del nano. Ci dovrai probabilmente provare più volte…

Ciao, Ale.

Una volta che risolvi, cerca di evitare di usare while() all'interno del loop() intanto perché sono in genere parti di codice "bloccanti" (ossia la CPU non può seguire o fare altro), sia perché il "loop()" è già lui stesso un ciclo richiamato infinite volte.
Nel tuo caso poi puoi togliere i while() sostituendoli con altrettanti "if()". E togliere l'ulteriore lettura analogRead() perché tanto la fa già a inizio loop.

Appena sblocchi la cosa, se vuoi vediamo qui il tuo "nuovo" codice.

Alcune cose non quadrano, anzi sono proprio tonde

Primo: evita come la peste quei programmi e tutto, ripeto tutto, quello che abbia la stessa origine

Un programmatore che per ben tre volte chiama degli output come IN… e li usa lasciandoli in alta impedenza è un ‘cane pericoloso’ e va evitato, lui e tutti i suoi "amici" ovvero siti e forum e similia che gli lasciano spazio
Internet è già abbastanza piena di robaccia fetida e marrone, evitiamo...

Poi la questione che hai sempre traffico e non riesci a resettare…

Che Arduino usi?

Ma in generale aprire la seriale alza DTR e questo resetta in hardware l’arduino

Quindi delle tre l'una:

Hai riscritto il boot-loader, e non credo

Oppure hai qualcosa di attaccato all’arduino

Oppure hai qualche guasto
Comincia a controllare il cavo e prova con un altro Arduino

Utilizzo un Arduino Nano.

Aprire la seriale alza il DTR. Cosa è il DTR?

L’Arduino è collegato tramite cavo usb al pc ed ho scollegato tutti i pin. Sia del ULN2003 che del Joystick.

Già provato, il cavo funziona perfettamente…

Ho provato come mi hanno detto sopra, a caricare uno sketch, tipo il “blink“ ed appena lo compila; resettare l’Arduino. Ma purtroppo dopo svariati tentativi, ancora nessun risultato.

Cosa potrei fare a questo punto?

Grazie

Saluti

Se con Arduino Nano intendi il classico ATMgea328P (di Nano ce ne sono diverse famiglie in casa Arduino), puoi prendere un programmatore esterno USBasp per 5/6€ e caricare il firmware senza usare il bootloader.

Un'altra possibilità è usare un secondo Arduino come programmatore esterno.

Risolto. Sono riuscito tramite process explorer a trovare il processo che occupava la porta ed a chiuderlo.

Ora devo solo trovare un buono sketch per farlo funzionare ;)

Trovato ora uno sketch niente male, vorrei solo capire se si può far andare lo stepper un pò più veloce o meno. Io non ci sono riuscito.

const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution
const int rolePerMinute = 15;
const int X_pin = 1; // analog pin connected to X output

Stepper myStepper(stepsPerRevolution, 2, 4, 3, 5);
void setup() {
  myStepper.setSpeed(rolePerMinute);
  
  //Serial.begin(9600);

}

void loop() {
//  Serial.print("X-axis: ");
//  Serial.println(analogRead(X_pin));
  int a = analogRead(X_pin);
  if (a > 400 && a < 520)
  {
    for (int i = 2; i < 6; i++)
    {
      digitalWrite(i, LOW);
    }
  }
  else if (a < 400)
  {
    myStepper.setSpeed(rolePerMinute);
    myStepper.step(-30);
  }
  else if (a > 530)
  {
    myStepper.setSpeed(rolePerMinute);
    myStepper.step(30);
  }



}

Grazie