Comandare Servo Motore da Monitor Seriale

Buongiorno a tutti. Stavo cercando di creare un semplice programma che inviasse ad un servo motore, tramite monitor seriale, il valore dell'angolo sul quale si deve portare.
Il codice che ho scritto è il seguente:

#include <Servo.h>

Servo myservo;

String angolo;

void setup(){
  myservo.attach(9);
  Serial.begin(9600);
  myservo.write(0);
}

void loop(){
  if (Serial.available()>0) {
    angolo=Serial.readString();
    
    float angle=angolo.toFloat();
    Serial.println(angle);
    myservo.write(angle);
  }  
}

Praticamente quello che ho pensato di fare è stato prima di inizializzare l'angolo a zero. Dopo di che, di leggere l'angolo inviato col monitor seriale come una stringa e convertirla in float. Come verifica ho rischiesto di stampare l'angolo (angle) così definito, che corrisponde a quello inserito inizialmente, e poi di settare il servo su quell'angolo.
Il codice funziona, nel senso che per angoli ad es. di 180-90-0° fornisce lo spostamento desiderato.
Ma NON funziona, nel senso che per angoli "piccoli" o "grandi", cioè minori di circa 30 o maggiori di circa 150, il servo si porta sulla posizione 0 o 180. Per tutti gli altri angoli sembra invece funzionare.
Qualche idea?
Grazie a tutti :slight_smile:

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

Chiedo scusa, ho provveduto immediatamente :smiley:

dubito seriamente ti serva una float dato che se è un normale servo da € 3,50 a mala pena riesci a posizionarlo con 10 gradi di differenza....
Deve essere un servocomando serio allora arrivi al grado ma con precisione 77%......
Se vuoi posizioni angolari serie:
a) motore + encoder
b) stepper.

Grazie mille, avendoci giocato un pò prima con un potenziometro la regolazione dell'angolo mi sembrava più "elastica"..
Quindi è un problema legato alla meccanica del servo motore? Il codice è formalmente corretto, salvo sostituire .toFloat con .toInt?

e' legato al sistema globale... arduino compreso...
il potenziometro ha poca precisione.
Se non usi una tensione di riferimento tale precisione sale del 300%
Se lasci gli altri analogici aperti e in configurazione analogica arduino (ma non solo arduino, tutti i micro in configurazione ingresso analogico) ti spara tanta di quella fantasia che la metà basta e la precisione moltiplicala per un altro 300%
quindi:
accontentarsi che giri nel senso che gli dico di girare è gia un successo....

ho estremizzato un po ma fidati che i servi van bene solo per indicare piu o meno quella direzione...

Se hai un sistema meccanico e devi posizionare un binocolo con un servocomando a potenziometro, punti adesso il palo o la casa a 100metri, gli dici di girarsi di 90 gradi e ritornare li e al posto del palo o la casa ci vedi la montagna...

Quei servocomandi li son nati per posizionamenti continui e variabili.
Van benissimo per far volare un aereo, dove cambi di continuo la sua angolazione.

Puoi migliorare qualcosa se:

  1. usi una tensione di riferimento extra_stabilmente_stabile per alimentare il potenziometro.
  2. un alimentazione del arduino e servocomandi che sia stabile, sufficentemente potente.

ciau

Hai usato una variabile float, ma credo che la write accetti solo variabili intere.

Puoi trasformare la float in int, ad esempio.

cyberhs:
Hai usato una variabile float, ma credo che la write accetti solo variabili intere.

Puoi trasformare la float in int, ad esempio.

non credere... essine certo! ehehehe

da 0 a 255 o da 0 a 1024