Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 05 maggio 20, 16:32   #111 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da Smsteves Visualizza messaggio
Eccomi di ritorno.

Un po' di dati

Frequenza segnale in uscita dalla radio 50 Hz (alcune anche 60Hz)
numero di impulsi in un secondo quindi 50.

se per fare il calcolo ne aspettiamo 2 di impulsi abbiamo un ritardo di 1sec/50cicli=20msx2=40 mS.
Attendendo i 7 necessari a fare la media diventano 20*7=140 ms.
Abbiamo un ritardo di 1.4 decimi di secondo..

Non va bene per la reattività giusto?

avete letto il post 106 ?
i valori accettabili del filtro sono tra 5 e 10
sotto 5 tornano le vibrazioni, sopra 15 ti accorgi che lo sterzo diventa troppo lento.
ho messo entrambi a 7 aggiungendo una spiegazione in modo che chiunque possa provarlo e trovare il miglior setup per la sua combo.

https://pastebin.com/CCwhsw6F

l'ho letto il post 106 ma non tutte le combo sono uguali, anche solo cambiando il servo cambia molto sul mio banco prova.
l'oscilloscopio non lo possiedo nemmeno.
però faccio volenteri mattina incaponito a provare

ad ogni modo non posso che ringraziarvi tutti perchè è solo in questo modo che sono potuto andare avanti ed aver impararato qualcosa.

se volete vi giro un video del risultato ottenuto.

Ultima modifica di wrighizilla : 05 maggio 20 alle ore 16:38
wrighizilla non è collegato   Rispondi citando
Vecchio 05 maggio 20, 16:40   #112 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Chris, quello che fai è appunto una media mobile, in un altro post l'avevo consigliata mi pare a Minestrone per un suo problema di acquisizione dati, viene usata assai spesso per filtrare dati provenienti da convertitori A/D, sensori I2C, SPI che possono essere sporchi, però in genere la si applica in routine che non dipendono dal main loop, in genere o si lavora sotto interrupt od in DMA che blocca il micro per pochissimi microsecondi.

Come ha scritto Smsteves avrai un ritardo di, a mio avviso, 40 x 8 = 320ms più forse altri ms per calcoli e varie, non è sicuramente un sistema reattivo e forse al limite anche per il tuo camion ( a proposito: complimenti veramente molto bello e ben fatto).

Il problema di Arduino è che molte librerie sono bloccanti, cioè quando ne viene richiamata una funzione il micro resta in attesa fino alla fine della stessa, hai provato a vedere cosa succede se spegni il Tx dopo aver mosso lo stick del gas o dello sterzo ? Se la routine resta impallata in attesa degli impulsi il camion diventa incontrollabile, andrebbe perlomeno inserito un timeout che metta tutto in stato di sicurezza.

IMHO

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 05 maggio 20, 16:59   #113 (permalink)  Top
User
 
L'avatar di nicolap
 
Data registr.: 02-10-2019
Residenza: Orvieto
Messaggi: 307
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Chris, quello che fai è appunto una media mobile, in un altro post l'avevo consigliata mi pare a Minestrone per un suo problema di acquisizione dati, viene usata assai spesso per filtrare dati provenienti da convertitori A/D, sensori I2C, SPI che possono essere sporchi, però in genere la si applica in routine che non dipendono dal main loop, in genere o si lavora sotto interrupt od in DMA che blocca il micro per pochissimi microsecondi.



Come ha scritto Smsteves avrai un ritardo di, a mio avviso, 40 x 8 = 320ms più forse altri ms per calcoli e varie, non è sicuramente un sistema reattivo e forse al limite anche per il tuo camion ( a proposito: complimenti veramente molto bello e ben fatto).



Il problema di Arduino è che molte librerie sono bloccanti, cioè quando ne viene richiamata una funzione il micro resta in attesa fino alla fine della stessa, hai provato a vedere cosa succede se spegni il Tx dopo aver mosso lo stick del gas o dello sterzo ? Se la routine resta impallata in attesa degli impulsi il camion diventa incontrollabile, andrebbe perlomeno inserito un timeout che metta tutto in stato di sicurezza.



IMHO



La funzione di timeout già esiste..
pulsein(pin, HIGH, 20000)

Dove l'ultima cifra è appunto il timeout espresso in microsecondi, se non riceve segnali in quel lasso di tempo restituisce 0. 20000 corrisponde al tempo che intercorre tra due impulsi successivi

Inviato dal mio PRA-LX1 utilizzando Tapatalk
nicolap non è collegato   Rispondi citando
Vecchio 05 maggio 20, 17:04   #114 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Chris, quello che fai è appunto una media mobile, in un altro post l'avevo consigliata mi pare a Minestrone per un suo problema di acquisizione dati, viene usata assai spesso per filtrare dati provenienti da convertitori A/D, sensori I2C, SPI che possono essere sporchi, però in genere la si applica in routine che non dipendono dal main loop, in genere o si lavora sotto interrupt od in DMA che blocca il micro per pochissimi microsecondi.

Come ha scritto Smsteves avrai un ritardo di, a mio avviso, 40 x 8 = 320ms più forse altri ms per calcoli e varie, non è sicuramente un sistema reattivo e forse al limite anche per il tuo camion ( a proposito: complimenti veramente molto bello e ben fatto).

Il problema di Arduino è che molte librerie sono bloccanti, cioè quando ne viene richiamata una funzione il micro resta in attesa fino alla fine della stessa, hai provato a vedere cosa succede se spegni il Tx dopo aver mosso lo stick del gas o dello sterzo ? Se la routine resta impallata in attesa degli impulsi il camion diventa incontrollabile, andrebbe perlomeno inserito un timeout che metta tutto in stato di sicurezza.

IMHO

è veloce quanto basta, che ti devo dire..
se lo vuoi migliorare ulteriormente ho condiviso il codice apposta.
non serve a nulla stare a discutere su cosa succede se spengo la tx.. tu spengi la tx su i tuoi modelli accesi? sono forse controllabili i tuoi modelli con la tx spenta?
nel video vedi come si muove adesso e come lo fa a corsa chiusa quando sto dando tutto gas.. vedi anche come si muove con il gas parzializzato e sotto slowlimit compresa la retro.
se non ti piace o ti sembra inutilizzabile aspetto volentieri il tuo sketch con le soluzioni che ti sembreranno migliori.. al momento questo è un risultato che considero molto soddisfacente.


Ultima modifica di wrighizilla : 05 maggio 20 alle ore 17:10
wrighizilla non è collegato   Rispondi citando
Vecchio 05 maggio 20, 17:35   #115 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Citazione:
Originalmente inviato da wrighizilla Visualizza messaggio
è veloce quanto basta, che ti devo dire..
se lo vuoi migliorare ulteriormente ho condiviso il codice apposta.
non serve a nulla stare a discutere su cosa succede se spengo la tx.. tu spengi la tx su i tuoi modelli accesi? sono forse controllabili i tuoi modelli con la tx spenta?
nel video vedi come si muove adesso e come lo fa a corsa chiusa quando sto dando tutto gas.. vedi anche come si muove con il gas parzializzato e sotto slowlimit compresa la retro.
se non ti piace o ti sembra inutilizzabile aspetto volentieri il tuo sketch con le soluzioni che ti sembreranno migliori.. al momento questo è un risultato che considero molto soddisfacente.

Chris, tranquillo, mica ho scritto che non funziona, poi se va bene a te a chi altri deve andare bene ?

Il fail safe era un suggerimento perchè potresti anche perdere il segnale od altro, il camion è tuo ed anche la responsabilità quando lo fai andare quindi la cosa non mi tange.

Non posso metterti uno sketch per Arduino perchè, come ho scritto più volte, lo uso solo per piccole applicazioni ed utilizzo più che altro l'hardware che programmo direttamente i C, senza usare librerie di terzi, chiaramente so leggere un programma scritto in wire essendo simile al C ed alcuni concetti come la media mobile od usare lo shift al posto di divisione e moltiplicazione valgono per qualsiasi microprocessore si utilizzi.

buon divertimento, passo e chiudo.


__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 05 maggio 20, 18:11   #116 (permalink)  Top
User
 
Data registr.: 03-05-2020
Residenza: milano
Messaggi: 47


Bene, quindi c'e' una soluzione..
Ma hai provato con i due servi dello sterzo anteriore e posteriore? L'unico problema e' che i circa 2.8 decimi di secondo di ritardo tra davanti e dietro ti possano creare dei problemi..

Ti metto qui lo sketch che ho modificato io, mi sono dilettato ad aggiungere funzioni.

1) centratura Automatica del servo
Accendi tx poi la ricevente non tocchi nulla e conti fino a 5
2) Maxspeed automatico e Slowlimit invece pure..
Basta accellerare al max, quando lo fai aggiorna maxspeed e slowlimit

Cosi' chiunque volesse provarlo non deve trovare i valori della sua configurazione.

Il bello del software e' che vi sono molte strade per fare la stessa cosa, alcune lunghe e impervie alcune semplici e rettilinee… e alcune illuminate da led
Se si fa per gioco e modellismo e' anche divertente…

Smsteves

Codice:

/*
 * Created by Stefano Prevedini
 * Date 05/05/2020 V0.1
 * Project: Arduino Four Steering Wheels Control 
*/
 

#define Tolerance 5 //-- if poor quality servo vibrates try 5
#define Max_gain 500 //-- gain steering reduction by throttle if reverse add -
//#define Slowlimit 1600 //-- slow forward without endpoint correction
#include <Servo.h>
Servo myservo;


unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gascorse ;
unsigned int Gain;
unsigned int Neutral;// -- minimum forward signal
signed int NewPos, OldPos;
int  Stato;
int Stato_Led = 0;
int Ledpin = 13;
int Led = 0;
boolean Cmd_Led = false;
unsigned int Maxspeed; // -- maximum forward signal
unsigned int Antsx ; // -- in front servo signal sx
unsigned int Antdx; // -- in front servo signal dx
unsigned int Postsx; // out rear servo sx endpoint if inverted with postdx it reverse
unsigned int Postdx; //-- out rear servo dx endpoint if inverted with postsx it reverse
unsigned int Center = 0; //-- add or subtract xx value to center steering
unsigned int Slowlimit = 200;
unsigned int Sterzo = 300;
unsigned int Scala_GAS = 1;
unsigned int Scala_RX = 1;
double Percentuale;

void setup() {
  pinMode(7, INPUT); //-- throttle signal in pin
  pinMode(8, INPUT); //-- front servo signal in pin
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  pinMode(Cmd_Led, OUTPUT);
  myservo.attach(10); //-- rear servo signal out pin
  Stato = 0;
}

void loop() {
  if (millis() < 50) {
    Stato == 10;
    Led = 10;
    noInterrupts();
    Neutral = pulseIn(7, HIGH);
    Center = pulseIn(8, HIGH);
    interrupts();
    Postsx = Center - Sterzo;
    Postdx = Center + Sterzo;
    Antsx = Center - Sterzo;
    Antdx = Center + Sterzo;
    Maxspeed = Neutral + Gascorse;
  }
  if ((millis() > 2000) && (millis() < 3100)) {
    Serial.print("*******************");
    Serial.print("\n");
    delay(50);
    Stato == 10;
    Maxspeed=Neutral+100;
    Slowlimit=Neutral+50;
  }
  
  if (Stato == 0) {
    noInterrupts();
    Rxpulse = pulseIn(8, HIGH);
    Gaspulse = pulseIn(7, HIGH);
    interrupts();
    if (Rxpulse > (Sterzo + Center))  {
      Sterzo = Rxpulse - Center;
      Gain = Sterzo;
    }
    if (Rxpulse < (Center - Sterzo))  {
      Sterzo = Center - Rxpulse;
      Gain = Sterzo;
    }
    Rxpulse = Rxpulse - Antsx;
    Rxpulse = Rxpulse / Scala_RX;
    Rxpulse = Rxpulse * Scala_RX ;
    Rxpulse = Rxpulse + Antsx;
    if (Gaspulse > Maxspeed)  {
      Maxspeed = Gaspulse;
      Slowlimit = ((Maxspeed - Neutral) / 3) + Neutral;
    }
    Gaspulse = Gaspulse - Neutral;
    Gaspulse = Gaspulse / Scala_GAS;
    Gaspulse = Gaspulse * Scala_GAS;
    Gaspulse = Gaspulse + Neutral;
  }

  if (Stato == 1) {
    if (Gaspulse > Slowlimit) {
      if (Rxpulse > Center) 
        Percentuale = 0;
        Percentuale = ((Gaspulse - Slowlimit) * 100) / (Maxspeed - Slowlimit);
        if (Rxpulse > Center) {
          NewPos = Center + (((Rxpulse - Center) * (100 - Percentuale) / 100));
                Led = 3;
        }
        if (Rxpulse < Center) {
          NewPos = Center - (((Center - Rxpulse) * (100 - Percentuale) / 100));
                Led = 4;
        }
      
      Led = 1;
    }
    else {
      NewPos = Rxpulse;
      Led = 2;
    }
  }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  if (Stato == 2) {
    if (abs(NewPos - OldPos) > Tolerance) {
      myservo.write(NewPos );
      OldPos = NewPos;
    }

  }
  ++Stato;
  ++Stato_Led;
  if (Stato > 2) {
    Stato = 0;
  }
  delay(1);
  if (Led == 1) {
    //led veloce
    if (Stato_Led > 60) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
    digitalWrite(Ledpin, Cmd_Led);
  }
  if (Led == 2) {
    //led lento
    if (Stato_Led > 30) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  if (Led == 3) {
    //led lento
    if (Stato_Led > 10) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  if (Led == 4) {
    //led lento
    if (Stato_Led > 5) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  digitalWrite(Ledpin, Cmd_Led);

}
Smsteves non è collegato   Rispondi citando
Vecchio 05 maggio 20, 18:16   #117 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Il fail safe era un suggerimento perchè potresti anche perdere il segnale od altro, il camion è tuo ed anche la responsabilità quando lo fai andare quindi la cosa non mi tange.
fammi capire.. la responsabilità di cosa? di un camion che va nei boschi a 5kmh abbi pazienza ma è inutile intervenire solo per denigrare arduino e fare polemiche assurde, se vuoi contribuire in modo costruttivo ben venga altrimenti è molto meglio il passo e chiudo.
wrighizilla non è collegato   Rispondi citando
Vecchio 05 maggio 20, 18:22   #118 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da Smsteves Visualizza messaggio


Bene, quindi c'e' una soluzione..
Ma hai provato con i due servi dello sterzo anteriore e posteriore? L'unico problema e' che i circa 2.8 decimi di secondo di ritardo tra davanti e dietro ti possano creare dei problemi..

Ti metto qui lo sketch che ho modificato io, mi sono dilettato ad aggiungere funzioni.

1) centratura Automatica del servo
Accendi tx poi la ricevente non tocchi nulla e conti fino a 5
2) Maxspeed automatico e Slowlimit invece pure..
Basta accellerare al max, quando lo fai aggiorna maxspeed e slowlimit

Cosi' chiunque volesse provarlo non deve trovare i valori della sua configurazione.

Il bello del software e' che vi sono molte strade per fare la stessa cosa, alcune lunghe e impervie alcune semplici e rettilinee… e alcune illuminate da led
Se si fa per gioco e modellismo e' anche divertente…

Smsteves

Codice:

/*
 * Created by Stefano Prevedini
 * Date 05/05/2020 V0.1
 * Project: Arduino Four Steering Wheels Control 
*/
 

#define Tolerance 5 //-- if poor quality servo vibrates try 5
#define Max_gain 500 //-- gain steering reduction by throttle if reverse add -
//#define Slowlimit 1600 //-- slow forward without endpoint correction
#include <Servo.h>
Servo myservo;


unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gascorse ;
unsigned int Gain;
unsigned int Neutral;// -- minimum forward signal
signed int NewPos, OldPos;
int  Stato;
int Stato_Led = 0;
int Ledpin = 13;
int Led = 0;
boolean Cmd_Led = false;
unsigned int Maxspeed; // -- maximum forward signal
unsigned int Antsx ; // -- in front servo signal sx
unsigned int Antdx; // -- in front servo signal dx
unsigned int Postsx; // out rear servo sx endpoint if inverted with postdx it reverse
unsigned int Postdx; //-- out rear servo dx endpoint if inverted with postsx it reverse
unsigned int Center = 0; //-- add or subtract xx value to center steering
unsigned int Slowlimit = 200;
unsigned int Sterzo = 300;
unsigned int Scala_GAS = 1;
unsigned int Scala_RX = 1;
double Percentuale;

void setup() {
  pinMode(7, INPUT); //-- throttle signal in pin
  pinMode(8, INPUT); //-- front servo signal in pin
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  pinMode(Cmd_Led, OUTPUT);
  myservo.attach(10); //-- rear servo signal out pin
  Stato = 0;
}

void loop() {
  if (millis() < 50) {
    Stato == 10;
    Led = 10;
    noInterrupts();
    Neutral = pulseIn(7, HIGH);
    Center = pulseIn(8, HIGH);
    interrupts();
    Postsx = Center - Sterzo;
    Postdx = Center + Sterzo;
    Antsx = Center - Sterzo;
    Antdx = Center + Sterzo;
    Maxspeed = Neutral + Gascorse;
  }
  if ((millis() > 2000) && (millis() < 3100)) {
    Serial.print("*******************");
    Serial.print("\n");
    delay(50);
    Stato == 10;
    Maxspeed=Neutral+100;
    Slowlimit=Neutral+50;
  }
  
  if (Stato == 0) {
    noInterrupts();
    Rxpulse = pulseIn(8, HIGH);
    Gaspulse = pulseIn(7, HIGH);
    interrupts();
    if (Rxpulse > (Sterzo + Center))  {
      Sterzo = Rxpulse - Center;
      Gain = Sterzo;
    }
    if (Rxpulse < (Center - Sterzo))  {
      Sterzo = Center - Rxpulse;
      Gain = Sterzo;
    }
    Rxpulse = Rxpulse - Antsx;
    Rxpulse = Rxpulse / Scala_RX;
    Rxpulse = Rxpulse * Scala_RX ;
    Rxpulse = Rxpulse + Antsx;
    if (Gaspulse > Maxspeed)  {
      Maxspeed = Gaspulse;
      Slowlimit = ((Maxspeed - Neutral) / 3) + Neutral;
    }
    Gaspulse = Gaspulse - Neutral;
    Gaspulse = Gaspulse / Scala_GAS;
    Gaspulse = Gaspulse * Scala_GAS;
    Gaspulse = Gaspulse + Neutral;
  }

  if (Stato == 1) {
    if (Gaspulse > Slowlimit) {
      if (Rxpulse > Center) 
        Percentuale = 0;
        Percentuale = ((Gaspulse - Slowlimit) * 100) / (Maxspeed - Slowlimit);
        if (Rxpulse > Center) {
          NewPos = Center + (((Rxpulse - Center) * (100 - Percentuale) / 100));
                Led = 3;
        }
        if (Rxpulse < Center) {
          NewPos = Center - (((Center - Rxpulse) * (100 - Percentuale) / 100));
                Led = 4;
        }
      
      Led = 1;
    }
    else {
      NewPos = Rxpulse;
      Led = 2;
    }
  }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  if (Stato == 2) {
    if (abs(NewPos - OldPos) > Tolerance) {
      myservo.write(NewPos );
      OldPos = NewPos;
    }

  }
  ++Stato;
  ++Stato_Led;
  if (Stato > 2) {
    Stato = 0;
  }
  delay(1);
  if (Led == 1) {
    //led veloce
    if (Stato_Led > 60) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
    digitalWrite(Ledpin, Cmd_Led);
  }
  if (Led == 2) {
    //led lento
    if (Stato_Led > 30) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  if (Led == 3) {
    //led lento
    if (Stato_Led > 10) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  if (Led == 4) {
    //led lento
    if (Stato_Led > 5) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  digitalWrite(Ledpin, Cmd_Led);

}
scusa ma in base a cosa puoi fare la centratura automatica del servo?
altrettanto slowlimit automatico, in base a quale fattore può essere automatica una cosa che dipende strettamente dallo stile di guida personale e dalle caratteristiche della macchina?

spiega meglio.
adesso provo lo sketch..

----edit---------
inizia a chiudere appena do gas e chiude del tutto.
però non vibra.
per me hai bisogno di una macchina 4ws, montarla, settarla e guidarla per capire il senso del progetto.

Ultima modifica di wrighizilla : 05 maggio 20 alle ore 18:28
wrighizilla non è collegato   Rispondi citando
Vecchio 05 maggio 20, 18:28   #119 (permalink)  Top
User
 
Data registr.: 03-05-2020
Residenza: milano
Messaggi: 47
Boni.

Ho copiato lo sketch sbagliato..

Codice:
/*
 * Created by Stefano Prevedini
 * Date 05/05/2020 V0.1
 * Project: Arduino Four Steering Wheels Control 
*/
 

#define Tolerance 5 //-- if poor quality servo vibrates try 5
#define Max_gain 500 //-- gain steering reduction by throttle if reverse add -
//#define Slowlimit 1600 //-- slow forward without endpoint correction
#include <Servo.h>
Servo myservo;


unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gascorse ;
unsigned int Gain;
unsigned int Neutral;// -- minimum forward signal
signed int NewPos, OldPos;
int  Stato;
int Stato_Led = 0;
int Ledpin = 13;
int Led = 0;
boolean Cmd_Led = false;
unsigned int Maxspeed; // -- maximum forward signal
unsigned int Antsx ; // -- in front servo signal sx
unsigned int Antdx; // -- in front servo signal dx
unsigned int Postsx; // out rear servo sx endpoint if inverted with postdx it reverse
unsigned int Postdx; //-- out rear servo dx endpoint if inverted with postsx it reverse
unsigned int Center = 0; //-- add or subtract xx value to center steering
unsigned int Slowlimit = 200;
unsigned int Sterzo = 300;
unsigned int Scala_GAS = 1;
unsigned int Scala_RX = 1;
double Percentuale;

void setup() {
  pinMode(7, INPUT); //-- throttle signal in pin
  pinMode(8, INPUT); //-- front servo signal in pin
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  pinMode(Cmd_Led, OUTPUT);
  myservo.attach(10); //-- rear servo signal out pin
  Stato = 0;
}

void loop() {
  if (millis() < 50) {
    Stato == 10;
    Led = 10;
    noInterrupts();
    Neutral = pulseIn(7, HIGH);
    Center = pulseIn(8, HIGH);
    interrupts();
    Postsx = Center - Sterzo;
    Postdx = Center + Sterzo;
    Antsx = Center - Sterzo;
    Antdx = Center + Sterzo;
    Maxspeed = Neutral + Gascorse;
  }
  if ((millis() > 2000) && (millis() < 3100)) {
    delay(50);
    Stato == 10;
    Maxspeed=Neutral+100;
    Slowlimit=Neutral+50;
  }
  
  if (Stato == 0) {
    noInterrupts();
    Rxpulse = pulseIn(8, HIGH);
    Gaspulse = pulseIn(7, HIGH);
    interrupts();
    if (Rxpulse > (Sterzo + Center))  {
      Sterzo = Rxpulse - Center;
      Gain = Sterzo;
    }
    if (Rxpulse < (Center - Sterzo))  {
      Sterzo = Center - Rxpulse;
      Gain = Sterzo;
    }
    Rxpulse = Rxpulse - Antsx;
    Rxpulse = Rxpulse / Scala_RX;
    Rxpulse = Rxpulse * Scala_RX ;
    Rxpulse = Rxpulse + Antsx;
    if (Gaspulse > Maxspeed)  {
      Maxspeed = Gaspulse;
      Slowlimit = ((Maxspeed - Neutral) / 3) + Neutral;
    }
    Gaspulse = Gaspulse - Neutral;
    Gaspulse = Gaspulse / Scala_GAS;
    Gaspulse = Gaspulse * Scala_GAS;
    Gaspulse = Gaspulse + Neutral;
  }

  if (Stato == 1) {
    if (Gaspulse > Slowlimit) {
      if (Rxpulse > Center) 
        Percentuale = 0;
        Percentuale = ((Gaspulse - Slowlimit) * 100) / (Maxspeed - Slowlimit);
        if (Rxpulse > Center) {
          NewPos = Center + (((Rxpulse - Center) * (100 - Percentuale) / 100));
                Led = 3;
        }
        if (Rxpulse < Center) {
          NewPos = Center - (((Center - Rxpulse) * (100 - Percentuale) / 100));
                Led = 4;
        }
      
      Led = 1;
    }
    else {
      NewPos = Rxpulse;
      Led = 2;
    }
  }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  if (Stato == 2) {
    if (abs(NewPos - OldPos) > Tolerance) {
      myservo.write(NewPos );
      OldPos = NewPos;
    }

  }
  ++Stato;
  ++Stato_Led;
  if (Stato > 2) {
    Stato = 0;
  }
  delay(1);
  if (Led == 1) {
     if (Stato_Led > 60) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
    digitalWrite(Ledpin, Cmd_Led);
  }
  if (Led == 2) {
    if (Stato_Led > 30) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }



  digitalWrite(Ledpin, Cmd_Led);

}

Pace e Bene.. E RC

Ps. slow limit e' 1/3 della corsa tra neutro e max. Centratura servo in base al segnale a riposo della radio e sterzo in base al max valore letto dalla radio.

Ultima modifica di Smsteves : 05 maggio 20 alle ore 18:32
Smsteves non è collegato   Rispondi citando
Vecchio 05 maggio 20, 18:33   #120 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da Smsteves Visualizza messaggio
Boni.

Ho copiato lo sketch sbagliato..

Pace e Bene.. E RC
è identico a quello prima almeno nel comportamento..
veloce, non vibra ma appena parto col gas avanti inizia a chiudere fino al massimo della corsa.
quindi se vai piano per quanto piano vai.. perdi lo sterzo e non ne sfrutti tutta la corsa a bassa velocità.
infine finisci a tutto gas con una macchina 2ws che magari non è proprio quello che uno avrebbe voluto.. un 10% se lo sarebbe tenuto volentieri.
per questo dico che le funzioni di settaggio del gas e corsa devono essere a discrezione del pilota, non le puoi automatizzare.
wrighizilla non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
buggy da completare BoBoPoP Automodellismo Mot. Scoppio Off-Road 41 18 maggio 16 17:56
monster da completare...! bronto_19 Automodellismo Mot. Elettrico Off-Road 2 22 giugno 10 17:35
Sto costruendo uno schiumino (o tzagi), mi aiutate??? crido96 Aeromodellismo Principianti 72 07 febbraio 10 02:26
Come completare una associated B4? ryan-j Automodellismo Mot. Elettrico On-Road 9 04 maggio 08 11:55



Tutti gli orari sono GMT +2. Adesso sono le 19:10.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002