tester per valvola proporzionale

Buon giorno a tutti,
come ho scritto in un altro post stavo lavorando per realizzare un circuito che comandasse una valvola proporzionale per testarne l'effettiva funzionalità. Per essere più specifico ho avuto l'esigenza di questo dispositivo in quanto nell'ambito lavorativo dovevamo essere sicuri di installare valvole sicuramente funzionanti.
Il "problema" è sorto nel momento in cui si è scoperto che queste valvole erano proporzionali al duty cycle applicato con una frequenza di circa 110Hz.
Alla fine cercando un po' qua ed un po' là ho realizzato un circuito funzionante che si adatta benissimo alle esigenze iniziali, ho inserito un LCD grafico per visualizzare le varie informazioni, un rotary encoder per settare la pressione di riferimento ed un sensore di pressione per avere un valore da comparare. Il sensore di pressione ha un'uscita analogica con un range da 0 a 10V, perciò è stato necessario inserire un partitore resistivo.
Le specifiche della vavola in questione, oltre a quelle già elencate, sono:
pressione di lavoro 0 - 10 Bar
Segnale di feedback a pressione raggiunta (+/- 200mBar).

L'utilizzo di questo "tester" non è sicuramente di interesse comune ai più, però come consuetudine del forum voglio rendere pubblico questo "esperimento" (non si sa mai che qualcuno in giro.......),postando oltre allo sketch anche gli schemi elettrici, i master per le pcb ed alcune immagini di come sono venute le schede. Il tutto è poi stato assemblato in una scatoletta "elettrica" alla quale si è voluto installare una piastra dove viene fissata la valvola in prova. Del prodotto finito non ho al momento foto disponibili, ma se qualcuno fosse interessato sarò felicissimo di postarle più avanti.

Inoltre mi farebbe piacere sapere dagli utenti più esperti se lo sketch postato presenta errori strutturali o se necessita di snellimenti in alcuni punti, così da aiutarmi a sistemare come si deve le cose.

Grazie
Meluino

P.S. :
Se ci sono dei demeriti nel lavoro eseguito, quelli sono tutti miei, però è anche vero che se ci sono dei meriti questi devono essere condivisi, infatti dallo schema alle piste PCB devo ringraziare Antonio, un mago ad utilizzare EAGLE. :wink:

cartella_progetto.zip (2.95 MB)

Per chi non volesse scaricare l'allegato posto qui solo lo sketch, non l'ho potuto fare prima perché eccedevo nel numero di caratteri

 /*Comando valvole proporzionali con modifica del duty cycle
  
  Questo sketch serve per testare vavole proporzionali che hanno
  un range di pressione da 0 a 10 Bar con un comando in
  duty cycle che varia dal 4% al 100%.
  Nello sketh la pressione massima è limitata a 8 Bar in quanto la pressione
  di rete non supera gli 8.6 Bar.
  Nello sketch è inserito un controllo sulla differenza di pressione tra set
  e feedback, questo serve per evitare che venga impostata una pressione 
  troppo alta senza che la valvola sia effettivamente collegata. Questo controllo
  è bypassabile utilizzando il jumper collegato al pin 9.
  La libreria "I2C_graphical_LCD_display.h" è stata scaricata dal 
  link: http://www.gammon.com.au/forum/?id=10940 .
  
  */

int sensPres= 0;               //sensore di pressione
int barGraph =0;               //barra grafica 
const int pinConf =10;         //pin segnale di conferma valvola
int valConf = 0;              //valore del pin 9
int bypass = 9;               // pin per bypass protezione comando valvola
int valBy =0;                 //valore del pin 8
int state =0;

int encoderPin1 = 2;         // pin per encoder (aumentare)
int encoderPin2 = 3;         // pin per encoder (diminuire)
int ledPin = 17;             // pin per uscita led sul risultato della comparazione
                             // tra set e feedback
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue =0;
int lastMSB =0;
int lastLSB =0;
char buf [20];
char buf2 [20];
#include <Wire.h>
#include <SPI.h>
#include <I2C_graphical_LCD_display.h>
I2C_graphical_LCD_display lcd;

// preparazione dell'immagine legata al seganle di conferma della valvola

byte picture [] PROGMEM = {                          
 0xF0, 0x0c, 0x02, 0x01, 0x19, 0x19, 0x01, 0x81, 
 0x81, 0x01, 0x19, 0x19, 0x01, 0x02, 0x0c, 0xF0,
};
byte picture2 [] PROGMEM = {
 0x0F, 0x30, 0x40, 0x80, 0x84, 0x88, 0x90, 0x90,  
 0x90, 0x90, 0x88, 0x84, 0x80, 0x40, 0x30, 0x0F,
};
byte picture3 [] PROGMEM = {
 0x0F, 0xf3, 0xfd, 0xfe, 0xe6, 0xe6, 0xfe, 0x7e,
 0x7e, 0xfe, 0xe6, 0xe6, 0xfe, 0xfd, 0xf3, 0x0F,
};
byte picture4 [] PROGMEM = {
 0xF0, 0xcf, 0xbf, 0x7f, 0x7b, 0x77, 0x6f, 0x6f,
 0x6f, 0x6f, 0x77, 0x7b, 0x7f, 0xbf, 0xcf, 0xF0,
};




void setup(){
  
  lcd.begin ();
  lcd.gotoxy(0, 8);        
  lcd.string("Set :",true);         //scritura Set sul display (evidenziata)
  lcd.gotoxy(72, 8);
  lcd.string("Bar",false);          //scrittura Bar sul display
  lcd.gotoxy(0, 40);
  lcd.string("Feedback :",true);   //scrittura Feedback sul display (evidenziata)
  lcd.gotoxy(104, 40);
  lcd.string("Bar",false);         //scrittura Bar sul display
  lcd.frameRect (7, 22, 115, 33, 1, 1);  // crea un rettangolo sul display
  
  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  pinMode(11, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(pinConf, INPUT);
  pinMode(bypass, INPUT);

  digitalWrite(encoderPin1, HIGH);
  digitalWrite(encoderPin2, HIGH);
  analogWrite(11, LOW);
  
  attachInterrupt (0, updateEncoder, CHANGE);   //interrupt sul pin 2, qualsiasi variazione di valore attiverà la funzione
  attachInterrupt (1, updateEncoder, CHANGE);   //interrupt sul pin 3, qualsiasi variazione di valore attiverà la funzione
  
   
}

// comandi per la preparazione dei pin PWM a lavorare con una frequenza 
//differente da quella impostata di default

void setPwmFrequency(int pin, int divisor){              
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
    case 1: mode = 0x01; break;
    case 8: mode = 0x02; break;
    case 64: mode = 0x03; break;
    case 256: mode = 0x04; break;
    case 1024: mode = 0x05; break;
    default: return;
  }
  if(pin == 5 || pin == 6) {
    TCCR0B = TCCR0B & 0b11111000 | mode;
  }else{
    TCCR1B = TCCR1B & 0b11111000 | mode;
  }
} else if(pin == 3 || pin == 11){
  switch(divisor) {
    case 1: mode = 0x01; break;
    case 8: mode = 0x02; break;
    case 32: mode = 0x03; break;
    case 64: mode = 0x04; break;
    case 128: mode = 0x05; break;
    case 256: mode = 0x06; break;
    case 1024: mode = 0x07; break;
    default: return;
  }
  TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}


void loop(){
  
  setPwmFrequency(11,256);            //scelta del pin 11 a lavorare nel modo 0x06 (122Hz)
  valBy= digitalRead(bypass);         //lettura digitale del pin 8
  
  valConf =digitalRead (pinConf);     //lettura del segnale di conferma della valvola
  
  if (valConf == LOW){
    state = 1- state;
  }
  if (state == 1){
  
  // ogni volta che il pin rileva un segnale basso cambia l'immagine visualizzata
  
  lcd.clear(112,48,127,63,0);    
  lcd.gotoxy (112, 48);
  lcd.blit (picture, sizeof picture);
  lcd.gotoxy (112, 56);
  lcd.blit (picture2, sizeof picture);
  }else{
  lcd.clear(112,48,127,63,0);
  lcd.gotoxy (112, 48);
  lcd.blit (picture3, sizeof picture);
  lcd.gotoxy (112, 56);
  lcd.blit (picture4, sizeof picture);
  }
  
  if( encoderValue > 190 )  { encoderValue = 190; }     //viene dato un valore massimo a encoderValue
  if( encoderValue < 10 )  { encoderValue = 10; }         //viene dato un valore minimo a encoderValue
  
  if ((encoderValue-sensPres < 35) || (valBy == LOW)){  //controllo della differenza di pressione o del pin 8,
                                                        //se una delle due condizioni fosse vera
    analogWrite(11, encoderValue);                      //sul pin 11 si avrebbe un uscita PWM uguale al valore
                                                        //di encoderValue   
  }else{                                                // altrimenti
  encoderValue = 10;                                     //il valore di encodeValue viene portato a 10
}                                    
  sensPres= analogRead(1);                              //viene letto il valore del sensore di pressione
  
  lcd.gotoxy (32, 8);
  lcd.clear (32, 8, 63, 15);
  
  float set = float(encoderValue-10);                  //encoderValue viene trasformato in un valore float 
  float x = (set*8)/180;                               //viene eseguito il calcolo per trasformare i bit in valore di pressione
  dtostrf(x,2,2, buf);                                  //viene preparata la stringa da visualizzare sul display
  lcd.string (buf);                                     //viene visualizzata la stringa sul display
  
  lcd.clear (10,24,sensPres /10+10,29,0xFF);            //visualizzazione della barra grafica
  lcd.clear (sensPres /10+11,24,113,29,0);              //visualizzazione della barra grafica
  
  lcd.gotoxy (64, 40);
  lcd.clear (64, 40, 95, 47);
  float pressione = float (sensPres);                    //sensPres viene trasformato in un valore float
  pressione= (pressione/4)*10/255;                       //viene eseguito il calcolo per trasformare i bit in Bar
  
  dtostrf(pressione,2,2, buf2);                          //viene preparata la stringa da visualizzare sul display
  lcd.string (buf2);    //viene visualizzata la stringa sul display
  
  if (((encoderValue - (sensPres/4)) >= -10) && ((encoderValue - (sensPres/4)) <= 10)){  //viene eseguita una comparazione, se il set ed il feedback sono all'interno
                                                                                         //di un determinato range
    digitalWrite(ledPin, HIGH);                         //l'uscita del led sarà portata alta
  } else {                                              //altrimenti
    digitalWrite(ledPin, LOW);                          //verrà portata bassa
  }
  delay(100);
}

// lettura del senso di rotazione dell'enoder e generazione del valore di encoderValue

void updateEncoder(){
  int MSB = digitalRead(encoderPin1);
  int LSB = digitalRead(encoderPin2);
  
  int encoded = (MSB << 1)  |LSB;
  int sum = (lastEncoded << 2)  |encoded;
  
  if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
  encoderValue ++;

if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
  encoderValue --;

lastEncoded = encoded;
}

Buon giorno, so che non è mai bello "rinfrescare" un topic, soprattutto se a quanto sembra non ha destato interesse da parte di qualcuno, però voglio ribadire la richiesta di controllo dello sketch.
Vorrei capire se quello che ho scritto è contorto e se vi sono strade migliori per fare quello che ho fatto, nello specifico capire se io per arrivare da un punto A ad un punto B ho fatto il giro del mondo e imparare le varie tecniche.
Mi scuso per l'insistenza

Meluino

Esamino solo l'hardware e non il software: metti un condensatore da 100N tra pin 21 e gnd del MC, e una resistenza da 22-47 ohm tra pin 20 e vcc

OK2 dovrebbe ricevere il Segnale di feedback a pressione raggiunta (+/- 200mBar). ?

icio:
Esamino solo l'hardware e non il software: metti un condensatore da 100N tra pin 21 e gnd del MC, e una resistenza da 22-47 ohm tra pin 20 e vcc

Ok provvederò ad integrare quanto detto, però vorrei sapere il significato di questi accorgimenti! :cold_sweat:

icio:
OK2 dovrebbe ricevere il Segnale di feedback a pressione raggiunta (+/- 200mBar). ?

Sì, quello che su schema è chiamato OK2 è il segnale di conferma, praticamente la valvola ha un'uscita sempre alta (24V) e ogni volta che raggiunge la pressione di set manda a 0 questa uscita per qualche mS.

Lo scopo è quello di rendere un pò più stabile la tensione ri rifermimento del ADC, sono modifiche consigliate da atmel.
Hai fatto un buon lavoro, una bella scheda display/encoder , curato sia la progettazione che la realizzazione,
a quanto sembra la valvola che hai usato ha dell'elettronica a bordo, hai il DS dell'elettrovalvola?
Da quello che ho capito, la soglia di pressione dove si attiva il segnale di feedback eregolabile meccanicamente oppure tramite l'elettronica a bordo della valvola, o sbaglio?

Da quello che ho capito, la soglia di pressione dove si attiva il segnale di feedback eregolabile meccanicamente oppure tramite l'elettronica a bordo della valvola, o sbaglio?

Con segnale di feedback intendi il famoso OK2? Se ho ben capito, c'è una sorta di pressostato all'interno che va a saldarsi direttamente sulla scheda, immagino che poi il segnale venga utilizzato anche per rimandare quel feedback di cui parlavi.

a quanto sembra la valvola che hai usato ha dell'elettronica a bordo, hai il DS dell'elettrovalvola?

La valvola è una Bosch Rexroth modello R414000645, ho postato un'immagine. Per il DS devo dirti che in rete non abbiamo trovato nulla su questa specifica valvola, o meglio, Bosch rilascia un DS dove vengono elencate tutte le valvole di questa serie, ma non si trova quella con numero finale 645. Sono tutte valvole comandate o in corrente o in tensione ma nessuna menzione su quella usata da me, penso che sia stata fatta ad hoc per il costruttore della macchina su cui è montata, forse per motivi più commerciali $) che tecnici.

Hai fatto un buon lavoro, una bella scheda display/encoder , curato sia la progettazione che la realizzazione,

VERAMENTE :astonished:, questo tuo commento mi fa molto piacere, in base ai giudizi tecnici ed al grado di preparazione che dimostri nei vari post la cosa mi lusinga molto, però voglio ribadire che il merito (se c'è) è in condivisione.

Sullo sketch nessun commento?

Ho esaminato qualcosa su queste valvole, Il fatto che ti funzioni bene con un pwm di 110hz indica che il primo stadio dell'ingresso 0-10V è costituito da un integratore quindi secondo me puoi aumentare la frequenza fino a 250-270hz, è possibile che vada anche meglio, cioè che possa essere ancora più stabile, ma non andare sotto i 80hz

il tuo modello ....645 ha sempre un connettore circolare a 5 poli?

Non uso il compilatore arduino, ma qualche scheda arduino sì, le uso con avr-gcc distribuzione winavr per avrstudio4 quindi non posso aiutarti con lo sketch perchè non conosco bene le librerie, penso comunque che il prossimo anno farò qualcosa anche con il compilatore arduino visto che con le librerie ethernet sembra essere forte.

Sì, il modello 645 ha un connettore a 5 poli:

  1. 24V DC
  2. ACTUAL VALUE
  3. 0V
  4. NOMINAL VALUE
  5. FE

Per quanto concerne la frequenza si è cercato di fare un tester che si avvicinasse il più possibile alle condizioni di lavoro della valvola sulla macchina. Dall'ATMega utilizzo una frequenza di 122 Hz, è quanto più vicino riesco ad utilizzare seguendo quanto ho trovato in rete e quanto riportato sul Playground al link http://playground.arduino.cc/Code/PwmFrequency#.Uxkaytz6Skg!
Calcola che in macchina la valvola fa parte di un gruppo di 4 comandate in diverse fasi in modo a volte anche troppo rapido, è per questo che una volta montate, in presenza di un problema risulta complicato capire se il difetto è causato da una delle valvole. Sino ad oggi si faceva pima a cambiarle e vedere cosa succedeva, ma l'ultima volta c'era il dubbio di aver sostituito una valvola guasta con un'altra guasta.
In più, per complicare il tutto, il gruppo è comandato da una scheda Bosch rexroth che a sua volta viene gestita da un PLC ABB tramite bus CS31!! :cold_sweat:
Decisamente troppo per noi comuni mortali!!

Interessante!
Darò una lettura al programma.
Quanto costa una valvola del genere?

Ho esaminato il codice, per quello che posso capire
-setPwmFrequency dovrebbe essere messa nel setup
-hai scritto che il pwm lo imposti dal4% al 100% ma mi sembra che il massimo sia il 75%

Questo pezzo non mi è chiaro:

  if ((encoderValue-sensPres < 35) || (valBy == LOW)){  //controllo della differenza di pressione o del pin 8,
                                                        //se una delle due condizioni fosse vera
    analogWrite(11, encoderValue);                      //sul pin 11 si avrebbe un uscita PWM uguale al valore
                                                        //di encoderValue   
  }else{                                                // altrimenti
  encoderValue = 10;                                     //il valore di encodeValue viene portato a 10
}

potrebbe essere:

  if (((encoderValue-(sensPres/4)) < 35) || (valBy == LOW)){  //controllo della differenza di pressione o del pin 8,
                                                        //se una delle due condizioni fosse vera
    analogWrite(11, encoderValue);                      //sul pin 11 si avrebbe un uscita PWM uguale al valore
                                                        //di encoderValue   
  }else{                                                // altrimenti
  encoderValue = (sensPres/4) +34;                                     //oppure +30
}

la prima modifica per portare l'adc da 10 a 8 bit come hai fatto anche dopo , la seconda modifica per evitare la repentina diminuzione della pressione impostata se ruoti l'encoder verso il + troppo rapidamente

Il resto non si poteva fare meglio di così

la valvola costa 220 euro

Vero, se non cambi più frequenza, setPwm lo puoi mettere nel setup.
Inoltre sensPres/4 puoi sostituirlo con un sensPres>>2.
Lo shift a DX di 2 bit equivale ad una divisione per 4, con il vantaggio che l'operazione è molto più veloce e meno esosa in termini di risorse (la divisione in hardware non è presente negli Avr).

I pin dichiarali così:

const byte pin = numero;

Così il compilatore mette il numero di pin come costante in flash e non usa memoria Ram.
Gli include di librerie mettili sempre in cima allo sketch.
Come var di stato, al posto di usare un int per "state" usa un byte e cambiagli valore con uno XOR, risparmi un byte di Ram e semplifichi il processo:

byte state = 1;
state ^= 1; //diventa 0
state ^= 1; //torna ad 1

Poi altro non ho guardato.

Il compilatore avr-gcc quando incontra una roba tipo value/4 lo compila in assembler proprio con 2 shift, l'ho verificato personalmente, non sò come lo fà il compilatore arduino...

icio:
-hai scritto che il pwm lo imposti dal4% al 100% ma mi sembra che il massimo sia il 75%

Sì effettivamente ho impostato un limite diverso dal 100% in quanto non c'è la possibilità fisica di raggiungere i 10 Bar, la dicitura nel commento è errata per il semplice fatto che non mi sono accorto dell'errore. :smiley:

icio:

  if (((encoderValue-(sensPres/4)) < 35) || (valBy == LOW)){  //controllo della differenza di pressione o del pin 8,

//se una delle due condizioni fosse vera
    analogWrite(11, encoderValue);                      //sul pin 11 si avrebbe un uscita PWM uguale al valore
                                                        //di encoderValue 
  }else{                                                // altrimenti
  encoderValue = (sensPres/4) +34;                                    //oppure +30
}



la prima modifica per portare l'adc da 10 a 8 bit come hai fatto anche dopo , la seconda modifica per evitare la repentina diminuzione della pressione impostata se ruoti l'encoder verso il + troppo rapidamente

Questo suggerimento non mi è chiaro :blush:, ho insertio questo pezzo di sketch perché se qualcuno imposta un valore per esempio di 5 bar e poi attacca la connessione alla valvola si potrebbe creare una situazione "pericolosa", con questo pezzo si evita di andare oltre una certa pressione al di là della quale il set viene riportato a 0 Bar, ovvero encoderValue=10. Però probabilmente non colgo io il significato della modifica.

leo72:
Vero, se non cambi più frequenza, setPwm lo puoi mettere nel setup.
Inoltre sensPres/4 puoi sostituirlo con un sensPres>>2.
Lo shift a DX di 2 bit equivale ad una divisione per 4, con il vantaggio che l'operazione è molto più veloce e meno esosa in termini di risorse (la divisione in hardware non è presente negli Avr).

OK, è questo che voglio capire, ovvero se esistono, ero certo che ve ne fossero, metodi per risparmiare risorse!!
Purtroppo i metodi che sono abituato ad usare sono quelli che ho messo nello sketch, sinceramente ho un po' di difficoltà a capire questi suggerimenti, l'unico modo è provare e provare, grazie :wink: .

Per quanto riguarda il costo della valvola il mio capo mi ha detto che si aggira attorno alle 200€, se icio ha dato un valore così preciso probabilmente ha qualche informazione in più!!

icio:
Il resto non si poteva fare meglio di così

Troppo buono!!

Un metodo semplice per vedere quanto consuma una istruzione è quello di: mettere istruzione , compilare e vedere flash occupata, togliere istruzione, compilare e vedere flash occupata, se la differenza è minima prende poche istruzioni assembler, se la differenza è grande impiega una funzione di una libreria, questo test è valido solo quando il compilatore incontra per la prima volta una istruzione/funzione quindi sono test che si fanno quando si comincia a scrivere un programma nuovo

encoderValue-sensPres < 35 ; //spiega: perchè non hai portato a 8 bit l'adc con sensPres/4 ? e come hai scelto il valore 35 ? A quanto volevi impostare lo scarto , a 343millibar o 1372millibar?

va bene lo stesso ma è come se avessi confrontato con circa 9 ,

siccome alla fine del loop c'è un delay(100); 100msec presuppongo , significa che se incrementi di 9 unità l'encoder entro 100msec cioè prima che venga eseguita la analogWrite(11, encoderValue); allora
il valore encoderValue tornerebbe a 10

quanti impulsi per giro ha l'encoder ?

icio:
Un metodo semplice per vedere quanto consuma una istruzione è quello di: mettere istruzione , compilare e vedere flash occupata, togliere istruzione, compilare e vedere flash occupata, se la differenza è minima prende poche istruzioni assembler, se la differenza è grande impiega una funzione di una libreria, questo test è valido solo quando il compilatore incontra per la prima volta una istruzione/funzione quindi sono test che si fanno quando si comincia a scrivere un programma nuovo

Il metodo indicato sicuramente lo utilizzerò d'ora in poi per i progetti futuri, il problema è che nel momento in cui ci si accorge di aver messo un funzione troppo onerosa bisogna anche essere in grado di avere alternative.....e qui iniziano le mie difficoltà! :cold_sweat:

Per quanto riguarda il fatto di non aver portato a 8 bit l'adc la risposta è semplice, errore (orrore) di distrazione, lo sketch postato è stato modificato tante di quelle volte (come potete ben immaginare) che all'interno qualche errore è rimasto, però mi consolo col fatto che siamo ancora alla fase "beta"!! :grin: :grin:
Comunque ho capito l'intenzione della tua modifica.

Il valore 35 è un valore impostato grossolanamente, mi sembra se non ricordo male che questa funzione interviene con un scarto di 1.7 Bar, non mi ricordo se con l'errore nello sketch o meno, comunque l'intenzione è di impostare una differenza adeguata facendo più test, ma credo che vorrò tenermi attorno ad 1.5 Bar.

L'encoder, anche qui se non ricordo male (non sono al lavoro), dovrebbe avere 18 impulsi al giro.

leo72:
I pin dichiarali così:

const byte pin = numero;

Così il compilatore mette il numero di pin come costante in flash e non usa memoria Ram.

Leo, scusa la mia ignoranza, se ero al lavoro con il circuito in mano avrei fatto delle prove prima di chiedere, ma per capire i tuoi consigli volevo sapere se quanto scritto sotto è giusto:

da

int valConf=0;

a

const int byte valConf=0

Intendi così?

Come var di stato, al posto di usare un int per "state" usa un byte e cambiagli valore con uno XOR, risparmi un byte di Ram e semplifichi il processo:

byte state = 1;

state ^= 1; //diventa 0
state ^= 1; //torna ad 1

questo consiglio non riesco a svilupparlo!! :disappointed_relieved:

Mmmmmhhh.....mi sa che ho scritto una caspiterata vero? Un valore o è int o è byte, tu intendevi solo di aggiunger const durante la dichiarazione. Giusto?!