Salve a tutti, avrei una domanda da rivolgervi, oggi mi è arrivato un servomotore mg945 analogico minitower, così utilizzando un sensore di flessione ho impostato che dopo che il sensore viene piegato oltre un certo angolo il braccio del servo deve raggiungere una certa posizione tramite la funzione if, quando piego il sensore il servo arriva sì alla posizione, ma sempre a scatti...è una limitazione del servo oppure ho commesso qualche errore io nella scrittura del programma? E se è a causa del servo, verso quale tipo dovrei orientarmi per avere un movimento più costante?
Sarebbe buona cosa che pubblicassi qui lo sketch che stai usando e comunque dovresti fare delle prove con il solo servo e gli sketch di esempio inseriti nell'IDE.
Un'altra cosa da considerare è l'alimentazione del servo: da Arduino o esterna?
Per la pubblicazione del codice nel forum segui le istruzioni del punto 7 --> [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum
Oppure usa la funzione "Copia per il Forum" ma solo se usi l'IDE 1.5.5: quelli precedenti (1.5.4 o 1.0.5) usano un tag errato.
in effetti l'alimentazione proviene da arduino, però pensavo che, non essendoci nulla che opponesse resistenza, l'alimentazione da arduino andasse bene, comunque ti posto il codice, in effetti non ho fatto altro che confrontare due esempi cercando di utilizzare ciò che serviva a me, scusa se forse ho sbagliato qualcosa, ma sono alle prime armi XD
int SensorPin = A0;
#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
Serial.begin(9600);
}
void loop()
{
int sensor, degrees;
sensor = analogRead(0); // read the voltage from the voltage divider (sensor plus resistor)
degrees = map(sensor, 238, 125, 0, 90);
if ((degrees <= 30)) {
myservo.write(15);
}
if ((degrees > 30)) {
myservo.write(45);
}
// mostra i risultati
Serial.println(" analog input: ");
Serial.print(sensor,DEC);
Serial.print(" degrees: ");
Serial.println(degrees,DEC);
delay(15); // waits 15ms for the servo to reach the position
}
Non è corretta la funzione map.
degrees = map(sensor, 238, 125, 0, 90);
I valori vanno messi in progressione: minimo e massimo, quindi prima 125 e poi 238
Se puoi vuoi invertire il senso puoi fare
degrees = 90 - degrees;
Inoltre dopo il map dovresti mettere un constrain perché la map non limita i valori che quindi potrebbero andare fuori scala.
Ricorda che l'analogRead restituisce valori tra 0 e 1023 e anche se indichi un intervallo minore anche gli altri sono calcolati.
Quindi basta inserire subito dopo il map
constrain(degrees, 0, 90);
Per l'IF basta una sola serie di tonde e se segue una sola istruzione le graffe le puoi omettere.
quindi puoi anche scrivere
if (degrees <= 30) myservo.write(15);
if (degrees > 30) myservo.write(45);
EDIT: Immagino che abbia già controllato quali sono i valori massimi e minimi restituiti del sensore analogico.
sisi quello l'ho controllato e riguardo la funzione constrain avevo deciso di non utilizzarla per il momento per iniziare a capire il funzionamento, spero che sia l'alimentazione il problema, a breve proverò con un alimentatore da 6v dedicato al solo servo e ti farò sapere se è andato a buon fine oppure no XD... Grazie per l'aiuto