aiuto per uno sketch rc

Sezione dedicata alla costruzione di robot
Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 11:59

il nodo che non riesco a sciogliere è:

se io uso un define significa che Postsx e Postdx sono definiti, non si toccano. non sono variabili in gioco ma valori definiti.

allora perchè cambiando i valori di Slowlimit e Max_gain ( altri 2 valori definiti ) vedo accorciarsi o allungarsi la corsa del servo appena carico il programma con la radio in neutro?

cambiando Slowlimit mi aspetterei di avere solo maggiore corsa del gas a disposizione per usare lo sterzo posteriore con tutta la corsa definita da Postsx Postdx

cambiando Max_gain mi aspetterei di veder cambiare l'ampiezza della corsa disponibile del servo quando arriva a maxspeed ovvero tutto gas, serve solo a scegliere se arrivati a tutto gas avere chiusa tutta la corsa o lasciarne una parte utilizzabile.

non mi aspetto ed è spiacevole vedere scombinare il settaggio dei fine corsa che sono stati definiti con 2 valori precisi.

ho scritto male oppure manca qualcosa, magari anche solo un paio di { } ma non c'arrivo.
mi ingrippo sulla questione che i dati in define non dovrebbero venire cambiati dalle risultanti del void loop.

ti ringrazio, adesso provo a trasformare tutto in microseconds. vediamo se me la cavo.




kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 03/05/2020, 12:29

Perché newPos essendo fuori dalla condizione if else viene sempre calcolato con la correzione gain che per basse velocità è correlata a slowlimit.

Sono da separare i due casi

Hai provato a caricare le righe che ti avevo rimandato ieri? Anche se ho paura di sapere come si comporta!

Hai tenuto una copia del programma con la pulseIn? Perché se si aggiungono troppe cose che ancora non funzionano bene rischia di diventare complicato imputare la colpa a questo o quel comando

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 18:25

si funziona tanto meglio con questo codice

Codice: Seleziona tutto

#define Neutral 1500 // -- minimum forward signal
#define Maxspeed 2000 // -- maximum forward signal
#define Antsx 1000 // -- in front servo signal sx
#define Antdx 2000 // -- in front servo signal dx
#define Postsx 5 // out rear servo sx endpoint if inverted with postdx it reverse
#define Postdx 175 //-- out rear servo dx endpoint if inverted with postsx it reverse
#define Center 0 //-- add or subtract xx value to center steering
#define Tolerance 3 //-- if poor quality servo vibrates try 5
#define Max_gain 120 //-- gain steering reduction by throttle if reverse add -
#define Slowlimit 1800 //-- slow forward without endpoint correction
#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);
}
}
adesso lo testo prima di cantare vittoria.. grazie infinite, è la strada giusta.

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 18:33

funziona molto meglio di prima, adesso i fine corsa non cambiano, non si allargano più
l'unica cosa che cambia adesso è l'interazione tra Slowlimit e Max_gain ovvero se abbasso slowlimit la corsa del servo a tutto gas cambia e devo ritoccare anche Max_gain
la prova la faccio sempre cercando di ottenere il servo fermo al massimo del gas
ad esempio slowlimit 1600 e Max_gain 115 ho il servo nuovamente fermo al centro a tutto gas.
ma aumentando slowlimit a 1800 devo mettere Max_gain a 170
ad ogni modo è certamente il risultato migliore trovato fino ad adesso.


kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 03/05/2020, 18:42

Oooooooooooottima notizia sono contento.

Quel problema che dici che ha ancora è perché come ti avevo detto bisogna accertarsi che max gain + fine corsa sinistro faccia 90. E di conseguenza fine corsa dx meno max gain faccia anche lui 90.

Quindi direi che siamo arrivati al discorso che avevo accennato ieri sull'eliminare le impostazioni manuali di alcuni valori.

Max gain lo deve calcolare il programma perché una volta definito il finecorsa è univocamente determinato.

Poi a cascata eliminerei tutti i settaggi a mano del "secondo semiveicolo"... non so come dire... ma il succo è che se imposti i valori di sx, quelli di dx li deve calcolare il programma

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 18:54

kele-1 ha scritto:
03/05/2020, 18:42
Oooooooooooottima notizia sono contento.

Quel problema che dici che ha ancora è perché come ti avevo detto bisogna accertarsi che max gain + fine corsa sinistro faccia 90. E di conseguenza fine corsa dx meno max gain faccia anche lui 90.

Quindi direi che siamo arrivati al discorso che avevo accennato ieri sull'eliminare le impostazioni manuali di alcuni valori.

Max gain lo deve calcolare il programma perché una volta definito il finecorsa è univocamente determinato.

Poi a cascata eliminerei tutti i settaggi a mano del "secondo semiveicolo"... non so come dire... ma il succo è che se imposti i valori di sx, quelli di dx li deve calcolare il programma
ni.. perchè non è che deve per forza finire con lo sterzo tutto chiuso annullando le 4ws a tutto gas..
puoi decidere di averne un pò oppure anche tutta la corsa di sterzo 4ws comunque anche a tutto gas..
sono io che per accertarmi del corretto funzionamento cerco la posizione dove la corsa del servo si chiude del tutto.

per i codici è meglio se li tagghiamo con (code) (/code) parentesi quadre ovviamente.

se sai pulirlo e snellirlo, non ho chiaro cosa dovrei cancellare di quello che è già scritto perchè poi mi mancherebbero le variabili nel void loop


kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 03/05/2020, 19:16

ok. Allora si setta a mano la differenza con il valore a 90. Ma Maxgain deve in ogni caso essere calcolato dal programma

Codice: Seleziona tutto

 #define Neutral 1500 // -- minimum forward signal
#define Maxspeed 2000 // -- maximum forward signal
#define Antsx 1000 // -- in front servo signal sx
#define Antdx 2000 // -- in front servo signal dx
#define Postsx 5 // out rear servo sx endpoint if inverted with postdx it reverse
#define Center 0 //-- add or subtract xx value to center steering
#define Tolerance 3 //-- if poor quality servo vibrates try 5
#define Max_gain_diff 10 //
#define Slowlimit 1800 //-- slow forward without endpoint correction
#include <Servo.h>
Servo myservo;
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
unsigned int Max_gain = 90 - Max_gain_diff - Postsx;
unsigned int Postdx = 180 - Postsx;
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);
}
} 
Prova se così funziona. Per decidere quanto poter sterzare quando sei al massimo setti max_gain_diff invece di max_gain.

Intanto il fine corsa destro si calcola in base a quello sinistro. Poi per il discorso dei segnali che la tua radio può inviare con valori differenti non so come funziona quindi non so se ci sono un po' di limitazioni o se è tutto variabile a piacere.

Nel senso, se puoi decidere sia il valore minimo che massimo del segnale, allora va tenuto tutto così.
Se invece scendi per esempio di 100 punti, quindi da 1000 vai a 900 e sei obbligato ad avere un range di 1000 fino al valore massimo, allora l'altro valore si può calcolare come

valoreMassimo = valoreMinimo + 1000;

Ma non sapendo come funziona quell'opzione non ho modificato.

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 19:42

no non è cambiato molto, funziona come prima quindi abbastanza bene, con l'unica differenza che con slowlimit a 1800 devo mettere un valore negativo Max_gain_diff -70 per tornare alla posizione col servo fermo centrato a tutto gas.
invece con Slowlimit a 1600 devo mettere Max_gain_diff a -30

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 20:17

ho capito che tipo di pulizia hai fatto, in linea di massima hai ragione e magari Postsx potrebbe cambiare nome in endpoint dove metti un valore solo semplificando tutto, ma ci sono alcune condizioni sulle macchine che a volte obbligano ad avere corse diverse tra destra e sinistra.. questo capita quando il servocomando non è al centro del modello ma messo di lato con rinvii di lunghezze differenti.
per esempio il camion che ti ho fatto vedere non ha questo problema ma il Tamiya dynahead si.. infatti per avere una corsa decente dello sterzo anteriore ho dovuto mettere un settaggio radio dove un lato eccede rispetto all'altro.

penso che forse sia meglio tornare al code precedente, è più "automodellisticamente" pratico

per lo stesso motivo anche il travel della radio non ha un solo settaggio che allarga entrambi i lati ma 2 travel separati.


kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 03/05/2020, 20:37

Aspetta, se vuoi avere lo sterzo centrato max gain diff dovrebbe stare a 0. perché quello è il parametro che dicevi per avere alla massima velocità ancora un certo valore di sterzata.

Settato così a 10 dovrebbe voler dire che alla massima velocità, quando giri tutto, il servo posteriore è a 80 gradi.

Per la questione dello sterzo se è come dici allora tocca impostare a mano. Non sapevo questa cosa.
Questo perché le aste che girano le ruote assumono angoli diversi rimanendo attaccate al servo che ruota? Quindi si spostano lateralmente di angoli diversi?

Avresti modo di farmi vedere questo sistema di sterzo?

In ogni caso, tornando a noi, basta che cancelli quell'operazione che ho aggiunto e aggiungi di nuovo Postdx nei define.

Ma max gain diff lascialo perché quello deve funzionare mannaggia. prova a settarlo a 0 come ti ho all'inizio di questo post per vedere se si riallinea

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 20:56

con l'ultimo sketch con un solo Postsx
se metto

Codice: Seleziona tutto

 #define Max_gain_diff 10 //
#define Slowlimit 1800 //--
praticamente ho lo sterzo quasi tutto aperto anche a tutto gas.. qualcosa chiude ma poca cosa un 10%.
se metto

Codice: Seleziona tutto

 #define Max_gain_diff 0 //
#define Slowlimit 1800 
chiude leggermente ancora meno la corsa a tutto gas diciamo un 5%

se invece metto

Codice: Seleziona tutto

#define Max_gain_diff -80 //
#define Slowlimit 1800
a tutto gas chiudo tutto lo sterzo, come non averlo

invece con lo sketch precedente, se:
Slowlimit è a 1600 Max_gain deve stare a 115 per ottenere una corsa uguale identica a Slowlimit 1800 - Max_gain 155

questo sketch

Codice: Seleziona tutto

#define Neutral 1500 // -- minimum forward signal
#define Maxspeed 2000 // -- maximum forward signal
#define Antsx 1000 // -- in front servo signal sx
#define Antdx 2000 // -- in front servo signal dx
#define Postsx 5 // out rear servo sx endpoint if inverted with postdx it reverse
#define Postdx 175 //-- out rear servo dx endpoint if inverted with postsx it reverse
#define Center 0 //-- add or subtract xx value to center steering
#define Tolerance 3 //-- if poor quality servo vibrates try 5
#define Max_gain 155 //-- gain steering reduction by throttle if reverse add -
#define Slowlimit 1800 //-- slow forward without endpoint correction
#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);
}
}


kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 03/05/2020, 22:04

Questa è tosta. Non ne sto venendo fuori.
A questo punto aggiungerei queste righe tra le ultime due parentesi

Serial.println(gain);
delay(500);

per leggere sul monitor del pc i valori di gain. Perché sono ad un punto morto e mi sa che da qua non mi schiodo

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 22:21

:green aspetta perchè sta diventando un lavoro di gruppo.. ho coinvolto altri 3 modellisti su 2 forum e qualcuno è già impazzito :clap
la soluzione è sicuramente semplicissima, c'è una relazione tra 2 valori che invece dovrebbero essere indipendenti.. una situazione del tutto simile a wulla che c'era prima che tu riuscissi ad escludere i fine corsa dagli altri.
va a finire che la soluzione gli somiglierà.

intanto ho fatto delle prove e ho scoperto che posso settare tutto così

Codice: Seleziona tutto

#define Neutral 1500 // -- minimum forward signal
#define Maxspeed 2000 // -- maximum 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 endpoint 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 xx value to center steering
#define Tolerance 5 //-- if poor quality servo vibrates try 5
#define Max_gain 650 //-- gain steering reduction by throttle if reverse add -
#define Slowlimit 1600 //-- slow forward without endpoint correction

in questa condizione ho circa 30% di gas prima di veder partire la correzione e alla fine lo stezo è tutto chiuso col servo perfettamente fermo al centro

così invece

Codice: Seleziona tutto


#define Neutral 1500 // -- minimum forward signal
#define Maxspeed 2000 // -- maximum 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 endpoint 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 xx value to center steering
#define Tolerance 5 //-- if poor quality servo vibrates try 5
#define Max_gain 950 //-- gain steering reduction by throttle if reverse add -
#define Slowlimit 1800 //-- slow forward without endpoint correction



ho il 70-80% di gas prima di veder partire la correzione che ovviamente sarà abbastanza repentina dato che la corsa rimanente è davvero poca.
ma il servo è altrettanto immobile inchiodato al centro

visivamente si setta molto meglio usando i valori alti.
a livello pratico è la stessa cosa di prima, nessuna differenza.

per reversare il servo è sufficiente scambiare i valori di Postsx e Postdx e mettere un valore negativo davanti a Max_gain, perfettamente reversato e identico.


kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 03/05/2020, 22:43

ahahah bene! Non fanno male un po' di rinforzi! Però a me quel max gain impostato a mano non convince per niente...perché quando calcoli newPos rischi che se giri a sinistra viene fuori un valore di sterzo che supera la mezzeria e finisce a destra.....

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 03/05/2020, 22:48

kele-1 ha scritto:
03/05/2020, 22:43
ahahah bene! Non fanno male un po' di rinforzi! Però a me quel max gain impostato a mano non convince per niente...perché quando calcoli newPos rischi che se giri a sinistra viene fuori un valore di sterzo che supera la mezzeria e finisce a destra.....
si ovvio.. ma te ne accorgi subito :nono1

per questo problema posso anche scrivere due linee guida piuttosto che lavorare sulla possibilità di renderlo impossibile.
alla fine sono parecchi i settaggi che se li sballi di brutto crei mostri :why

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 04/05/2020, 11:45

per caso hai qualche soluzione per le vibrazioni ritmiche del servo? ho messo Tolerance ma non risolve molto.
mi chiedevo se fosse possibile filtrare in qualche modo il segnale d'ingresso che oscilla tra 1000 e 1005 penso sia questo a generare la vibrazione a ritmo blues.
sto studiando se posso usare detach oppure stabilizzare il segnale d'ingresso direttamente all'inizio dello sketch al pulseIn dei piedini 7-8 invece che usare Tolerance alla fine.

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 04/05/2020, 21:32

il problema, spero l'ultimo è questa vibrazione ritmica..



i movimenti ampi lo faccio io col radiocomando ma per tutta la corsa proporzionale sono costantemente afflitti dalla vibrazione ritmica..
non so come risolverla, serve un filtro per i PulseIn di entrata perchè usare Tolerance funziona solo per metà oltre a rendere tutto a scatti se esagero col valore..
la parte dello sketch dove viene eseguite la mappa inversamente proporzionale trema che è una bellezza.
ho provato a usare WriteMIcroseconds e anche a cambiare libreria con mobatools ma non cambia niente..

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 05/05/2020, 14:14

risolto.. sterzo stabilizzato e sketch perfettamente funzionante, serviva creare un filtro che facesse una media tra i valori dei segnali in ingresso.
vi ringrazio per l'aiuto che ha fatto in modo che tutto questo sia stato reso possibile.

Codice: Seleziona tutto

//----------- 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   //-- stabilize vibration steering signal in ( high value =slow servo response)           
#define N_STGAS     7  //-- stabilize vibration throttle signal in (high value = slow servo response) 
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 );
}



kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da kele-1 » 06/05/2020, 0:55

bene bene!
ma le vibrazioni c'erano anche con tolerance a 4?
perché arduino legge differenze di 4 microsecondi, quindi puoi leggere 1000 o 1004 ma non leggerai mai 1001 1002 1003. Per questo se avevi impostato tolerance a 3 era come non averlo.
E quindi mi chiedo: i valori di pulse che leggevi variavano anche di 3 punti da una lettura all'altra siccome ho visto che l'avevi impostata così?

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

aiuto per uno sketch rc

Messaggio da wrighizilla » 06/05/2020, 3:34

la tolleranza funziona ma non risolve..

guarda questo.. è più semplice e funziona ancora meglio
vedi le stringhe STST STGAS storia sterzo e storia gas

Codice: Seleziona tutto

#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 Guadagno;
unsigned int NewPos, OldPos;
void setup () {
per (int i = 0; i <N_STST; i ++) stSt [i] = 0;
per (int i = 0; i <N_STGAS; i ++) stGas [i] = 0;
myservo.attach (10); // - pin uscita segnale servo posteriore
pinMode (8, INPUT); // - segnale servo anteriore in pin
pinMode (7, INPUT); // - segnale dell'acceleratore nel pin
}
void loop () {
    noInterrupts ();  
Rxpulse = pulseIn (8, HIGH);
Gaspulse = pulseIn (7, HIGH);
     interrupt ();    
ritardo (5);
if (Gaspulse> Slowlimit) {
Guadagno = mappa (Gaspulse, Slowlimit, Maxspeed, 0, Max_gain);
NewPos = map (Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));
  }
altro {
NewPos = map (Rxpulse, Antsx, Antdx, Postsx, Postdx);
  }
if (abs (NewPos - OldPos)> Tolleranza) {
OldPos = NewPos;
myservo.write (NewPos + Center);
}
}
la differenza è questa: vecchio sketch senza filtro dei segnali con solo tolerance



a questo del code che ho messo sopra con i segnali filtrati e semplificati



in entrambi dove la corsa è corta significa che sto dando tutto gas.

Rispondi