Visualizza messaggio singolo
Vecchio 05 maggio 20, 12:01   #107 (permalink)  Top
wrighizilla
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
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
wrighizilla non è collegato   Rispondi citando