Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 02 maggio 20, 20:06   #41 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
niente via.. arrivo fino qui.

ho provato una marea di cose ma nessuna ha funzionato.

ho messo un pochino di ordine nel testo e ho cambiato alcuni nomi per rendere più chiaro lo sketch.

funziona tutto come dovrebbe, compresa la possibilità di dare un pochino di gas a bassa velocità mantenendo tutto lo sterzo (cambiando valore a Slowlimit)
anche la correzione funziona perfettamente adesso, inversamente proporzionale e fino a chiudere completamente la corsa del servo posteriore (cambiando valore a Max_gain)

ma se cambio i valori di Slowlimit e Max_gain si spostano anche i finecorsa Postdx e Postsx obbligandomi a reimpostarli da capo di conseguenza alle modifiche.

rompe un pò perchè sarebbero valori che dovrebbero restare fissi visto che dipendono dalla effettiva corsa di sterzo a disposizione, anche solo cambiando i parametri si rischia di allargare la corsa molto oltre quella che lo sterzo meccanicamente permette.
sarebbe uno dei parametri da impostare per primo e poi dimenticare..

non so.. manca qualche parentesi oppure va scritto meglio qualcosa ma non trovo l'inghippo

riporto lo sketch rivisto e corretto al meglio delle sue attuali possibilità

#define Neutral 1500 // -- minimum forward signal
#define Maxspeed 2000 // -- maximum forward signal
#define Antsx 1000 // -- in front servo signal sx
#define Antdx 2000 // -- in front servo signal dx
#define Postsx 5 // out rear servo sx endpoint if inverted with postdx it reverse
#define Postdx 175 //-- out rear servo dx endpoint if inverted with postsx it reverse
#define Center 0 //-- add or subtract xx value to center steering
#define Tolerance 3 //-- if poor quality servo vibrates try 5
#define Max_gain 100 //-- gain steering reduction by throttle if reverse add -
#define Slowlimit 1700 //-- slow forward without endpoint correction
#include <Servo.h>
Servo myservo;
unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gain;
unsigned int NewPos, OldPos;
void setup() {
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);
if (Gaspulse > Slowlimit);
else
Gaspulse = constrain (Slowlimit, Neutral, Maxspeed);
Gain = map(Gaspulse, Neutral, Maxspeed, 0, Max_gain);
NewPos = map(Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));
if (abs(NewPos - OldPos)> Tolerance) {
OldPos = NewPos;
myservo.write(NewPos + Center);
}
}
wrighizilla non è collegato   Rispondi citando
Vecchio 03 maggio 20, 10:44   #42 (permalink)  Top
User
 
L'avatar di nicolap
 
Data registr.: 02-10-2019
Residenza: Orvieto
Messaggi: 293
Ciao, mi sono fatto un'idea di quali potrebbe essere il problema... Riassumo: il valore dei canali letto dalla rx è un valore espresso in microsecondi mentre il comando "myservo.write()" richiede di passare un valore espresso in gradi di rotazione. Prova a lavorare solo con valori in microsecondi e utilizza il comando "myservo.wtitemicroseconds(newPos).


Inviato dal mio PRA-LX1 utilizzando Tapatalk
nicolap non è collegato   Rispondi citando
Vecchio 03 maggio 20, 11:45   #43 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da nicolap Visualizza messaggio
Ciao, mi sono fatto un'idea di quali potrebbe essere il problema... Riassumo: il valore dei canali letto dalla rx è un valore espresso in microsecondi mentre il comando "myservo.write()" richiede di passare un valore espresso in gradi di rotazione. Prova a lavorare solo con valori in microsecondi e utilizza il comando "myservo.wtitemicroseconds(newPos).


Inviato dal mio PRA-LX1 utilizzando Tapatalk
aspetta mi manca un passaggio: cosa significa "lavorare solo con valori in microsecondi"?

devo sostituire quali valori? Postdx Postsx che adesso sono 5 -175 ? con ( a caso 1100-1900) ? ce ne sono altri che mi sfuggono? max_gain?


il nodo che non riesco a sciogliere è:

se io uso un define significa che Postsx e Postdx sono definiti, non si toccano. non sono variabili in gioco ma valori definiti.

allora perchè cambiando i valori di Slowlimit e Max_gain ( altri 2 valori definiti ) vedo accorciarsi o allungarsi la corsa del servo appena carico il programma con la radio in neutro?

cambiando Slowlimit mi aspetterei di avere solo maggiore corsa del gas a disposizione per usare lo sterzo posteriore con tutta la corsa definita da Postsx Postdx

cambiando Max_gain mi aspetterei di veder cambiare l'ampiezza della corsa disponibile del servo quando arriva a maxspeed ovvero tutto gas, serve solo a scegliere se arrivati a tutto gas avere chiusa tutta la corsa o lasciarne una parte utilizzabile.

non mi aspetto ed è spiacevole vedere scombinare il settaggio dei fine corsa che sono stati definiti con 2 valori precisi.

ho scritto male oppure manca qualcosa, magari anche solo un paio di { } ma non c'arrivo.
mi ingrippo sulla questione che i dati in define non dovrebbero venire cambiati dalle risultanti del void loop.

ti ringrazio, adesso provo a trasformare tutto in microseconds. vediamo se me la cavo.

Ultima modifica di wrighizilla : 03 maggio 20 alle ore 11:49
wrighizilla non è collegato   Rispondi citando
Vecchio 03 maggio 20, 12:52   #44 (permalink)  Top
User
 
L'avatar di nicolap
 
Data registr.: 02-10-2019
Residenza: Orvieto
Messaggi: 293
Ciao, ho potuto dare un'occhiata piu approfondita allo sketch e ho notato queste cose:

1)
il ciclo if else scritto come riportato non esegue nessuna operazione, andrebbe invece scritto così:

if (Gaspulse > Slowlimit)
{
operazione da eseguire
}
else
{
operazione da eseguire
}


il ciclo if else comunque non è necessario perché con il comando "constrain" ,il valore di "Gaspulse", rimane sempre entro i limiti da te imposti...e qui ho notato un altro problema, che è probabilmente la causa del cambiamento di valori indesiderato

2)
l'operazione "constrain" per essere utilizzata come vuoi tu dovrebbe essere scritto come segue

Gaspulse = constrain (Gaspulse, Neutral, Maxspeed);

ho sostituito la variabile "Slowlimit" con "Gaspulse" perchè è quest'ultimo valore che deve essere contenuto entro certi limiti...ho scritto variabile riferendomi a "Slowlimit" perché effettivamente lo è...con #define assegni un valore costante a quella variabile ogni volta che compili lo sketch o ogni volta che resetti/avvii l'arduino.


void loop(){
Rxpulse = pulseIn(8, HIGH);
Gaspulse = pulseIn(7, HIGH);
if (Gaspulse > Slowlimit);
else

Gaspulse = constrain (Slowlimit, Neutral, Maxspeed);
Gain = map(Gaspulse, Neutral, Maxspeed, 0, Max_gain);
NewPos = map(Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));
if (abs(NewPos - OldPos)> Tolerance) {
OldPos = NewPos;
myservo.write(NewPos + Center);
}
}

Ora devo andare a pranzo...
nicolap non è collegato   Rispondi citando
Vecchio 03 maggio 20, 13:04   #45 (permalink)  Top
User
 
L'avatar di nicolap
 
Data registr.: 02-10-2019
Residenza: Orvieto
Messaggi: 293
ps…
per funzionare correttamente il valore di Gain dovrebbe essere espresso in gradi mentre il valore max_gain mi pare che sia espresso in microsecondi...se così non fosse allora 100 mi sembra un valore molto alto.
per questo ti avevo parlato di valori in microsecondi e valori in gradi...
buon lavoro!!
nicolap non è collegato   Rispondi citando
Vecchio 03 maggio 20, 13:19   #46 (permalink)  Top
User
 
Data registr.: 03-05-2020
Residenza: milano
Messaggi: 47
Smile

Ciao,
Interessante, a mio modesto parere manca un delay nel loop principale..
Prova anche a mettere 10 ms con delay(10).
Ma non comprenso bene come dovrebbe funzionare, riesci a darmi qualche info?

Io convertirei il sw in una macchina a stati.. ci proviamo?

Sms
Smsteves non è collegato   Rispondi citando
Vecchio 03 maggio 20, 13:47   #47 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da nicolap Visualizza messaggio
ps…
per funzionare correttamente il valore di Gain dovrebbe essere espresso in gradi mentre il valore max_gain mi pare che sia espresso in microsecondi...se così non fosse allora 100 mi sembra un valore molto alto.
per questo ti avevo parlato di valori in microsecondi e valori in gradi...
buon lavoro!!
Max_gain 100 adesso chiude completamente lo sterzo.
80 ne chiude meno ma apre di parecchio gli end point a gas neutro (e retro che si comporta uguale al neutro)
stessa cosa adesso Slowlimit 1700 hai un certo gas per camminare con tutte le 4ws ma chiude moltissimo gli end point a neutro gas 1500 macchina ferma.
se solo metto 1600 perdo metà del gas utile per girare completamente lo sterzo ma apro vistosamente gli end point quasi a 180 gradi.

con write.micros() non ho concluso ancora nulla.. se cambio postdx e postsx in 1000-2000 impazzisce tutto, non funziona più niente nemmeno giocando con max_gain e slowlimit a cambiargli drasticamente i valori .

magari ho scritto male.. dopo pranzo scendo nuovamente nell'ide


Citazione:
Originalmente inviato da Smsteves Visualizza messaggio
Ciao,
Interessante, a mio modesto parere manca un delay nel loop principale..
Prova anche a mettere 10 ms con delay(10).
Ma non comprenso bene come dovrebbe funzionare, riesci a darmi qualche info?

Io convertirei il sw in una macchina a stati.. ci proviamo?

Sms
ehhh? che caspita sono l'sw e una macchina stati?
scusami ma sono solo alla seconda settimana della mia prima elementare l'ignoranza ancora scorre libera dentro di me

Ultima modifica di wrighizilla : 03 maggio 20 alle ore 13:51
wrighizilla non è collegato   Rispondi citando
Vecchio 03 maggio 20, 13:56   #48 (permalink)  Top
User
 
L'avatar di nicolap
 
Data registr.: 02-10-2019
Residenza: Orvieto
Messaggi: 293
Citazione:
Originalmente inviato da nicolap Visualizza messaggio
Ciao, ho potuto dare un'occhiata piu approfondita allo sketch e ho notato queste cose:



1)

il ciclo if else scritto come riportato non esegue nessuna operazione, andrebbe invece scritto così:



if (Gaspulse > Slowlimit)

{

operazione da eseguire

}

else

{

operazione da eseguire

}




il ciclo if else comunque non è necessario perché con il comando "constrain" ,il valore di "Gaspulse", rimane sempre entro i limiti da te imposti...e qui ho notato un altro problema, che è probabilmente la causa del cambiamento di valori indesiderato



2)

l'operazione "constrain" per essere utilizzata come vuoi tu dovrebbe essere scritto come segue



Gaspulse = constrain (Gaspulse, Neutral, Maxspeed);



ho sostituito la variabile "Slowlimit" con "Gaspulse" perchè è quest'ultimo valore che deve essere contenuto entro certi limiti...ho scritto variabile riferendomi a "Slowlimit" perché effettivamente lo è...con #define assegni un valore costante a quella variabile ogni volta che compili lo sketch o ogni volta che resetti/avvii l'arduino.





void loop(){

Rxpulse = pulseIn(8, HIGH);

Gaspulse = pulseIn(7, HIGH);

if (Gaspulse > Slowlimit);

else


Gaspulse = constrain (Slowlimit, Neutral, Maxspeed);

Gain = map(Gaspulse, Neutral, Maxspeed, 0, Max_gain);

NewPos = map(Rxpulse, Antsx, Antdx, (Postsx + Gain), (Postdx - Gain));

if (abs(NewPos - OldPos)> Tolerance) {

OldPos = NewPos;

myservo.write(NewPos + Center);

}

}



Ora devo andare a pranzo...
Avevi letto questo messaggio? Se hai sostituito Slowlimit con Gaspulse come avevo scritto non dovresti avere variazioni indesiderate.
Se metti 100 su max_gain significa che imposti 100 gradi come correzione massima su un lato e 200 gradi tra dx e sx...

Inviato dal mio PRA-LX1 utilizzando Tapatalk
nicolap non è collegato   Rispondi citando
Vecchio 03 maggio 20, 13:59   #49 (permalink)  Top
User
 
Data registr.: 03-05-2020
Residenza: milano
Messaggi: 47


sw = software o sketch

Macchina a stati = una macchina che esegue sempre lo stesso ciclo il ns loop ma con sezioni diverse.

Esempio
1 giro di loop = lettura impulsi da radio
2 giro di loop = calcolo gradi
3 giro di loop = movimento servo
ricomincia..

pulsein ferma il ciclo, quindi non è perfetto per l'uso che tu vorresti fare.

mi descrivi in parole semplici come dovrebbe funzionare ? Ci provo come passatempo

Sms
Smsteves non è collegato   Rispondi citando
Vecchio 03 maggio 20, 14:12   #50 (permalink)  Top
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da Smsteves Visualizza messaggio
Ma non comprenso bene come dovrebbe funzionare, riesci a darmi qualche info?
grazie dell'aiuto

dovrebbe funzionare collegando questa controller al servo posteriore in uscita e al segnale sterzo e gas in entrata.
--------------
l'utente dovrebbe immettere dei dati preliminari che possono essere anche default 1000-2000 per i segnali di entrata sterzo anteriore e gas.. ma volendo anche 1000-2000 per gli endpoint in uscita.

se poi l'utente vuole settare meglio la controller i dati precisi dei segnali in entrata li ricava controllandoli da serial monitor.

gli endpoint li dovrà determinare empiricamente per evitare di sbattere nei limiti meccanici dello sterzo ma se ha fortuna sono gli stessi dell'anteriore 1000-2000.

anche la centratura va trovata in relazione alla meccanica, la squadretta sta su un millerighe e qualche grado di correzione potrebbe essere inevitabile.

questi dati sono una cosa a se stante, sono il setup introduttivo che permettono di passare al setup di guida.
-----------------

i dati che interagiscono con la controller e permettono di settare il tipo di guida sono:

la quantità di gas che puoi dare con tutto lo sterzo aperto 4ws a tutta corsa disponibile, esempio ho tutto lo sterzo posteriore disponibile solo per un 20% di gas avanti.

la riduzione della corsa a tutto gas, posso decidere se avere una macchina senza sterzo posteriore, oppure posso lasciare un margine di sterzo quando il gas è al massimo.. anche tutto volendo ma la feature nasce per evitare di ribaltare per il troppo sterzo quando invece alla fine le 4ws servono solo quando vai piano.
------------------

quindi sarebbero solo Max_gain e Slowspeed le variabili che l'utente potrebbe settare per cambiare stile di guida della macchina.

ora fa tutto questo precisamente come deve funzionare.
eccetto che se tocco quei 2 parametri devo reimpostare la corsa del servo

sembra che la corsa del servo sia rimasta legata, imparentata a variabili che di fatto non la dovrebbero riguardare, non c'è un solo caso nel quale la corsa del servo dovrebbe cambiare in ampiezza allargandosi.

la corsa si deve solo proporzionalmente stringere quando il gas supera una certa soglia e fino ad arrivare al massimo gas (Slowlimit).
si deve solo proporzionalmente ridurre la corsa fino ad un certo grado di ampiezza che può andare da "tutta chiusa" a "niente chiusa" (Max_gain)

Ultima modifica di wrighizilla : 03 maggio 20 alle ore 14:21
wrighizilla non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
buggy da completare BoBoPoP Automodellismo Mot. Scoppio Off-Road 41 18 maggio 16 16:56
monster da completare...! bronto_19 Automodellismo Mot. Elettrico Off-Road 2 22 giugno 10 16:35
Sto costruendo uno schiumino (o tzagi), mi aiutate??? crido96 Aeromodellismo Principianti 72 07 febbraio 10 01:26
Come completare una associated B4? ryan-j Automodellismo Mot. Elettrico On-Road 9 04 maggio 08 10:55



Tutti gli orari sono GMT +2. Adesso sono le 10:42.


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