Led temporizzato

ciao a tutti, ho questo codice che fa funzionare la centralina di sterzo e canale ausiliario del mio camioncino radiocomandato.

vorrei aggiungere una nuova funzione che riguarda gli indicatori di direzione.
ma ho una serie di dubbi e non ho ancora iniziato a scrivere niente.
al momento gli indicatori di direzione sono messi in relazione con Rxpulse che sarebbe il segnale di sterzo che arriva dalla ricevente e questa funzione deve rimanere in ogni caso, ha la priorità su tutto il resto.

vorrei fare in modo che dopo 5-10 secondi nei quali non viene toccato il Gaspulse i led lampeggianti si potessero accendere per imitare il blinker 4 frecce.

ho una mezza idea di come fare ma non vorrei che partite le 4 frecce non fosse più possibile disinserirle girando lo sterzo.
mi spiego meglio: il camion è fermo e il segnale del gas diciamo che sia attorno a 1500 (1490 -1510 un pochina di tolleranza) dopo 10 secondi partono le 4 frecce in automatico... aziono il gas superando 1510 di segnale Gaspulse e le 4 frecce si devono spengere.

ma si dovrebbero spengere anche se giro lo sterzo, o meglio deve attivarsi solo il led di direzione come adesso.
se poi decidessi di rimanere fermo dovrebbe ripartire il conteggio dei 10 secondi e tornare a funzionare il blinker.

/*


  controllo di sterzo posteriore
  pin VIN(+)
  pin GND(-)
  pin D7 entrata segnale gas ch2.
  pin D8 entrata segnale sterzo ch1.
  pin D10 uscita segnale sterzo posteriore
  pin D9 entrata segnale aux ch3
  pin D4 led indicatori direzione sx
  pin D5 led indicatori direzione dx
  pin D6 led freno retro
  pin D3 led abbaglianti massima velocità
  pin D11 uscita servo ausiliario per videocamera ch3 aux.
  pin D2 buzzer claxon
  -----------------------------------------

*/
//----------------------- STEERING UNIT ------------------------

//----------- signal setup -------------------------------------
#define Neutral 1500 // -- default 1500//neutro gas ch2 
#define Maxspeed 1907 // -- default 2000//massimo gas ch2
#define Antsx 1102 // -- default 1000// massimo sterzo sx
#define Antdx 1906 // -- default 2000//massimo sterzo dx


//----------- rear servo setup -------------------------------
#define Postsx 1000 //-- default 1000// uscita servo posteriore fine corsa sx
#define Postdx 1900 //-- default 2000//uscita servo posteriore fine corsa dx (se i valori dx sx vengono invertiti = reverse)
#define Center 0 //-- default 0// aggiungere o togliere valore per centrare (valore di prova incrementa 100 / sottrae 100)

//--------- user driving setup ------------------------------
#define Max_gain 350 //-- default 400//quantità di sterzo posteriore a massimo gas (se reverse agguingere segno - prima del valore)
#define Slowlimit 1500 //-- default 1600//quantità di gas a bassa velocità prima che avvenga la correzione di sterzo


//------------ servo cam setup ------------------------------
#define tolerance 2 //-- default 4// velocità di step servo cam ch3 
#define front 10 //-- default 0//servo cam centratura in posizione AUX mobile
#define Camsx -10 //--default 5// servo cam endpoint sx (reverse  camdx)
#define Camdx 180//-- default 175// servo cam endpoint dx (reverse  camsx)
#define fix 1500 //-- default 90//servo cam centratura posizione frontale Aux fisso.

//-------------led setup ------------------------------------
#define Streight 1500 //-- default 1500// centratura indicatori di direzione blink
#define Blinkpoint 50 //-- default 100// quantità di sterzo necessario per attivare blink
#define Blink 100 //--default 100// velocità di blink
#define rearstart 1300 //-- default 1300//  quantità di gas reverse per ottenere l'accensione led freno/retro
#define beam 30 //-- default 100// accensione abbaglianti in prossimità di tutto gas

//----------------------------------------- program part, (NIENTE O QUASI DA FARE QUI)   ---------------

#include <Servo.h>
Servo myservo;
Servo camservo;
#define N_STST  4 // default 7// riduzione della vibrazione del servo posteriore
unsigned int stSt[ N_STST ];
long toStSt = 0;
int inSt = 0;
int Tol = 0;
unsigned int auxpulse;
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
unsigned int newloc, oldloc;
unsigned int Centerpos = fix ;
int led1 = 4;
int led2 = 5;
int led3 = 6;
int led4 = 3;
int claxon = 2;
//int claxonState = 0;
void setup() {
  for ( int i = 0; i < N_STST; i++ ) stSt[ i ] = 0;

  myservo.attach(10); //--  rear servo signal out pin 12
  pinMode(8, INPUT); //--  front servo signal in pin 8
  pinMode(7, INPUT); //-- throttle signal in pin 7
  camservo.attach(11); //-- cam servo out pin 11
  pinMode(9, INPUT); //--aux servo signal in pin 9
  pinMode(led1, OUTPUT); //--led blinker dx out pin 4
  pinMode(led2, OUTPUT); //--led blinker sx out pin 5
  pinMode(led3, OUTPUT); //--led retro brake out pin 6
  pinMode (led4, OUTPUT); //-- led maxspeed out pin 3
  pinMode (claxon, OUTPUT); //-- aux claxon buzzer
}
void loop() {
  auxpulse = pulseIn(9, HIGH);
  Gaspulse = pulseIn(7, HIGH);
  noInterrupts();
  Rxpulse = pulseIn(8, HIGH);
  interrupts();
  delay(5);
  //-------------- BUZZER CLAXON --------------
  if (auxpulse > 1600) {
    digitalWrite(claxon, HIGH);
    tone(claxon, 2650, 100);



  } else  digitalWrite (claxon, LOW);
  //-------------- Throttle parts ----------
  if (Gaspulse > Slowlimit) { //-- default >// se il segnale del gas è in reverse il segno va cambiato "<"
    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) > Tol) {
    OldPos = NewPos;
    myservo.write(NewPos + Center);
  }

  //-- led part ----------
  if (Rxpulse > Streight + Blinkpoint) {
    digitalWrite(led1, (millis() / Blink) % 2);

  } else   digitalWrite(led1, LOW);
  if (Rxpulse < Streight - Blinkpoint) {
    digitalWrite(led2, (millis() / Blink) % 2);

  } else  digitalWrite(led2, LOW);

  if (Gaspulse < rearstart) {
    digitalWrite(led3, HIGH);

  } else  digitalWrite(led3, LOW);
  if (Gaspulse > Maxspeed - beam) {
    digitalWrite(led4, HIGH);

  } else  digitalWrite(led4, LOW);

  //-- aux cam part ----------


  if (auxpulse > 1600) { //--default > 1600// definisce il valore al quale AUX ch3 cambia stato da ON a OFF. test provare 1400

    camservo.write(fix);
    delay (4);

  } else {
    newloc = map(pulseIn(8, HIGH), Antsx, Antdx, Camsx, Camdx);


    if (abs(newloc - oldloc) > tolerance) {
      oldloc = newloc;
      camservo.write(newloc + front);
    }

  }
}

sono riuscito a far partire i led di direzione quando gaspulse è fermo a 1500 e poi mi sono fermato per capire come insegnare alla funzione di doversi attivare solo dopo 10 secondi m lasciando comunque allo sterzo Rxpulse la priorità di terminarla appena lo sterzo viene mosso.

se avete idee, soluzioni e spunti sui quali riflettere vi ringrazio per l'aiuto

p.s allego un breve video per mostrare cosa fa adesso, anzi ora fa molto di più

Per adesso non vado tanto più avanti di qui.
in questa condizione le 4 frecce entrano in funzione dopo 10 secondi ma solo inizialmente all'accensione e si spengono quando la centralina riceve un segnale da Gaspulse e il camion si muove.
Però non si ripete il ciclo di attesa di 10 secondi quando mi fermo nuovamente.

Ovvero adesso basta che rallento quasi a zero ed entrano in funzione le 4 frecce, invece vorrei che vi fosse una pausa ogni volta che mi fermo perchè magari non sarà una pausa lunga al punto tale da aver bisogno che parta il blinker, sarebbe fastidioso se ad ogni minima sosta si azionassero i 4 led.

inoltre non ho ancora idea di come poterle disinserire quando da fermo aziono lo sterzo.
è fondamentale che da fermo se giro lo sterzo il blinker si deve disattivare per altri 10 secondi.
Adesso gli indicatori di direzione funzionano bene solo quando il camion è in movimento ma come decelera o si ferma tornano subito in funzione le 4 frecce e girando lo sterzo a camion fermo le 4 frecce lampeggiano tutte assieme.

Io vorrei ottenere che la parte blinker fosse una cosa a se stante che si aziona dopo 10 secondi e si disattiva sia quando viene mosso lo sterzo RXpulse e sia quando viene dato Gaspulse. qualora torni la condizione nella quale il camion risulta nuovamente fermo trascorsi 10 secondi vorrei tornassero in funzione la 4 frecce.

L'idea è solo quella di fare in modo di segnalare la presenza del camion nel caso lo mando avanti un pezzo di strada nel frattempo che lo raggiungo a piedi, ultimamente viaggia più di notte che di giorno.

Avete qualche suggerimento per favore?

la parte isolata è quella sulla quale sto lavorando


//----------- signal setup -------------------------------------
#define Neutral 1500 // -- default 1500//neutro gas ch2 
#define Maxspeed 1907 // -- default 2000//massimo gas ch2
#define Antsx 1102 // -- default 1000// massimo sterzo sx
#define Antdx 1906 // -- default 2000//massimo sterzo dx


//----------- rear servo setup -------------------------------
#define Postsx 1000 //-- default 1000// uscita servo posteriore fine corsa sx
#define Postdx 1900 //-- default 2000//uscita servo posteriore fine corsa dx (se i valori dx sx vengono invertiti = reverse)
#define Center 0 //-- default 0// aggiungere o togliere valore per centrare (valore di prova incrementa 100 / sottrae 100)

//--------- user driving setup ------------------------------
#define Max_gain 350 //-- default 400//quantità di sterzo posteriore a massimo gas (se reverse agguingere segno - prima del valore)
#define Slowlimit 1500 //-- default 1600//quantità di gas a bassa velocità prima che avvenga la correzione di sterzo


//------------ servo cam setup ------------------------------
#define tolerance 2 //-- default 4// velocità di step servo cam ch3 
#define front 10 //-- default 0//servo cam centratura in posizione AUX mobile
#define Camsx -10 //--default 5// servo cam endpoint sx (reverse  camdx)
#define Camdx 180//-- default 175// servo cam endpoint dx (reverse  camsx)
#define fix 1500 //-- default 90//servo cam centratura posizione frontale Aux fisso.

//-------------led setup ------------------------------------
#define Streight 1500 //-- default 1500// centratura indicatori di direzione blink
#define Blinkpoint 50 //-- default 100// quantità di sterzo necessario per attivare blink
#define Blink 100 //--default 100// velocità di blink
#define rearstart 1300 //-- default 1300//  quantità di gas reverse per ottenere l'accensione led freno/retro
#define beam 30 //-- default 100// accensione abbaglianti in prossimità di tutto gas

//----------------------------------------- program part, (NIENTE O QUASI DA FARE QUI)   ---------------

#include <Servo.h>
Servo myservo;
Servo camservo;
#define N_STST  4 // default 7// riduzione della vibrazione del servo posteriore
unsigned int stSt[ N_STST ];
long toStSt = 0;
int inSt = 0;
int Tol = 0;
unsigned int auxpulse;
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
unsigned int newloc, oldloc;
unsigned int Centerpos = fix ;
int led1 = 2;
int led2 = 4;
int led3 = 6;
int led4 = 3;
int claxon = 5;
//int claxonState = 0;
void setup() {
  for ( int i = 0; i < N_STST; i++ ) stSt[ i ] = 0;

  myservo.attach(10); //--  rear servo signal out pin 12
  pinMode(8, INPUT); //--  front servo signal in pin 8
  pinMode(7, INPUT); //-- throttle signal in pin 7
  camservo.attach(11); //-- cam servo out pin 11
  pinMode(9, INPUT); //--aux servo signal in pin 9
  pinMode(led1, OUTPUT); //--led blinker dx out pin 4
  pinMode(led2, OUTPUT); //--led blinker sx out pin 5
  pinMode(led3, OUTPUT); //--led retro brake out pin 6
  pinMode (led4, OUTPUT); //-- led maxspeed out pin 3
  pinMode (claxon, OUTPUT); //-- aux claxon buzzer
}
void loop() {
  auxpulse = pulseIn(9, HIGH);
  Gaspulse = pulseIn(7, HIGH);
  noInterrupts();
  Rxpulse = pulseIn(8, HIGH);
  interrupts();
  delay(5);
  //-------------- BUZZER CLAXON --------------
  if (auxpulse > 1600) {
    digitalWrite(claxon, HIGH);
    tone(claxon, 2650, 100);



  } else  digitalWrite (claxon, LOW);
  //-------------- Throttle parts ----------
  if (Gaspulse > Slowlimit) { //-- default >// se il segnale del gas è in reverse il segno va cambiato "<"
    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) > Tol) {
    OldPos = NewPos;
    myservo.write(NewPos + Center);
  }

  //-- led part ----------
  if (Rxpulse > Streight + Blinkpoint) {
    digitalWrite(led1, (millis() / Blink) % 2);

  } else   digitalWrite(led1, LOW);
  if (Rxpulse < Streight - Blinkpoint) {
    digitalWrite(led2, (millis() / Blink) % 2);

  } else  digitalWrite(led2, LOW);

  if (Gaspulse < rearstart) {
    digitalWrite(led3, HIGH);

  } else  digitalWrite(led3, LOW);
  if (Gaspulse > Maxspeed - beam) {
    digitalWrite(led4, HIGH);

  } else  digitalWrite(led4, LOW);


  /*
    // blinker 4 frecce
    if  ((Gaspulse >= 1510), (Gaspulse <= 1490) ){
      millis, (10000);

        digitalWrite(led2, (millis() / Blink) % 2);
        digitalWrite(led1, (millis() / Blink) % 2);

    } else {if  (Gaspulse <= 1510){
      digitalWrite(led2, LOW);
      digitalWrite(led1, LOW);}}

  */

  //-- aux cam part ----------


  if (auxpulse > 1600) { //--default > 1600// definisce il valore al quale AUX ch3 cambia stato da ON a OFF. test provare 1400

    camservo.write(fix);
    delay (4);

  } else {
    newloc = map(pulseIn(8, HIGH), Antsx, Antdx, Camsx, Camdx);


    if (abs(newloc - oldloc) > tolerance) {
      oldloc = newloc;
      camservo.write(newloc + front);
    }

  }
}

per adesso ho messo il blinker sotto interruttore ausiliario del terzo canale radio.
alla fine potrebbe essere meglio così.
non so valutare il blinker automatico dopo tot secondi nel modo come l'avevo pensato, potrebbe essere pratico oppure una perdita di tempo a trovare il modo di farlo funzionare per poi giungere alla conclusione che funziona meglio come l'ho scritto adesso azionato via radio.
sul canale aux avevo messo un claxon ma non l'ho mai usato quindi l'ho sacrificato volentieri.
per il resto quando è montata la telecamera fpv uso il canale aux in posizione 1 per ruotarla assieme allo sterzo del camion e in posizione 2 per guardare fisso avanti.
vorrà dire che quando ruoto la telecamera avrò assieme anche le 4 frecce.
questo il codice

  controllo di sterzo posteriore
  pin VIN(+)
  pin GND(-)
  pin D7 entrata segnale gas ch2.
  pin D8 entrata segnale sterzo ch1.
  pin D10 uscita segnale sterzo posteriore
  pin D9 entrata segnale aux ch3
  pin D4 led indicatori direzione sx
  pin D5 led indicatori direzione dx
  pin D6 led freno retro
  pin D3 led abbaglianti massima velocità
  pin D11 uscita servo ausiliario per videocamera ch3 aux.

  -----------------------------------------

*/
//----------------------- STEERING UNIT ------------------------

//----------- signal setup -------------------------------------
#define Neutral 1500 // -- default 1500//neutro gas ch2 
#define Maxspeed 1907 // -- default 2000//massimo gas ch2
#define Antsx 1102 // -- default 1000// massimo sterzo sx
#define Antdx 1906 // -- default 2000//massimo sterzo dx


//----------- rear servo setup -------------------------------
#define Postsx 1000 //-- default 1000// uscita servo posteriore fine corsa sx
#define Postdx 1900 //-- default 2000//uscita servo posteriore fine corsa dx (se i valori dx sx vengono invertiti = reverse)
#define Center 0 //-- default 0// aggiungere o togliere valore per centrare (valore di prova incrementa 100 / sottrae 100)

//--------- user driving setup ------------------------------
#define Max_gain 350 //-- default 400//quantità di sterzo posteriore a massimo gas (se reverse agguingere segno - prima del valore)
#define Slowlimit 1500 //-- default 1600//quantità di gas a bassa velocità prima che avvenga la correzione di sterzo


//------------ servo cam setup ------------------------------
#define tolerance 2 //-- default 4// velocità di step servo cam ch3 
#define front 10 //-- default 0//servo cam centratura in posizione AUX mobile
#define Camsx -10 //--default 5// servo cam endpoint sx (reverse  camdx)
#define Camdx 180//-- default 175// servo cam endpoint dx (reverse  camsx)
#define fix 1500 //-- default 90//servo cam centratura posizione frontale Aux fisso.

//-------------led setup ------------------------------------
#define Streight 1500 //-- default 1500// centratura indicatori di direzione blink
#define Blinkpoint 100 //-- default 100// quantità di sterzo necessario per attivare blink
#define Blink 100 //--default 100// velocità di blink
#define rearstart 1300 //-- default 1300//  quantità di gas reverse per ottenere l'accensione led freno/retro
#define beam 30 //-- default 100// accensione abbaglianti in prossimità di tutto gas

//----------------------------------------- program part, (NIENTE O QUASI DA FARE QUI)   ---------------

#include <Servo.h>
Servo myservo;
Servo camservo;
#define N_STST  4 // default 7// riduzione della vibrazione del servo posteriore
unsigned int stSt[ N_STST ];
long toStSt = 0;
int inSt = 0;
int Tol = 0;
unsigned int auxpulse;
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
unsigned int newloc, oldloc;
unsigned int Centerpos = fix ;
int led1 = 2;
int led2 = 4;
int led3 = 6;
int led4 = 3;

void setup() {
  for ( int i = 0; i < N_STST; i++ ) stSt[ i ] = 0;

  myservo.attach(10); //--  rear servo signal out pin 12
  pinMode(8, INPUT); //--  front servo signal in pin 8
  pinMode(7, INPUT); //-- throttle signal in pin 7
  camservo.attach(11); //-- cam servo out pin 11
  pinMode(9, INPUT); //--aux servo signal in pin 9
  pinMode(led1, OUTPUT); //--led blinker dx out pin 4
  pinMode(led2, OUTPUT); //--led blinker sx out pin 5
  pinMode(led3, OUTPUT); //--led retro brake out pin 6
  pinMode (led4, OUTPUT); //-- led maxspeed out pin 3

}
void loop() {
  auxpulse = pulseIn(9, HIGH);
  Gaspulse = pulseIn(7, HIGH);
  noInterrupts();
  Rxpulse = pulseIn(8, HIGH);
  interrupts();
  delay(5);


  //-------------- Throttle parts ----------
  if (Gaspulse > Slowlimit) { //-- default >// se il segnale del gas è in reverse il segno va cambiato "<"
    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) > Tol) {
    OldPos = NewPos;
    myservo.write(NewPos + Center);
  }

  //-- led part ----------
  if (Rxpulse > Streight + Blinkpoint) {
    digitalWrite(led1, (millis() / Blink) % 2);

  } else   digitalWrite(led1, LOW);
  if (Rxpulse < Streight - Blinkpoint) {
    digitalWrite(led2, (millis() / Blink) % 2);

  } else  digitalWrite(led2, LOW);

  if (Gaspulse < rearstart) {
    digitalWrite(led3, HIGH);

  } else  digitalWrite(led3, LOW);
  if (Gaspulse > Maxspeed - beam) {
    digitalWrite(led4, HIGH);

  } else  digitalWrite(led4, LOW);

  //---------------- blinker -----------
  if (auxpulse < 1600) {
    digitalWrite(led1, (millis() / Blink) % 2);
    digitalWrite(led2, (millis() / Blink) % 2);
  }

  //-- aux cam part ----------


  if (auxpulse > 1600) { //--default > 1600// definisce il valore al quale AUX ch3 cambia stato da ON a OFF. test provare 1400

    camservo.write(fix);
    delay (4);

  } else {
    newloc = map(pulseIn(8, HIGH), Antsx, Antdx, Camsx, Camdx);


    if (abs(newloc - oldloc) > tolerance) {
      oldloc = newloc;
      camservo.write(newloc + front);
    }

  }
}

se vogliamo provare a ragionare su un sistema differente e pratico per integrare una funzione di blinker temporizzato automatico mi farebbe comunque piacere anche solo per didattica, io non sono riuscito a fare in modo che lo sterzo e gli indicatori di direzione fossero predominanti sul blinker, quindi se devo rinunciare a indicare la direzione quando il camion è fermo preferisco fare senza e attivarlo tramite aux ch3

Se lampeggiano così velocemente, ci dev'essere una lampadina fulminata! :grin:

Non ho studiato tutto il codice, ma non ci dovrebbe volere molto...
Il lampeggiatore deve partire 10 secondi dopo che non tocchi lo sterzo, perciò ogni volta che tocchi lo sterzo aggiorni una variabile unsigned long:
t_fermo=millis();
Poi controlli continumente se:
milllis()-t_fermo>10000
Se è vero, le frecce devono lampeggiare, perciò a ogni loop se è vero la funzione lampeggio_frecce() accende e spegne le frecce:

unsigned long t_frecce;

lampeggio_frecce()
  {
  if (millis()-t_frecce > 900)
    {
    t_frecce=millis(); 
    bool stato=digitalRead (led1);
    digitalWrite (led1, !stato);
    digitalWrite (led2, !stato);
    }
  }

Appena viene mosso lo sterzo,
milllis()-t_fermo>10000
non è più vero e le frecce smettono di lampeggiare.

N.B.!:
Ogni pulseIn blocca il loop finché non arriva e termina l'impulso, oppure prosegue automaticamente l'esecuzione del programma se viene superato il Timeout impostato (che tu non hai messo)! Quindi, piuttosto che usare pulseIn, dovresti cronometrare, leggendo millis(), il tempo che passa tra una transizione da basso ad alto e la successiva.

ti ringrazio di aver partecipato.
non ho assolutamente capito il nota bene. quale timeout impostato?

pulsein lo considero il piedino che legge l'impulso del segnale in ingresso, il timeout è opzionale ma in questo caso a cosa mi servirebbe aggiungere il timeout?
tutti i movimenti almeno di sterzo e gas devono essere istantanei e con meno delay o lag possibili.
per favore mi spieghi meglio cosa comporta impostare un timeout?

la centralina nasce per fare una cosa diversa dalla questione delle luci, le luci sono state aggiunte in seguito per sfruttare le possibilità offerte dai vari segnali in ingresso.
la centralina serve per settare un secondo servocomando di sterzo posteriore in base a quello anteriore.
ovvero su un camion con 4 ruote sterzanti la centralina legge e ripropone lo sterzo anteriore in modo da offrire un settaggio regolabile allo sterzo posteriore in uscita dal piedino D10
in questo modo si evita di fare un cavo a Y per il servo posteriore e dover regolare astine e distanza della squadretta del servo, oppure peggio dver aggiungere un circuito di reverse servo nel caso la funzione risulti ribaltata. tutti i settaggi (limite massimo del raggio di sterzata, centratura reverse) si possono fare via software.

poi nel rimappare il movimento del servo anteriore la centralina fa anche altre cose come chiudere il raggio di sterzo in modo inversamente proporzionale alla quantità di gas throttle e questo per limitare la possibilità di ribaltare il camion riducendo fino a zero la sterzata alle ruote posteriori. (slowlimit maxgain) si può decidere a quanto gas lo sterzo posteriore deve iniziare a chiudersi e quanto dovrà chiudersi. per esempio io alla massima velocità lo faccio chiudere del tutto e il camion torna ad essere solo 2 ruote sterzanti.
infine la centralina aziona il servo D11 che ripropone lo sterzo anteriore su un terzo servo ausiliario sul quale è montata una microcamera in cabina. esso si muove nelle 2 posizioni del canale aux ( deviatore 2 posizioni) può stare ferma e guardare avanti oppure girare insieme alle ruote anteriori e posteriori.

questa centralina la sto usando da quasi 2 anni e funziona molto bene in tutte le sue parti col codice che ho condiviso, fa tutto quello per la quale è pensata.
le luci sono nate in seguito, è stato facile aggiungere delle funzioni sui piedini liberi. in questo caso dei led che si accendono quando il gas arriva circa al massimo ( D3) la luce di retromarcia quando il segnale del gas va sotto neutral e ovviamente gli indicatori di direzione che si possono settare a piacimento sia per la velocità di lampeggio che per il punto di attacco durante la sterzata, io li tengo abbastanza vicini al centro.

questo è lo schema

per il blinker temporizzato mi studio il tuo suggerimento e ci riprovo ma sono quasi certo che sia meglio lasciarlo funzionare usando il deviatore.
ieri sera usandolo con deviatore mi sono chiarito anche con un po' di immaginazione come potrebbe essere il blinker automatico temporizzato e penso che potrebbe non essere poi così pratico.
certo lo vorrei vedere per valutare meglio e anche per la curiosità di riuscire a farlo funzionare.

questo è un video che descrive la funzione sulle ruote posteriori, il motivo per la quale la centralina è nata.
se vedi pur tenendo fermo lo sterzo del radiocomando le ruote posteriori interagiscono con la quantità di gas chiudendosi automaticamente alla massima velocità.
ovvero hai tanto sterzo solo quando vai piano e progressivamente diminuisce il raggio di sterzata all'aumentare della velocità

va bene così, per adesso le novità mi piacciono.
Per rendere la funzione del blinker più interessante ho cambiato velocità di lampeggio rispetto agli indicatori di direzione.
ho aggiunto un cicalino che suona a intermittenza sul blinker e sulla retromarcia.
funziona tutto molto bene.

 /*


  controllo di sterzo posteriore
  pin VIN(+)
  pin GND(-)
  pin D7 entrata segnale gas ch2.
  pin D8 entrata segnale sterzo ch1.
  pin D10 uscita segnale sterzo posteriore
  pin D9 entrata segnale aux ch3
  pin D4 led indicatori direzione sx
  pin D2 led indicatori direzione dx
  pin D6 led freno retro
  pin D3 led abbaglianti massima velocità
  pin D11 uscita servo ausiliario per videocamera ch3 aux.
  pin D12 claxon blinker / retro
  -----------------------------------------

*/
//----------------------- STEERING UNIT ------------------------

//----------- signal setup -------------------------------------
#define Neutral 1500 // -- default 1500//neutro gas ch2 
#define Maxspeed 1907 // -- default 2000//massimo gas ch2
#define Antsx 1102 // -- default 1000// massimo sterzo sx
#define Antdx 1906 // -- default 2000//massimo sterzo dx


//----------- rear servo setup -------------------------------
#define Postsx 1000 //-- default 1000// uscita servo posteriore fine corsa sx
#define Postdx 1900 //-- default 2000//uscita servo posteriore fine corsa dx (se i valori dx sx vengono invertiti = reverse)
#define Center 0 //-- default 0// aggiungere o togliere valore per centrare (valore di prova incrementa 100 / sottrae 100)

//--------- user driving setup ------------------------------
#define Max_gain 350 //-- default 400//quantità di sterzo posteriore a massimo gas (se reverse agguingere segno - prima del valore)
#define Slowlimit 1500 //-- default 1600//quantità di gas a bassa velocità prima che avvenga la correzione di sterzo


//------------ servo cam setup ------------------------------
#define tolerance 2 //-- default 4// velocità di step servo cam ch3 
#define front 10 //-- default 0//servo cam centratura in posizione AUX mobile
#define Camsx -10 //--default 5// servo cam endpoint sx (reverse  camdx)
#define Camdx 180//-- default 175// servo cam endpoint dx (reverse  camsx)
#define fix 1500 //-- default 90//servo cam centratura posizione frontale Aux fisso.

//-------------led setup ------------------------------------
#define Streight 1500 //-- default 1500// centratura indicatori di direzione blink
#define Blinkpoint 90 //-- default 100// quantità di sterzo necessario per attivare blink
#define Blink 200 //--default 100// velocità di blink direzione
#define Blinking 120//--default 100// velocità di blinking 
#define rearstart 1300 //-- default 1300//  quantità di gas reverse per ottenere l'accensione led freno/retro
#define beam 30 //-- default 100// accensione abbaglianti in prossimità di tutto gas

//----------------------------------------- program part, (NIENTE O QUASI DA FARE QUI)   ---------------

#include <Servo.h>
Servo myservo;
Servo camservo;
#define N_STST  4 // default 7// riduzione della vibrazione del servo posteriore
unsigned int stSt[ N_STST ];
long toStSt = 0;
int inSt = 0;
int Tol = 0;
unsigned int auxpulse;
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
unsigned int newloc, oldloc;
unsigned int Centerpos = fix ;
int led1 = 2;
int led2 = 4;
int led3 = 6;
int led4 = 3;
int cl = 12;
void setup() {
  for ( int i = 0; i < N_STST; i++ ) stSt[ i ] = 0;

  myservo.attach(10); //--  rear servo signal out pin 12
  pinMode(8, INPUT); //--  front servo signal in pin 8
  pinMode(7, INPUT); //-- throttle signal in pin 7
  camservo.attach(11); //-- cam servo out pin 11
  pinMode(9, INPUT); //--aux servo signal in pin 9
  pinMode(led1, OUTPUT); //--led blinker dx out pin 4
  pinMode(led2, OUTPUT); //--led blinker sx out pin 5
  pinMode(led3, OUTPUT); //--led retro out pin 6
  pinMode (led4, OUTPUT); //-- led maxspeed out pin 3
  pinMode (cl, OUTPUT); //-- claxon blinker retro
}
void loop() {
  auxpulse = pulseIn(9, HIGH);
  Gaspulse = pulseIn(7, HIGH);
  noInterrupts();
  Rxpulse = pulseIn(8, HIGH);
  interrupts();
  delay(5);
  //--------------  CLAXON BLINKER RETRO --------------

  if (auxpulse < 1600 or Gaspulse < rearstart)

  {
    digitalWrite(cl, HIGH);

    digitalWrite(cl, (millis() / Blinking) % 2);

  } else  digitalWrite (cl, LOW);


  //-------------- Throttle parts ----------
  if (Gaspulse > Slowlimit) { //-- default >// se il segnale del gas è in reverse il segno va cambiato "<"
    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) > Tol) {
    OldPos = NewPos;
    myservo.write(NewPos + Center);
  }

  //-- led part ----------
  if (Rxpulse > Streight + Blinkpoint) {
    digitalWrite(led1, (millis() / Blink) % 2);

  } else   digitalWrite(led1, LOW);
  if (Rxpulse < Streight - Blinkpoint) {
    digitalWrite(led2, (millis() / Blink) % 2);

  } else  digitalWrite(led2, LOW);

  if (Gaspulse < rearstart) {
    digitalWrite(led3, HIGH);

  } else  digitalWrite(led3, LOW);
  if (Gaspulse > Maxspeed - beam) {
    digitalWrite(led4, HIGH);

  } else  digitalWrite(led4, LOW);

  //---------------- blinker -----------
  if (auxpulse < 1600) {
    digitalWrite(led1, (millis() / Blinking) % 2);
    digitalWrite(led2, (millis() / Blinking) % 2);

  }

  //-- aux cam part ----------


  if (auxpulse > 1600) { //--default > 1600// definisce il valore al quale AUX ch3 cambia stato da ON a OFF. test provare 1400

    camservo.write(fix);
    delay (4);

  } else {
    newloc = map(pulseIn(8, HIGH), Antsx, Antdx, Camsx, Camdx);


    if (abs(newloc - oldloc) > tolerance) {
      oldloc = newloc;
      camservo.write(newloc + front);
    }

  }
}