MOTORE PASSO-PASSO CON A4988

Salva a tutti,
dovrei realizzare un progetto per lavoro che mi permetta di impostare due parametri che indicano il numero di passi che devono fare due motori passo-passo. Al momento vorrei cercare di farne funzionare almeno uno :D. Per controllare il motore uso il driver A4988. Quando carico il codice base, il motore gira tranquillamente in senso orario e in senso antiorario, appena inserisco il mio codice il motore vibra ma non gira. Ho soltanto copiato e incollato modificando gli opportuni parametri che mi servivano.
Il progetto comprende anche un keypad che mi serve per inserire i parametri, e un lcd i2c che mi serve per visualizzarli ed eventualmente modificarli…
Ecco qui il codice

#include <LiquidCrystal_I2C.h>

#include <Keypad.h>
#define LED 13
#define Accuratezza 4
#define BUTTON 10
const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 3; //three columns
const int stepPin = 11; 
const int dirPin = 12; 
int  val = 0;
char Data[Accuratezza]={0,0,0,0};
int i = 0;
int distance = 0;
int data_count=0;
int stato = 0;
int vecchio_val = 0;
LiquidCrystal_I2C lcd(0x3f, 16, 2);
char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte pin_rows[ROW_NUM] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {6, 7, 8}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

void setup(){


pinMode(BUTTON, INPUT);
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
   pinMode(LED,OUTPUT);
 lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
}

void loop(){
  char key = keypad.getKey();
val = digitalRead(BUTTON);
if (key && key != '*'&& key != '#'){
    Data[data_count] = key; 
    lcd.setCursor(data_count,1); 
    lcd.print(Data[data_count]); 
    data_count++; 
    }
    if (data_count<=4){
   if(key == '#'){
     distance = atoi(Data);
      Serial.println(distance);
     pinMode(LED, LOW);
    delay(distance);
    pinMode(LED, HIGH);
     lcd.clear();
  lcd.setCursor(0,0);
   lcd.print("Distanza: ");
   lcd.setCursor(10,0);
    lcd.print(distance);
    if ((val == HIGH)&& (vecchio_val == LOW)){
      stato = 1-stato;
      delay(1000);
      }
      vecchio_val = val;
      if (stato == 1) {  
       //per risolvere la instabilità del sistema
    digitalWrite(dirPin,HIGH);
    for(int x = 0; x < distance; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(800); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(800); 
  }
  

  }
  /*se premo dinuovo il tasto devo fare tutto al contrario e tornale alla home position*/
else {  
    for(int x = 0; x < distance; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(500); 
  }  
    for(data_count=4;data_count>0;data_count--){
      Data[data_count] = {0};
    }
    data_count = 0;
    delay(3000);
    lcd.clear();
      }
  
    }
    }
    
      else {
         lcd.clear();
  lcd.setCursor(0,0);
   lcd.print("ERRORE");
   delay(3000);
   lcd.clear();
   data_count = 0;
        
        }


     }

Aiutatemi vi prego sto impazzendo, non riesco a capire dove stia sbagliando!!!

Come prima cosa e come più volte indicato nel forum, dovresti indentare per bene il tuo codice (CTRL +T se usi l'IDE Arduino) perché si perde più tempo a capire cosa va con cosa che per il resto.

Tornano al tuo problema... stai cercando di avviare senza rampa un motore passo passo con una frequenza di 1Khz più o meno.
Ammesso che il tuo motore ci arrivi a quella frequenza di pilotaggio, di sicuro non lo fa in tempo 0!

Se non vuoi reinventare l'acqua calda implementando una funzione che gestisca l'accelerazione, ci sono delle ottime librerie già pronte che lo fanno egregiamente.

Ah scusa la mia ignoranza la prossima volta sarà fatto.
Proverò allora con una libreria per stepper e vedremo anche se non capisco che se carico questo programma semplice che da questi impulsi il motore gira con il programma completo vibra soltanto della durata del ciclo for()

    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(800); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(800);

Secondo me 800uS è un tempo troppo breve.
Prova con tempi superiori al mS, es: 2000uS e poi diminuisci fino a trovare il tempo più idoneo

Questo valore di delay cambia solo la velocità

Si, già sperimentato, con tempo passo troppo bassi il motore si mette a vibrare.
Ti consiglio di provare.

Grazie mille ho provato ma purtroppo niente da fare ,proverò un altro driver dato che questo non ne vuole sapere e vediamo che succede.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.