con un solo canale funziona perfettamente l'altro sketch, quello nel quale decidi solo la corsa e il verso.
certo che a tutto gas ti trovi a dare tutto sterzo.. il senso di questa applicazione è solo quella di limitarlo proporzionalmente quando superi un certo valore del gas, altrimenti va benissimo l'altra dove il gas non è collegato.
mi riferisco a questa che funziona benissimo
https://pastebin.com/s27QJ37c
comunque la soluzione è questa
Codice:
#include <Servo.h>
Servo myservo;
#define N_STORIASTERZO 7 // numero valori passati utilizzati per il calcolo della media valori sterzo. Da cambiare sperimentalmente
#define N_STORIAGAS 7 // numero valori passati utilizzati per il calcolo della media valori gas. Da cambiare sperimentalmente
unsigned int storiaSterzo[ N_STORIASTERZO ]; // array di N_STORIASTERZO elementi che memorizza gli ultimi valori di sterzo letti dal radiocomando per calcolarne la media
unsigned int storiaGas[ N_STORIAGAS ]; // array di N_STORIAGAS elementi che memorizza gli ultimi valori di gas letti dal radiocomando per calcolarne la media
long totaleStoriaSterzo = 0; // conterrà sempre la somma degli ultimi N_STORIA valori di sterzo letti dal radiocomando, per poi fare la media
// (inizializzato a zero perché tutti i valori inizialmente sono zero)
// lo dichiaro long perché se N_STORIA è grande la somma di int potrebbe andare in overflow
long totaleStoriaGas = 0; // conterrà sempre la somma degli ultimi N_STORIA valori di gas letti dal radiocomando, per poi fare la media
// (inizializzato a zero perché tutti i valori inizialmente sono zero)
// lo dichiaro long perché se N_STORIA è grande la somma di int potrebbe andare in overflow
int indiceSterzo = 0; // posizione del prossimo elemento che entra nella storia, da spostare passo dopo passo. Partiamo da zero
// (in realtà, dato che al primo passo si incrementa subito, potremmo inizializzarlo a -1, ma non cambia nulla
// perché fa tutto il giro
int indiceGas = 0; // posizione del prossimo elemento che entra nella storia, da spostare passo dopo passo. Partiamo da zero
// (in realtà, dato che al primo passo si incrementa subito, potremmo inizializzarlo a -1, ma non cambia nulla
// perché fa tutto il giro
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
void setup() {
for ( int i=0; i<N_STORIASTERZO; i++ ) storiaSterzo[ i ] = 0;
for ( int i=0; i<N_STORIAGAS; i++ ) storiaGas[ 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 = mediaStoriaSterzo( Rxpulse );
Gaspulse = mediaStoriaGas( 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 mediaStoriaSterzo( unsigned int valore ) {
/*
* questa funzuine ritorna il valor medio degli ultimi N_STORIA valori elaborati,
* incluso l'ultimo, cancellando il più vecchio dei valori attualmente memorizzati
* I valori sono memorizzati nell'array 'storia'
* Per cancellare e sostituire il valore più vecchio, invece di spostarli tutti all'indietro e far posto al nuovo,
* andiamo noi a scegliere il valore da sostituire spostando un indice.
* Si parte da 0 e si va avanti sino in fondo, poi si torna a zero.
* Il primo giro in assoluto sostituiamo i valor iniziali tutti a zero, poi effettivamente cominceremo a sostituire il più veccio di tutti
*/
// determino la posizione su cui operare: incremento l'indice per andare sul prossimo, se arriva in fondo torna a zero
if ( ++indiceSterzo >= N_STORIASTERZO ) indiceSterzo = 0;
// aggiorno il totale, sottraendo il valore vecchio e sommando il nuovo
totaleStoriaSterzo = totaleStoriaSterzo - storiaSterzo[ indiceSterzo ] + valore;
// memorizzo il nuovo valore al posto di quello vecchio
storiaSterzo[ indiceSterzo ] = valore;
// ritorno la media: totale diviso numero elementi
return( totaleStoriaSterzo / N_STORIASTERZO );
}
unsigned int mediaStoriaGas( unsigned int valore ) {
/*
* come la precedente, ma per il valore di Gas
*/
// determino la posizione su cui operare: incremento l'indice per andare sul prossimo, se arriva in fondo torna a zero
if ( ++indiceGas >= N_STORIAGAS ) indiceGas = 0;
// aggiorno il totale, sottraendo il valore vecchio e sommando il nuovo
totaleStoriaGas = totaleStoriaGas - storiaGas[ indiceGas ] + valore;
// memorizzo il nuovo valore al posto di quello vecchio
storiaGas[ indiceGas ] = valore;
// ritorno la media: totale diviso numero elementi
return( totaleStoriaGas / N_STORIAGAS );
}
non vibra più nulla