richiesta informazioni inversione rotazione NEMA premendo un pulsante

Buongiorno,

volevo chiedervi un aiuto in quanto non riesco a invertite la rotazione del motore NEMA premendo un pulsante.

il progetto consisterebbe nel far muovere tramite due fine corsa delle paperelle collegate a una badda filettatà che ne trasmette il moto.

Il codice che sto usando è:

const int pinDir = 2;
const int pinStep = 3;
int pulsante = 7;  //Il pulsante è connesso al pin 7
int val = 0;
 
const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 500; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
 
void setup() {
  //inizializzo i PIN come OUTPUT
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pulsante, INPUT);  //Il pin del pulsante è un'entrate
}
void loop() {
 
  val = digitalRead(pulsante);  //Lettura del pulsante  
//definiamo la direzione del motore
if (val == 1){  //Se il valore del pulsante è 1
  digitalWrite(pinDir, HIGH);
 }
 if (val == 0){  //Se il valore del pulsante è 0
  digitalWrite(pinDir, LOW);
 }
 
  //esegue un giro completo in un senso
  for (int x = 0; x < numStepMotore; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  }
 }

Il problema riscontrato è che quando premo il pulsante invece di invertire il sensodi rotazione fino ad una nuova pressione il motore si ferma finche non rilascio il pulsante.

Sperando che questo sia un problema che affligge altri neofiti come me colgo l’occasione per ringraziarvi per la disponibilità.

Carino questo. Adesso l' abbreviazione della "National Electrical Manufacturers Association" (associazione statunitense di produttori di materiale elettrico) dovrebbe specificare il modello di un motore.
Ciao Uwe

Scusami l'imprecisione. Il motore è un motore passo a passo nema17 modello: 42BYGHW811 stepper motor.

perfetto fin qui ci siamo :slight_smile:
e ora dicci con cosa lo comandi :wink:
essendo un bipolare dovresti avere un h-bridge ed essere collegato all'incirca così

bipolar_stepper_four_pins.jpg

bipolar_stepper_four_pins.jpg

@Patrick_M
purtroppo non hai considerato che il driver é un driver di tensione ma il motore é costruito per essere pilotato in corrente. La corrente nominale del motore é cosí alta che non puoi usare i soliti driver per stamanti 3D.

Dati motore:
Coil Resistance: 1.25 Ohms
Rated Current: 2.5 A

Ciao Uwe

Guarda, il tuo problema è semplice:
se ti metti con il ditino (non ti sto prendendo in giro) a seguire il programma lo trovi facile
io per il debug di solito faccio così: carta penna e ditino sulla riga del programma, e poi faccio come quando ero all'asilo: gioco "a che sono io arduino"
comincio a leggere dalla prima riga di loop
leggo pulsante nella variabile val
if val ..... significa che se trovo pulsante su, metto alto il pindir
la seconda if val... significa che se trovo pulsante giu, metto basso il pindir
ferma tutto, mi dico, ma qui se mollo il pulsante, al prossimo giro di loop il pindir viene rimesso basso dalla seconda if....
devo fare che "solo" quando il pulsante "passa" da basso ad alto cambio lo stato del pindir, qualunque esso sia lo inverto.....
ecco il primo problema
Il secondo è che non gira indietro, ma invece si ferma
scommettiamo che hai invertito il collegamento di pindir con pinstep?
però la prossima volta con carta penna e ditino a seguire le righe di codice ti ci metti tu, giusto?

uwefed:
@Patrick_M
purtroppo non hai considerato che il driver é un driver di tensione ma il motore é costruito per essere pilotato in corrente. La corrente nominale del motore é cosí alta che non puoi usare i soliti driver per stamanti 3D.

Dati motore:
Coil Resistance: 1.25 Ohms
Rated Current: 2.5 A

Ciao Uwe

vero... :frowning:

Buonasera, grazie mille per l interessamento.

Attualmente il motore lo piloto con un drive dvr8825 e un alimentatore da 15v e 1,5 a.

Standardoil grazie mille per il consiglio. Prossimamente proverò a stampare il programma per trovare errori. Provo a risolvere e se ci riesco carico il codice.

Grazie

Daniele1990:
Attualmente il motore lo piloto con un drive dvr8825 e un alimentatore da 15v e 1,5 a.

Settando la corrente sul driver a 1A funziona. Sappi che il motore non avrá la coppia specificata nal suo datasheet alla correne nominale.

Ciao Uwe

Buongiorno Uwe,

per la coppia avevo considerato che sarebbe stata ridotta, ma visto lo scarso peso delle paperelle ho voluto provare a riciclare un motore che già avevo. Lo sforzo maggiore sarà dovuto all’atrito tra la chiocciola e la barra filettata.

Per quanto riguarda il codice credo di aver risolto il problema e ora sembra funzionare:

int pinDir = 2;
int pinStep = 3;
int pulsante = 7;  //Il pulsante è connesso al pin 7
int val = 0;
int vecchio_val = 0;
int stato = 0;
 
const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 500; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
 
void setup() {
  //inizializzo i PIN come OUTPUT
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pulsante, INPUT);  //Il pin del pulsante è un'entrate
}
void loop() {
 
  val = digitalRead(pulsante);  //Lettura del pulsante  
//definiamo la direzione del motore
if ((val == HIGH) && (vecchio_val == LOW)){  //Se il valore del pulsante è 1
 stato = 1 - stato;
 delay(50);
 }
 
 vecchio_val = val;
 
  if (stato == 1){  //Se il valore del pulsante è 0
  digitalWrite(pinDir, LOW);
 }
 else {  //Se il valore del pulsante è 0
  digitalWrite(pinDir, HIGH);
 }
  //esegue un giro completo in un senso
  for (int x = 0; x < numStepMotore; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  }
 }

Grazie mille