Servi "arrabbiati"

Ho realizzato un mini circuito che comprende Arduino 2009, un sensore Memsic 2125 ( del quale leggo solo gli assi x ed y) e 2 servi montati su un telaietto pan/tilt.

Il codice e’ un semplicissimo copia/incolla degli esempi riportati su questo sito sia per i servi sia per il Memsic.

A parte che muovendo il sensore, i servi non reagiscono come mi aspetto che facciano.
Quello che mi preoccupa di piu’ e’ che quando il sensore e’ a riposo sulla bread bord appoggiata al tavolo, i servi sembrano impazziti.

Utilizzando la versione di codice per il solo sensore e monitorando la comunicazione seriale, quando il sensore e’ a “riposo” ci sono dei valori negativi.
Ho provato ad aggiungere una costante alla lettura dei servi, ma non cambia nulla.

Credo che per risolvere, si debba inserire qualche resistenza o qualche Delay da qualche parte, ma non ho idea dove.

Note sui collegamenti elettrici:

  • Servi alimentati da un alimentatore esterno.
  • Sensore collegato direttamente ai pin 2/3 senza nessun componente.

Di seguito metto il codice, che come ripeto e’ stato preso da questo sito:

#include <Servo.h>
const int xPin = 2; // X output of the accelerometer
const int yPin = 3; // Y output of the accelerometer
Servo myservo;
Servo servo2;
int pos = 0;
int pos2 = 0;
void setup()
{
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
myservo.attach(9);
servo2.attach(8);
}
void loop()
{
// variables to read the pulse widths:
int pulseX, pulseY;
// variables to contain the resulting accelerations
int accelerationX, accelerationY;

// read pulse from x- and y-axes:
pulseX = pulseIn(xPin,HIGH);
pulseY = pulseIn(yPin,HIGH);

// convert the pulse width into acceleration
// accelerationX and accelerationY are in milli-g’s:
// earth’s gravity is 1000 milli-g’s, or 1g.
accelerationX = ((pulseX / 10) - 500) * 8;
accelerationY = ((pulseY / 10) - 500) * 8;

pos = accelerationX+90;
pos2 = accelerationY+90;
myservo.write(pos);
servo2.write(pos2);
position
}

Dove sbaglio?

ciao arcom non sono sicuro, ma credo che pulsein() é un comando che come delay() blocca l'esecuzione del programma e si ferma finché non abbia letto l' impulso. Questo va in conflitto con il pilotaggio dei servo che deve dare un impulso di lunghezza da 0,5 a 1,5 milisecondi con una ripetizione ogni 20milisecondi. Prova di misurare il Memsic 2125 usando milli() Ciao Uwe

Una volta ho letto un interessante articolo sull' uso di milli() (sempre partendo da questo forum).

Ci do un' occhiata e posto i risultati

Sto facendo prove con millis() che sicuramente e’ da preferire a delay().

Comunque credo di aver capito che il problema sta nei valori che mando in pasto ai servi.

Un servo puo’ accettare valori compresi tra 0 e 180.
Il sensore manda valori anche al di fuori di questa scala.
Di conseguenza i servi impazziscono.
Ho trovato l’ esempio “Servo - Knob”; vengono convertiti i valori da 0 a 1023 di un potenziometro in valori compresi tra 0 e 180 che possono essere accettati da un servo.
Il comando che viene usato e’ :

val = map(val, 0, 1023, 0, 179);

dove val e’ il valore letto dal potenziometro.

Vi aggiorno.