scanner

ciao a tutti sono alle prese con la realizzazione di uno scanner con motore passo passo, con un pulsante decido che distanza deve percorrere lo scanner e con un'altro dò lo start, che parte solo se è impostata una distanza (ovviamente)
il mio problema è un'altro, con un terzo pulsante io vorrei decidere quante volte deve ricoprire questa distanza, ma è da qualche giorno che mi sono piantato e non riesco a trovare una soluzione, sono già riuscito a scrivere su lcd il valore che mi direbbe quante volte deve fareil ciclo, non ho ben chiaro quale funzione usare "for; While; do..While" oppure qualcos'altro :roll_eyes:

#include <Stepper.h>
#include <LiquidCrystal.h>
#define STEPS_PER_MOTOR_REVOLUTION 32   
#define STEPS_PER_OUTPUT_REVOLUTION 32 * 64    

Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11);
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);

int  Steps2Take1;               //ciclo avanti
int  Steps2Take2;               //ciclo indietro

const int  button = 5;          //pulsante distanza
int statoButton     = 0;        // stato del pulsante (inizialmente non premuto)  
int lastStatoButton = 0;        // ultimo stato del pulsante (per ora non premuto)  
int countButton     = 0;        // Conteggio del pulsante

const int button1 = 7;          //pulsante start
int statoButton1= 0;            //stato del pulsante start

const int button2 = 6;          //pulstante passate
int statoButton2 = 0;           //stato pulstante passate
int lastStatoButton2 = 0;       //ultimo stato pulstante passate      
int countButton2 = 0;           // Conteggio del pulsante

void setup()  
{
 pinMode(button,INPUT);          //pulsante distanza
 pinMode(button1,INPUT);         //pulsante start
 pinMode(button2,INPUT);         //pulstante passate
 lcd.begin(16, 2);
}

void loop()   
{
  lcd.setCursor(0, 0);
  lcd.print("Distanza:");
  lcd.setCursor(10, 0);
  lcd.print(countButton);
  lcd.setCursor(0, 1);
  lcd.print("Passate:");
  lcd.setCursor(10, 1);
  lcd.print(countButton2);
  
  statoButton=digitalRead(button);
  statoButton1=digitalRead(button1);
  statoButton2=digitalRead(button2);
  
  if(digitalRead(button))
  {
  delay(200);
  
  if(lastStatoButton==0)lastStatoButton=1;
  else statoButton=0;
  if(countButton<=50) countButton=countButton+1;
  else countButton=0;
  }
  if(digitalRead(button2))
  {
    delay(200);
  if(lastStatoButton2==0)lastStatoButton2=1;
  else statoButton2=0;
  if(countButton2<20) countButton2=countButton2+1;
  else countButton2=0;
    

}
  switch(statoButton1)
 {
  case 1:
  Steps2Take1  =  STEPS_PER_OUTPUT_REVOLUTION * countButton ;  
  small_stepper.setSpeed(500);   
  small_stepper.step(Steps2Take1);
  delay(200);
  
  Steps2Take1  =  - STEPS_PER_OUTPUT_REVOLUTION * countButton ;   
  small_stepper.setSpeed(500);  
  small_stepper.step(Steps2Take1);
  delay(200);
  }
}

se non ho capito male il tuo problema, è sufficiente che utilizzi un ciclo for...

http://arduino.cc/en/Reference/For#.UwMkQrQQ_-s

in questo modo ripeti n volte l'operazione che vuoi compiere...
Se invece ci sono delle condizioni che potrebbero farti uscire prima dal ciclo potresti utilizzare il while aggiungendo una variabile oltre al controllo del numero di cicli effettuati.

spero di esserti stato utile

ciao!

Benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Grazie, provvederò a presentarmi anche se l'avevo già fatto mi pare....
Grazie tapirinho
Per quanto riguarda il problema ho risolto ieri sera in un paio d'ore, con varie prove.
Alla fine ho usato while e aggiunto una variabile, ora sono fuori casa, posterò il programma appena torno.
Molto probabilmente nell'usare for o while sbagliavo la posizione e mi bloccava il programma.
L'unica cosa che mi rimane da capire e come mettere un limite alle variabili, e se il programma può essere migliorato rendendolo piccolo usando funzioni diverse.
Es variabile :
Da 0 a 10 dopo deve fermarsi o tornare a 0
Da 100 a 700 dopo deve tornare a 100 o fermarsi.

beh, basta che nel punto che ti interessa controlli il valore della variabile e se arriva a 10 la riporti a 0; devi poi decidere tu se prima compiere l'azione e poi resettarla o resettarla prima ecc ecc...

per ottimizzare il programma potresti utilizzare delle variabili di tipo più adeguato, ad esempio char o byte al posto di int se i valori da memorizzare sono molto piccoli. Inoltre impara l'utilizzo del millis() e togli i delay dal software, altrimenti non avrai mai un comportamento "fluido" dello sketch! Guarda l'esempio "blink without delay" per capire di cosa si tratta

questo è la soluzione funzionante,
sono riuscito a limitare le variabili, eccetto quella che va da 0 a 800 con incremento di 50 che sarebbe la velocità.
mi succede che aumentando mi dà questi valori
0-50-100-150-........800-poi al posto di tornare a 0 mi dà 050-500-150-e ricomincia giusto.
intanto lo farò funzionare così, percè mi serve,
intanto mi studierò i tuoi consigli :wink:

#include <Stepper.h>
#include <LiquidCrystal.h>
#define STEPS_PER_MOTOR_REVOLUTION 32   
#define STEPS_PER_OUTPUT_REVOLUTION 32 * 48    

Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11);
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);

byte  Steps2Take1;               //ciclo avanti
byte  Steps2Take2;               //ciclo indietro

byte  button = 5;          //pulsante distanza
byte statoButton     = 0;        // stato del pulsante (inizialmente non premuto)  
byte lastStatoButton = 0;        // ultimo stato del pulsante (per ora non premuto)  
byte countButton     = 0;        // Conteggio del pulsante

byte button1 = 7;          //pulsante start
byte statoButton1= 0;            //stato del pulsante start

byte button2 = 6;          //pulstante passate
byte statoButton2 = 0;           //stato pulstante passate
byte lastStatoButton2 = 0;       //ultimo stato pulstante passate      
byte countButton2 = 0;           // Conteggio del pulsante

byte button3 = 2;          //pulstante aumento velocità
byte statoButton3 = 0;           //stato pulstante aumento velocità
byte lastStatoButton3 = 0;       //ultimo stato pulstante aumento velocità
byte button4 = 3;          //pulstante diminuisci velocità   
byte statoButton4 = 0;           //stato pulstante diminuisci velocità 
byte lastStatoButton4 = 0;       //ultimo stato pulstante diminuisci velocità 

int Speed = 0;                  // velocità
int countSpeed = 0;             //conteggio velocità


void setup(){
  pinMode(button,INPUT);          //pulsante distanza
  pinMode(button1,INPUT);         //pulsante start
  pinMode(button2,INPUT);         //pulstante passate
  pinMode(button3,INPUT);         //pulsante aumento velocità
  pinMode(button4,INPUT);         //pulstante diminuisce velocità
  lcd.begin(16, 2);
}

void loop(){
  lcd.setCursor(0, 0);
  lcd.print("D:");
  lcd.setCursor(2, 0);
  lcd.print(countButton);
  lcd.setCursor(0, 1);
  lcd.print("P:");
  lcd.setCursor(2, 1);
  lcd.print(countButton2);
  lcd.setCursor(4, 0);
  lcd.print("S:");
  lcd.setCursor(6, 0);
  lcd.print(countSpeed);
  if(digitalRead(button)){
    delay(200);
  
    if(lastStatoButton==0)lastStatoButton=1;
    else statoButton=0;
    if(countButton<=10) countButton=countButton+1;
    else countButton=0;
    if(countButton>=10) countButton=0;
     }
     if(digitalRead(button2)){
       delay(200);
       if(lastStatoButton2==0)lastStatoButton2=1;
       else statoButton2=0;
       if(countButton2<10) countButton2=countButton2+1;
       else countButton2=0;
       if(countButton2>=10) countButton2=0;
       }
       if(digitalRead(button3)){
         delay(200);
         if(lastStatoButton3==0)lastStatoButton3=1;
         else statoButton3=0;
         if(countSpeed<=800) countSpeed=countSpeed+50; 
         else countSpeed=0;
         }
         if(digitalRead(button4)){
          if(lastStatoButton4==0)lastStatoButton4=1;
           else statoButton4=0;
           if(countSpeed<=800) countSpeed=countSpeed-50;
           else countSpeed=0;
           }
           if(digitalRead(button1)){
           delay(200);
           while(countButton2>0){
             Steps2Take1  =  STEPS_PER_OUTPUT_REVOLUTION * countButton ;  
             small_stepper.setSpeed(countSpeed);   
             small_stepper.step(Steps2Take1);
             delay(200);
  
            Steps2Take1  =  - STEPS_PER_OUTPUT_REVOLUTION * countButton ;   
            small_stepper.setSpeed(countSpeed);  
            small_stepper.step(Steps2Take1);
            delay(200);
            countButton2--;
            lcd.setCursor(2, 1);
            lcd.print(countButton2);
          }
        }
      }

Nel regolamento, sezione 7 viene spiegato come postare il codice.

Oltre a postare il codice tra il giusto tag, dovresti indentarlo meglio per renderlo più leggibile.

Inoltre mi sembra inutile memorizzare in una variabile lo stato dei pulsanti e poi andare a fare una altro digitalread nel loop...

indentato il codice spero vada bene,
per quanto riuarda lo stato intendi le variabili messe nel loop più i digitalRead?

intendo questo:

 statoButton=digitalRead(button);
  statoButton1=digitalRead(button1);
  statoButton2=digitalRead(button2);
  statoButton2=digitalRead(button3);
  statoButton2=digitalRead(button4);
 
  if(digitalRead(button)){
    delay(200);

fai il digitalread di button quando l'hai appena memorizzato nella variabile statoButton.... fai il controllo direttamente sulla variabile, tanto sono passati pochissimi millisecondi. Utilizzando il delay però i controlli successivi li dovrai lasciare, se invece usi il millis secondo me li potresti togliere tutti o quasi...

edit: anzi, se usi i delay la lettura dei pulsanti non sarà molto fluida!! (per usare un eufemismo)

In effetti ho fatto delle prove e non servono a niente funzionano tutti,
mi sono accorto tra l'altro che avevo fatto errori stupidi e li ho corretti,
però il problema della velocità che mi dà valorti strani non l'ho risolto. Hosostituito byte a int tranne per il valore speed che supera il valore di 255.

nonostante abbia eliminato comandi variabili e stati che non mi servono, il risultato della velocità rimane quello.....

#include <Stepper.h>
#include <LiquidCrystal.h>
#define STEPS_PER_MOTOR_REVOLUTION 32   
#define STEPS_PER_OUTPUT_REVOLUTION 32 * 48    

Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11);
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);

byte  Steps2Take1;                //ciclo avanti
byte  Steps2Take2;                //ciclo indietro

byte  button = 5;                 //pulsante distanza
byte statoButton     = 0;         // stato del pulsante (inizialmente non premuto)  
byte lastStatoButton = 0;         // ultimo stato del pulsante (per ora non premuto)  
byte countButton     = 0;         // Conteggio del pulsante

byte button1 = 7;                 //pulsante start
byte statoButton1= 0;             //stato del pulsante start

byte button2 = 6;                 //pulstante passate
byte statoButton2 = 0;            //stato pulstante passate
byte lastStatoButton2 = 0;        //ultimo stato pulstante passate      
byte countButton2 = 0;            // Conteggio del pulsante

int Speed = 2;                    // velocità
int statoSpeed = 0;               //stato pulstante passate
int lastStatoSpeed = 0;           //ultimo stato pulstante passate
int countSpeed = 0;               //conteggio velocità


void setup(){
  pinMode(button,INPUT);          //pulsante distanza
  pinMode(button1,INPUT);         //pulsante start
  pinMode(button2,INPUT);         //pulstante passate
  pinMode(Speed,INPUT);           //pulsante aumento velocità
           
  lcd.begin(16, 2);
}

void loop(){
  lcd.setCursor(0, 0);
  lcd.print("D:");
  lcd.setCursor(2, 0);
  lcd.print(countButton);
  lcd.setCursor(0, 1);
  lcd.print("P:");
  lcd.setCursor(2, 1);
  lcd.print(countButton2);
  lcd.setCursor(4, 0);
  lcd.print("S:");
  lcd.setCursor(6, 0);
  lcd.print(countSpeed);
  
  if(digitalRead(button)){
    delay(200);
  
    if(lastStatoButton==0)lastStatoButton=1;
    else statoButton=0;
    if(countButton<=10) countButton=countButton+1;
    else countButton=0;
    if(countButton>=10) countButton=0;
     }
     if(digitalRead(button2)){
       delay(200);
       if(lastStatoButton2==0)lastStatoButton2=1;
       else statoButton2=0;
       if(countButton2<10) countButton2=countButton2+1;
       else countButton2=0;
       if(countButton2>=10) countButton2=0;
       }
       if(digitalRead(Speed)){
         delay(200);
         if(lastStatoSpeed==0)lastStatoSpeed=1;
         else statoSpeed=0;
         if(countSpeed<=800) countSpeed=countSpeed+50; 
         else countSpeed=0;
         }
         if(digitalRead(button1)){
          delay(200);
           while(countButton2>0){
           Steps2Take1  =  STEPS_PER_OUTPUT_REVOLUTION * countButton ;  
           small_stepper.setSpeed(countSpeed);   
           small_stepper.step(Steps2Take1);
           delay(200);
  
           Steps2Take1  =  - STEPS_PER_OUTPUT_REVOLUTION * countButton ;   
           small_stepper.setSpeed(countSpeed);  
           small_stepper.step(Steps2Take1);
           delay(200);
           countButton2--;
           lcd.setCursor(2, 1);
           lcd.print(countButton2);
         }
       }
     }