strano comportamento servo standard

salve ho collegato un servo standard mega quarter HITEC HS-805BB 24,7 kg cm a una batteria esterna da 6 V, pin 3 al cavo giallo, negativo batteria e negativo servo sul pin GND
questo è il codice per comandarlo prima posizione centrale poi rotazione a sinistra e poi a destra
Servo servo1;
void setup()
{
servo1.attach(3);
}
void loop()
{
servo1.write(90); // Put servo1 at home position
delay(2000);
servo1.write(10);
delay(2000);
servo1.write(170);
delay(2000);
}

Risulato dopo scaricato il codice il servo ruota in senso antiorario fino a battuta
fa lo stesso anche solo con il codice
Servo servo1;
void setup()
{
servo1.attach(3);
}
void loop()
{
delay(2000);
}
che non dà nessun comando !!
Ho cambiato il servo con un parallax continuos servo...lo stesso ruota in senso antiorario quindi il problema è su arduino (arduino uno)
A qualcuno ..è mai capitata una cosa simile?

errato copia incolla il codice comprendeva anche la libreria servo
#include <Servo.h>
Servo servo1;
void setup()
{
servo1.attach(3);
}
void loop()
{
servo1.write(90); // Put servo1 at home position
delay(2000);
servo1.write(10);
delay(2000);
servo1.write(170);
delay(2000);
}
ruota solo antiorario fino a battuna

Sei sicuro di avere impostato bene lo zero motore a 90 ???

p.s. ma cosa intendi per "fino a battuna/battuta" ?

ciao!

Prova con questo codice e vedi se il servo resta fermo:

#include <Servo.h>
Servo servo;

#define servoPin     9

#define servoZero       90


void setup() {
servo.attach(servoPin);

servo.write(servoZero);
Serial.begin(9600);
}

void loop() {
}

Vedi se il tuo servo (nel mio codice attaccato al pin 9) resta fermo?!

ho riscritto il codice come mi hai suggerito, ma nulla il servo parte in senso antiorario e arriva alla battuta meccanica si ferma sbattendo ma arduino continua a comandare il motore che sforza se non stacco l'alimentazione oppure il cavo connesso al pin 3 rischio di bruciarlo
non capisco i motori passo passo davano meno problemi eppure con il servo il circuito è banale e il codice sono poche righe
#include <Servo.h>
Servo servo1;
#define servoPin 3
#define servoZero 90
void setup()
{
servo1.attach(servoPin);
servo1.write(servoZero);
}
void loop()
{
servo1.write(servoPin); // Put servo1 at home position
delay(2000);
servo1.write(10);
delay(2000);
servo1.write(170);
delay(2000);
}

Ah scusami ma probabilmente non ci siamo capiti?! Ma il servo non puó girare a 360º???non é modificato???

nikel:
ho riscritto il codice come mi hai suggerito, ma nulla il servo parte in senso antiorario e arriva alla battuta meccanica si ferma sbattendo ma arduino continua a comandare il motore che sforza se non stacco l'alimentazione oppure il cavo connesso al pin 3 rischio di bruciarlo
non capisco i motori passo passo davano meno problemi eppure con il servo il circuito è banale e il codice sono poche righe
#include <Servo.h>
Servo servo1;
#define servoPin 3
#define servoZero 90
void setup()
{
servo1.attach(servoPin);
servo1.write(servoZero);
}
void loop()
{
servo1.write(servoPin); // Put servo1 at home position
delay(2000);
servo1.write(10);
delay(2000);
servo1.write(170);
delay(2000);
}

dunque
servo1.write(servoPin); // Put servo1 at home position
non ha significato logico, gli dici di andare in posizione a 3°
se togli
servo1.write(170);
delay(2000);
cosa succede? il servo gira lo stesso in senso antiorario?

datasheet del servomotore?

con
servo1.write(servoZero);
il servo torna in posizione centrale?

i servi continui funzionano in modo particolare, dipende da come sono stati modificati. Anche qui' datasheet alla mano. Ti posso assicurare personalmente (come migliaia di altre persone) che la libreria Servo funziona alla grande

Buongiorno...grazie per i tuoi suggerimenti....

si qui
servo1.write(servoPin); // Put servo1 at home position
con servoPin = 3
ho sbagliato poi ho corretto ma il risultato è lo stesso

ho provato anche con
#include <Servo.h>
Servo servo1;
void setup()
{
servo1.attach(3);
}
void loop()
{
delay(2000);
}
stessa cosa il servo parte e va a battuta

...questo maxy servo Hitec non è un servo modificato a rotazione continua
è standard con la battuta meccanica classica del servo per modellismo

ho provato a comandare un servo parallax (futaba)modificato a rotazione continua
che uso con il basic stamp2 stessa cosa parte in senso antiorario

Ora ho un sospetto:
la prima volta che ho usato il servo parallax sul basic stamp ho dovuto effettuare la centratura
come spiegato sotto

"A causa del fatto che i servo non sono stati
pretarati in fabbrica, probabilmente essi cominceranno a girare. (e infatti!!!) Userete quindi un piccolo
giravite per tararli in modo che stiano fermi quando ricevono uno specifico segnale dal BASIC Stamp
L’istruzione consiste di un impulso di 1.5 ms Quando i servo ricevono questo segnale,
probabilmente cominceranno a girare. Userete quindi il piccolo giravite per regolare ciascun
servo fino a che si fermi" (tratto dalle istruzioni del servo parallax)

Il servo parallax lo avevo tarato sul basic stamp2...forse devo farlo anche per arduino
il servo Hitec non è mai stato tarato
Ora voglio provare questa cosa...sicuramente è questo il problema
Unico dubbio...ma come mando un impulso di 1.5 ms al servo con arduino??

Io proprio questo intendevo (se il servo era modificato) ma mi ero spiegato male, cioè tu davi il comando servo.write(90) e poi con un giravite giravi il potenziometro e facevi arrestare il servo!!! :slight_smile:

finalmente...regolato il potenziometro con il programma
#include <Servo.h>
Servo servo1;
#define servoPin 3
#define servoZero 90
void setup()
{
servo1.attach(servoPin);
servo1.write(servoZero);
}
void loop()
{
servo1.write(90); // Put servo1 at home position
delay(2000);
}
ora rimane fermo...se alimento in parallelo dalla batteria 6 V arduino e il maxy servo
se invece alimento dalla batteria 6V il maxy servo e arduino da usb il servo ruota antiorario fino a battuta (il negativo della batteria e portato anche su arduino) strano.
Ora ho un'altro problema
Quando invece provo a dare solo una rotazione antioraria (per farlo ruotare di 90° antiorario rispetto la posizione di riposo)
#include <Servo.h>
Servo servo1;
#define servoPin 3
void setup()
{
servo1.attach(servoPin);
}
void loop()
{
servo1.write(10);
delay(4000);
}
si sposta di pochi gradi dalla posizione di riposo centrale e poi torna subito centrale ma non gli ho dato nessun servo1.write(90);

È una cosa normale. Per ogni valore diverso dell'alimentazione devi impostare lo zero del motore. In pratica ogni volta che devi usare un servo , se vuoi che a 90 il servo stia fermo devi caricare quello sketch che ti ho postato e regolare il potenziometro .

Spero di essere stato chiaro. Naturalmente i due valori diversi dell'alimentazione del servo li hai perché una volta tutta l'alimentazione è per il servo, l'altra l'alimentazione è divisa tra servo e Arduino.

Ciao.

ok...grazie per quanto riguarda la centratura...
invece perchè impartendo un comando di rotazione antioraria di 90° dalla posizione di riposo centrale con lo sketch come sotto
#include <Servo.h>
Servo servo1;
#define servoPin 3
void setup()
{
servo1.attach(servoPin);
}
void loop()
{
servo1.write(10);
delay(4000);
}
il servo si muove solo di pochi gradi e torna subito alla posizione centrale senza che abbia scritto il comando servo1.write(90);
stò cercando su altri post inglesi mi sembrava di aver letto qualcuno che aveva lo stesso problema

Guarda secondo me stiamo facendo un pò di confusione...

perchè io di questa cosa ne ho sentito parlare ma non ne sono sicuro, cioè se non erro i servo standard non modificati funzionano così, dopo il comando tornano nella posizione iniziale!!!

però può essere anche che è una stupidaggine , paradossalmente ho avuto a che fare solo con servo a rotazione continua nella mia breve carriera arduinica!!!

no, in teoria con
servo1.write(10);
non serve il delay, perchè quello rimane come output fisso... qualcosa di losco sta avvenendo :slight_smile:
come fai le connessioni?

lesto:
no, in teoria con
servo1.write(10);
non serve il delay, perchè quello rimane come output fisso... qualcosa di losco sta avvenendo :slight_smile:
come fai le connessioni?

Salve
no purtroppo non sono le connessioni
Ho provato il codice sul mio servo parallax modificato per la rotazione continua
#include <Servo.h>
Servo servo1;
#define servoPin 3
#define servoZero 90
void setup()
{
servo1.attach(servoPin);
servo1.write(servoZero);
}
void loop()
{
servo1.write(90); // Put servo1 at home position
delay(4000);
servo1.write(10);
delay(4000);
servo1.write(90); // Put servo1 at home position
delay(4000);
servo1.write(170);
delay(4000);
}
e in effetti rimane fermo per 4 secondi poi ruota in senso orario per 4 secondi con velocità 10, poi fermo 4 sec, e infine ruota in senso antiorario 4 sec. con velocità 170
il maxy servo standard Hitec non modificato per la rotazione continua ruota solo di pochi gradi poi ritorna in posizione centrale
su un testo di arduino ho letto
"On a standard servo the center position is reached by providing pulses at 1.5 millisecond intervals,
the -45 degree position by providing 0.6 millisecond pulses, and the +45 degree position by providing 2.4
millisecond pulses."
purtroppo non ci sono esempi
correggetemi se sbaglio il "pulses at 1.5 millisecond intervals" corrisponde al servo1.write(90);
ma per avere la posizione -45 providing 0.6 millisecond pulses e + 45 providing 2.4
millisecond pulses....che comandi devo impartire?

si tratta del PPM
in pratica hai un segnale alto che dura X microsecondi, e uno basso che dura Y-X microsecondi (dove Y è costante = a 20millisecondi, se non erro)

la X minima è 600, la massima 2400, e le puoi settare quando fai attach(pin, minX, maxX)

lesto:
si tratta del PPM
in pratica hai un segnale alto che dura X microsecondi, e uno basso che dura Y-X microsecondi (dove Y è costante = a 20millisecondi, se non erro)

la X minima è 600, la massima 2400, e le puoi settare quando fai attach(pin, minX, maxX)

salve...grazie...allora si ho trovato questo
"The attach command can take either 1 parameter, or 3parameters. If 3parameters are used, the first
parameter is the pin, the second is the minimum (0 degree) angle in pulse width in microseconds
(defaults to 544), and the third parameter is the maximum degree angle (180 degrees) in pulse width in
microseconds (defaults to 2400). "
quindi ora ho modificato il codice
#include <Servo.h>
Servo servo1;
#define servoPin 3
#define servoZero 90
void setup()
{
servo1.attach(servoPin, 544, 2400);
}
void loop()
{
servo1.write(90); // Put servo1 at home position
delay(4000);
servo1.write(10);
delay(4000);
servo1.write(90); // Put servo1 at home position
delay(4000);
servo1.write(170);
delay(4000);
}
non cambia nulla il maxy servo HITEC (standard senza rotazione continua ) all'inizio rimane centrale poi ruota di pochi gradi in senso antioraio non permane nella posizione per i 4 sec scritti e torna alla posizione centrale dove rimane per 4 sec poi successiva nuova rotazione di pochi gradi antioraria
insomma in verso orario non ci va mai e comunque dopo che ruota non rimane in posizione
temo alla fine dovrò proprio modificarlo se voglio farlo muovere da 0° a 180°

boh mi sembra molto strano, sicuro di non averlo accidentalmente alimentato al contrario? oppure dato che hai settato il servo a mano, potresti aver sbagliato l'impostazione, no?

lesto:
boh mi sembra molto strano, sicuro di non averlo accidentalmente alimentato al contrario? oppure dato che hai settato il servo a mano, potresti aver sbagliato l'impostazione, no?

No no i collegamenti sono giusti...oggi ho provato questo codice che stava negli esempi sweep arduino (....averlo visto prima)
e il maxy servo Hitec standard (non modificato per la rotazione continua) ora si muove da 0° a 180° e poi da 180° a 0°
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup()
{
myservo.attach(3); // attaches the servo on pin 3 to the servo object
}
void loop()
{
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}

evidentemente devo continuamente dargli comandi write(xxx°)
poi ho provato a modificare come segue
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup()
{
myservo.attach(3); // attaches the servo on pin 3 to the servo object
}
void loop()
{
for(pos = 90; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
delay(10000); /rimane fermo nella posizione 180° per 10 sec
myservo.write(0); / questi comandi è come se non ci fossero
delay(10000);
myservo.write(180);
delay(10000);
}
poco male lavorerò con dei cicli for grazie a tutti

molto strano, ma se dici che funziona... sarebbe da indagare