Follow focus con motore dc (pwm) + potenziometro

Ciao a tutti, avrei bisogno di un piccolo aiuto o chiarimento.

Ecco il mio progetto, follow focus (ho usato un motore dc controllato in pwm) con potenziometro per controllare la posizione di rotazione della ghiera di messa a fuoco.

int output = 0;
int value = 0;
int potPin0 = 0;
int potPin1 = 1;
int potPin2 = 2;
int potValue = 0;
int potValueA = 0;
int potValueB = 0;
int potValuePosiz = 0;
int differenziale = 30;
int X = 890;
int Y = 0;
int A = 0;
int B = 0;
int finecorsaXmin = 0;
int finecorsaXmax = 0;
int finecorsaYmin = 0;
int finecorsaYmax = 0;
int interruttoreA = 7;
int interruttoreB = 8;

boolean finecorsaX = false;
boolean finecorsaY = false;
boolean variabileA = false;
boolean variabileB = false;

void setup()
{
  pinMode(interruttoreA, INPUT);
  pinMode(interruttoreB, INPUT);
  pinMode (3, OUTPUT);    //setta la porta 3 come uscita
  pinMode (11, OUTPUT);   //setta la porta 11 come uscita
  setPwmFrequency(3, 256); //applica il divisore sul timer del pin 3
  setPwmFrequency(11, 256);  //applica il divisore sul timer del pin 11
  Serial.begin(9600);
  finecorsaXmax = X;
  finecorsaXmin = X - differenziale;
  finecorsaYmin = Y + differenziale;
  finecorsaYmax = Y;
}

void loop()
{
  int stato_interruttoreA = digitalRead(interruttoreA);
  int stato_interruttoreB = digitalRead(interruttoreB);

  // verifica dello stato interruttore A
  if (stato_interruttoreA == HIGH)
  {
    if (variabileA == false)
    {
      A = analogRead(potPin2);
      finecorsaXmax = A;
      finecorsaXmin = A - differenziale;
      variabileA = true;
    }
  }
  else
  {
    finecorsaXmax = X;
    finecorsaXmin = X - differenziale;
    variabileA = false;
  }

  // verifica dello stato interruttore B
  if (stato_interruttoreB == HIGH)
  {
    if (variabileB == false)
    {
      B = analogRead(potPin2);
      finecorsaYmin = B + differenziale;
      finecorsaYmax = B;
      variabileB = true;
    }
  }
  else
  {
    finecorsaYmin = Y + differenziale;
    finecorsaYmax = Y;
    variabileB = false;
  }
  potValueA = analogRead(potPin0);
  potValueB = analogRead(potPin1);
  potValue = (potValueA - potValueB);
  potValuePosiz = analogRead(potPin2);

  if ((potValuePosiz >= finecorsaXmin) && (potValuePosiz <= finecorsaXmax))
  {
    finecorsaX = true;
  }
  else
  {
    finecorsaX = false;
  }

  if ((potValuePosiz >= finecorsaYmax) && (potValuePosiz <= finecorsaYmin))
  {
    finecorsaY = true;
  }
  else
  {
    finecorsaY = false;
  }

  Serial.print(potValueA);
  Serial.print("\t");
  Serial.print(potValueB);
  Serial.print("\t");
  Serial.print(potValue);
  Serial.print("\t");
  Serial.print(potValuePosiz);
  Serial.print("\t");
  Serial.print(finecorsaX);
  Serial.print("\t");
  Serial.print(finecorsaXmin);
  Serial.print("\t");
  Serial.print(finecorsaXmax);
  Serial.print("\t");
  Serial.print(finecorsaY);
  Serial.print("\t");
  Serial.print(finecorsaYmin);
  Serial.print("\t");
  Serial.print(finecorsaYmax);

  if ((potValue >= 60) && (finecorsaX == false))
  {
    if ((potValue >= 60) && (potValue < 200))
    {
      value = 50;
      analogWrite (3, value);
      analogWrite (11, LOW);
    }
    else
    {
      output = potValue;
      value = map(output, 200, 550, 51, 200);
      analogWrite (3, value);
      analogWrite (11, LOW);
    }
  }

  else if ((potValue <= -30) && (finecorsaY == false))
  {
    if (potValue <= -200)
    {
      output = potValue;
      value = map(output, -200, -550, 51, 200);
      analogWrite (3, LOW);
      analogWrite (11, value);
    }
    else
    {
      value = 50;
      analogWrite (3, LOW);
      analogWrite (11, value);
    }
  }

  else
  {
    value = 0;
    analogWrite (11, LOW);
    analogWrite (3, LOW);
  }

  Serial.println(value);

}

void setPwmFrequency(int pin, int divisor) //funzione per modificare la frequenza del PWM
{
  byte mode;
  if (pin == 5 || pin == 6 || pin == 9 || pin == 10) //se il pin è uno di questi
  {
    switch (divisor) //in base al divisore scelto viene dato un valore esadecimale a "mode"
    {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if (pin == 5 || pin == 6) //se il pin è il 5 o il 6 cambio il valore del registro TCCR0B
    {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else                    //altrimenti cambio il valore del registro TCCR1B
    {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if (pin == 3 || pin == 11) //se il pin è il 3 o 11 cambio il valore del registro TCCR2B
  {
    switch (divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x07; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

Adesso però c'è una cosa che non capisco: quando la ghiera gira lentamente, il mio codice arduino riesce a fermare il motore in prossimità di un valore preciso del potenziometro, invece quando il movimento della ghiera diventa più sostenuto, il blocco si perde, come se non facesse in tempo a leggere quel valore del potenziometro percui passa oltre e ingora il finecorsa...l'unico modo che ho sperimentato per risolvere questo problema è definire un range di valori tra min e max e quando aziono il motore a velocità sostenuta, se il valore cade nel range allora arduino arresta il motore...ma come mai la lettura del potenziometro non è istantanea ? Avete qualche suggerimento ?

Grazie.

>Cico8791: il cross-posting è proibito dal regolamento e tu stai discutendo di questo argomento già QUI ...
... ti prego di continuare nel thread che hai già aperto e dove ti sono state già date delle risposte. Grazie.

Thread chiuso.

Guglielmo