Muovere Passo passo tramite pulsante

Ciao a tutti eccomi quì di nuovo a riprendere un mio progetto passato. :grin:
Dopo aver fatto muovere un passo passo a mio piacimento come un intervalluino ora vorrei muoverlo a comando premento un pulsante ,cioè se premo il pulsante 1 il motore va alla velocità stabilita in direzione Destra se premo il pulsante 2 va a Sinistra se non premo nulla resta fermo
Nel codice che uso ora se è in positovo va a dx (rotateDeg(3000, 2);)se è negativo va a sinistra(rotateDeg(-3000, 2);
Il codice che uso è questo vorrei capire come e dove scrivere una riga di comando per l'azionamento
Vi ringrazio in anticipo :smiley:

int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int SLEEP = 6;      // PIN 12 = SLP
//motore 2
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;

void setup() {
  pinMode(DIR_PIN_M1, OUTPUT);
  pinMode(STEP_PIN_M1, OUTPUT);
} 

void loop(){ 

  //specifica numero giri e tempo di attesa
  rotateDeg(-3000, 2);
  delay(000);




}

void rotateDeg(float deg, float speed){
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN_M1,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) *70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M1, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M1, LOW);
    delayMicroseconds(usDelay);
  }
  
  }
void rotate_M2(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M2,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M2, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M2, LOW);
    delayMicroseconds(usDelay);
}

}

interessa anche a me la cosa, appena posso provo il tuo codice o ne faccio uno mio, anche a me serve premere un pulsante e far girare il motorino finche' il pulsante e' premuto, ho appena iniziato a provare i passopasso :slight_smile:

io nn ho mica capito il problema -.-"

se si tratta solo di prendere in input dati da tastiera allora la cosa diventa cosi'

if (Serial.available() > 0) {
int inByte = Serial.read();
// do something different depending on the character received.
// The switch statement expects single number values for each case;
// in this exmaple, though, you're using single quotes to tell
// the controller to get the ASCII value for the character. For
// example 'a' = 97, 'b' = 98, and so forth:

switch (inByte) {
case 'a':
//code for a
break;
case 'b':
//code for b
break;
case 'c':
//code for c
break;
case 'd':
//code for d
break;
case 'e':
//code for e
break;
default:
// se nessuna opzione è tra quelle prestabilite
//code
}
}

No non devo prendere imput da tastiera
ho 2 tasti con contatto chiuso aperto 0-1 collegati su 4 pin dell'arduino vorrei far girare il motore quando premo il tasto
cioè con il pin 1 si attiva (premendo il tasto) con il pin 0 resta fermo
con il secondo tasto con pin 2 si attiva verso opposto se lascio il tasto resta fermo. :drooling_face:

Allora è ancora più semplice, te la cavi con 2 IF.
però perchè usi 4 pin per due pulsanti? basta un pin per pulsante, metti una resistenza di pull-up tipo da 10k (giusto?) tra il pin e i 5V, mentre il pulsante lo metti tra il pin e GND. praticamente quando lo schiacci il pin diventa 0.
per cui fai un:

if ( digitalRead(n_pin) == 0) { 
  chiamata_alla_funzione_movimento()
}

..poi ci sono modi più eleganti, ma questo è il più elementare e comprensibile.

Davide.

dab77:
Allora è ancora più semplice, te la cavi con 2 IF.
però perchè usi 4 pin per due pulsanti? basta un pin per pulsante, metti una resistenza di pull-up tipo da 10k (giusto?) tra il pin e i 5V, mentre il pulsante lo metti tra il pin e GND. praticamente quando lo schiacci il pin diventa 0.
per cui fai un:

if ( digitalRead(n_pin) == 0) { 

chiamata_alla_funzione_movimento()
}



..poi ci sono modi più eleganti, ma questo è il più elementare e comprensibile.

Davide.

Si giusto Davide e grazie!
ho fatto proprio così solo che non avevo il codice .
Quindi la tua stringa la dovrei inserire così?Mi da un erroreProva_pulsante_.cpp:20:20: error: invalid suffix "_pin" on integer constant

#define DIR_PIN 7
#define STEP_PIN 5
const int buttonPin = 8; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off

void setup() {
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
}

void loop(){

//specifica numero giri e tempo di attesa

if ( digitalRead(8_pin) == 0) {
rotateDeg(-1000, 0.7);
delay(000);
}
}

void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN,dir);

int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *30;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}

perchè fai digitalRead(8_pin) e dove è dichiarato 8_pin nelle variabili? non lo vedo da nessuna parte.

Sarà, credo che sia l'8, digitalRead(buttonPin)

ps. anche il commento alla variabile, magari cambialo in futuro potrà servire a te o ad altri.

Non ti ho capito potresti correggermi con un esempio sul mio listato?
Grazie in anticipo :grin:

void loop(){

  //specifica numero giri e tempo di attesa
 
 
  if ( digitalRead(buttonPin) == 0) {
  rotateDeg(-1000, 0.7);
   delay(000);
}
}

meglio? :slight_smile:

Grazie BrainBooster e a tutti gli altri

XD XD XD XD siete dei mitiiiiiiiiiii!!! :grin: :grin: :grin:
Funzionaaaaaaaaaaaaaaa!!!!!!!!!!

Ora però siamo a metà del lavoro ,cioè quando premo il pulsante il motore gira verso destra quando lascio si ferma
Avendo un secondo pulsante sul pin 12 come posso far cambiare direzione?
Io fino adesso cambiavo lo stato di questa stringa rotateDeg(-1000, 0.7);da positivo a negatico togliendo ed inserendo la - davanti al 1000
Come potrei fare?
Grazie infinite

int DIR_PIN_M1 =3;  //7
int STEP_PIN_M1 =2; //5
int SLEEP = 6;      // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;

const int buttonPin = 10;  //Setting button number 1 to Pin 2
int buttonState = 0;   //Setting button state to off


void setup() {
  pinMode(DIR_PIN_M1, OUTPUT);
  pinMode(STEP_PIN_M1, OUTPUT);
  
  
} 

void loop(){

  //specifica numero giri e tempo di attesa
 
 
  if ( digitalRead(buttonPin) == 0) {
  rotateDeg(-1000, 0.7);
   delay(000);
}
}  

void rotateDeg(float deg, float speed){
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN_M1,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) *70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M1, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M1, LOW);
    delayMicroseconds(usDelay);
  }
  
  }
void rotate_M2(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M2,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M2, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M2, LOW);
    delayMicroseconds(usDelay);
}

}[code*

duplica il codice e cambia i riferimenti dei pin e della direzione

Ho provato ma mi da errore:

int DIR_PIN_M1 =3; //7
int STEP_PIN_M1 =2; //5
int SLEEP = 6; // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;

const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 0; //Setting button state to off

const int buttonPin1 = 12; //Setting button number 1 to Pin 2
int buttonState = 0; //Setting button state to off

void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);

}

void loop(){

//specifica numero giri e tempo di attesa

if ( digitalRead(buttonPin) == 0) {
rotateDeg(-1000, 0.7);
delay(000);
}

if ( digitalRead(buttonPin1) == 0) {
rotateDeg(1000, 0.7);
delay(000);
}
}

void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);

int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN_M1, LOW);
delayMicroseconds(usDelay);
}

}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);

digitalWrite(DIR_PIN_M2,dir);

float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN_M2, LOW);
delayMicroseconds(usDelay);
}

}

dichiari e inizializzi due volte (con lo stesso nome) la variabile buttonState due volte e non la usi mai? :slight_smile:

Ora mi funzia ma non fa quello che volevo io. ]:slight_smile:
Praticamente senza premere nessun bottone gira a destra all'infinito se premo il bottone 2 mi fa il ciclo 3000 giri da un senso e 3000 giri dall'altro ripetendolo all'infinito se rilascio il tasto 2 ritorna la rotazione a destra all'infinito.
Mi andrebbe bene se premento il tasto 1 rimanesse nella direzione sinistra ma così non è!
Come faccio a fargli cambiare direzione all'infinito?
e se possibile come faccio fargli fare una direzione tenendo premuto un pulsante e l'altra direzione con l'altro pulsante all'infinito e se non premo nulla sta fermo?
Grazie ancora

const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off

const int buttonPin1 = 12; //Setting button number 1 to Pin 2

void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);

}

void loop(){

//specifica numero giri e tempo di attesa

if ( digitalRead(buttonPin) == 0) {
rotateDeg(-3000, 0.7);
delay(000);
}

if ( digitalRead(buttonPin1) == 0) {
rotateDeg(3000, 0.7);
delay(000);
}
}

Marco non voglio sembrarti scortese, ma presenti un codice dove almeno io non ci capisco nulla.

Dichiari:

pinMode(DIR_PIN_M1, OUTPUT);
  pinMode(STEP_PIN_M1, OUTPUT);

Ma dove sono? Hai riportato parte del codice e non è completo? Cos'è?
Dove dichiari che i buttonPin sono di INPUT?
buttonState lo dichiari e non lo usi.

Boh...

E' vero scusatemi ecco l'intero codice:

int DIR_PIN_M1 =3; //7
int STEP_PIN_M1 =2; //5
int SLEEP = 6; // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;

const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off

const int buttonPin1 = 12; //Setting button number 1 to Pin 2

void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);

}

void loop(){

//specifica numero giri e tempo di attesa

if ( digitalRead(buttonPin) == 0) {
rotateDeg(-3000, 0.7);
delay(000);
}

if ( digitalRead(buttonPin1) == 0) {
rotateDeg(3000, 0.7);
delay(000);
}
}

void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);

int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN_M1, LOW);
delayMicroseconds(usDelay);
}

}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);

digitalWrite(DIR_PIN_M2,dir);

float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN_M2, LOW);
delayMicroseconds(usDelay);
}

}

Prova al posto dell'if

while (digitalRead(buttonPin) == LOW)
      {
       rotateDeg(-3000, 0.7);
      }
while (digitalRead(buttonPin1) == LOW)
      {
       rotateDeg(3000, 0.7);
     }

poi bisognerebbe capire come sono collegati i tuoi pulsanti, ma dal codice che posti quanto sopra deve andare.

Niente con while non funzia nulla

però ho modificato il codice così e ci siamo quasi solo che ora il motore gira sempre all'infinito se non premo nulla a dx se premo il pulsante 1 gira a sinistra all'infinito e mi andrebbe bene anche così anche se non è molto bello per la sicurezza devo trovare il modo di farlo azionare tenendo prememuto il pulsante1 che vada a destra tenendo il pulsante 2 che vada a sinistra se lascio i due pulsanti deve stare fermo.
Non c'è il modo di dare il consenso al motore?

int DIR_PIN_M1 =3; //7
int STEP_PIN_M1 =2; //5
int SLEEP = 6; // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;

const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off

void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);

}

void loop(){

//specifica numero giri e tempo di attesa

if ( digitalRead(buttonPin) == 0) {
rotateDeg(-500, 0.7);
delay(000);
}

if ( digitalRead(buttonPin) == 1) {
rotateDeg(500, 0.7);
delay(000);
}
}

void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);

int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN_M1, LOW);
delayMicroseconds(usDelay);
}

}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);

digitalWrite(DIR_PIN_M2,dir);

float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN_M2, LOW);
delayMicroseconds(usDelay);
}

}

Stavo pensando se assegnassi al bottone 2 uno int SLEEP tipo:

if ( digitalRead(buttonPin1) == 1){
digitalWrite(SLEEP, LOW); } // Sveglia il motore.

in modo che mi addormenti il ciclo loop se non premo il bottone e se premo il bottone lo risvegli?

Però scritto così non mi funzia ]:smiley: