Visualizza un messaggio singolo
Vecchio 06-05-20, 08:59 PM   #9
wrighizilla
Utente
 
Registrato dal: May 2002
Messaggi: 592
wrighizilla inizia ad ingranare.
predefinito

Grazie alla collaborazione e al prezioso aiuto di amici di forums, è nata una nuova centralina arduino per controllare lo sterzo posteriore con radio 2ch basilari senza alcun mix.

questa versione permette di assegnare una certa quantità di gas throttle oltre la quale il servo posteriore inizia a chiudersi fino anche ad arrivare a eliminare completamente le 4 ruote sterzanti.

in pratica attraverso il settaggio di 2 parametri (Slowlimit e Max_gain ) è possibile decidere a quale velocità iniziare una progressione proporzionale della corsa di sterzo in modo da poter andare a tutto gas con solo 2 ruote sterzanti o una piccola porzione sterzante delle ruote posteriori.

per costruirla ho usato una scheda arduino nano e la procedura per quanto riguarda il programma arduino ide è la stessa che ho scritto nel primo post.

logicamente coinvolgendo il segnale del gas occorre assegnare un nuovo piedino al quale far arrivare il segnale dalla vostra ricevente.

allego in foto lo schema dei collegamenti alla scheda nano


nello sketch ho allegato una spiegazione globale del progetto e del settaggio necessario a farla funzionare al meglio ma qualche spiegazione vedrò di aggiungerla anche qui.

questo è il codice

codice:
/* 
I used an inexpensive nano board v3 ATmega 328p the pins used are VIN(+)and GND(-) 
you can feed the power from your bec (5-9 volt) 
the pins I used are: pin D7 throttle signal input. D8 front steering input signal. D10 rear steering signal output.
-----------------------------------------
basic setup instructions: first you get the best mechanical setup of the rear servo.
the values you find by default should make the controller work quite right away.
however if you want to be sure about what are your real radio signals,check them before starting this sketch. 
create a new tab and check your input signals with this program (7 for steering - 8 for throttle gas)

int rxpulse;
void setup () {
Serial.begin (9600);
}
void loop () {
rxpulse = pulseIn (7, HIGH); // - 7 to know true front steering signal 8 throttle
Serial.println (rxpulse);

you can read the values in the serial monitor by turning the steering wheel of the radio control and moving the throttle.
write the values obtained in the first part of the setup, replace the default ones with yours send by transmitter.
-------------------------------------------------- ------
the user driving setup consists of 2 functions: you can choose how much throttle allow at low speed 
before the width of the rear servo starts to close (Speedlimit function).

the second function allows you to determine the rear servo width  at maximum throttle (Max_gain).
you can choose to close it completely or leave a width available to turn with 4 steering wheels even at maximum speed

the other functions are: tolerance that avoids the rhythmic vibrations of the loop.
if the servo is good it could stay at zero, analog or low quality servos want at least a value of 4
it can happen that you exceed with the values and invert the direction, be careful to find the best suitable values for your model.
to get the servo reverse you just have to exchange the Postsx Postdx rear steering values and put a sign (-) in front of the Max_gain value
---------
there is a relationship between Slowlimit and Max_gain, it can happen that if you lower one you will have to raise the other
however I am sure that it will take you little time to understand how it works
*/

//----------- signal setup -------------------------------------
#define Neutral 1500 // -- minimum throttle forward signal

#define Maxspeed 2000 // -- maximum throttle forward signal

#define Antsx 1000 // -- in front servo signal end point sx

#define Antdx 2000 // -- in front servo signal end point dx

#define Postsx 1000 // out rear servo sx end point (if inverted with postdx rear servo will reverse)

#define Postdx 2000 //-- out rear servo dx endpoint (if inverted with postsx rear servo will reverse)

#define Center 30 //-- add or subtract your value to center steering (+- 50 or more)
 
//--------- user driving setup ------------------------------
 
#define Max_gain 400 //-- gain steering reduction width at max throttle (if rear servo is reverse add (-) before this value)

#define Slowlimit 1800 //-- slow forward percentage without endpoint correction
 
#define Tolerance 0 //--  if  value is 10 to 50 servo move by step 

//---------------------------- main program - nothing to do here ------------
#include <Servo.h>
Servo myservo; 

#define N_STST  7   //--   if servo vibrating (try values from 4 to 10)         
#define N_STGAS  7   //-- if servo vibrating (try values from 4 to 10) 
unsigned int stSt[ N_STST ];  
unsigned int stGas[ N_STGAS ];       
long toStSt = 0;           
long toStGas = 0;         
int inSt = 0;                                         
int inGas = 0;           
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
void setup() {
for ( int i=0; i<N_STST; i++ ) stSt[ i ] = 0;
for ( int i=0; i<N_STGAS; i++ ) stGas[ i ] = 0;
myservo.attach(10); //-- rear servo signal out pin
pinMode(8, INPUT); //-- front servo signal in pin
pinMode(7, INPUT); //-- throttle signal in pin
}
void loop(){
    noInterrupts();   
Rxpulse = pulseIn(8, HIGH);
Gaspulse = pulseIn(7, HIGH);
     interrupts();     
delay(5);
if (Gaspulse > Slowlimit) {
Gain = map(Gaspulse, Slowlimit, Maxspeed, 0, Max_gain );
NewPos = map(Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));
  }
else {
NewPos = map(Rxpulse, Antsx, Antdx, Postsx, Postdx);
  }
if (abs(NewPos - OldPos)> Tolerance) {
OldPos = NewPos;
myservo.write(NewPos + Center);
}
}
il setup è un filino più complicato perchè ha più parametri rispetto alle altre controller.
io ho messo dei valori di default che dovrebbero far funzionare la controller abbastanza bene fin da subito, tuttavia i segnali delle vostre radio potrebbero essere leggermente diversi quindi sarebbe sempre meglio controllarli da serial monitor con questo codice che potete incollare in un nuovo sketch vuoto nell'arduino ide

codice:
int rxpulse;
void setup () {
Serial.begin (9600);
}
void loop () {
rxpulse = pulseIn (7, HIGH); // - 7 to know true front steering signal (number  8 to check throttle signal)
Serial.println (rxpulse);
in pratica se avete collegato il segnale di sterzo anteriore al piedino 7 come da disegno potete andare nel serial monitor e girando lo sterzo vedere i vostri valori radio di endpoint.
idem col gas, basta cambiare il numero con (8, HIGH) e muovere il grilletto o lo stick e annotarsi i valori risultanti.

a questo punto avete i valori di fine corsa dello sterzo anteriore, del gas da massima retro a massimo gas e anche il valore del gas neutro e potete cambiare i valori 1000-2000 di default con quelli della vostra radio.

i valori di Postsx e Postdx li potete anche cambiare per via empirica controllando che lo sterzo posteriore arrivi al massimo della corsa possibile evitando così di sforzare i biccherini dell'asse posteriore.
stessa sorte per il "define center" per quanto la centratura dello sterzo sia sempre bene farla al meglio meccanicamente.
per centrare il servo fate progressioni di 30-50 anche per capire in che direzione state andando..

se invece mettete davanti al valore di Center il segno meno (-) andrete nel verso opposto.

per reversare il servo basta invertire i valori di Postsx con quelli di Postdx e aggiungere il segno meno (-) davanti alla correzione inversamente proporzionale al gas (Max_gain) esempio "define Max_gain -400"
----------------------------
ok avete fatto il setup di base della controller, resta da settare i 2 parametri del setup di guida Slowlimit e Max_gain

c'è una relazione tra questi 2 parametri ma è intuitiva da capire..
ad esempio se impostate Slowlimit a 1600 avrete lo sterzo posteriore tutto chiuso al massimo della velocità impostando Max_gain intorno a 630
oppure 1700 - 700 e così via..
se superate i valori lo sterzo il servo si reverserà al massimo del gas e la macchina andrà in diagonale.. nulla di grave, trovate i valori che più vi piacciono sia di quantità di gas che di massima sterzata.

il valore minimo di slowlimit sarà il vostro neutro (1500) ma ovviamente lo sterzo inizierà a ridurre la sua corsa appena inizierete a muovervi.
quindi direi che valori tra 1600-1800 sono ideali per avere tutto sterzo a bassa o media velocità e lasciare che si riduca solo quando andate veloci.

quanto chiudere lo decidete voi impostando (Max_gain) di default ho messo 400 che è circa metà della corsa disponibile.

lo sterzo posteriore lo potete chiudere anche tutto e avere a massima velocità una comune macchina 2 ruote sterzanti oppure lasciarvi una porzione di corsa allo sterzo.

chiaramente se la macchina è veloce con 4ws è facile ribaltare e magari le 4 ruote sterzanti fanno comodo solo nei passaggi più lenti tra sassi e radici, la controller nasce per questo.

in retromarcia lo sterzo posteriore è sempre al massimo della sua apertura.


infine Tolerance che è rimasto da modifiche precedenti, di fatto adesso serve a poco e l'ho messo a zero in default ma se lo impostate a 50 avete uno sterzo che si muove a brevi scatti tipo step by step

nella parte di codice del programma non avete da fare nulla, ci sono anche lì 2 define che ho impostato a 7, servono nel caso il servo abbia vibrazioni.. potete provare a mettere 5 per velocizzare il servocomando ma oltre 15 il servo rallenta vistosamente e sotto 5 potrebbe vibrare in maniera ciclica.
------------------------------------------

la controller l'ho provata abbastanza a fondo e domani la monto sul mio camion, magari faccio 2 scatti e un breve video.

magari la prima volta che la usate scollegate il rinvio di sterzo posteriore o provatela con un servo sul banco.. così la capite molto meglio, in mezz'ora non avrà più segreti.

se avete domande o vi siete persi non esitate a chiedere, un paio di settimane addietro neanche io sapevo cosa fosse arduino e come farlo funzionare quindi avete sicuramente tutta la mia disponibilità
Icone allegate
centralina 4 ruote sterzanti con arduino nano-rear_servo_inv_prop_gain.jpg  

Ultima modifica di wrighizilla; 06-05-20 a 09:17 PM
wrighizilla non è in linea   Rispondi quotando