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);
    }

  }
}

sto sistemando una seconda centralina di sterzo ma adesso sto usando un diverso tipo di buzzer rispetto a quella dello sketch precedente.
il buzzer ha bisogno di una frequenza tone e avrei scritto la linea 103 tone(cl, 2650, 100); nella parte -- buzzer claxon---
rispetto all'altro sketch però questo buzzer adesso suona continuamente, l'altro invece suona a intermittenza secondo quanto avrei scritto nelle linea 102
cosa sbaglio? vorrei che anche questo buzzer potesse suonare a intermittenza come l'altro.
se tolgo la linea 103 tone funziona a intermittenza ma non ha volume, si sente appena. con la linea di tone suona bene e ha un bel volume ma il suono è continuo.
per favore potete aiutarmi a capire perchè?
l'altro buzzer che uso nello sketch nel post precedente è molto più grosso e ha già un suo oscillatore, non ha bisogno di nessun tono e funziona benissimo con il programma che ho scritto.
con questo buzzer invece ho fatto varie prove ma non mi riesce farlo funzionare come vorrei, se tolgo il tono funziona a intermittenza ma senza volume, con la linea del tono il suono è fisso, se modifico la durata abbasso il volume ma non cambio nulla.

/* 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 1445 // -- default 1500//neutro gas ch2 
#define Maxspeed 1932 // -- default 2000//massimo gas ch2
#define Antsx 1141 // -- default 1000// massimo sterzo sx
#define Antdx 1968 // -- default 2000//massimo sterzo dx


//----------- rear servo setup -------------------------------
#define Postsx 700 //-- default 1000// uscita servo posteriore fine corsa sx
#define Postdx 2000 //-- 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 550 //-- default 400//quantità di sterzo posteriore a massimo gas (se reverse agguingere segno - prima del valore)
#define Slowlimit 1600 //-- 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 30 //-- 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 1400 //-- 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 1350 //-- 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 cl = 2;

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 (cl, 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 or Gaspulse < rearstart)

  {
    digitalWrite(cl, HIGH);

    digitalWrite (cl, (millis() / Blinking) % 2);
    tone(cl, 2650, 100);
  } 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);
    }

  }
}

per adesso ho capito che quello che vale per il buzzer con oscillatore integrato non può valere per il buzzer passivo. ovvero il cicalino dell'altra centralina funziona con digital write e gli basta un I/0 a 5 volt per fuinzionare bene, mentre questo cicalino passivo non può funzionare con le stesse linee di codice.
usando tone ottengo un suono continuo, adesso devo capire come fare per temporizzarlo secondo lo stesso valore di blinking che fa lampeggiare i led blinker.

Se ti riferisci a questa parte di codice:

if (auxpulse < 1600 or Gaspulse < rearstart)

  {
    digitalWrite(cl, HIGH);

    digitalWrite (cl, (millis() / Blinking) % 2);
    tone(cl, 2650, 100);
  } else  digitalWrite (cl, LOW);

c'è in effetti un po di confusione : le 3 operazioni di seguito sul medesimo pin cl non hanno molto senso, solo l'ultima avrà effetto.
Se vuoi pilotare un buzzer collegato al pin cl secondo la stessa logica che usi per il blink ti basta aggiungere un altro if dentro il primo, tipo:

if (auxpulse < 1600 or Gaspulse < rearstart)

  {
    if(millis() / Blinking) % 2) tone(cl, 2650);
    else noTone();

  } else  digitalWrite (cl, LOW);  // o forse è meglio un noTone() anche qui.

Ciao, Ale.

ti ringrazio, adesso sono riuscito a far funzionare il tone a intermittenza che suona insieme al led che lampeggia ma succede una cosa strana, anche il servocomando pin 11 si comporta muovendosi insieme al lampeggio e al buzzer intermittente e non so ancora perchè.

la funzione del canale 3 attiva sia il servo che il blinker, ovvero in una posizione di ch3 il servo è fermo e il blinker spento, nella seconda posizione il servo si ruota insieme con lo sterzo della radio e il blinker lampeggia. il buzzer suona a intermittenza.

avevo scritto la linea così

tone( cl,2650, (millis()/ Blinking) %2);

togliendo i digital write perchè non hanno più senso con questo cicalino.

ma spostando il deviatore canale 3 della radio che mi comanda il servo in cabina si muove anche il servo a scattini.. senza la linea tone il blinker dei led funziona benissimo insieme al servo.
non capisco cosa vada a influire sul movimento del servocomando collegato al pin 11 non ne vedo il nesso logico.

adesso provo a scrivere il tuo suggerimento e vediamo cosa accade, grazie 1000, ti faccio sapere.

no, scritta come mi hai suggerito mi da errore "expected primary expression before % token"
adesso faccio altre prove e vediamo..

allora, se la scrivo così

 if (auxpulse < 1600 or Gaspulse < rearstart) {
 tone( cl,2650, (millis()/ Blinking) %2);
  }
  else noTone(cl);
 

il cicalino suona a intermittenza con le luci ma anche il servo camservo.attach (11) si muove a intermittenza. e non va bene..

se invece la scrivo quasi come hai suggerito ovvero così

 if (auxpulse < 1600 or Gaspulse < rearstart) {
  
    if ((millis() / Blinking) % 2)tone(cl, 2650);
  }

  else noTone(cl);

il servo non si sposta a intermittenza ma il suono del cicalino e fisso.

ok sto pensando di tornare a digital write e comprare un cicalino che funziona con una normale alimentazione a 5 volt dato che funziona tutto perfettamente.
non ne sono venuto a capo con questo buzzer.
con questo codice e un cicalino con oscillatore integrato risolvo tutto e funziona perfettamente senza che il servocomando si muova a ritmo con le luci.

 if (auxpulse < 1600 or Gaspulse < rearstart) { 
digitalWrite(cl, HIGH);
digitalWrite (cl, (millis() / Blinking) % 2);}
else {
digitalWrite (cl, LOW);
  }

per stasera ho finito il mio tempo e la fantasia, non so spiegarmi perchè il servocomando debba muoversi a ritmo con la intermittenza del buzzer.

Potrebbe esserci un conflitto tra la libreria Servo e la Tone ... ora non ricordo che timers usano, ma, ad esempio, di sicuro, con la tone() NON sui può più usare il PWM sui pin 3 ed 11 (salvo che sulla MEGA) perché il timer che li gestisce è usato dalla tone() ... :roll_eyes:

Guglielmo

grazie, questo potrebbe essere un problema.
boh vabè.. domani vedo dove posso trovare un cicalino che suona alimentandolo semplicemente a 5 volt perchè credo che hai centrato il problema e non voglio mettermi a scombinare la centralina già saldata.

grazie dell'aiuto.

La sostituzione diretta fra digitalWrite e tone è:

digitalWrite (cl, HIGH); / digitalWrite (cl, LOW);
tone (cl, frequenza);    / noTone (cl);

ti ringrazio ma non funziona bene con tone.
la centralina comanda un servo al pin 11 che reagisce al tone del buzzer.
dove, con digital write non ho nessun problema anche nel rendere il segnale "tratteggiato" lampeggiante insieme al led, col tone la stessa operazione fa muovere a tratti anche il servocomando che si sposta sembra abbia il singhiozzo.

siccome non ho idea di come risolvere e non intendo dissaldare / ricostruire la centralina per spostare il servo su altri piedini, mi compro un buzzer attivo a 5 volt e lo alimento con digital write dato che tutti questi problemi non li causa.

Evidentemente usano lo stesso timer:
"Use of the tone() function will interfere with PWM output on pins 3 and 11 (on boards other than the Mega)."

... ma ancora ci stai pensando ? ? ? :open_mouth: :open_mouth: :open_mouth: ... è più che ovvio che, se non vuoi rifare gli stampati, quella è l'unica soluzione!

Guglielmo

P.S.: @Datman ... avevo già indicato QUI quel possibile problema ... :roll_eyes:

1 Like