BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   mi aiutate a completare uno sketch? (https://www.baronerosso.it/forum/circuiti-elettronici/384129-mi-aiutate-completare-uno-sketch.html)

italo.driussi 25 aprile 20 11:39

Citazione:

Originalmente inviato da wrighizilla (Messaggio 5190640)
funziona, ho modificato i tempi di delay della corsa in movimento portandoli a 20 e i canali assegnati al servo e all'ingresso che sono diversi.. 10, 8
a questo punto mancherebbe solo una pausa di 2 secondi alle estremità dei fine corsa.

grazie!! è quasi pronto ad essere impiegato, andrà corretta la posizione del servo alle 2 estremità del loop portandola ai gradi giusti della visuale che dovrò avere dalla cam ma il tuo sketch fa precisamente quello che vorrei ottenere. :wub:

La metti alla fine dei cicli for

ciao

wrighizilla 25 aprile 20 12:05

ho provato ad aggiungere alla fine dello sketch la stringa
}
delay(2000);

ottengo la pausa di 2 secondi ma solo su uno dei finecorsa, ora vedo se riesco ad assegnare la pausa anche all'altro..
se copio la stessa stringa anche all'altro delay poco sopra mi perdo la posizione al centro e cicla in entrambe le posizioni radio, quindi l'ho cancellato.

in pratica così fa quasi tutto quello che desidero eccetto la pausa anche sull'altro fine corsa.

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

}

for (int n = maxdx; n >= maxsx; n--) {
myservo.write(n);
delay(20);
}

delay(2000);

}

}

wrighizilla 25 aprile 20 12:09

Citazione:

Originalmente inviato da italo.driussi (Messaggio 5190643)
La metti alla fine dei cicli for

ciao

non proprio, se cpio la stessa stringa al "primo for" poi cicla sempre in entrambe le posizioni di aux, anzi, quella che dovrebbe essere ferma al centro cicla solo metà corsa con la pausa di 2 secondi poi recupera velocemente fino al centro e riparte il loop.

l'altra posizione funziona invece benissimo con la pausa di 2 secondi in entrambi i fine corsa..

andrebbe anche bene inserendo le 2 stringhe di delay perchè i fine corsa ora hanno entrambi la pausa ma dovrei ritrovare la posizione ferma avanti come nel primo sketch che hai postato

giocavik 25 aprile 20 12:39

Cioè hai un interruttore sulla
Tx con cui vorresti mandare
la telecamera ai due estremi
e all'occorrenza anche al
centro..?
Se e' così e ci hai il fail safe
banalmente lo programmi per
portare il servo al centro se
spegni la tx, e vai in saccoccia
ad arduino...

wrighizilla 25 aprile 20 12:45

Citazione:

Originalmente inviato da giocavik (Messaggio 5190654)
Cioè hai un interruttore sulla
Tx con cui vorresti mandare
la telecamera ai due estremi
e all'occorrenza anche al
centro..?
Se e' così e ci hai il fail safe
banalmente lo programmi per
portare il servo al centro se
spegni la tx, e vai in saccoccia
ad arduino...

ti ringrazio dell'intervento ma premesso che il failsafe non ce l'ho, credo che non c'entra nulla usare un failsafe.

sto cercando di ottenere un loop programmabile sia come velocità di scorrimento che come punto di end point nei quali si ferma, compresa la durata della pausa..
ovvio che il più delle volte serve solo la posizione al centro ma non potendo dare un occhiata da entrambi i lati mi sembra una soluzione sensata programmare una nano per fare una panoramica in loop.

lo sketch proposto da Italo va benissimo, manca solo la pausa di 2 secondi agli end point.
per adesso non riesco ad ottenere il loop con le pause agli end point senza che nella posizione aux 2 il servo cicli ugualmente metà corsa con pausa.. sicuramente è una banalità ma appunto sto cercando di capirne la logica. :unsure:
a dire il vero credo di aver capito che il problema potrebbe essere nel valore for (int n = maxsx; n <= maxdx; n++) che genera il loop indesiderato nella posizione aux nella quale la cam dovrebbe rimanere ferma..

ma non so ancora scriverlo :wacko:

wrighizilla 25 aprile 20 13:06

credo di aver capito che inserendo le 2 stringhe delay il problema potrebbe essere nel valore for (int n = maxsx; n <= maxdx; n++) che genera il loop indesiderato anche nella posizione aux2 nella quale la cam dovrebbe rimanere invece ferma..

il passaggio adesso è questo, così corretto con le stringhe delay
in posizione aux1 il loop è meraviglioso, funziona tutto benissimo.

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

ma purtroppo non so ancora scriverlo per correggerlo, per adesso sono solo al livello di copiare e analizzare sintassi e funzioni, posso capire la logica quando la vedrò scritta e potrò confrontare cosa mancava :wacko:
vabè, comunque alla quinta ora mi va benissimo di essere messo così :lol:

wrighizilla 25 aprile 20 15:16

ho risolto! grazie davvero, era solo una questione di parentesi mancanti, un amico mi ha datto questa dritta di incorporare assieme le funzioni di else ed è bastato. :wub:

questo è lo sketch con tutto funzionante.


https://pastebin.com/embed_js/CiB7LMY1


#include <Servo.h>
Servo myservo;
int rxpulse = 1500;
int maxsx = 45; //-- taratura fine corsa sx
int maxdx = 135; //-- taratura fine corsa dx
int pservo = 90;
void setup() {
myservo.attach(10);
pinMode(8, INPUT); //-- piedino che legge RX
}
void loop() {
rxpulse = pulseIn(8, HIGH);
if (rxpulse > 1600)
{
myservo.write(90); //-- taratura centratura del servo su canale aux1
delay(200);
}
else
{
{
for (int n = maxsx; n <= maxdx; n++) {
myservo.write(n);
delay(20); //-- velocità di rotazione loop su aux2
}
delay(2000); //-- tempo di pausa endpoint
}
for (int n = maxdx; n >= maxsx; n--) {
myservo.write(n);
delay(20); //-- velocità di rotazione loop su aux2
}
delay(2000); //tempo di pausa endpoint
}
}


vi ringrazio tantissimo, stasera sarà sul camion :wub:

questo sketch adesso permette di usare una radio con aux con deviatore 2 posizioni e avere un loop programmabile su una delle 2 posizioni.
permette inoltre:
- centrarsi su un certo grado di rotazione a piacimento per la posizione dove il servo sta fermo.
- decidere la velocità e la corsa del loop
- impostare a piacimento una pausa ai fine corsa (1sec. = 1000)

lo trovo utilissimo, vi ringrazio ancora :)

wrighizilla 25 aprile 20 15:44

Citazione:

Originalmente inviato da madqwerty (Messaggio 5190587)
considerando che non programmo con Arduino da un tot (non programmo da un tot in generale :fiu:) e che non ho mai usato la libreria servo..

...........
non so se sia giusta la routine di lettura dell'input, e anche non ricordo come dichiarare gli AND

grazie, ora provo a far funzionare anche il tuo sketch, inizio a capire meglio la sintassi e chiaramente ci voglio provare :lol:

mi spaventava un pò questa roba ma alla fine è molto interessante.. anche sbagliando si scoprono ugualmente alcune cose utili. :)

madqwerty 25 aprile 20 17:14

Citazione:

Originalmente inviato da wrighizilla (Messaggio 5190686)
grazie, ora provo a far funzionare anche il tuo sketch,

de nada, onorato di poterti essere d'aiuto, vista quantità e qualità delle tue opere B)

l'unico vantaggio del mio è che che non ha delay lunghi nel main loop (li spezzetta in piccoli delay sempre lunghi uguali) quindi se torni al centro con l'interruttore ch3 non devi attendere un tempo random da 0 a 2 secondi del delay alla fine dei cicli for ,

però non l'ho nemmeno passato al compilatore, di sicuro contiene errori grammaticali (gli AND verso il fondo) e anche la lettura del ch3, vedendo come fa lo sketch dopo il mio, ma può servirti per fare un po' di palestra :D

italo.driussi 25 aprile 20 17:15

Prova questo



#define LPAUSA 2000 //-- pausa laterale
#define CPAUSA 2000 //-- pausa centrale
#define maxsx 45 //-- corsa max sx
#define maxdx 135 //-- corsa max dx
#define centro 90 //-- centro servo
#define VelSer 60 //-- velocita servo
#define PinSer 9 //-- pin servo
#define PinRX 8 //-- pin legge RX

#include <Servo.h>
Servo myservo;

int rxpulse = 1500;
int n = 90;

void setup() {
myservo.attach(PinSer);
pinMode(PinRX, INPUT);
}

void loop() {
rxpulse = pulseIn(PinRX, HIGH);
Serial.println(rxpulse);
if (rxpulse > 1700)
{
myservo.write(centro);
delay(200);
} else {
ruota();
}
}


void ruota() {
//-- da centro a sx
for (n = centro; n >= maxsx; n--) {
myservo.write(n);
delay(VelSer);
} delay(LPAUSA);
//-- torno al centro
for (n = maxsx ; n <= centro; n++) {
myservo.write(n);
delay(VelSer);
} delay(CPAUSA);
//-- da centro a dx
for (n = centro; n <= maxdx; n++) {
myservo.write(n);
delay(VelSer);
} delay(LPAUSA);
//-- torno al centro
for (n = maxdx ; n >= centro; n--) {
myservo.write(n);
delay(VelSer);
} delay(CPAUSA);
}


Tutti gli orari sono GMT +2. Adesso sono le 08:46.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002