Se sei già registrato           oppure    

Orario: 28/03/2024 11:42:54  

 

Energia Alternativa ed Energia Fai Da Te > Arduino


Help: Motorizzazione asse x fresa
FinePagina

RAUNARDE
GigaWatt


Gruppo:Utente
Messaggi:1225

Stato:



Inviato il: 26/04/2021 12:20:37

Ciao a tutti, sono alle prime armi con arduino e non riesco a far funzionare questo sketch.
Devo motorizzare l'asse X di una fresa con un motore passo passo Nema34 (ho esagerato, bastava un nema 23....)

Come comandi ho un joystick con pulsanti NO che mi deve effettuare il movimento DX o SX
ho 2 microswitch NC che mi fanno da finecorsa e che quando l'asse x mi arriva al limite apre il contatto
ho 1 pulsante per avanzamento veloce
ho un potenziometro per regolare la velocità normale ed uno per avanzamento veloce.
Infine ho 3 uscite per un driver DM556 e 2 uscite per dei led di stato che "dovrebbero accendersi" quando vado a destra o sx.

il programma l'ho scritto ma non mi funziona, non capisco dove stia sbagliando, ho provato a fare dei cicli richiamati dal Void loop ma senza esito infatti li ho esclusi racchiudendoli tra /*----*/ e li ho poi copiati direttamente nel void loop, ma anche in qusto modo non mi va.


Tutti i comandi li ho collegati verso massa impostando la porta arduino come INPUT_PULLUP così normalmente è alta come valore (HIGH = 5V) e quando chiudo un contatto va a 0 (LOW) tranne i finecorsa che essendo sempre NC sono a = finchè uno non viene azionato e mi manda la porta in HIGH
Sapreste dirmi cosa sto sbagliando?
Grazie mille

int puls_sx = 3;       //pulsante controller SX
int puls_dx = 4;       //pulsante controller DX
int ena = 5;           //ENA stepper Driver
int dir = 6;           //DIR stepper Driver
int pul = 7;           //PUL stepper Driver
int rapid = 8;         //Pulsante rapido
int potS = A0;         //Potenziometro velocità normale
int potR = A1;         //Potenziometro velocità Rapida
int fcsx = 10;         //Fine corsa SX NC
int fcdx = 11;         //Fine corsa DX NC
int ledSx = 12;        //Led direzione SX
int ledDx = 13;        //Led direzione DX
int buzzer = 9;        // Buzzer segnalazioni acustiche
int power_on = 2;       //led stato acceso

int direzione;
long currentMicros = 0;
long previousMicros = 0;
long delay_Micros = 0;

void setup() {

  Serial.begin(9600);
  pinMode(puls_sx, INPUT_PULLUP);
  pinMode(puls_dx, INPUT_PULLUP);
  pinMode(ena, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(pul, OUTPUT);
  pinMode(potS, INPUT);
  pinMode(potR, INPUT);
  pinMode(fcsx, INPUT_PULLUP);
  pinMode(fcdx, INPUT_PULLUP);
  pinMode(ledSx, OUTPUT);
  pinMode(ledDx, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(power_on, OUTPUT);
  
  digitalWrite(power_on, LOW);
  digitalWrite(ledSx,LOW);
  digitalWrite(ledDx,LOW);
  delay(200);
  digitalWrite(ledSx, HIGH);
  digitalWrite(ledDx, HIGH);
  Serial.println ("Ready");
  delay(1000);
  digitalWrite(ledSx, LOW);
  digitalWrite(ledDx, LOW);
  tone(1, 1000, 600);



}

void tone_err() {
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
}


/*

void direz() {
  

  if (puls_sx == LOW) { //funziona a SX
    if (fcsx == LOW) {
      digitalWrite(ledSx, HIGH);
      digitalWrite(dir, HIGH);
      digitalWrite(ena, HIGH);
      tone(4, 800, 300);
      Serial.print("sinistra");
     
    }

    else  {   if (fcsx == HIGH)   {      //finecorsa sx aperto blocco movimento
      digitalWrite(ledSx, LOW); {
        digitalWrite(ena, LOW);
        Serial.print("finecorsa sinistra");
        tone_err();
      }
    }

  }
  }


 if (puls_dx == LOW){
    if (fcdx == LOW){ //funziona a dx
      digitalWrite(ledDx, LOW);
      digitalWrite(dir, LOW);
      digitalWrite(ena, HIGH);
      Serial.print("Destra");
      tone(4, 800, 300);
      
    }

    else {  //(fcdx = HIGH); finecorsa dx aperto blocco movimento
      digitalWrite(ledDx, HIGH); {
        digitalWrite(ena, LOW);
        Serial.print("finecorsa destra");
        tone_err();
      }
    }

  }
  if (puls_dx && puls_sx==LOW){
    digitalWrite(ena,LOW);
  }
 }
*/
void start() {
  currentMicros = micros();



  if (digitalRead(rapid)==HIGH) { //if rapid not pressed
    delay_Micros = map(analogRead(potS), 0, 1024, 50000, 1000); //Read speed
    if (currentMicros - previousMicros >= delay_Micros)
    {
      previousMicros = currentMicros;
      digitalWrite(pul, HIGH);
      delayMicroseconds(100); //Set Value
      digitalWrite(pul, LOW);
    }

  }
  else (digitalRead(rapid)==LOW);{ //if rapid pressed
    delay_Micros = map(analogRead(potR), 0, 1024, 1000, 300); //Read rapid speed

    if (currentMicros - previousMicros >= delay_Micros)
    {
      previousMicros = currentMicros;
      digitalWrite(pul, HIGH);
      delayMicroseconds(100); //Set Value
      digitalWrite(pul, LOW);
      
    }

  }




}

void loop() {
if (puls_sx == LOW) { //funziona a SX
    if (fcsx == LOW) {
      digitalWrite(ledSx, HIGH);
      digitalWrite(dir, HIGH);
      digitalWrite(ena, HIGH);
      tone(4, 800, 300);
      Serial.print("sinistra");
      start();
     
    }

    else  {   if (fcsx == HIGH)   {      //finecorsa sx aperto blocco movimento
      digitalWrite(ledSx, LOW); {
        digitalWrite(ena, LOW);
        Serial.print("finecorsa sinistra");
        tone_err();
      }
    }

  }
  }


 if (puls_dx == LOW){
    if (fcdx == LOW){ //funziona a dx
      digitalWrite(ledDx, LOW);
      digitalWrite(dir, LOW);
      digitalWrite(ena, HIGH);
      Serial.print("Destra");
      tone(4, 800, 300);
      start();
      
    }

    else {  //(fcdx = HIGH); finecorsa dx aperto blocco movimento
      digitalWrite(ledDx, HIGH); {
        digitalWrite(ena, LOW);
        Serial.print("finecorsa destra");
        tone_err();
      }
    }

  }
  if (puls_dx && puls_sx==LOW){
    digitalWrite(ena,LOW);
  }
 }

 //start();


Scarica allegato

Prova_motore_asse_x.ino ( Numero download: 99 )

 

Maufedro

Avatar
MegaWatt


Gruppo:Utente
Messaggi:314

Stato:



Inviato il: 26/04/2021 13:38:02

A prima vista sembra che manchi la dichiarazione delle librerie



---------------
Per ogni problema esistono più soluzioni. ma solo una è la migliore

 

RAUNARDE
GigaWatt


Gruppo:Utente
Messaggi:1225

Stato:



Inviato il: 26/04/2021 14:46:36

Ciao Maufedro, grazie per la risposta, ma non capisco a quali librerie tu stia facendo riferimento, teoricamente non ho usato nulla che necessita di libreria, o magari mi sbaglio ed ecco l'errore.

 

RAUNARDE
GigaWatt


Gruppo:Utente
Messaggi:1225

Stato:



Inviato il: 29/04/2021 10:08:59

Allora situazione in evoluzione, prima da newby di arduino non avevo inserito la lettura dello stato dei pin, sistmato questo mi funziona quasi tutto, non riesco a variare i giri e ad usare l'avanzamento veloce.
probabilmente sbaglio qualcosa con il void start()
provato da solo funziona, ma inserito nello sketch non va.



int puls_sx = 3;       //pulsante controller SX
int puls_dx = 4;       //pulsante controller DX
int ena = 5;           //ENA stepper Driver
int dir = 6;           //DIR stepper Driver
int pul = 7;           //PUL stepper Driver
int rapid = 8;         //Pulsante rapido
int potS = A0;         //Potenziometro velocità normale
int potR = A1;         //Potenziometro velocità Rapida
int fcsx = 10;         //Fine corsa SX NC
int fcdx = 11;         //Fine corsa DX NC
int ledSx = 22;        //Led direzione SX
int ledDx = 23;        //Led direzione DX
int buzzer = 9;        // Buzzer segnalazioni acustiche
int power_on = 2;       //led stato acceso

int val_p_sx =1;
int val_p_dx =1;
int val_fcsx =0;
int val_fcdx =0;
int val_potS =0;
int val_potR =0;
long currentMicros = 0;
long previousMicros = 0;
long delay_Micros = 0;

void setup() {

  Serial.begin(9600);
  pinMode(puls_sx, INPUT_PULLUP);
  pinMode(puls_dx, INPUT_PULLUP);
  pinMode(ena, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(pul, OUTPUT);
  pinMode(potS, INPUT);
  pinMode(potR, INPUT);
  pinMode(fcsx, INPUT_PULLUP);
  pinMode(fcdx, INPUT_PULLUP);
  pinMode(ledSx, OUTPUT);
  pinMode(ledDx, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(power_on, OUTPUT);
  
  digitalWrite(power_on, LOW);
  digitalWrite(ledSx,LOW);
  digitalWrite(ledDx,LOW);
  delay(200);
  digitalWrite(ledSx, HIGH);
  digitalWrite(ledDx, HIGH);
  Serial.println ("Ready");
  delay(1000);
  digitalWrite(ledSx, LOW);
  digitalWrite(ledDx, LOW);
  tone(1, 1000, 600);
  val_potS = analogRead(potS);
  Serial.println(val_potS);
  delay(1000);
  val_potR = analogRead(potR);
  Serial.println(val_potR);
  delay(1000);



}

void tone_err() {
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
}



void start() {
  currentMicros = micros();



  if (digitalRead(rapid)==1) { //se puls rapid non premuto
    delay_Micros = map(analogRead(val_potS), 0, 1024, 10000, 1000); //leggo velocita potS
    if (currentMicros - previousMicros >= delay_Micros)
    {
      previousMicros = currentMicros;
      digitalWrite(pul, HIGH);
      delayMicroseconds(20); 
      digitalWrite(pul, LOW);
    }

  }
  else (digitalRead(rapid)==0);{ //se premo rapid
    delay_Micros = map(analogRead(val_potR), 0, 1024, 1000, 300); //leggo potR

    if (currentMicros - previousMicros >= delay_Micros)
    {
      previousMicros = currentMicros;
      digitalWrite(pul, HIGH);
      delayMicroseconds(20); 
      digitalWrite(pul, LOW);
      
    }

  }




}

  

void loop() {
 val_p_sx = digitalRead(puls_sx);
 val_p_dx = digitalRead(puls_dx);
 val_fcsx = digitalRead(fcsx);
 val_fcdx = digitalRead(fcdx);
if ((val_p_sx == 0)&&(val_p_dx==1)) { //funziona a SX
    if (val_fcsx == 0) {
      digitalWrite(ledSx, HIGH);
      digitalWrite(dir, HIGH);
      digitalWrite(ena, HIGH);
      Serial.println("sinistra");
        start();
     
    }

    else  {   if (val_fcsx == 1)   {      //finecorsa sx aperto blocco movimento
      digitalWrite(ledSx, LOW); {
        digitalWrite(ena, LOW);
        Serial.println("finecorsa sinistra");
        tone_err();
       
      }
    }

  }
  }


 if ((val_p_dx == 0)&&(val_p_sx==1)){
    if (val_fcdx == 0){                   //funziona a dx
      digitalWrite(ledDx, HIGH);
      digitalWrite(dir, LOW);
      digitalWrite(ena, HIGH);
      Serial.println("Destra");
          start();
      
    }

    else {  if(val_fcdx == 1); {                  //finecorsa dx aperto blocco movimento
      digitalWrite(ledDx, LOW); {
        digitalWrite(ena, LOW);
        Serial.println("finecorsa destra");
        tone_err();
       
      }
    }

  }
 }
  if ((val_p_dx==0) && (val_p_sx==0)){
    digitalWrite(ena, LOW);
    Serial.println("Stop 1");
  }
   if ((val_p_dx==1) && (val_p_sx==1)){
     digitalWrite(ena, LOW);
     Serial.println("Stop 2");
  }
 }

 

 

NextStep
milliWatt


Gruppo:Utente
Messaggi:2

Stato:



Inviato il: 16/06/2021 20:12:30

CITAZIONE (RAUNARDE, 29/04/2021 10:08:59 ) Discussione.php?216493&1#MSG3

Allora situazione in evoluzione, prima da newby di arduino non avevo inserito la lettura dello stato dei pin, sistmato questo mi funziona quasi tutto, non riesco a variare i giri e ad usare l'avanzamento veloce.
probabilmente sbaglio qualcosa con il void start()
provato da solo funziona, ma inserito nello sketch non va.


Hai provato a vedere con un oscilloscopio l'andamento del segnale PUL quando vai in rapido?

Come hai collegato i pin di uscita di Arduino agli ingessi del driver DM556, in modo diretto (figura 2 del manuale) oppure hai messo in mezzo un buffer?

Prova ad aggiungere un ulteriore ritardo delayMicroseconds(20); dopo che mandi basso PUL, un esempio:


if (currentMicros - previousMicros >= delay_Micros)
    {
      previousMicros = currentMicros;
      digitalWrite(pul, HIGH);
      delayMicroseconds(20); 
      digitalWrite(pul, LOW);
      delayMicroseconds(20);  <== AGGIUNTO
    }


Hai provato a misurare il tempo che ci impiega Arduino a fare un ciclo completo in rapido ovvero quando tempo ci mette a ritornare nel codice che gestisce la modalità in rapido? Se il giro è più lungo di quello che sarebbe la scansione prevista per il modo rapido può essere che non vada in rapido in quanto il sistema nel suo complesso è troppo lento ed è lui che limita...

Ciao



Modificato da NextStep - 16/06/2021, 20:35:02
 

RAUNARDE
GigaWatt


Gruppo:Utente
Messaggi:1225

Stato:



Inviato il: 22/06/2021 10:43:48

grazie della risposta.
Ho modificato il codice in questo modo e mi funziona tutto, ho solo un problema che di seguito descrivo:

I funzionamento è corretto tranne quando vario la velocità del rapido, mi passa dal valore minimo come rpm fino al massimo ogni 1/3 di giro del potenziometro, superata quella soglia torna al minimo per arrivare al max a 2/3 di giro idem appena supero ed entro nel 3/3 ritorna al minimo e riparte fino al max.
I valori del potenziometro sono corretti, sale costantemente come resistenza, sembra quasi come in radiofrequenza quando si sovrappongano delle armoniche.
Spero di essermi spiegato.
Il problema me lo genera con i delay_microseconds, se lascio in millis va bene , ma ho il problema che mi gira troppo piano (come movimento rapid) avendo impostato sul driver un certo numero di passi per farlo muovere lentamente ma fluido quando devo usarlo per fresare materiali duri.






#define puls_sx 3      //pulsante controller SX
#define puls_dx 4      //pulsante controller DX
#define ena 5           //ENA stepper Driver
#define dir 6           //DIR stepper Driver
#define pul 7           //PUL stepper Driver
#define rapid 8         //Pulsante rapido
#define potS A0         //Potenziometro velocità normale
#define potR A1         //Potenziometro velocità Rapida
#define fcsx 10         //Fine corsa SX NC
#define fcdx 11         //Fine corsa DX NC
#define ledSx 12        //Led direzione SX
#define ledDx 13        //Led direzione DX
#define buzzer 9        // Buzzer segnalazioni acustiche
#define power_on 2       //led stato acceso

int val_p_sx =0;
int val_p_dx =0;
int val_fcsx =0;
int val_fcdx =0;
int val_potS =0;
int val_potR =0;
int val_rapid =0;
int delay_MicrosS = 0;
int delay_MicrosR = 0;

void setup() {

  Serial.begin(9600);
  pinMode(puls_sx, INPUT_PULLUP);
  pinMode(puls_dx, INPUT_PULLUP);
  pinMode(ena, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(pul, OUTPUT);
  pinMode(potS, INPUT);
  pinMode(potR, INPUT);
  pinMode(fcsx, INPUT_PULLUP);
  pinMode(fcdx, INPUT_PULLUP);
  pinMode(ledSx, OUTPUT);
  pinMode(ledDx, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(power_on, OUTPUT);
  pinMode(rapid, INPUT_PULLUP);
  
  digitalWrite(power_on, LOW);
  digitalWrite(ledSx,LOW);
  digitalWrite(ledDx,LOW);
  delay(200);
  digitalWrite(ledSx, HIGH);
  digitalWrite(ledDx, HIGH);
  Serial.println ("Ready");
  delay(1000);
  digitalWrite(ledSx, LOW);
  digitalWrite(ledDx, LOW);
  tone(1, 1000, 600);
  delay(1000);



}

void tone_err() {
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  Serial.println("Tono Errore");
}

void loop() {
check_valori();
direzione();

}

void start_normal() {
  
   // if (digitalRead(val_rapid)==1){                              //se puls rapid non premuto
      //leggo velocita potS
    
    {
      delay (delay_MicrosS);
      digitalWrite(pul, HIGH);
      delayMicroseconds(10); 
      digitalWrite(pul, LOW);
    }

  }

 void start_rapid() {
 // if(digitalRead(val_rapid)==0) {                             //se premo rapid
       //leggo potR
   
   
    {
      delayMicroseconds (delay_MicrosR);
      digitalWrite(pul, HIGH);
      delayMicroseconds(10); 
      digitalWrite(pul, LOW);
      
    }

  }




//}

  
void check_valori() { 

  val_p_sx = digitalRead(puls_sx);
  val_p_dx = digitalRead(puls_dx);
  val_fcsx = digitalRead(fcsx);
  val_fcdx = digitalRead(fcdx);
  val_rapid = digitalRead(rapid);
  delay_MicrosS = map(analogRead(potS), 0, 1023, 1, 40);
  delay_MicrosR = map(analogRead(potR), 0, 1023, 50, 1000);
}
void direzione(){
 
if ((val_p_sx == 0)&&(val_p_dx==1)) { //funziona a SX
    if (val_fcsx == 0) {
      digitalWrite(ledSx, HIGH);
      digitalWrite(dir, HIGH);
      digitalWrite(ena, HIGH);
       if (val_rapid==0){
        start_rapid();
       }
     else {
        start_normal();
       }
    }

    else  {   if (val_fcsx == 1)   {      //finecorsa sx aperto blocco movimento
      digitalWrite(ledSx, LOW); {
        digitalWrite(ena, LOW);
        Serial.println("finecorsa sinistra");
        tone_err();
       
      }
    }

  }
  }


 if ((val_p_dx == 0)&&(val_p_sx==1)){
    if (val_fcdx == 0){                   //funziona a dx
      digitalWrite(ledDx, HIGH);
      digitalWrite(dir, LOW);
      digitalWrite(ena, HIGH);
        if (val_rapid==0){
        start_rapid();
       }
     else {
        start_normal();
       }
      
    }

    else {  if(val_fcdx == 1); {                  //finecorsa dx aperto blocco movimento
      digitalWrite(ledDx, LOW); {
        digitalWrite(ena, LOW);
        Serial.println("finecorsa destra");
        tone_err();
       
      }
    }

  }
 }
  if (((val_p_dx==0) && (val_p_sx==0))||((val_p_dx==1) && (val_p_sx==1))){
    digitalWrite(ena, LOW);
    //Serial.println("Stop");
  }
  
 }

 

  
 



Modificato da RAUNARDE - 22/06/2021, 10:53:33
 
 InizioPagina
 

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum