[risolto]vibrazioni servo segnale rx in entrata

per favore, avrei bisogno del vostro aiuto per risolvere un problema che affligge il servocomando che viene pilotato da un segnale radio di una ricevente RC

il segnale da serial monitor oscilla di circa 5-6 punti (1000-1005) questo si traduce in una vibrazione ritmica quasi "blues"

ho aggiunto una tolleranza alla fine dello sketch

#define Tolerance 5
...............................
if (abs(NewPos - OldPos)> Tolerance) {
OldPos = NewPos;
myservo.write(NewPos + Center);
}

qualcosa migliora ma non risolve del tutto il problema.

mi chiedevo se potrebbero esserci soluzioni migliori per filtrare il segnale direttamente all'inizio dello sketch nella parte che riguarda pulseIn al posto di tolerance che fra l'altro mi trasforma il movimento in scatti.

#define Neutral 1500 // -- minimum throttle forward signal
#define Maxspeed 2000 // -- maximum throttle forward signal
#define Antsx 1000 // -- in front servo signal sx
#define Antdx 2000 // -- in front servo signal dx
#define Postsx 1000 // out rear servo sx end point (if inverted with postdx it reverse)
#define Postdx 2000 //-- out rear servo dx endpoint (if inverted with postsx it reverse)
#define Center 0 //-- add or subtract your value to center steering (+- 50 or more)



#define Max_gain 650 //-- gain steering reduction width at max throttle (if reverse add (-) before value)
#define Slowlimit 1800 //-- slow forward percentage without endpoint correction

#define Tolerance 5 //-- if poor quality servo vibrates try 5 (also try (0) before decide)



#include <Servo.h>
Servo myservo;
unsigned int Rxpulse;
unsigned int Gaspulse ;

unsigned int Gain;
unsigned int NewPos, OldPos;
void setup() {
myservo.attach(10); //-- rear servo signal out pin
pinMode(8, INPUT); //-- front servo signal in pin
pinMode(7, INPUT); //-- throttle signal in pin
}
void loop(){
Rxpulse = pulseIn(8, HIGH);
Gaspulse = pulseIn(7, HIGH);

if (Gaspulse > Slowlimit) {
Gain = map(Gaspulse, Slowlimit, Maxspeed, 0, Max_gain );
NewPos = map(Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));
}
else {
NewPos = map(Rxpulse, Antsx, Antdx, Postsx, Postdx);
}
if (abs(NewPos - OldPos)> Tolerance) {
OldPos = NewPos;
myservo.write(NewPos + Center);
}
}

il servo è alimentato separatamente e a sufficienza, il problema credo stia solo nel segnale in ingresso ai piedini D7 D8 che arriva leggermente oscillante
grazie a tutti.

la radio è una spektrum dx3s dsm, credo che il segnale sia PPM

vedo da monitor seriale che il segnale entra con una variazione ciclica velocissima che oscilla tra 1000 e 1005 e si mantiene in questo modo anche spostando gli stick al massimo con un valore 2000- 2005
nello sketch che ho postato questo si traduce in un servo poco fluido nel movimento e sempre afflitto da una sorta di ritmo ciclico.
mi chiedo se ci sia una sorta di controllo PID che potrei applicare a questo segnale per filtrare l'errore.. dico una bischerata?

avrei bisogno di stabilizzare il segnale in entrata in modo che possa attenuare questa oscillazione di Rxpulse e Gaspulse che sono lo sterzo e il gas del radiocomando

sto cercando qualche informazione, ho provato a cambiare libreria del servo con mobatools ma non cambia nulla.
tra l'altro con un servocomando digitale buonissimo ho più vibrazioni rispetto all' hs55 col quale sto facendo le prove da banco.

ho notato che la vibrazione cambia ritmo se modifico un parametro di trasmissione del radiocomando da 11ms a 16.5ms settato su 11ms è tutto molto peggio ma non ho altri modi per intervenire sul problema.

potete aiutarmi per favore?

allego un breve video del problema che vorrei risolvere

anche se sto muovendo io il servo con lo sterzo della radio si vede che c'è una vibrazione ritmica che è indipendente dai movimenti fatti attraverso il radiocomando.
i movimenti ampi non sono il difetto, sono io che giro lo sterzo. vorrei risolvere solo la vibrazione ritmica che si porta dietro come "rumore di fondo" per tutto il movimento proporzionale.
il servo è alimentato bene.
avete qualche suggerimento che potrei provare?
vi ringrazio.

può essere che serve un filtro passa basso?

a quanto ho capito si può fare anche da software ma io non saprei scriverlo.

invece ricordo che cose simili si usavano sui servocomandi per ovviare ad alcune interferenze con una resistenza in serie al segnale e un condensatore tra segnale e massa.

un toroide potrebbe forse funzionare? è l'unica cosa che ho per fare una prova veloce.

qualcuno potrebbe aiutarmi a scrivere un filtro passa basso su questo sketch?

non so quale potrebbe essere la soluzione migliore da provare.

ho risolto.
serviva filtrare i segnali in entrata creando una valore intermedio.
questa è la soluzione, il servo è perfettamente stabile e lo sketch funziona perfettamente.
lo condivido ringraziando chi su altri forum mi ha aiutato e in memoria futura per tutti quelli ai quali possa servire creare un filtro dei segnali in ingresso da una radio trasmittente da modellismo.
lo sketch permette di avere uno sterzo inversamente proporzionale al gas potendo decidere il punto di attacco e la massima corsa a tutto gas.
collegare il segnale di sterzo al piedino D8, il segnale del gas al piedino D7 e il segnale del servo posteriore al piedino D10

//----------- signal setup -------------------------------------
#define Neutral 1500 // -- minimum throttle forward signal
#define Maxspeed 2000 // -- maximum throttle forward signal
#define Antsx 1000 // -- in front servo signal sx
#define Antdx 2000 // -- in front servo signal dx
#define Postsx 1000 // out rear servo sx end point (if inverted with postdx it reverse)
#define Postdx 2000 //-- out rear servo dx endpoint (if inverted with postsx it reverse)
#define Center 0 //-- add or subtract your value to center steering (+- 50 or more)
 
//--------- user driving setup ------------------------------
 
#define Max_gain 600 //-- gain steering reduction width at max throttle (if reverse add (-) before value)
#define Slowlimit 1700 //-- slow forward percentage without endpoint correction
 
#define Tolerance 0 //-- if poor quality servo vibrates try 5 (also try (0) before decide)

  
 
//------------ here start the program, you don't need to change anything here --------------------------
 
#include <Servo.h>
Servo myservo; 
#define N_STST  7      //-- low value =more servo speed and vibrations (try 3-15)        
#define N_STGAS     7  //-- low value = more servo speed and vibrations (try 3-15)  
unsigned int stSt[ N_STST ];  
unsigned int stGas[ N_STGAS ];       
long toStSt = 0;           
long toStGas = 0;         
int inSt = 0;                                         
int inGas = 0;           
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
void setup() {
for ( int i=0; i<N_STST; i++ ) stSt[ i ] = 0;
for ( int i=0; i<N_STGAS; i++ ) stGas[ i ] = 0;
myservo.attach(10); //-- rear servo signal out pin
pinMode(8, INPUT); //-- front servo signal in pin
pinMode(7, INPUT); //-- throttle signal in pin
}
void loop(){
Rxpulse = pulseIn(8, HIGH);
Gaspulse = pulseIn(7, HIGH);
Rxpulse  = meStSt( Rxpulse );
Gaspulse = meStGas( Gaspulse );
if (Gaspulse > Slowlimit) {
Gain = map(Gaspulse, Slowlimit, Maxspeed, 0, Max_gain );
NewPos = map(Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));
  }
else {
NewPos = map(Rxpulse, Antsx, Antdx, Postsx, Postdx);
  }
if (abs(NewPos - OldPos)> Tolerance) {
OldPos = NewPos;
myservo.write(NewPos + Center);
}
}
unsigned int meStSt( unsigned int val ) {
if ( ++inSt >= N_STST ) inSt = 0;
toStSt = toStSt - stSt[ inSt ] + val;
stSt[ inSt ] = val;
return( toStSt / N_STST );
}
unsigned int meStGas( unsigned int val ) {
if ( ++inGas >= N_STGAS ) inGas = 0;
toStGas = toStGas - stGas[ inGas ] + val;
stGas[ inGas ] = val;
return ( toStGas / N_STGAS );
}

Grazie per aver condiviso la soluzione. +1Karma