Ho provato a modificare il programma con l'impiego della funzione delayMicroseconds in questo modo:
#include <LiquidCrystal.h>
#define SCENDI 2
#define SALI 3LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
byte esponente[8] = {
0b01110,
0b00010,
0b00100,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000
};int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;int speedPinPot = 0;
int decelPinPot = 1;int i = 0;
int down = 0;
int up = 0;
int stop = 0;
int downDelayTime = 2;
long double upDelayTime;
double ritardo;
long previousMillis = 0;
long interval = 100;void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);pinMode(SCENDI, INPUT);
pinMode(SALI, INPUT);
pinMode(speedPinPot, INPUT);
pinMode(decelPinPot, INPUT);lcd.createChar(1, esponente);
lcd.begin(20, 2);
lcd.print("Vel.iniz.");
lcd.setCursor(16, 0);
lcd.print("mm/s");
lcd.setCursor(0, 1);
lcd.print("Deceler.");
lcd.setCursor(15, 1);
lcd.print("mm/s");
lcd.write(1);
}void loop() {
int speedReadPin = analogRead(speedPinPot);
upDelayTime = map(speedReadPin, 0, 1024, 10000, 100000);
double velocita = (1000000/upDelayTime) * 0.226;int decelReadPin = analogRead(decelPinPot);
ritardo = map(decelReadPin, 0, 1024, 0, 1000);
double decelerazione = ( ( (1/upDelayTime) - (1/(upDelayTime + ritardo)) )/0.1 ) * 1000000 * 0.226;lcd.setCursor(10, 0);
if (velocita < 10)
lcd.print(" ");
lcd.print(velocita);lcd.setCursor(10, 1);
if (decelerazione < 10)
lcd.print(" ");
lcd.print(decelerazione);down = digitalRead(SCENDI);
up = digitalRead(SALI);
if (down == HIGH)
scendi();
if (up == HIGH)
sali();
}void scendi() {
if(!stop) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(downDelayTime);
i++;digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(downDelayTime);
i++;digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(downDelayTime);
i++;digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(downDelayTime);
i++;if (i > 159)
stop = 1;
}
}void sali() {
stop = 0;
while(i>0){
unsigned long currentMillis = millis();if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delayMicroseconds(upDelayTime);
i--;if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delayMicroseconds(upDelayTime);
i--;if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delayMicroseconds(upDelayTime);
i--;if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delayMicroseconds(upDelayTime);
i--;
}}
ma il motore non risponde più bene ai valori che gli impongo coi potenziometri, addirittura va più veloce quando setto una velocità minore e viceversa!!
Dove potrebbe essere il problema? Perchè adesso effettivamente noto che la regolazione delle decelerazione è molto meno granulosa, non si avvertono più cambiamenti di velocità "a scatti" come succedeva prima solo che succedono cose strane...addirittura se si impongono valori di decelerazione alti, il motore prima rallenta e poi si ferma del tutto ad un certo punto emettendo un fischio pur essendo il range dei valori imposti identico al precedente...