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)

wrighizilla 24 aprile 20 23:02

mi aiutate a completare uno sketch?
 
sto giocando con una arduino nano e vorrei poter usare il ch3 di una radio a volantino (on off) in modo che su una posizione ottengo un servo loop che va da un fine corsa all'altro.

questo è lo sketch del servo loop, appena si carica il servo inizia a ruotare da un lato all'altro della sua corsa.

int pos = 0;
void setup()
{
myservo.attach(10);
}
void loop()
{
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(25);
}
for(pos = 180; pos>=1; pos-=1)
{
myservo.write(pos);
delay(25);
}
}

purtroppo sono non più di 4 ore totali che gioco con questa roba e la nebbia è troppo densa, non mi riesce. :(

vorrei poterlo completare aggiungendo tutto quello che manca per dire alla nano che dovrà fare il loop quando riceverà il segnale di una delle 2 posizioni dalla ricevente del radiocomando.
mentre nell'altra posizione il servo dovrà stare fisso centrato indipendentemente dalla posizione nella quale sarà quando verrà azionato l'aux ch3 della radio, in pratica come se la nano non ci fosse.

per favore mi aiutate? :)

vorrei fare questo progetto per ovviare alla mancanza di un ch3 proporzionale sulla mia radio spektrum dx3s l'applicazione servirebbe per ruotare una videocamera e darsi un'occhiata intorno ma poter tornare alla visuale frontale in qualsiasi momento.
ma se avete altre soluzioni potrebbero essere altrettanto interessanti.

wrighizilla 24 aprile 20 23:20

ops.. ho dimenticato le prime 2 stringhe::wacko:

#include <Servo.h>

Servo myservo;

di seguito il resto scritto nel post precedente. :rolleyes:

myservo.attach 10 può essere cambiato di valore in base a quale piedino usate in uscita per il segnale del servo.

vorrei anche poter aggiungere una breve pausa raggiunti i fine corsa, 1 secondo andrebbe bene. sto studiando come fare, se lo sapete aiutatemi per favore :)

wrighizilla 24 aprile 20 23:53

ok almeno questo è stato facile..

questo è lo sketch del servo che ruota in loop con una pausa di 2 secondi sui fine corsa

#include <Servo.h>

Servo myservo;

int pos = 0;

void setup() {
myservo.attach(10); // il 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 sono 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

}


---------------------
per adesso sono arrivato qui.. se sapete come fare per aggiungere quello che manca per comandare il loop dalla ricevente del modello vi sarei riconoscente :)

madqwerty 25 aprile 20 00:10

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

#include <Servo.h>

Servo myServo,
myInput;
int newPos,
oldPos;
bool direzione;

void setup()
{
myServo.attach(10);
myInput.attach(ingresso_ch3);
newPos = 90;
oldPos = 90;
direzione = true;
myservo.write(pos);
}


void loop()
{
oldPos = newPos;

if (myInput.read() < soglia_on_off_ch3)
{
newPos = 90;
direzione = true;
}
else
{
if (direzione)
{
if (newPos < 220)
NewPos++;
else
direzione = false;
}
else
{
if(newPos > -40)
NewPos--;
else
direzione = true;
}

if ( (newPos != oldPos) AND (newPos <= 180) AND (newPos >=0) )
myservo.write(newPos);

delay(25);
}


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

madqwerty 25 aprile 20 00:14

newPos e oldPos ti servono per capire che da un loop all'altro la posizione sia stata ricalcolata, quindi non dare comandi al servo non utili alla causa,

direzione serve per ricordare da un loop all'altro dove stava muovendo

e newPos oltre a 180 e inferiore a 0 ti servono per gestire i delay del servo fermo a dx o sx, tanto il controllo finale non li manderà al servo

scritto così "a sensazione" eh :wink:

wrighizilla 25 aprile 20 01:11

Citazione:

Originalmente inviato da madqwerty (Messaggio 5190588)
newPos e oldPos ti servono per capire che da un loop all'altro la posizione sia stata ricalcolata, quindi non dare comandi al servo non utili alla causa,

direzione serve per ricordare da un loop all'altro dove stava muovendo

e newPos oltre a 180 e inferiore a 0 ti servono per gestire i delay del servo fermo a dx o sx, tanto il controllo finale non li manderà al servo

scritto così "a sensazione" eh :wink:

grazie :) spiegami meglio questo sketch che hai scritto, così come lo vedo è già utilizzabile con una ricevente? il segnale d'ingresso della rx ch3 a quale piedino della nano lo dovrei collegare?
lo decido io? ad esempio nella parentesi (ingresso_ch3) scrivo 8 e poi collego la rx al piedino 8?
inoltre non ritrovo scritto un delay di 2 secondi sui fine corsa comunque dopo lo carico e lo studio meglio.

italo.driussi 25 aprile 20 10:53

Punto di partenza

#include <Servo.h>
Servo myservo;
int rxpulse = 1500;
int maxsx = 45; //-- tarare
int maxdx = 135; //-- tarare
int pservo = 90;
void setup() {
myservo.attach(9);
pinMode(3, INPUT); //-- legge RX
}

void loop() {
rxpulse = pulseIn(3, HIGH);
if (rxpulse > 1700)
{
myservo.write(90);
delay(200);
}
else
{
for (int n = maxsx; n <= maxdx; n++) {
myservo.write(n);
delay(50);
}

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

wrighizilla 25 aprile 20 11:09

Citazione:

Originalmente inviato da madqwerty (Messaggio 5190588)
newPos e oldPos ti servono per capire che da un loop all'altro la posizione sia stata ricalcolata, quindi non dare comandi al servo non utili alla causa,

direzione serve per ricordare da un loop all'altro dove stava muovendo

e newPos oltre a 180 e inferiore a 0 ti servono per gestire i delay del servo fermo a dx o sx, tanto il controllo finale non li manderà al servo

scritto così "a sensazione" eh :wink:

non mi compila il tuo sketch. mi da errore alla fine: myservo.write(newPos);
ho provato a inserire un valore numerico ma rimane l'errore myservo not declared
abbi pazienza è certamente banale ma ancora non sono capace di passare oltre

intanto sul serial monitor ho testato i valori ottenuti dalla nano dalla ricevente.
le 2 posizioni del canale ausiliario sono 1100 e 1904 ora non so dire ancora quale delle 2 sarà il loop. al canale servo ho assegnato il piedino 10 mentre l'ingresso del segnale è al piedino 8

wrighizilla 25 aprile 20 11:27

Citazione:

Originalmente inviato da italo.driussi (Messaggio 5190630)
Punto di partenza

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:

wrighizilla 25 aprile 20 11:39

Italo, a cosa serve la stringa
myservo.write(90);
delay(200);

il 200 a cosa fa riferimento?


Tutti gli orari sono GMT +2. Adesso sono le 22:38.

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