Go Down

Topic: Problema con memorizzazione variabili (Read 581 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;
}
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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


PaoloP

Si, scusa, mi è sfuggito un doppio = :smiley-roll-sweat:
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Silverdog63

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

Go Up