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ù