Visualizza messaggio singolo
Vecchio 05 maggio 20, 13:44   #109 (permalink)  Top
wrighizilla
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
in pratica questo è un filtro.
La funzione mediaStoria ( entrambe, sono uguali) funzionano un po' come se mettessi un condensatore in parallelo al filo che porta i valori: invece di darti il valore diretto lo media con i precedenti.
se i valori oscillano intorno al valore 10, come 7, 9, 11, 12, 10
la loro media è 9.
Se il prossimo valore fosse 13, si butta via il 7, la media diventa 11. Se il prossimo fosse 8 la media sarà 10.
Quindi le oscillazioni vengono ammortizzate.
Più grande è il numero di elementi che vengono conservati e meno pesa un valore difforme dagli altri, quindi tutto si stabilizza.
Ma accelerando devono uscire diversi valori bassi prima che i nuovi valori alti prevalgano e alzino la media, quindi si ottiene una maggiore lentezza della risposta.
Il tutto si svolge in microsecondi ad ogni giro.
il ritmo effettivo lo determina pulseIn che sta fermo a misurare la linea in attesa dei fronti del segnale.

questo è lo sketch ripulito dai commenti, rivisto e corretto.
perfettamente stabile e funzionante.

Codice:
//----------- 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 

//----------------------------
 
#include <Servo.h>
Servo myservo; 
#define N_STST  7              
#define N_STGAS     7    
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 );
}

Ultima modifica di wrighizilla : 05 maggio 20 alle ore 13:48
wrighizilla non è collegato   Rispondi citando