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... benvenuto!

aiuto per sketch servo loop

Discussione in 'Come fare a...' iniziata da wrighizilla, 25 Aprile 2020.

  1. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    giocherellando con la scheda nano sono arrivato a far funzionare questo sketch che fa muovere in loop un servo con una pausa di 2 secondi sui fine corsa.
    lo vorrei usare per ovviare alla mancanza del terzo canale proporzionale della mia radio spektrum dx3s in modo da averlo su una delle 2 posizioni del canale aux ch3
    in pratica vorrei che in una posizione di aux la microcamera guardi avanti mentre in posizione 2 di aux faccia una panoramica in loop con pausa sui fine corsa.. per darsi giusto un occhiata intorno in caso di dubbi di visuale.
    però per adesso sono fermo qui, non so aggiungere quello che manca per comandare la arduino nano dalla rx del modello.
    per favore potete aiutarmi a completare questo sketch?
    vi allego dove sono arrivato.

    #include <Servo.h>

    Servo myservo;

    int pos = 0;

    void setup() {
    myservo.attach(10); // il vostro piedino assegnato al segnale servo
    }

    void loop() {
    for (pos = 0; pos <= 180; pos += 1) { //il servo ruota da 1 a 180 gradi con step di 1 passo alla volta

    myservo.write(pos);
    delay(15); // la velocità con la quale il servo effettuerà la sua corsa in un verso
    }

    delay(2000); //2000 equivalgono a 2 secondi di pausa

    for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15); // la velocità con la quale il servo effettuerà la sua corsa nell'altro verso
    }

    delay(2000); //altri 2 secondi di pausa prima di ricominciare il loop

    }


    grazie a tutti.
     
  2. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    Ciao.

    Allora il comando che ti serve si chiama pulsein()

    Anche in questo caso ti consiglio di agire in due tempi a livello di sketch.

    Per la parte hardware colleghi la ricevente alla scheda. Il nero con GND e il segnale ad una pin libero a tua scelta (nel mio sketch di esempio si tratta del 10)

    Perché dico di agire in due tempi? Perché per prima cosa ti occorre sapere che segnale la ricevente manda in uscita su AUX quando lo attivi poi con questo dato potrai programmare lo switch.

    Fatti i collegamenti caricherai questo sketch (cambiando ovviamente il pin di ingresso segnale)

    void setup() {
    Serial.begin(9600);
    Serial.println("Setup");
    delay(1000); //attendo che si accenda la ricevente
    }

    void loop() {
    int i = pulseIn(10, HIGH);
    Serial.println(i);
    delay(200);
    }

    Con questo sketch attivo vedrai sul monitor seriale i valori di microsecondi in uscita da AUX. Se ho ben capito puoi programmarlo solo in due posizioni quindi ti serve capire quali esse siano.

    Ad esempio sulla mia spektrum le due posizioni sono circa 1100 e 1900.
    Diciamo quindi che 1500 possa essere un buon punto intermedio abbastanza lontano da entrambe per non generare confusioni.

    Potrai quindi tornare al tuo sketch originale, impostare il pin in ingresso della ricevente AUX (in setup) e fargli leggere ad ogni ripetizione del loop il valore con pulseIn()

    Nel Setup avrai anche indicato una costante ad esempio BASCULA = 1500

    A questo punto si tratta di impostare nel codice qualcosa del tipo:

    IF i < BASCULA
    " codice per mantenere servo al centro"
    ELSE
    "codice per ruotare il servo"

    Inconveniente di questo sistema:
    una volta che la scheda ha cominciato a ruotare il servo dovrà compiere tutto il movimento prima di leggere che hai magari cambiato posizione all'interruttore nel frattempo.
    Ci sono modi probabilmente per evitare questo ma ancora non li conosco.
     
    A wrighizilla piace questo elemento.
  3. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    grazie!!
    fatto: 1904 e 1100 le due posizioni aux della ricevente
     
  4. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    per adesso con l'aiuto di un utente di un altro forum sono arrivato a questo sketch
    https://pastebin.com/embed_js/rpKu004K

    così come è adesso ha un difetto ma non so scrivere la sintassi giusta.

    in pratica con la radio su aux 1 il loop panoramico di 180 gradi funziona perfettamente con una pausa di 2 secondi arrivati agli endpoint
    con aux 2 invece di avere il servo fermo al centro esso cicla in loop da un solo lato con la pausa e si riporta al centro.

    magari è semplicissimo ma per adesso dalle prove fatte non ne sono ancora venuto a capo o non so scrivere la stringa corretta.

    in questo passaggio dello sketch:
    for (int n = maxsx; n <= maxdx; n++) {
    myservo.write(n);
    delay(20);
    }
    delay(2000);
    }
    for (int n = maxdx; n >= maxsx; n--) {
    myservo.write(n);
    delay(20);
    }
    delay(2000);
    }

    se tolgo entrambi i delay 2000, lo sketch funziona con aux2 perfettamente fermo e centrato ma aux2 cicla in loop continuo senza la pausa agli endpoint

    per logica penso che l'errore sia dovuto alla stringa for (int n = maxsx; n <= maxdx; n++) che interpreta metà ciclo.. non so dire.. :oops:
     
  5. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    Mi sa che dipende dalle parentesi graffe.

    In pratica devi racchiudere tutto il movimento del servo nell’ELSE {}

    Come mai hai impostato la costante 1500 ma poi quando fai il controllo lo fai a parte con 1800?
     
  6. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    sono riuscito a farlo.. è perfetto.
    avevi ragione mancavano le parentesi. grazie 1000!!

    questo è lo sketch funzionante.

    #include <Servo.h>
    Servo myservo;
    int rxpulse = 1500;
    int maxsx = 45; //-- tarare
    int maxdx = 135; //-- tarare
    int pservo = 90;
    void setup() {
    myservo.attach(10);
    pinMode(8, INPUT); //-- legge RX
    }
    void loop() {
    rxpulse = pulseIn(8, HIGH);
    if (rxpulse > 1800)
    {
    myservo.write(90);
    delay(200);
    }
    else
    {
    {
    for (int n = maxsx; n <= maxdx; n++) {
    myservo.write(n);
    delay(20);
    }
    delay(2000);
    }
    for (int n = maxdx; n >= maxsx; n--) {
    myservo.write(n);
    delay(20);
    }
    delay(2000);
    }
    }
     
  7. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    Perfetto. :nice:
    Sono contento di esserti stato utile.

    Ho aperto una discussione di raccolta dei vari progetti arduino per i nostri mezzi. Magari metti un link a questa discussione e a quella originale del sistema fpv così si riescono a trovare tutte agevolmente.
     
  8. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    caspita è meraviglioso!! stasera finisce sul camion dynahead. :eek:

    in pratica con la radio 3 canali e aux 2 posizioni posso averne una fissa dove decidere solo il grado di rotazione che dovrà avere il servo per guardare avanti.
    nella seconda posizione aux ho un loop programmabile in velocità, raggio d'ampiezza e tempo di pausa fermo su gli endpoint.

    per darsi un occhiata attorno o attraversare una strada traversa è perfetto e vale il costo di una sola nano.
    la nano è collegata con:
    - VIN direttamente al positivo della ricevente del modello insieme al positivo del servo (un microservo funziona anche collegato al +5)
    -ground al negativo della rx insieme al negativo del servo
    -piedino D8 al segnale bianco del servocomando
    -piedino D10 al segnale proveniente dalla rx del modello.

    tutto qui.
    lo sketch definitivo https://pastebin.com/embed_js/zfgBF9Vy
     
  9. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    Volendo potresti farla che nella posizione 1 sta fissa per guidare e nella posizione 2 ruota assieme allo sterzo per comandarla direttamente tu.
     
    A wrighizilla piace questo elemento.
  10. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    si ma queste cose me le dici ora che l'ho impacchettato sul camion? :eek: :D:D

    che poi non penso servirebbe neanche spacchettarlo.. o forse si perchè dovrei aggiungere alla nano anche il segnale di sterzo da qualche parte..
    ora vedo se ho un mix sulla radio ma dubito..

    sarebbe un'interessante soluzione pure questa. ;)
    ad ogni modo se hai voglia di scrivere e proseguire io posso testare al volo abbastanza facilmente.

    ad esempio all'attuale sketch sarebbe migliorabile potendo richiamare il servo in centro indipendentemente da quale è la posizione del loop.
    ora se richiami la visuale in centro prima di raggiungere la metà corsa, la squadretta ritorna subito in posizione di centro.
    ma se lo richiami dopo la metà corsa, la squadretta finisce di fare tutto il ciclo di loop prima di ricentrarsi..
     
    Last edited: 25 Aprile 2020
  11. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    Per il ritorno come ti dicevo non ne so molto. Probabilmente si devono usare delle istruzioni breack o interrupt ma non le conosco ancora.

    Una soluzione poco elegante che userei io è quella di dividere il movimento del servo in 4 step separati.

    Da centro a sinistra;
    Da sinistra a centro;
    Da centro a destra;
    Da destra a centro.

    Ogni blocco di istruzioni è in pratica un IF....ELSE che prima controlla la posizione dell'interruttore AUX.
    In pratica se cominci il loop puoi interromperlo più spesso (ad ogni 1/4 di rotazione).
    Di negativo c'è che quando lo avvii non sai da che posizione parte (ad esempio potrebbe schizzare a sinistra per poi tornare al centro).

    Un altro modo potrebbe essere quello di sostituire due IF.... ELSE con dei WHILE ma su questo non sono sicuro e ci si deve ragionare un po' sopra.

    Provo a metterti uno sketch in cui sostituisco al tuo loop il codice che ho provato per il mio Lipo saver in costruzione.
    Ovviamente come hai fatto per il canale AUX dovrai collegare ad Arduino anche segnale e ground dello sterzo su un pin dedicato (che nell'esempio chiamerò 13). Ho tolto anche il delay del punto fisso per renderlo più reattivo al comando.
    spero di non aver fatto errori di sintatti.

    1. #include <Servo.h>
    2. Servo myservo;
    3. int rxpulse;
    4. void setup() {
    5. myservo.attach(10); //-- piedino segnale servo
    6. pinMode(8, INPUT); //-- piedino che legge RX-AUX
    7. pinMode(13,INPUT); //--piedino che legge RX-STR
    8. }

    9. void loop() {
    10. rxpulse = pulseIn(8, HIGH); //-- piedino segnale proveniente dalla ricevente
    11. if (rxpulse > 1600)
    12. {
    13. myservo.write(90); //-- centratura del servo su canale AUX1
    14. }
    15. else
    16. {
    17. myservo.writeMicroseconds(pulseIn(13,HIGH)); //-- servo segue sterzo
    18. }
    19. }

    Prima di spacchettare quanto hai già fatto provalo magari sull'altra nano con dei collegamenti voltanti. così vedi se ti piace e se ti trovi bene.

    Ciao
     
    A wrighizilla piace questo elemento.
  12. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    caspita :wub: funziona benissimo e potrebbe essere indubbiamente un sistema molto migliore del loop.
    però la corsa del servo e la centratura bisognerebbe poterla definire separatamente settandola sullo sketch, altrimenti resta soggetta ai settaggi relativi allo sterzo.
    per esempio adesso lo sterzo della mia radio ha utilizzato 1/3 in meno della sua corsa disponibile e il trim di centratura è un filino fuori centro zero.
    non potendo variare i parametri di sterzo dalla radio penso sia indispensabile poterlo fare dallo sketch per centrarsi con la cam e poter usare tutta la corsa disponibile.
    idem la posizione ferma con vista avanti, avrà bisogno della stessa centratura della telecamera quando l'aux e il conseguente mix viene disattivato.

    potrebbe servire aggiungere queste stringhe?
    sono anche la corsa attuale del mio servo
    #define maxsx 6 //-- corsa max sx
    #define maxdx 175 //-- corsa max dx
    #define centro 80 //-- centro servo
    la stringa di centro forse nemmeno serve.. basta settare il 90 che c'è adesso
    però gli endpoint penso che dovrei metterli in relazione dopo "else".. almeno credo .. :D



    grazie , è davvero interessante. :+1:
     
    Last edited: 25 Aprile 2020
  13. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    vabè.. ho smanettato un altro par d'ore ma non ne sono venuto ancora a capo. :(

    pensavo anche che questo stesso sketch potrebbe tornare comodissimo per fare un mix per lo sterzo posteriore sul quale con una qualsiasi radio 2ch si potrebbe regolare la centratura, la direzione e la corsa utile di movimento senza stare a impazzire nel regolare astine e millerighe e con sempre il problema di avere magari troppo o poco travel disponibile.
    sommariamente lo stesso sketch oltre che per gestire la cam con il canale aux, volendo sarebbe impiegabile anche per questo uso, magari con l'aux si potrebbe decidere di avere le 4ws oppure no.
     
  14. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    Guarda. Io stavo pensando a questo sistema per aggiungere il controllo del verricello alla mia scheda luci senza doverne avere una apposita.
    Purtroppo però ho finito i pin liberi :D
    In realtà informandomi un po' sull'argomento ho trovato cose interessanti da provare in tal senso ma vedrò in seguito.


    Tornando a noi visto che il tuo problema è che hai poca escursione dello sterzo rispetto a quanta ne vorresti per la cam ti propongo questa sostituzione.

    cambia la riga 18| myservo.writeMicroseconds(pulseIn(13,HIGH)); //-- servo segue sterzo
    con:

    18| myservo.write(map(pulseIn(13,HIGH), 1100,1900,45,135)); //--servo amplifica sterzo in gradi

    Ovviamente ho messo come limiti dello sterzo 1100-1900 perché sono quelli che avevi registrato per il pulsante AUX. Visto però che mi dici che hai ridotto l'escursione via radio devi per prima cosa ritornare a leggere i valori effettivi che otterrai e inserirli nello sketch al posto di quelli che ho messo io.
    E' la prima volta che uso questo comando. spero funzioni a dovere.

    Come dicevi tu quando AUX è in condizioni di riposo il centraggio è automatico visto che hai impostato 90°.
     
  15. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    ho spulciato su internet ma per adesso non trovo la grammatica e nemmeno un buon corso per questo linguaggio.. dove lo imparo? mi salverei volentieri dei link per studiare.
    per favore mi fai capire la logica che c'è nella stringa? map riassegna la mappatura di 13 a myservo con valori di 1100,1900,45,135? come arrivi a scrivere la stringa correttamente? la sintassi e la logica dove le posso imparare?
    altra curiosità, è il piedino 13? perchè lì per lì l'ho cercato giusto per non cambiarlo sullo sketch ma non l'ho trovato quindi ho assegnato il 9 al quale ho saldato il filo del segnale di sterzo, esiste un piedino 13?

    ora provo, tra 15 minuti ti dico cosa succede :)
     
  16. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    allora.. funziona bene la corsa cambiando 45,135 e portandoli a 20,160 ma non so se è corretto oppure se dovrei cambiare anche 1100,1900 dovrei prima di tutto testare i fine corsa del camion perchè adesso sono su una nano e radio volante bindata su un nuovo modello quindi tutto a zero.
    facendo le cose per bene dovrei vedere da seriale cosa mi restituisce lo sterzo del camion.

    quello che non funziona el tutto correttamente è la centratura nella posizione volantino.
    ma volendo è indifferente visto che ho comunque il volantino in mano.. la centratura è relativa solo alla posizione aux1 nella quale il servo è fermo
    se cambio 90 con 70 quando passo ad aux2 c'è lo scatto di quei 20 di differenza..

    comunque si, è utilissimo anche per farci un verricello, è molto versatile
     
  17. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    potrebbe anche in questo caso dipendere da una questione di parentesi? perchè per la cam va benissimo anche così ma volendo proporre lo stesso sketch per un controller del servo di sterzo andrebbero accomunate le centrature dello sterzo in entrambe le posizioni di aux.
    ma anche per un verricello sennò quando lo fermi potrebbe esserci uno strattone.
    forse l'unico caso nel quale non fregerebbe nulla sarebbe proprio per la cam fpv.
     
  18. Rock Golem

    Rock Golem Mercante RC Photo-user

    Messaggi:
    686
    "Mi Piace" ricevuti:
    163
    Località:
    Alessandria
    La sintassi di map() è questa:

    map(variabile, minimo in ingresso, massimo in ingresso, minimo in uscita, massimo in uscita);

    Praticamente prende la variabile e la scala riproporzionando il valore in entrata.

    Ti chiedo scusa ma non riesco a capire bene quale sia il problema del centraggio.
    Quando AUX è in posizione A, avrai che il servo è fisso a 90° (o quello che imposterai).
    Quando AUV è in posizione B, avrai che il servo segue in maniera proporzionale (in base ai valori definiti in map) il volantino.
    Quando passi da A a B e viceversa avrai uno scatto che porterà il servo dalla posizione attuale a quella nuova.

    Se il problema è che a volante non sterzato passando da A a B fa uno scatto questo mi sa che vuol dire che 90° non è la posizione di centraggio. Se come dici hai tutti i trim a zero vuol dire che la squadretta non è nella posizione corretta sui 90° del servo. Puoi risolvere spostando la squadretta o modificando l'angolo del punto fisso.

    Ovviamente queste regolazioni vanno fatte con le impostazioni radio esatte per il mezzo che userai (trim, finecorsa ecc) altrimenti funzionerà nel modo corretto..

    Ho scelto il pin 13 proprio per averne uno che di sicuro non avevi usato. Nella nano guardandola con lo spinotto per l'USB in basso è il pin nell'angolo in basso a destra. comunque ogni pin che ti è comodo va perfettamente.

    Un paio di link per la sintassi:
    https://www.arduino.cc/reference/en
    http://wiring.org.co/reference/alpha.html
     
  19. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    immagina di usarlo per una controller di sterzo posteriore..
    può capitare che hai un determinato centraggio dovuto ai subtrim dello sterzo principale e questo non lo puoi cambiare salvo non andare storti.

    a questo punto in posizione ferma (2ws) centro lo sterzo posteriore su diciamo 95 o quello che mi serve per allinearmi con tutte le ruote dritte.
    quando aziono le 4ws questo valore non dovrebbe cambiare ma rimanere legato al settaggio di 95 col quale ho centrato lo sterzo posteriore.

    adesso questo non lo fa: se vario il 90 e lo porto a 70 sposto il settaggio di centro solo nella posizione fissa A, ma torna a 90 quando mi metto in posizione B dove entrambi gli sterzi girano assieme.

    ora ricontrollo meglio.. ma sembra che le 2 funzioni siano slegate tra loro per quanto concerne la centratura, per questo pensavo potesse dipendere anche solo da una parentesi che le accomuna. prima però devo verificare precisamente l'uscita del segnale di sterzo sul serial, così almeno inserisco dati reali e non approssimativi. uso questo:
    int rxpulse;
    void setup() {
    Serial.begin(9600);
    }
    void loop() {
    rxpulse = pulseIn(9, HIGH); //-- per sapere qual'è il valore del segnale di sterzo
    Serial.println(rxpulse);
    }

    i piedini del progetto sono: 8- segnale aux, 9- segnale sterzo, 10 myservo
     
    Last edited: 26 Aprile 2020
  20. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    420
    "Mi Piace" ricevuti:
    202
    Località:
    Firenze
    ok ho ricontrollato dal seriale e la mappatura è 925-2085 con 10 -175 ho tutta la corsa disponibile del servo.

    ti confermo che la centratura (90) se la modifico ad esempio in 70 quando aziono l'aux (da posizione fissa a volantino) essa si sposta di 20.
    la centratura del servo myservo dovrebbe essere invece la stessa in entrambe le posizioni in modo che : da cam fissa (o 2 ruote sterzanti regolate come devono stare.) passando a cam volantino (oppure 4 ruote sterzanti) la centratura di myservo rimanga la solita.

    ora mi mandi a fan.. :D

    c'è un altra cosa che non capisco da cosa dipende e tanto meno come curarla: il servo su posizione volantino esegue un movimento ritmico quasi cardiaco vibra con un ciclo ripetitivo che lo fa leggermente muovere.
    irrilevante per uno sterzo 4ws perchè non sarebbe percepibile, ma è fastidioso guardando in camera. questo ritmo ciclico lo fa in qualsiasi posizione del volantino e termina solo quando aziono aux tornando in posizione fissa.
     
  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