Go Down

Topic: Problema con memorizzazione variabili (Read 640 times) previous topic - next topic

Silverdog63

Jan 28, 2013, 09:44 pm Last Edit: Jan 29, 2013, 12:32 pm by Silverdog63 Reason: 1
Ciao,
Il mio sketch imposta una variabile "QuotaZ" tramite un menu (MENWIZ),
Code: [Select]
   s3=menu.addMenu(MW_VAR,s2,F("Altezza Assoluta"));
     s3->addVar(MW_AUTO_INT,&QuotaZ,0,100,1);
       s3=menu.addMenu(MW_VAR,s2,F("QuotaAssoluta"));
       s3->addVar(MW_ACTION,QuotaAssoluta);

Per poi azionare un motore passo passo che mi muove l'altezza di una Sega/Pialla o Fresa.
Volendo eseguire uno spostamento assoluto (ovvero posizionare la lama/fresa a una quota che va da 0 a100 mm dal piano) devo eseguire un calcolo che è il seguente:
SpostamentoMotore = (NuovaQuotaZ - VecchiaQuotaZ)*50passi (50passi è il numero passi per fare 1mm) in pratica se la mia lama è a 20mm di altezza e voglio portarla a 70mm dovrò eseguire: (70mm-20mm)*50passi  .... cioè 2500passi.
Il mio problema è che sono incapace con la programmazione e non so come salvare la mia "QuotaZ" precedente in "VecchiaQuotaZ".
ho buttato giù questo abbozzo, ma ovviamente non è corretto.
Code: [Select]

int QuotaZ = 0;
int VecchiaQuotaZ;
int NuovaQuotaZ;


void QuotaAssoluta(){
if (QuotaZ > 0) QuotaZ = VecchiaQuotaZ;
//VecchiaQuotaZ = QuotaZ;  // QuotaZ variable impostata nel menu
NuovaQuotaZ = (QuotaZ - VecchiaQuotaZ);
stepper1.moveTo(NuovaQuotaZ * 50); // muove l'altezza di "QuotaZ" mm
lcd.print ("Altezza mm ");
lcd.print (QuotaZ);
delay (5000);
}

Qualcuno ha da darmi qualche dritta ?
Grazie

PaoloP

Dovresti ragionare sempre in termini assoluti.
Come variabili ti conviene usare Quota, VecchiaQuota e Spostamento.
VecchiaQuota è la quota corrente. All'inizio, all'accensione, VecchiaQuota deve avere il valore di partenza della lama/fresa: mettiamo che sia 0.
Code: [Select]
int QuotaZ = 0;
int VecchiaQuotaZ = 0;
int SpostamentoZ;


Dopo il movimento da VecchiaQuota a Quota, allora assegni il valore a VecchiaQuota. Credo che lo spostamento possa essere anche negativo.
Code: [Select]
void QuotaAssoluta(){
SpostamentoZ == (QuotaZ - VecchiaQuotaZ);
stepper1.moveTo(SpostamentoZ * 50); // muove l'altezza di "QuotaZ" mm
lcd.print ("Altezza mm ");
lcd.print (QuotaZ);
VecchiaQuotaZ == QuotaZ;
}

Silverdog63

Paolo grazie !
è un aiuto prezioso ! mi si sta illuminando il processo.
Praticamente ci sono 2 tempi da considerare, uno all'avvio dove VecchiaQuota viene definita ed infatti è quella a cui il calcolo deve sempre fare riferimento, (forse come hai accennato sarebbe più logico nomnarla "QuotaCorrente") e in un secondo tempo all'interno dell'azione "void QuotaAssoluta"  al termine dell'azione viene ridefinita: "VecchiaQuotaZ == QuotaZ;" ovvero prende il valore della quota corrente.(si penso che sia meglio definirla "Quota Corrente" è più preciso).
Come hai intuito il valore può essere sia positivo che negativo.
Ad esempio: all'accensione azzero la mia Sega, poi la sposto a 30 mm di quota, sucessivamente voglio portare il taglio a 80 mm, quindi dalla quota corrente di 30 passo ad 80 spostandomi di +50mm (80-30) ...
successivamente ho bisogno di portare la lama a 20mm quindi (20-80)= -60 mm quindi mi sposterò di -60mm ... WOW mi sembra perfettamente logico (alla fine dello spostamento la mia quota corrente è 20mm e "VecchiaQuotaZ == QuotaZ" lo memorizza !!
GRAZIE !!! ho inserito i nuovi codici e lo skech fila liscio .... ora appena ho Arduino tra le mani provo.
Ciao

Silverdog63

Code: [Select]
SpostamentoZ = (QuotaZ - VecchiaQuotaZ);
VecchiaQuotaZ = QuotaZ;

penso ci vada un solo = vero ?

tapirinho

x l'assegnazione un simbolo =, se ne metti 2 diventa una comparazione

Ciao



Silverdog63

Paolo, colpa mia ... li avevo messi nel mio sketch di partenza (ora li ho levati)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy