Go Down

Topic: stepper control, riportare a zero una variabile (Read 685 times) previous topic - next topic

corsair2

Feb 01, 2015, 06:45 pm Last Edit: Feb 01, 2015, 07:55 pm by corsair2
Buongiorno a tutti, ho difficoltà a esporre il problema xche sono un principiante, perdonatemi se nn riesco ad essere subito chiaro, uso un mega2560 con adamotorshield collegato + un display lcd e un tastierino a matrice, lo scopo è inserire a display un numero che venga interpretato come valore di step da fare eseguire a due motori stepper, per una ragione che non conosco quando premo il tasto per l'esecuzione del ciclo che pilota i motori il primo input lo esegue bene ma al secondo input il listato esegue un addizione non voluta sul valore degli step e si blocca, se c'è qualche volenteroso che voglia dare un occhiata al listato eccolo: (perdonate se è confusionario ma ho cercato di azzerare le variabili pilota in vari punti del listato con conseguenti vari pasticci)  Grazie a tutti :-[
Code: [Select]
/*
Questo programma permette di far inserire da un utente
un codice con il KeyPad
visualizzarlo sul lcd e
farlo eseguire dal motor shield
*/
#include <AFMotor.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>

//dichiarazione motori
int stp;
int spd;
AF_Stepper motor2(409, 1);
AF_Stepper motor1(409, 2);


//#define LED 3
int LED = 3;
int v1 = 0;
int v2 = 0;
int v3 = 0;

//pin usati per lcd
LiquidCrystal lcd(35, 34, 33, 32, 31, 30);

char keyInsert[3]; //limita a 3 gli input  ....ma nn funziona

int num = 0;
int i = 0;
int s = 0;
Servo myservo;


const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] =
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'#','0','*','D'}
};
byte rowPins[ROWS] = {
  22, 23, 24, 25}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {
  26, 27, 28, 29}; //connect to the column pinouts of the keypad
int count=0;
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup()
{
  Serial.begin(9600); // set up Serial library at 9600 bps
  
  //servo 1
  myservo.attach(9);
  
  //set motori
    spd = 75;
    Serial.println("Stepper test!");  
    motor2.setSpeed(spd); // 10 rpm
    motor1.setSpeed(spd); // 10 rpm  
  
  //led
  pinMode(LED,OUTPUT);
 
  //inizializza lcd
  lcd.begin(16, 2);
  lcd.print("Keypad test!");  
  delay(2000);
  lcd.clear();
}

//routine ritorno cursore lcd
void lcdclr()
{
  lcd.setCursor(0, 0);
  lcd.clear();
}  

//routine pilota motori
int motor()
  {  
    //s = 0;
    
    Serial.println(s);
    s = s*10;
    for (stp==0;stp<s;stp++)
         {
         Serial.println(stp);
         motor2.step(1, FORWARD, DOUBLE);
         //motor1.step(1, BACKWARD, SINGLE);
         //motor.step(1, BACKWARD, SINGLE);
         motor1.step(1, FORWARD, SINGLE);
         Serial.println("end");
        
         }
        
   delay (200);
   num = 0;
  i = 0;
   loop();
        //GetNumber(); //provato a ripartire direttamente da GetNumber
        //stp=0;    //se attivo ripete il loop all'infinito
  
  }    


void loop()
{
  
  v1 = GetNumber();
  
  

}


int GetNumber()
{

   lcd.print("INP  ");
   char key = keypad.getKey();
   while(key != '*')
   {
      switch (key)
      {
         case NO_KEY:
            break;
  
         case '0': case '1': case '2': case '3': case '4':
         case '5': case '6': case '7': case '8': case '9':
        
         lcd.print(key);
            num = num * 10 + (key - '0');
         Serial.println ();
 Serial.print (num);
            break;

         case '#':
            lcdclr();
            num = 0;
            break;
         case 'D':
            i = 0;
            i = num;
            i = map(i, 0, 1023, 20, 148);
            
            if (i == 93)
            {
            digitalWrite(LED, HIGH);
            delay(1000);                   // wait for a second ma rallenta il sistema
            motor();
            digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
            delay(100);
            }          
          lcd.clear();
         Serial.println (" val");
 Serial.print (i);
          lcd.setCursor(0, 1);
          lcd.print("Val ");
          lcd.print(i);
          myservo.write(i);
          s = i; //impone numero cicli
          lcd.setCursor(0, 0);
          num = 0;
          i = 0;
        break;
         case 'B':
         //myservo.write(93); //usato per testare il movimento diretto del servo
         motor();
         num = 0;
         i = 0;
         s = 0;
         break;
         case 'A':
         //myservo.write(20); //usato per testare il movimento diretto del servo
         break;
         case 'C':
         //myservo.write(155); //usato per testare il movimento diretto del servo
         break;    
      }
    
      key = keypad.getKey();
      
   }
         num = 0; //tentativo di azzeramento
         i = 0;
         s = 0;
   return num;
}

 

corsair2

.... nessuno?      .........beh, io ci ho provato..... :smiley-cry:  :smiley-cry:  :smiley-confuse:

Go Up