Un Servo che non Serve a Servire

Salve a tutti,
ho un piccolo (per voi) problema che mi crea un grande (per me) disagio.
premesso che di elettronica ne so praticamente 0 e d'informatica forse tocchiamo 1 (scala 1:100)
mi spiego:

ho aquistato un servo motore da sparkfun

e gli ho implementato un semplice codice che collega il servo motore al pin 9 PWM e lo fa ruotare di 90 e 180° con un delay di 2 secondi.

il servomotore ha 3 fili rosso, nero e blu
il rosso l'ho collegato al 5v di arduino (tester 4v46), il nero su GND
il blu al pin 9 PWM

MA:
Quando collego il servomotore (indipendentemente dal pin9) all'alimentazione il servo effettua 2 rotazioni (in tutto saranno 20 gradi) con un'intervallo di tempo di 1 secondo circa dopodichè sembra non funzionare più

ho pensato, visto che i big dicono sempre che arduino non è una centrale elettrica, di collegare una batteria di 6v (tester 5v58) direttamente al servo ed il blu sul pin9

adesso mi chiedo... ci va qualche resistenza aggiuntiva?
ho sbagliato a collegare i cavi?
dovrò gettarlo?
perchè piove sempre nello stesso istante ijn cui stacco da lavorare ?:smiley:
vi ringrazio dell'attenzione e scusandomi ancora spero facciate una buona serata

Marbi

no, se il 5v NON lo prendi da un pin ma appunto dal 5v, se il servo ciuccia troppo al massimo l'arduino si spegne per mancanza di corrente.

i servo NON funzionano in PWM ma in PPM, quindi devi usare la libreria Servo.h (già inclusa in arduino)

maggiori info:Servo - Arduino Reference

Il codice poi sarebbe il seguente, o una cosa del genere:

#include <Servo.h>
  // instanzia un oggetto servo
Servo myservo2;

int i;
void setup()
{
  myservo2.attach(10); //Attacca il control del servo al pin 10
}

void loop()
{
 myservo2.write(0); // 
 delay(1000);
 myservo2.write(180);
delay(1000);
}

In questo modo colleghi il control al pin 10 di arduino e poi il servo dovrebbe andare per 1 secondo in un verso e per un secondo in un altro verso.

p.s. Ma il servo è un servo standard o uno a rotazione continua???

Ciao

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 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 
  } 
}

questo è il codice che ho utilizzato per far girare questo servomotore
il servomotore in questione è questo Servo - Generic Continuous Rotation (Micro Size) - ROB-10189 - SparkFun Electronics

non so cosa sia un PPM (e sinceramente ne so poco anche dei PWM) e mi piacerebbe molto saperne di più.

sono entrato da pochissimo (1 mesetto circa) nel mondo di arduino riuscendo a far accendere ben 10 led in vari modi differenti :smiley:
ho semplicemente alcune conoscenze nei linguaggi di codice (ma veramente alcune :wink: ).

per favore aiutatemi, riuscirei a far esplodere casa con l'arduino...
... io mi ci voglio divertire, mica ammazzare :fearful:

f.schiano:
...
p.s. Ma il servo è un servo standard o uno a rotazione continua???
...

come dice l'articolo di vendita .. "continuous full-rotation servo motor" :wink:

Il codice e' corretto. Non so bene invece se il servo a rotazione continua puo' fare quello che il codice gli dice di fare..

Salve, con i servi a rotazione continua la variabile che imposti non dà al servo l'angolo di rotazione del suo alberino, bensì il verso di rotazione e la velocità. Ora non ricordo molto bene i valori di riferimento quindi potrei sbagliare: prova a passargli prima 0 come valore e lo vedrai girare a massima velocità in senso antiorario; poi prova con 180 come valore e girerà in senso orario sempre a massima velocità. Più ci si avvicina a 90 quindi un valore intermedio, la velocità del servo diminuisce fino a fermarsi.
Saluti.

Pelletta:
Salve, con i servi a rotazione continua la variabile che imposti non dà al servo l'angolo di rotazione del suo alberino, bensì il verso di rotazione e la velocità. Ora non ricordo molto bene i valori di riferimento quindi potrei sbagliare: prova a passargli prima 0 come valore e lo vedrai girare a massima velocità in senso antiorario; poi prova con 180 come valore e girerà in senso orario sempre a massima velocità. Più ci si avvicina a 90 quindi un valore intermedio, la velocità del servo diminuisce fino a fermarsi.
Saluti.

Ecco mi pareva!

innanzitutto grazie a tutti per l'enorme collaborazione :smiley:

questo è il datasheet, http://www.sparkfun.com/datasheets/Robotics/SM23-33%20Servo%20_E.pdf i collegamenti dovrebbero essere esatti.

ho riscontrato un'altro problema nell'utilizzo della seriale di comunicazione.
se inizializzo la seriale mi scrive quest'errore:

inizialmente mi da quest'errore:

processing.app.SerialException: Serial port 'COM4' not found. Did you select the right one from the Tools > Serial Port menu?
at processing.app.Serial.(Unknown Source)
at processing.app.Serial.(Unknown Source)
at processing.app.debug.Uploader.flushSerialBuffer(Unknown Source)
at processing.app.debug.AvrdudeUploader.uploadViaBootloader(Unknown Source)
at processing.app.debug.AvrdudeUploader.uploadUsingPreferences(Unknown Source)
at processing.app.Sketch.upload(Unknown Source)
at processing.app.Sketch.exportApplet(Unknown Source)
at processing.app.Sketch.exportApplet(Unknown Source)
at processing.app.Editor$DefaultExportHandler.run(Unknown Source)
at java.lang.Thread.run(Thread.java:619)

ma la porta com4 è settata, quindi salvo e riavvio

ci riprovo e questa volta l'errore è:

Error inside Serial.serialEvent()
java.io.IOException: Bad file descriptor in nativeavailable
at gnu.io.RXTXPort.nativeavailable(Native Method)
at gnu.io.RXTXPort$SerialInputStream.available(RXTXPort.java:1532)
at processing.app.Serial.serialEvent(Unknown Source)
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)

Codice utilizzato

int Pin =9;
void setup() {
  Serial.begin(9600);
  Serial.println("Pronto!");
 
}
void loop() {
analogWrite(9,0);
if (Serial.available()>0) {
  delay(500);
  int Valore =Serial.read();
  analogWrite(9,Valore);
  Serial.println(Valore);
}
}

grazie ancora

con analogWrite(Pin,0) il servo si ferma... ma l'arduino va in tilt comunque... dovrei aggiungerci qualche componente fisica?
una resistenza, una bomba!!! :smiley:

Perchè usi analogWrite per comandare il servo?
Usa la libreria Servo

già fatto, il problema è a monte...
sia con analogWrite che con la libreria (sketch preso dagli esempi di arduino knob e sweep) mi nascono quegli errori

ho pensato che il problema fosse il codice e son partito dal principio (azzerare l'analogWrite) e lì ho notato che se implemento il seriale mi genera quel codice.

cosa può non andare?

l'arduino è un arduino mega

l'errore che descrivi è dell'ide di arduino... che versione usi? è un problema con rxtx.jar, ovvero le librerie java per comunicare in seriale.
l'errore "not found" di solito compare quando:
usb non collegata
usb appena collegata e non ancora riconosciuta dal SO
altro programma sta usando quella porta seriale

il secondo errore invece sembra indicare il fatto che la libreria NON è integra... prova a scaricare di nuovo l'IDE

continuo a ringraziare tutti per i vostri suggerimenti.
lesto, ho cambiato l'ide scaricando la 22 e tentando di far funzionare ancora questo motore servo "rotativo" mi imbatto in una novità.

// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.


#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{
 Serial.begin(9600); 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
 
void loop() 
{ 
  Serial.println("incremento");
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);      
    Serial.println(pos);    // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  Serial.println("decremento");
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                 
    Serial.println(pos);    
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}

l'arduino non carica lo sketch se il servo è collegato, ho scollegato il componente ed uppato lo sketch.
a sketch caricato la seriale funziona normalmente (vedo i numerini salire e scendere) ma come ricollego il servo...
BOOM!!! :fearful:
mi si riblocca tutto dandomi l'errore della seriale.

arduino da gettare?
servo che vale 0?

help pls

servo che ciuccia troppa corrente, probabilmente. alimenta il servo con una batteria esterna, ricorda che il gnd va messo in comune con l'arduindo e la batteria (il -)

grande lesto...
fammi capire...
io ho una batteria esterna da 6v... si può fare?

se ho capito bene il + lo prendo dalla batteria ed il - sul ground?

e sempre se ho capito bene tutti i - devono essere collegati all'arduino?

attendo risposta e ti ringrazio :smiley:

Guarda il datasheet del servo, se ti dice che puoi alimentarlo anche a 6V lo colleghi diretto alla batteria. Il negativo della batteria deve anche esso essere collegato sul GND di arduino altrimenti non funziona.
Se il servo non può sostenere 6V occorre mettere un regolatore di tensione; se ad esempio il servo funziona con 5V massimi devi usare un regolatore a basso drop out oppure mettere una batteria più grande (il comune lm7805 non va bene con 6V in ingresso).
Saluti

sul datasheethttp://www.sparkfun.com/datasheets/Robotics/SM23-33%20Servo%20_E.pdf del motore servo Servo - Generic Continuous Rotation (Micro Size) - ROB-10189 - SparkFun Electronics ci sono info su 4.8v e 6v e PENSO che si possa collegare direttamente.

quindi mi confermi che il servo deve essere collegato alla batteria e il negativo di quest'ultimo collegato direttamente all'arduino!!!

scusami Pelletta, ma sinceramente di elettronica ne capisco veramente 0.

ho scoperto da poco l'esistenza dei datasheet ed ho capito a mala pena a cosa serve una resistenza :frowning:

Tranquillo, ci siamo passati tutti.
Il positivo della batteria va sul positivo del servo, il negativo della batteria va sul negativo del servo E sul GND di arduino, infine sul pin di segnale del servo va un pin pwm di arduino.
Se la batteria non è maggiore di 6V stando al datasheet non corri nessun rischio.
Ciao.