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.
