Ciao a tutti, stasera ho iniziato a testare il mio arduino uno con firefly (http://www.fireflyexperiments.com), un programma che permette di usarlo con rhinoceros.
Così ho potuto usare degli slider tramite computer per vedere di preciso che frequenze inviavo a un servomotore (E-Flite S60) e mi sono reso conto che da 0 a 16 non si muoveva, tanto che una volta arrivato a finecorsa, a 179, non aveva compiuto i 180 gradi di rotazione ma era rimasto sensibilmente indietro.
Per il resto, superata quella soglia, rispondeva bene ai comandi.
Si certo, il codice l'avevo solo copiato e incollato, non era uno script mio ma quello rilasciato con firefly.
E comunque la rotazione inferiore ai 180° succede anche quando lo uso normalmente col codice di esempio di arduino e il potenziometro... davvero non capisco...
Per essere sicuro ho modificato lo script KNOB in modo che stampasse anche i risultati di input e output.
Effettivamente pur ricevendo dal potenziometro l'input anche in prossimità del finecorsa e scalandolo per il servo correttamente (almeno questo viene stampato), questo non si muove fino a poco prima dei 20 gradi.
Dunque ho provato a scalare anche da 0 a 20 invece che da 0 a 179, per essere sicuro che il potenziometro sfruttasse tutta la corsa per "zoommare" su quei valori molto bassi ma il discorso non cambia, non si muove.
Dunque può essere o che il mio arduino non riesca a trasmettere quelle frequenze così basse anche se creda di farlo, siccome stampa i valori, o che il servo abbia una soglia sotto la quale è insensibile, del resto è costato 10 euro.
Potrei provare a verificare l'output di arduino connettendo un output a un input analogico ad esempio?
Qualcuno ha altre idee sul perché del problema?
20 gradi non sono pochi...
#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()
{
myservo.attach(13); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
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
Serial.print("sensor = " );
Serial.print(potpin);
Serial.print("servo output = " );
Serial.println(val);
delay(15);
}
woops sorry ho fatto un pò di confusione
comunque verificherei i valori in uscita dal potenziometro
se continua a non funzionare proverei ad andare di PWM (analogWrite, occhio che non è compatibile con la libreria Servo.h)
Quelli credo siano corretti perché il serial print li indica e map li converte, solo che fino a 18-20 non si muove il servo.
Io vorrei verificare quelli in uscita da arduino piuttosto, non so se possa farlo arduino stesso connettendo un pin in uscita ad uno in entrata e confrontando i valori.
si può fare ma non esiste un comando apposito...
per fare una cosa fatta bene bisogna giocare con gli interrupt, e non è concetto da poco.
Però una cosa grezza è:colleghi il pin di output con uno di input digitale, fai un loop bello scarno, che continua a leggere la durata del segnale digitale alto(in MICROsecondi). il problema è che i comandi Serial son talmente lenti che ti sfaserebbero le letture. quindi prima fai tipo la media di 100 letture (2ms durata max ppm*100letture=200ms tra una serial e l'altra, è ancora poco, fai 500 ;D) e poi stampi a video il risultato.
così hai l'ampiezza del segnale PPM, che dovrebbe essere compresa tra 500 (min) e 2000(max) circa (dalla mia ricevente x servi leggo valori da 800 a 1900)