questo è il programma che hai allegato:
const int IN1=2;
const int IN2=3;
const int IN3=4;
const int IN4=5;
const int finecorsa=8;
const int button=7;
const int rele=6;
const char tab1[] =
{
0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09
};
const char tab2[] =
{
0x01, 0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03
};
void setup()
{
pinMode(finecorsa, INPUT);
pinMode(button, INPUT);
pinMode(rele, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
if(digitalRead(button)==HIGH)
{
ctlStepMotor(720,1);
}
if(digitalRead(finecorsa)==HIGH)
{
digitalWrite(rele, HIGH);
delay(5000);
digitalWrite(rele,LOW);
ctlStepMotor(-720,1);
StepMotorStop();
}
}
void ctlStepMotor(int angle,char speeds )
{
for (int j = 0; j < abs(angle) ; j++)
{
if (angle > 0)
{
for (int i = 0; i < 8; i++)
{
digitalWrite(IN1, ((tab1[i] & 0x01) == 0x01 ? true : false));
digitalWrite(IN2, ((tab1[i] & 0x02) == 0x02 ? true : false));
digitalWrite(IN3, ((tab1[i] & 0x04) == 0x04 ? true : false));
digitalWrite(IN4, ((tab1[i] & 0x08) == 0x08 ? true : false));
delay(speeds);
}
}
else
{
for (int i = 0; i < 8 ; i++)
{
digitalWrite(IN1, ((tab2[i] & 0x01) == 0x01 ? true : false));
digitalWrite(IN2, ((tab2[i] & 0x02) == 0x02 ? true : false));
digitalWrite(IN3, ((tab2[i] & 0x04) == 0x04 ? true : false));
digitalWrite(IN4, ((tab2[i] & 0x08) == 0x08 ? true : false));
delay(speeds);
}
}
}
}
void StepMotorStop()
{
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
}
All'intero del loop tu hai messo 2 if: il primo verifica se un pulsante viene premuto e si comporta di conseguenza (richiami la funzione ctlStepMotor) e il secondo controlla se interviene il finecorsa ecc.
C'è un piccolo problema: arduino esegue sempre e solo un comando (o una funzione) alla volta quindi se si verifica il primo if (button == HIGH) questo chiama (o esegue,come preferisci) la funzione ctlStepMotor fino alla fine della stessa senza mai verificare se interviene il finecorsa.
Se vuoi che mentre il motore si muove venga anche "letto" il finecorsa devi mettere questo controllo all'interno della funzione ctlStepMotor.
esempio:
void ctlStepMotor(int angle,char speeds )
{
for (int j = 0; j < abs(angle) ; j++)
{
if (angle > 0)
{
OMISSIS...
}
else
{
OMISSIS...
}
if(digitalRead(finecorsa)==HIGH) //<==============aggiunto controllo
{
OMISSIS...
}
}
Naturalmente non puoi solo spostare il tuo controllo finecorsa così come è scritto, va adattato alla situazione.
ciao
pippo72