Buon giorno.
Premessa: ho una scheda "UNO" (mi hanno detto che è un clone di ARDUINO UNO).
Ho un problema con uno sketch che sto scrivendo. Si tratta di una rampa di accelerazione per pilotare un motore passo passo a 4 fasi. Carico le istruzioni, il ciclo inizia, il motore gira ed accelera normalmente ma quando il ciclo termina ed il motore si è fermato, il secondo pin della sequenza di pilotaggio rimane a livello logico 1 e il motore fa un passo in più o in meno. L'ho provato anche scollegando tutto (motore, resistori ecc.) e misurando il livello logico con un multimetro: succede la stessa cosa. Se uso 4 pin diversi dai precedenti non cambia nulla: il secondo rimane sempre on. Al termine del ciclo ho anche inserito una sequenza aggiuntiva per riportare a LOW tutti i pin ma quel pin rimane sempre a livello logico alto. Se carico un altro sketch (vuoto o con qualunque altra sequenza di istruzioni) torna tutto a posto. E'possibile, secondo voi, che ci sia una qualche sorta di incompatibilità con il clone in mio possesso o che ci sia un bug nell'IDE?
Grazie e buona domenica a tutti.
Antonio
int rit=200; // variabile decrementale tra un impulso ed il successivo (ms) - utilizzata nel ciclo di accelerazione
int ritardo=rit; // variabile ritardo tra un impulso ed il successivo (ms) - utilizzata nel ciclo principale
int count=0; // variabile incrementale per controllo "distanza" percorsa
int distanza=480; // variabile di verifica "distanza": se è superiore ad un dato valore avvio accelerazione
int dist=distanza; // "distanza" da percorrere utilizzata nel ciclo di principale (1 unità = 4 step)
void setup() {
// Serial.begin(9600);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
}
void loop() {
while (count < dist+1) {
if (distanza>240) { // verifica se distanza è maggiore di 240...
Accelera(); // ... se sì, avvio accelerazione.
}
digitalWrite(5,LOW); // fase 4 OFF
digitalWrite(2,HIGH); // fase 1 ON
delay(ritardo); // attendi
digitalWrite(2,LOW); // fase 1 OFF
digitalWrite(3,HIGH); // fase 2 ON
delay(ritardo); // attendi
digitalWrite(3,LOW); // fase 2 OFF
digitalWrite(4,HIGH); // fase 3 ON
delay(ritardo); // attendi
digitalWrite(4,LOW); // fase 3 OFF
digitalWrite(5,HIGH); // fase 4 ON
delay(ritardo); // attendi
count++; // incremento cicli eseguiti (step eseguiti = cicli eseguiti * 4)
}
digitalWrite(2,LOW); //
digitalWrite(3,LOW); // ciclo aggiuntivo per
digitalWrite(4,LOW); // disattivazione pins
digitalWrite(5,LOW); //
// Serial.println(ritardo);
}
int Accelera() { // sub rampa di accelerazione
for (int i=200; i>5; i--) { // inizio ciclo per passare da 200ms/impulso a 5 ms/impulso (totale: 195 cicli)
digitalWrite(5,LOW); // fase 4 OFF
digitalWrite(2,HIGH); // fase 1 ON
delay(rit); // attendi
rit--; // decrementa ritardo di 1ms
digitalWrite(2,LOW); // fase 1 OFF
digitalWrite(3,HIGH); // fase 2 ON
delay(rit); // attendi
rit--; // decrementa ritardo di 1ms
digitalWrite(3,LOW); // fase 2 OFF
digitalWrite(4,HIGH); // fase 3 ON
delay(rit); // attendi
rit--; // decrementa ritardo di 1ms
digitalWrite(4,LOW); // fase 3 OFF
digitalWrite(5,HIGH); // fase 4 ON
delay(rit); // attendi
rit--; // decrementa ritardo di 1ms
}
digitalWrite(5,LOW); // fase 4 OFF
distanza=0; // azzeramento variabile per impedire il ripetersi del ciclo
count=196; // "distanza" percorsa durante l'accelerazione
ritardo=rit; // ritardo tra un impulso e il successivo quando il motore è a regime (5ms)
}