controllare 2 servi con 2 potenziometri!

Vorrei poter utilizzare 2 servi con 2 diversi potenziometri, conoscete uno sketch dove possa prendere spunto?

Basta cercare:

questo è con un servo , raddoppia e hai risolto il problema :smiley:

ho aperto giusto oggi lo sketch

// Controlling a servo position using a potentiometer (variable resistor) 
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott> 

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
 
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin 
 
void setup() 
{ 
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop() 
{ 
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
  val = map(val, 0, 1023, 13, 179);
  Serial.println(val);           // scale it to use it with the servo (value between 0 and 180) 
  myservo.write(val);                  // sets the servo position according to the scaled value 
  delay(15);                           // waits for the servo to get there 
}

dove c’e’ scritto 13,179 mi pare si debba mettere 0, 180 io usavo lo schetch per avere le posizioni minime senza disturbi/oscillazioni

tu metti 2 potenziometri e 2 servi, sul seriale vedi la posizione

reizel:
ho aperto giusto oggi lo sketch

// Controlling a servo position using a potentiometer (variable resistor) 

// by Michal Rinott http://people.interaction-ivrea.it/m.rinott

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup()
{
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 13, 179);
  Serial.println(val);           // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}




dove c'e' scritto 13,179 mi pare si debba mettere 0, 180 io usavo lo schetch per avere le posizioni minime senza disturbi/oscillazioni

tu metti 2 potenziometri e 2 servi, sul seriale vedi la posizione

Perdona la mia ignoranza, ma dove collego il secondo servo? raddoppio cosa? i 2 potenziometri dovrebbero comandare i servi separatamente…

Questo è lo sketch knob, è tra gli esempi di Arduino, modificato per gestire due servo tramite due potenziometri, le modifiche sono le righe con commenti in Italiano.
Il primo servo è collegato al pin 9 e il secondo al pin 10, ovviamente puoi cambiarli a tuo piacere, il primo potenziometro a A0 e il secondo a A1, il potenziometro deve essere collegato con il centrale all’ingresso ADC e i due laterali a +5V e GND.

// Controlling a servo position using a potentiometer (variable resistor) 
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott> 

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
Servo myservo2; // secondo servo
 
int potpin = 0;  // analog pin used to connect the potentiometer
int potpin2 = 1;  // secondo potenziometro collegato a A1
int val;    // variable to read the value from the analog pin 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  myservo.attach(10); // secondo servo al pin 10
} 
 
void loop() 
{ 
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180) 
  myservo.write(val);                  // sets the servo position according to the scaled value 

  val = analogRead(potpin2);            // secondo servo
  val = map(val, 0, 1023, 0, 179); 
  myservo2.write(val); 

  delay(15);                           // waits for the servo to get there 
}

wow grazie 6 stato chiarissimo!! che potenziometri mi consigli? i 2 servi dovranno azionare lo zoom e il fuoco di una reflex, per cui mi occorrono movimenti lenti e fluidi, ma modulabili...

robyr11:
wow grazie 6 stato chiarissimo!! che potenziometri mi consigli? i 2 servi dovranno azionare lo zoom e il fuoco di una reflex, per cui mi occorrono movimenti lenti e fluidi, ma modulabili…

Come potenziometri va bene un valore compreso tra 5k e 10k, fai attenzione a prenderli con variazione lineare e non logaritmica.
Per la tua applicazione il vero problema sono i servo che devono essere di alta qualità se vuoi ottenere un movimento preciso e realmente fluido.
Sarebbe consigliabile modificare lo sketch con il controllo in microsecondi invece che in gradi, ottieni una risoluzione 11 volte maggiore su i 180° della corsa, sopratutto se usi servo digitali da 12 bit (= $$$) che offrono una risoluzione effettiva di 0.1° contro i 0.3 - 0.4 dei modelli a 10 bit.

Lo sketch modificato con il controllo in microsecondi diventa così:

// Controlling a servo position using a potentiometer (variable resistor) 
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott> 

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
Servo myservo2; // secondo servo
 
int potpin = 0;  // analog pin used to connect the potentiometer
int potpin2 = 1;  // secondo potenziometro collegato a A1
int val;    // variable to read the value from the analog pin 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  myservo.attach(10); // secondo servo al pin 10
} 
 
void loop() 
{ 
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
 //val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180) 
 // myservo.write(val);                  // sets the servo position according to the scaled value 
 myservo.writeMicroseconds((val*2)+510); // 180° di escursione con risoluzione del comando di 0.18°

  val = analogRead(potpin2);            // secondo servo
  //val = map(val, 0, 1023, 0, 179); 
 // myservo2.write(val); 
 myservo2.writeMicroseconds((val*2)+510); 

 delay(15);                           // waits for the servo to get there 
}

non vorrei snaturare il progetto, ma io vedrei meglio degli stepper con relativa demoltiplica (ingranaggi) per questo tipo di lavoro, ma magari non serve che spacchi il grado in quattro :smiley:

BrainBooster:
non vorrei snaturare il progetto, ma io vedrei meglio degli stepper con relativa demoltiplica (ingranaggi) per questo tipo di lavoro, ma magari non serve che spacchi il grado in quattro :smiley:

Gli stepper non vanno per via delle vibrazioni, dell’elevato consumo di energia, non conosci la loro posizione se non usi un encoder, offrono meno risoluzione di un buon servo, non ultimo sono molto più grossi e pesanti.
Tutti i sistemi di controllo fuoco e zoom amatoriali, ma anche professionali low cost, sono basati su i servo, l’alternativa sono i motori DC con encoder che permettono prestazioni di gran lunga migliori, però i costi, e la complessità meccanica, salgono notevolmente.

astrobeed:
Tutti i sistemi di controllo fuoco e zoom amatoriali, ma anche professionali low cost, sono basati su i servo, l'alternativa sono i motori DC con encoder che permettono prestazioni di gran lunga migliori, però i costi, e la complessità meccanica, salgono notevolmente.

avresti per favore un esempio/link per capire di cosa si parla? per un progetto futuro controllare lo zoom potrebbe essere una cosa interessante...

Grazie.

su youtube è pieno di esempi di "follow focus with servo" e alcuni sono molto interessanti...visto che uso la mia EOS60D con 18-200 e supporto spallare, sarebbe comodissimo poter utilizzare i miei pollici per azionare fuoco e zoom, senza staccare le mani dai manubri del supporto...
Astrobeed: hai qualche modello di servo da consigliarmi? ne ho un paio ma sono delle porkerie!

GS88:
avresti per favore un esempio/link per capire di cosa si parla? per un progetto futuro controllare lo zoom potrebbe essere una cosa interessante...

Questo video è molto esplicativo, qui usano un radiocomando per automodelli per far muovere il servo invece di una elettronica dedicata.
Il vero problema di queste applicazione è realizzare il supporto meccanico e trovare il giusto ingranaggio che deve azionare la ghiera del fuoco o dello zoom.

Sai che non ho capito dal video?

Cioè, intendevo: un link/video per capire come muovono il meccanismo della ghiera rotante dello zoom... io non trovo nulla.

@astro esistono anche degli stepper minuscoli con risoluzione inferiore al grado, montando dei finecorsa si potrebbero ottenere dei risultati accettabili, inoltre con il microstepping (in chopper) si otterrebbe un movimento fluido.
Anche se effettivamente con dei servi si fà prima.

BrainBooster:
@astro esistono anche degli stepper minuscoli con risoluzione inferiore al grado,

Un buon servo ha una risoluzione migliore di 0.3°, inoltre serve abbastanza coppia per ruotare le ghiere di conseguenza servirebbe uno stepper non propriamente in miniatura che consuma tanta energia.

Questo video è più esplicativo:

comunque grazie a tutti!

robyr11:
wow grazie 6 stato chiarissimo!! che potenziometri mi consigli? i 2 servi dovranno azionare lo zoom e il fuoco di una reflex, per cui mi occorrono movimenti lenti e fluidi, ma modulabili...

scusami, ho arduinoUNO e non trovo il PIN ADC, dov' è?

robyr11:
Questo video è più esplicativo:
http://www.youtube.com/watch?v=PSlcbi0GnVw

comunque grazie a tutti!

chiarissimo ora! Grazie.

astrobeed:
Questo è lo sketch knob, è tra gli esempi di Arduino, modificato per gestire due servo tramite due potenziometri, le modifiche sono le righe con commenti in Italiano.
Il primo servo è collegato al pin 9 e il secondo al pin 10, ovviamente puoi cambiarli a tuo piacere, il primo potenziometro a A0 e il secondo a A1, il potenziometro deve essere collegato con il centrale all’ingresso ADC e i due laterali a +5V e GND.

// Controlling a servo position using a potentiometer (variable resistor) 

// by Michal Rinott http://people.interaction-ivrea.it/m.rinott

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
Servo myservo2; // secondo servo

int potpin = 0;  // analog pin used to connect the potentiometer
int potpin2 = 1;  // secondo potenziometro collegato a A1
int val;    // variable to read the value from the analog pin

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo.attach(10); // secondo servo al pin 10
}

void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value

val = analogRead(potpin2);            // secondo servo
  val = map(val, 0, 1023, 0, 179);
  myservo2.write(val);

delay(15);                           // waits for the servo to get there
}

Scusami ancora: ma i potenziometri hanno 3 pin, i centrali li collego assieme ad un unico pin di arduino: ADC, ma dove lo trovo? è per caso “AREF”?
Lo stesso per i laterali, in parallelo su +5v e gnd?

Per i servi, collego sempre in parallelo i +5v e gnd e il terzo cavetto (quello del segnale) lo collego uno al 9 e l’ altro al 10, right?

Rimane il problema del pin A0 e A1, o sono questi i due ADC?

Ci provo io pur non avendo l'esperienza di astrobeed.

Leggendo quello che scrive: "Il primo servo è collegato al pin 9 e il secondo al pin 10". Se i due servo vanno a 5V allora gli altri due cavi di ogni servo a +5 e GND.

"il primo potenziometro a A0 e il secondo a A1, il potenziometro deve essere collegato con il centrale all'ingresso ADC e i due laterali a +5V e GND." Quindi il potenziometro va ad A0 col centrale, laterali a +5 e GND.

ADC: "This operation of translating an analog voltage value into different levels is what we call Analog to Digital Conversion. One small hardware part inside the microprocessor that comes with the Arduino I/O board is dedicated to translate analog voltages into these values, it is the Analog to Digital Converter also called ADC." Per te A0 ed A1.