Lag con condizione IF

Ciao a tutti, mi chiamo Gabriel e scrivo da Torino, ho da poco preso un arduino mega 2010 e premetto che la mia conoscenza nella programmazione è veramente nulla, se non per le poche lezioni di pascal del liceo.
E’ da un po che seguo questo bellissimo forum e finalmente mi sono deciso a fare qualcosa ma purtroppo sono incappato in un problema che non riesco a risolvere!
In pratica volevo scrivere un programmino per utilizzare un servo motore modificato per avere la rotazione continua, insieme a un encoder magnetico as5040 e per iniziare a prendere confidenza con Arduino e i comandi servo ho scritto qualche semplice riga di prova (per il momento l’encoder non è assolutamente collegato).
L’alimentazione dell’Arduino è quella dell’'usb mentre quella del servo è indipendente.

ecco il programma:

#include <Servo.h>
#define pulsante 22

Servo myservo;

int val1=0;

void setup()
{
myservo.attach(33);
pinMode(pulsante, INPUT);
pinMode(48, OUTPUT);
Serial.begin(9600);
}

void loop()
{
val1 = digitalRead(pulsante);
if (val1 == HIGH) {
myservo.write(120);
digitalWrite(48, HIGH);
Serial.println(“acceso”) ;
}
else {
myservo.write(90);
digitalWrite(48, LOW);
Serial.println(“spento”) ;
}
}

Il programmino funziona, cioè quando chiudo il pin 22, il servo si mette in movimento, un led si accende e la seriale legge “acceso”, il problema è che quando riapro il pin 22, il servo invece di fermarsi immediatamente continua a girare per circa un secondo e poi si ferma, lo stesso vale per lo spegnimento del led e per la scritta “spento” nel serial monitor.
Questo “lag” lo ottengo solo se uso la condizione if, se invece faccio girare un programmino senza condizione, per esempio: accendi, aspetta 50ms, spegni, aspetta 50ms, gira rispettando le tempistiche.
Ho provato anche a scrivere un programmino solo per far accendere il led alla pressione del pulsante mantenendo l’if-else precedente e anche con queste poche righe il led si spegne solo dopo un secondo circa dall’aver riaperto il pulsante
Spero che qualcuno mi possa aiutare nel capire il perchè di questo ritardo! Grazie!

GabrielD: Ho provato anche a scrivere un programmino solo per far accendere il led alla pressione del pulsante mantenendo l'if-else precedente e anche con queste poche righe il led si spegne solo dopo un secondo circa dall'aver riaperto il pulsante Spero che qualcuno mi possa aiutare nel capire il perchè di questo ritardo! Grazie!

La spiegazione del fenomeno è nella elevatissima impedenza degli ingressi e della capacità parassita presente su ogni pin, il tuo programma controlla che il pin sia alto per far partire il motore e/o accendere il led e quando torna basso esegue l'opposto. Se il tuo pulsante si limita a collegare il +5V al pin nell'istante che lo fai carichi la capacità parassita, nel momento in cui lo rilasci il pin rimane appeso al nulla (flottante) e per effetto della capacità risulta sempre ad un livello logico alto per tornare basso solo quando la capacità si scarica attraverso l'impedenza d'ingresso, ovvero un tempo variabile tra qualche decimo di secondo e qualche secondo (dipende da diverse variabili). La soluzione è tenere il pin elettricamente collegato tramite una pullup a 1 Logico, gli ATmega le hanno integrate e per attivarla sul pulsante basta che usi la digitalWrite (22, HIGH), il pulsante lo fai chiudere a GND invece che al +5V, ovviamente devi invertire la logica della if dato che lo stato normale ora è 1 logico invece di 0 logico. Tieni presente che lasciare un qualunque input flottante vuol dire captare qualunque disturbo elettromagnetico presente nell'ambiente, diventa una vera e propria antenna, con risultati imprevedibili a livello di letture stato, p.e. se lo tocchi con un dito inietti il 50 Hz di rete facendo cambiare stato all'ìngresso 100 volte al secondo (50 volte da 0 a 1 e 50 volte 1 a 0).

@ astrobeed Non avrei pensato a questo problema. gratualzioni @ GabrielD parlando di resistenze hai messo uno in serie al LED o lo hai collegato senza? Non conoscevo il "arduino mega 2010" parli del Arduino Mega 2560? Ciao Uwe

@ astrobeed: Grazie mille sei stato veramente chiarissimo!! @ uwefed: L'ho messo senza nessuna resistenza! Comunque è un Arduino mega 1280, probabilmente c'è scritto 2010 poichè mi hanno mandato un clone!

p.s. Vorrei chiedere per alcune delucidazioni sull'utilizzo dell'encoder as5040, mi conviene aprire un altro topic o posso chiedere qui?

Se é sritto "Arduino 2010" é una falsificazione. I cloni (che sono legali) non possono chiamarsi "Arduino". Devi mettere una resistenza in serie al LED senó bruci il LED e l'Arduno. Puoi mettere resistenze tra 220 e 1000 Ohm. Ciao Uwe

Grazie per la segnalazione, ma con i led ad alta luminosità non ho mai avuto problemi cmq lo seguirò!