1. Ciao Visitatore, se ti vuoi iscrivere e far parte di questa comunità, ti preghiamo di far attenzione alla scelta che farai per il tuo nickname. 
    NON E' CONSENTITO
    l'utilizzo di nome e cognome reale nella fase di iscrizione in virtù di regole che ci siamo dati per tutelare la Vs privacy e in conformità al GDPR.
    Certi che capirai... ben venuto!

controller per servo posteriore con corsa variabile tramite throttle

Discussione in 'Tutorials - Elettronica' iniziata da wrighizilla, 5 Maggio 2020.

  1. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    questo programma arduino permette di usare una radio 2ch assegnando un certo valore di gas avanti oltre il quale lo sterzo posteriore inizia a chiudere.
    serve per evitare di ribaltare a tutto gas a causa del troppo sterzo posteriore.
    potete decidere quanto gas dare prima che inizi la correzione
    quanto chiudere la corsa dello sterzo a tutto gas, da pochissimo o niente (full 4ws) fino a tutto chiuso (2ws)
    è abbastanza semplice da settare, occorre fare solo attenzione a non esagerare con i valori immessi altrimenti si scavalca il limite di 90° e a tutto gas si inverte direzione.. ad ogni modo è più facile capirlo sulla macchina che spiegarlo per scritto.
    nello sketch è spiegato il setup e tutte le variabili.

    questo è lo schema dei collegamenti sulla scheda nano

    [​IMG]

    non sono stato a raddoppiare i cavetti a Y anche per il gas throttle.. serve solo prelevare il segnale e portarlo al piedino D7.
    mentre per lo sterzo il cavetto a Y è molto comodo visto che si alimenterà anche la scheda oltre che portare il segnale di sterzo al piedino D8 e l'altro capo della Y andrà collegato al servo anteriore.
    ------------------------------------------
    la procedura di base è la solita descritta nel tutorial della controller semplice:
    -scaricate arduino ide https://www.arduino.cc/en/main/software
    -scaricate il driver CH341SER http://www.wch.cn/download/ch341ser_exe.html che vi serve se avete una scheda nano clone cinese da 5 euro
    potete usare anche altre schede come arduino uno e molte altre ma la nano cinese costa nulla ed è piccola.
    - aprite arduino ide, collegate la usb alla scheda nano
    - andate nel menu strumenti e impostate scheda =nano (se avete la nano)
    - processore ATmega 238P
    -porta com (non la com1, se avete collegato la usb ve ne apparirà un'altra tipo com3 ma il numero può variare)
    -aprite un tab nuovo e pulitelo cancellando le stringhe di default.
    -incollate lo sketch e lanciatelo con cerchietto con la freccina a dx
    a questo punto lo sketch è caricato.. se non lo avete già fatto dovete saldare i pedini e provare lo sterzo

    - i piedini coinvolti sono:
    VIN al quale fate arrivare il positivo del bec o il bec esterno
    GND al quale collegate il negativo del bec
    D7 segnale proveniente dalla vostra ricevente filo bianco/giallo canale gas throttle
    D8 segnale proveniente dalla vostra ricevente canale sterzo
    D10 uscita del segnale del servo posteriore
    ---------------------------------
    questo è lo sketch

    https://pastebin.com/CCwhsw6F

    per sicurezza allego anche il codice scritto.
    basta copiarlo per intero e incollarlo nel vostro sketch pulito.

    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 sx
    #define Antdx 2000 // -- in front servo signal dx
    #define Postsx 1000 // out rear servo sx end point (if inverted with postdx it reverse)
    #define Postdx 2000 //-- out rear servo dx endpoint (if inverted with postsx it reverse)
    #define Center 0 //-- add or subtract your value to center steering (+- 50 or more)
    //--------- user driving setup ------------------------------
    #define Max_gain 600 //-- gain steering reduction width at max throttle (if reverse add (-) before value)
    #define Slowlimit 1700 //-- slow forward percentage without endpoint correction
    #define Tolerance 0 //-- if poor quality servo vibrates try 5 (also try (0) before decide)
     
    //------------ here start the program, you don't need to change anything here --------------------------
    #include <Servo.h>
    Servo myservo;
    #define N_STST  6  //-- servo steering signal stabilization (high value = slow servo- try 3-15)         
    #define N_STGAS 6  //-- servo throttle signal stabilization (high value = slow servo- try 3-15)
    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(){
    Rxpulse = pulseIn(8, HIGH);
    Gaspulse = pulseIn(7, HIGH);
    Rxpulse  = meStSt( Rxpulse );
    Gaspulse = meStGas( Gaspulse );
    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);
    }
    }
    unsigned int meStSt( unsigned int val ) {
    if ( ++inSt >= N_STST ) inSt = 0;
    toStSt = toStSt - stSt[ inSt ] + val;
    stSt[ inSt ] = val;
    return( toStSt / N_STST );
    }
    unsigned int meStGas( unsigned int val ) {
    if ( ++inGas >= N_STGAS ) inGas = 0;
    toStGas = toStGas - stGas[ inGas ] + val;
    stGas[ inGas ] = val;
    return ( toStGas / N_STGAS );
    }
    
    vi traduco il setup che ho scritto in inglese


    -----------------------------------------
    istruzioni di base per la configurazione: per prima cosa ottieni la migliore configurazione meccanica del servo posteriore.
    i valori che trovi di default dovrebbero far funzionare subito il controller.
    tuttavia, se vuoi essere sicuro di quali sono i tuoi veri segnali radio, controllali prima di iniziare questo scetch.
    crea un nuovo schetch e controlla i segnali di ingresso con questo programma, ricordati di cambiare i valori d'ingresso per controllare entrambi i canali della tua radio (7 per sterzo - 8 per gas acceleratore)
    Codice:
    int rxpulse;
    void setup () {
    Serial.begin (9600);
    }
    void loop () {
    rxpulse = pulseIn (7, HIGH); // - 7 per conoscere il reale segnale dello sterzo anteriore 8 acceleratore
    Serial.println (rxpulse);
    
    è possibile leggere i valori nel monitor seriale ruotando il volante del radiocomando e spostando l'acceleratore.
    scrivi i valori ottenuti nella prima parte del setup, sostituisci i valori di default con i tuoi
    -------------------------------------------------- ------
    la configurazione di guida dell'utente è composta da 2 funzioni: è possibile scegliere la quantità di accelerazione a bassa velocità prima che la larghezza del servo posteriore inizi a chiudersi (funzione Speedlimit).

    la seconda funzione consente di determinare la larghezza del servo posteriore alla massima accelerazione (Max_gain).
    puoi scegliere di chiuderlo completamente o lasciare una larghezza disponibile per girare con 4 ruote sterzanti anche alla massima velocità.

    le altre funzioni sono: tolleranza che evita le vibrazioni ritmiche del loop.
    se il servo è buono potrebbe rimanere a zero, i servi analogici o di bassa qualità chedono almeno un valore di 4
    può succedere che si superi con i valori e si inverta la direzione, fare attenzione a trovare i valori più adatti al proprio modello se non si vuole camminare come un granchio.

    per invertire la direzione del servo devi solo scambiare i valori dello sterzo posteriore Postsx Postdx e mettere un segno (-) davanti al valore Max_gain
    ---------
    esiste una relazione tra Slowlimit e Max_gain, può succedere che se ne abbassi uno dovrai alzare l'altro
    tuttavia è molto intuitivo e sono sicuro che ci vorrà poco tempo per capire come funziona.

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

    spero di aver spiegato le cose in un modo tale da mettere chiunque in grado di provare a costruire questa controller, se avete dubbi e domande chiedete pure.. :)
     
    A landrover piace questo elemento.
  2. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    una versione leggermente diversa che ha corretto un amico di forum eliminando alcuni ritardi di risposta.
    https://pastebin.com/W1deZhj1

    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 sx
    #define Antdx 2000 // -- in front servo signal dx
    #define Postsx 2000 // out rear servo sx end point (if inverted with postdx it reverse)
    #define Postdx 1000 //-- out rear servo dx endpoint (if inverted with postsx it 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 reverse add (-) before value)
    #define Slowlimit 1800 //-- slow forward percentage without endpoint correction
    #define Tolerance 0 //-- if poor quality servo vibrates try 5 
    //----------------------------
    #include <Servo.h>
    Servo myservo; 
    #define N_STST  7             
    #define N_STGAS     7   
    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 funzionamento e il setup sono identici ma la risposta del servo è leggermente più rapida.
     
    A landrover e (marzo) piace questo messaggio.
  3. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    alcune note aggiuntive:

    la larghezza di apertura dello sterzo dipende dal setup.
    volendo si chiude del tutto, centrato immobile girando lo sterzo col gas al massimo settando "define Max_gain" a 630 insieme a un valore di "define Slowlimit" del gas impostato a 1600.

    oppure "define Max_gain" 700 e "define slowlimit" 1700 e così via, è sostanzialmente una proporzione.

    se si supera il dato corretto di massima chiusura è facile accorgersi perchè l'eccesso risulterà come una porzione di corsa del servo ribaltata con la macchina che cammina in diagonale come un granchio.
    abbastanza facile da capire.

    nel codice sopra vedete che il servo è reversato: si nota nella prima parte del signal setup nei parametri di "define Postsx" e "define Postdx" invertiti rispetto ai valori di "define Antsx" e "define Antdx"
    oltre ai fine corsa posteriori vedete che Max_gain ha il segno meno davanti al valore di -400 (vedi note scritte a fianco dei valori di settaggio)
    in questo modo si reversa il servo.
    la centratura progredisce con valori di circa 50, nel code sopra lo vedete impostato a 30 ovvero una piccola correzione di circa 1-2 mm
    la centratura però è bene farla al meglio possibile meccanicamente e lasciare a "define Center" il compito di rifinire la centratura di precisione.

    in questo video vedete lavorare la controller e in quale modo risponde ai comandi.
    quando la corsa è chiusa (non del tutto perchè appunto ero a Max_gain 400 su 1800 di slowlimit come potete leggere nel codice ) significa che sto dando tutto gas




    la controller essenzialmente fa questo:
    la banda dei segnali radio va da 1000 a 2000 col neutro a 1500 (valori di default che andrebbero verificati nel monitor seriale con le stringhe di codice accluse nelle istruzioni)
    diciamo che in linea di massima i valori sono questi.

    in retromarcia lo sterzo è totalmente aperto fisso, inutile chiudere lo sterzo in retro, serve per fare manovra e ci vuole tutto lo sterzo posteriore possibile.

    da neutro a slowlimit è aperto come in retro, ovvero a bassa velocità hai tutto lo sterzo a disposizione.

    da slowlimit fino a tutto gas si chiude in modo proporzionale di quanto vuoi fino anche a centrarlo chiuso come una macchina 2 ruote sterzanti.

    slowlimit si imposta da 1500 minimo (che sarebbe il neutro ) fino a 2000 che sarebbe tutto gas.

    chiaro che settandolo a 1500 lo sterzo inizia a chiudersi subito come si avvia la macchina queindi un settaggio ideale è tra 1600 e 1800
    in questo range potete trovare il compromesso di "define Max_gain" che più vi piace e che vi permette di scegliere quanto volete che giri lo sterzo posteriore al massimo del gas.

    oltre a questo ci sono altri settaggi che ho omesso di spiegare:
    #define N_STST 7
    #define N_STGAS 7
    di fatto abbassando il 7 fino a 5 il servo diventa più veloce ma sotto 5 potrebbe vibrare, se lo alzate oltre 15 diventa visibilmente più lento.
    ho lasciato Tolerance ma dopo questa ultma modifica è quasi diventato inutile.. se portato a 50 il servo si comporta come un selettore a scatti.
    anche Tolerance evita le vibrazioni e stabilizza il servo ma STST e STGAS sono più efficaci.

    lo sketch precedente funziona bene anche quello ma nella zona di proporzione è leggermente più lento nella risposta.

    se ci saranno evoluzioni potrebbe nascere la versione 3.0 nel caso avete suggerimenti da aggiungere a questo tipo di controller.
    domani lo monto sul camion e magari riporto alcune note sull'esperienza di settaggio.
     
  4. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    ok ho settato la controller per la prima volta sul camion arancione e ho scoperto di avere il segnale del gas al contrario.. in realtà potrei ovviare in altri modi ma ho preferito modificare lo sketch per adattarmi alle impostazioni radio preesistenti.
    riporto lo sketch di esempio, ho dovuto cambiare un valore maggiore in minore alla stringa
    Codice:
     if (Gaspulse < Slowlimit) {
    vedrò di aggiungere una nota nello sketch

    di conseguenza a questa differenza anche altri valori sono leggermente cambiati.
    vi riporto il codice di esempio che ho applicato al mio camion, per capire quali sono le differenze lo potete confrontare con quello dato all'inizio della discussione.

    Codice:
    //----------- signal setup -------------------------------------
    #define Neutral 1508 // -- minimum throttle forward signal
    #define Maxspeed 1062 // -- maximum throttle forward signal
    #define Antsx 1829 // -- in front servo signal sx
    #define Antdx 1140 // -- in front servo signal dx
    #define Postsx 1250 // out rear servo sx end point (if inverted with postdx it reverse)
    #define Postdx 1950 //-- out rear servo dx endpoint (if inverted with postsx it reverse)
    #define Center -130 //-- add or subtract your value to center steering (+- 50 or more)
    
    //--------- user driving setup ------------------------------
    
    #define Max_gain 250 //-- gain steering reduction width at max throttle (if reverse add (-) before value)
    #define Slowlimit 1200 //-- slow forward percentage without endpoint correction
    
    #define Tolerance 0 //-- if poor quality servo vibrates try 5
    
    //----------------------------
    #include <Servo.h>
    Servo myservo;
    #define N_STST  7          
    #define N_STGAS     7
    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);
    }
    }
    
    ad ogni modo vi spiego i passaggi che ho fatto:
    prima di tutto ho settato alla meglio la meccanica e entrambi gli sterzi.
    ho controllato il gas che fosse trimmato bene.
    poi ho caricato il programma che serve per controllare nel serial monitor quale è l'effettivo valore di corsa dei segnali provenienti dal gas e dallo sterzo

    Codice:
    
    int rxpulse;
    void setup () {
    Serial.begin (9600);
    }
    void loop () {
    rxpulse = pulseIn (7, HIGH); // - 8 to know true front steering signal 7 throttle
    Serial.println (rxpulse);
    
    l'ho caricato la prima volta col valore 7 , sono andato nel serial monitor e mi sono annotato i numeri corrispondenti a neutro, massimo e minimo gas.
    poi l'ho ricaricato variando il numero 8 per controllare lo sterzo, stessa procedura nel serial monitor girando il volantino.

    i miei valori sono stati:
    throttle min 2036 max 1062 neutro 1508
    sterzo 1829 -1140
    con questi valori ho scritto la prima parte del setup

    ho reversato lo sterzo invertendo Postsx e Postdx perchè era al contrario.. ovvero sarei andato in diagonale invece che curvare.

    ho invertito il valore maggiore - minore nella stringa che ho messo all'inizio del post perchè il gas throttle sul mio camion è reversato.
    a questo punto ho caricato lo sketch e ho guardato come reagiva..
    c'era troppa corsa di sterzo che sforzava, quindi ho corretto i valori, varie volte fino a trovare il giusto compromesso.
    ho sistemato la centratura del servo che ha voluto una minima correzione.
    ho ricaricato il programma..
    infine ho sistemato Slowlimit e Max-gain in concezione inversa perchè il gas è reverse (vedi codice) portandoli a un valore di gas accettabile e una corsa minima di sterzo a tutto gas.
    ho preferito lasciarne un pochino e non chiuderlo tutto, rimane da verificare su strada se il setup mi piace.


    per fare tutto c'è voluta un oretta perchè ho dovuto smontare entrambi gli sterzi per centrarli meglio e riportando il subtrim della radio a zero.

    il setup vero e proprio non è stato complicato, giusto capire a quale valore postdx postsx corrisponde la direzione meccanica del servo ma basta mettere valori aumentati o diminuiti di 100-200 per capirlo facilmente, cambiando questi valori si sballa un pochino anche la centratura che appunto si corregge aggiungendo o sottraendo quanto serve.

    a breve metto un video cercando di inquadrare anche il radiocomando. :)
     
  5. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    670
    "Mi Piace" ricevuti:
    159
    Località:
    Alessandria
    Grande. Preciso e dettagliato.
    Mi piace come ti sei lanciato nell’impresa fino ad ottenere il risultato desiderato.
     
  6. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    tu hai potuto vedere la genesi, grazie a te e tutti coloro che mi hanno generosamente messo a disposizione il loro tempo.
    io 20gg addietro ero nel buio più totale con queste schede misteriose sul banco, ci tengo a specificarlo perchè molti si spaventano solo a leggere l'argomento.
    il primo passo è decidere di iniziare e avere un progetto di senso compiuto da realizzare.
    ho cercato di fare dei tutorial per non confondere i vari progetti e poter aiutare nei vari problemi e incomprensioni che potrebbero nascere.
    per esempio che il canale del gas del mio camion fosse al contrario l'ho scoperto solo quando ho controllato i valori dei segnali provenienti dal regolatore di velocità.
    a banco usavo un esc diverso e il caso di dover reversare il gas nello sketch non si era ancora presentato, l'intuizione logica per trovare la soluzione però è stata semplice e così anche il settaggio conseguente che è stato di fatto ribaltato su tutti i parametri definiti per il settaggio e una stringa del codice di programmazione.
    il senso della discussione è proprio quello di mettere chiunque in grado di realizzare il suo primo progetto e vederlo funzionare, leggere lo sketch e capire pian piano quello che accade e magari fare progressi fino anche a modificarlo e restituire qui una sua versione diversa da quella presentata.
    questa controller ha richiesto un gran lavoro di correzioni per arrivare allo stadio di adesso, vedere i vari errori e le relative soluzioni è stata per me una gran scuola.

    tornando alla controller:
    in questo video ho settato la controller per agire solo nell'ultima porzione di gas e lasciando una certa corsa di curvatura anche a tutto gas.
    quindi la proporzione adesso avviene solo nell'ultima parte alta del gas e non fino a chiudere lo sterzo posteriore del tutto.
    ovviamente avendo settato l'azione solo nella parte alta del gas la reazione avverrà con un margine più stretto e repentino.





    adesso faccio un setup più proporzionale facendo partire l'azione da un valore di gas più basso e per tutta la corsa disponibile finendo con azzerarla del tutto e appena possibile aggiungo un nuovo video.
     
  7. landrover

    landrover Senior Photo-user

    Messaggi:
    9.677
    "Mi Piace" ricevuti:
    814
    Sesso:
    Maschio
    Località:
    TORINO
    bel progetto!
    mi piacerebbe vederlo applicato anche sul dynahed, avevo visto un bel filmato in cui aveva anche lo sterzo posteriore
     
    A wrighizilla piace questo elemento.
  8. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    sul dynahead non la metto perchè gira già in un fazzoletto anche senza e non ha particolari problemi ad alta velocità ha un motore brushless 17 spire va piuttosto piano.
    la metteresi curamente sul suo fratellino konghead che fila come un missile.

    poi ha già una nano a bordo per controllare la cam e metterne 2 mi tocca districarmi in un groviglio di fili che è già abbastanza intricato.
    il dyna non ne ha fondamentalmente bisogno.
    invece sarà il camion verde il prossimo a imbarcare questa controller, appena trovo il materiale per farmi delle spinette decenti, per adesso ho finito tutto.
    sia il camion giallo che il verde soffrono un pochino nelle curve a tutto gas..
     
    Last edited: 10 Maggio 2020
  9. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    in questo video ho abbassato molto il valore di Slowlimit facendo partire la proporzione da un valore di gas prossimo al neutro e molto più basso rispetto al video precedente.
    ho anche alzato il valore di Max_gain in modo che chiuda completamente la corsa di sterzo alla massima velocità e adesso si può apprezzare meglio il movimento proporzionale della correzione che la centralina nano sta effettuando

     
    Last edited: 10 Maggio 2020
    A (marzo) piace questo elemento.
  10. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    ho fatto una modifica allo sketch per avere le frecce..

    in pratica ho aggiunto 2 piedini dx sx per acendere dei led che lampeggiano.
    si può settare a quale punto della sterzata far partire la freccia, se vicino al centro dello sterzo oppure verso i fine corsa..
    si può settare la velocità di lampeggio.

    ho aggiornato le istruzioni e 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)
    D7 throttle signal input.
    D8 front steering input signal.
    D10 rear steering signal output.
    D4 blinking dx leds
    D5 blinking sx leds
    -----------------------------------------
    basic setup instructions:
    first you must obtain the best mechanical setup from your front and rear servos and linkage.
    best without subtrims or radio adjustements.
    the values you find default should make the controller work quite right away.
    however if you want to be sure about what are your real radio signal inputs, or if they are reversed 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 for throttle
    Serial.println (rxpulse);
    
    you can read the values in the serial monitor by turning the steering wheel of the radio control or moving the throttle.
    write the values obtained in the first part of the controller setup, replace the default ones with yours custom values send by transmitter.
    -------------------------------------------------- ------
    the user driving setup consists of 2 main functions:
    first 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 rear servo width at maximum throttle (Max_gain).
    you can choose to close it completely to 2ws or keep 4ws available even at maximum speed
    
    the other functions are:
    tolerance give stepper movement to servo (set it to zero).
    Blinkpoint allow steering travel before led start to blink.
    
    -----------
    somethimes it can happen that you exceed with the values the direction result inverted, 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 controller works
    */
    
    //----------- signal setup -------------------------------------
    #define Neutral 1500 // -- minimum throttle forward signal or neutral position
    #define Maxspeed 2000 // -- maximum throttle forward signal
    #define Antsx 1000 // -- in front servo signal sx
    #define Antdx 2000 // -- in front servo signal dx
    #define Streight 1500 //-- neutral signal steering position for blinking arrow light (if seering center is not zero: add or subtract half of Center value)
    
    #define Postsx 1000 // out rear servo sx end point (if inverted with postdx it reverse)
    #define Postdx 2000 //-- out rear servo dx endpoint (if inverted with postsx it reverse)
    #define Center 0 //-- 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 reverse add (-) before value)
    #define Slowlimit 1600 //-- slow forward percentage without endpoint correction
    #define Blinkpoint 300 //-- steering value where led start to blink, small values led start blink close near to center
    #define Tolerance 0 //-- add stepper servo steering movement
    
    //----------------------------
    #include <Servo.h>
    Servo myservo;
    #define N_STST  7            
    #define N_STGAS     7  
    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;
    int led1 = 4;//--led dx
    int led2 = 5;//-- led sx
    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
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    }
    void loop(){
    
    
        noInterrupts();  
    Rxpulse = pulseIn(8, HIGH);
    Gaspulse = pulseIn(7, HIGH);
         interrupts();    
    delay(5);
    if (Gaspulse > Slowlimit) { //-- if your throttle signal is reverse must change "<"
    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);
    
    if (OldPos > Streight+Blinkpoint) digitalWrite(led1, (millis() / 100) % 2); //--100 is led blink speed
                
     else   digitalWrite(led1, LOW);   //  LED off
    if (OldPos < Streight-Blinkpoint) digitalWrite(led2, (millis() / 100) % 2); //--100 is led blink speed
                  
      else  digitalWrite(led2, LOW);   // LED off
    
    }
    }
    

    questo lo schema di montaggio.. le resistenze dei led vedete voi.. per i miei arancioni va bene una resistenza da 56 Ohm per ciascun led

    [​IMG]
     
    Last edited: 26 Giugno 2020
    A landrover piace questo elemento.
  11. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    che spasso.. ho appena finito di montare le frecce sul dynahead.. dopo metto alcune foto.
    ormai non credo che questa centralina potrà fare molto più di questo.
    al massimo potrei aggiungere la luce di retromarcia assegnando un led pinout a tutti i valori al di sotto di Neutral.

    intanto aggiorno il progetto che ho condiviso su project hub

    https://create.arduino.cc/projecthu...HvCUoJlQjLNLuAoxdcivcvgTH8tb1tVF2Yigc4t_JGhPI
     
  12. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    sto facendo un esperimento.
    ho unificato lo sketch della centralina per lo sterzo posteriore insieme a quella per fare ruotare la fpv cam tramite il canale ausiliario aux.
    in pratica le 2 nano che adesso sono montate sul Dynahead diventerebbero una solamente.
    ho aggiunto anche le frecce e 2 output per funzioni led ancora da definire.

    mi sono portato fuori anche aux pulito che aziona il servo del cambio sui camion grossi.. volendo i mpiegarla sul camion verde potrebbe accadere che in prima marcia ho la cam che ruota 180° e in seconda marcia la cam che guarda fissa avanti.
    sul Dynahead invece il canale aux al naturale non lo uso.

    per fare un lavoro pulito ho deciso di uscire dalla centralina solo con 3 fili che vanno nei rispettivi 3 canali della ricevente, tutti i servi e utenze led vanno innestati nella centralina senza bisogno di tagliare o giuntare nulla.

    [​IMG]

    ho usato una piastrina mille fori per riportare tutti i pedini compresi quelli per accendere le frecce anteriori e posteriori oltre alle 2 utenze led aggiuntive.

    in pratica partendo da sinistra ai piedini si collegano l'esc, il servo anteriore, quello posteriore, il canale aux, la servo cam che dipende da aux, le frecce anteriori (3 fili sx-dx-gnd) le frecce posteriori e le 2 utenze led da definire.. luce di retro e forse abbaglianti ad alta velocità oppure freno.

    [​IMG]

    i collegamenti sono sostanzialmente tutti ponticelli: gialli gli output dei 2 servi , beige tutti i led, arancio e verde gli input dei 3 canali, il rosso alimenta vin, 2 fili nudi di metallo per collegare positivi e negativi e il ponticello di metallo sul fronte dove ho fatto passare la massa.

    [​IMG]


    adesso devo saldare le spine e provarla.. il codice lo metterò quando sarò sicuro che funzionerà.. ;)
     
    A (marzo) piace questo elemento.
  13. (marzo)

    (marzo) utente handmade

    Messaggi:
    7.939
    "Mi Piace" ricevuti:
    749
    Località:
    milano
    lavoro bello pulito
    (oltre che parecchio difficile per i comuni mortali)

    ma un aspetto del modellismo in cui non eccelli esiste?
     
  14. P.Bolly

    P.Bolly Mercante RC Photo-user

    Messaggi:
    4.311
    "Mi Piace" ricevuti:
    265
    Sesso:
    Maschio
    Località:
    Segrate (MI)
    La prima cosa che mi viene da dire è : col saldatore sei un drago, tutte saldature praticamente perfette.
     
  15. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    vi ringrazio.. credetemi, il segreto sono lo stagno e il saldatore boni.

    comunque da questa unione di sketch sperimentale e dal dubbio risultato è venuto fuori un programma che funziona ancora meglio di prima.. :D
    credo di aver testato tutto..
    i led adesso sono:
    le frecce davanti e dietro dx sx
    la luce di retromarcia o freno.. impossibile differenziare per il secondo scatto di grilletto, si accende per tutta la durata della retromarcia..
    una luce di massima velocità che non serve a nulla se non accendere una ulteriore coppia di fari o definirla in futuro per altri scopi..

    il resto è abbastanza invariato, lo sterzo posteriore ha una risposta leggermente più veloce e migliore mentree il servo per ruotare la fpv cam è sostanzialmente identico a prima.

    Codice:
    //----------- signal setup -------------------------------------
    #define Neutral 1500 // -- default 1500//minimum throttle forward signal or neutral position
    #define Maxspeed 2000 // -- default 2000//maximum throttle forward signal
    #define Antsx 1000 // -- default 1000//in front servo signal sx
    #define Antdx 2000 // -- default 2000//in front servo signal dx
    
    
    #define Postsx 1000 //-- default 1000//out rear servo sx end point (if inverted with postdx it reverse)
    #define Postdx 2000 //-- default 2000//out rear servo dx endpoint (if inverted with postsx it reverse)
    #define Center 0 //-- default 0//add or subtract your value to center steering (+- 50 or more)
    
    //--------- user driving setup ------------------------------
    
    #define Max_gain 400 //-- default 400//gain steering reduction width at max throttle (if work reverse add (-) before value)
    #define Slowlimit 1600 //-- default 1600//slow forward percentage without endpoint correction
    
    
    
    //------------ servo cam setup------------
    #define tolerance 4 //-- default 4//servo cam vibration cutoff
    #define front 0 //-- default 0//servo cam front center in moving aux position
    #define Camsx 5 //--default 5// servo cam endpoint sx (reverse with camdx)
    #define Camdx 175//-- default 175// servo cam endpoint dx (reverse with camsx)
    #define fix 90 //-- default 90//servo cam front center in fix aux position
    //-------------led setup
    #define Streight 1500 //-- default 1500//neutral signal steering centered position for blinking arrow light (if seering center is not zero: add or subtract half of Center value)
    #define Blinkpoint 300 //-- default 300//steering value where led start to blink.
    #define rearstart 1200 //-- default 1300// reverse gear light start at 1300
    //-----------------------------------------
    
    #include <Servo.h>
    Servo myservo;
    Servo camservo;
    #define N_STST  7 // default 7//rear steering vibration cutoff
    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 centpos=fix;
    int led1 = 4;
    int led2 = 5;
    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 10
    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);
    if (Gaspulse > Slowlimit){  //-- default >// if your throttle signal is reverse must change "<"
    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 (OldPos > Streight+Blinkpoint) {digitalWrite(led1, (millis() / 100) % 2); //--default 100 is led blink speed
                
     }else   digitalWrite(led1, LOW);
    if (OldPos < Streight-Blinkpoint){ digitalWrite(led2, (millis() / 100) % 2); //--default 100 is led blink speed
                  
    } else  digitalWrite(led2, LOW);
     
    if (Gaspulse < rearstart){digitalWrite(led3,HIGH);
    
    }else  digitalWrite(led3, LOW);
    if (Gaspulse > Maxspeed-100){digitalWrite(led4,HIGH);
    
    }else  digitalWrite(led4, LOW);
    
    //-- aux cam part ----------
    
    
    if (auxpulse > 1600)//--default >// change aux position
    camservo.write(centpos);
    else {
     newloc = map(pulseIn(8, HIGH),Antsx,Antdx,Camsx,Camdx);
    
    
    if(abs(newloc - oldloc) > tolerance)
    oldloc = newloc;
    camservo.write(newloc + front);
    }
    }
    
    lo schema di costruzione è un pò cambiato.. dopo lo disegno e lo aggiorno, vedrò di fare uno schema nuovo più semplice e spero più chiaro.
     
    A Bibe piace questo elemento.
  16. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    670
    "Mi Piace" ricevuti:
    159
    Località:
    Alessandria
    Mamma mia. Un mostro. C’è solo da imparare da ogni tua discussione.
    Complimenti per la realizzazione e per l’ottimo oggetto autoprodotto.
     
  17. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    ecco lo schema:
    in pratica sulla basetta millefori riporto i pedini per collegare tutti i servi e l'esc
    dai piedini ponticello e faccio le 3 spine che andranno nella ricevente.
    i 3 segnali entrano nella nano ai piedini d7-d8-d9
    i segnali escono dai pedini d10 e d11 rispettivamente al servo di sterzo posteriore e al servo per ruotare la cam fpv
    i piedini d6-d5-d4-d3 sono tutti per le funzioni dei led che qui nel disegno non sono stato a mettere sulla basetta.
    se vi vengono idee che possono essere associate allo sterzo e al gas ci sarebbero ancora un paio di piedini liberi per fargli fare qualcosa. :D


    [​IMG]
     
    Last edited: 30 Giugno 2020 alle 00:29
    A Bibe piace questo elemento.
  18. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    ci sono cose di base delle quali ancora non ci capisco una mazza.. ho passato 2 ore a mettere parentesi graffe vedere che succede.. toglierle.. vedere che succede.. anche con x>y / x<y confusione bestia a non finire..

    anzi.. se nello sketch vedete errori o fetecchie segnalate..

    ho fatto sparire la media sul gas e tutto è diventato più veloce e stabile, ho lasciato la media sullo sterzo altrimenti vibra tutto quanto.
    sono impazzito per cercare di dare una logica al freno e alla luce di retro ma è impossibile definire in modo certo una soglia di gas per il freno e di seguito per la retro specialmente se l'esc vuole 2 scatti prima di passare in retromarcia..
    quindi ho lasciato perdere e ho definito il led brake retro che si illumini per tutta la tratta in retromarcia
    il led abbagliante l'ho definito qualcosa prima del tutto gas, se deciderò di usarlo magari metterò una coppia di fari bianchi.

    i blinker sono fantastici, li ho provati stasera nella girata digestiva di 6.3km.
    come li ho settati adesso fortunatamente non si vedono spesso accesi perchè intervengono solo quando sterzo drasticamente.. forse modificherò la velocità di lampeggio aumentandola un pochino.
     
    Last edited: 30 Giugno 2020 alle 00:50
  19. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    406
    "Mi Piace" ricevuti:
    194
    Località:
    Firenze
    e insomma non avevo testato tutto.. ho trovato una fetecchia in aux cam part.
    appena montata la cabina con il servo della cam in posizione mobile va benissimo mentre in posizione fissa (centpos) vibra tutto quanto.
    soluzione trovata aggiungendo delay.. siamo più o meno verso la fine dello sketch:
    camservo.write(centpos);
    delay (5);
    else{

    mistero il perchè con 2 nano separate non ne avesse bisogno mentre mettendo tutto assieme sia nata questa vibrazione in posizione fissa poi.. boh?

    il pastebin corretto https://pastebin.com/6cASD44u
     
  1. Questo sito utilizza i cookies per personalizzare i contenuti, la navigazione e la tua esperienza nell'utilizzo del forum; inoltre se decidi di registrarti, vengono utilizzati per mantenerti loggato
    Continuando ad utilizzare il sito, acconsenti all'utilizzo dei cookies.
    Nascondi Avviso