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 :-[
/*
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;
}