Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema programmazione encoder rotativo

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Problema programmazione encoder rotativo

Messaggioda Foto Utentemixmaxmaxxx33 » 4 ott 2014, 8:58

Buongiorno a tutti, sono nuovo del mondo della programmazione e avrei bisogno di un aiuto.
Sto programmando un encoder rotativo con ARDUINO e ho trovato tale codice on line , già pronto e bello funzionante.

#define ENC_A 14
#define ENC_B 15
#define ENC_PORT PINC

void setup()
{
/* Setup encoder pins as inputs */
pinMode(ENC_A, INPUT);
digitalWrite(ENC_A, HIGH);
pinMode(ENC_B, INPUT);
digitalWrite(ENC_B, HIGH);
Serial.begin (9600);
Serial.println("Start");
}

void loop()
{
static uint8_t counter = 0; //this variable will be changed by encoder input
int8_t tmpdata;
/**/
tmpdata = read_encoder();
if( tmpdata ) {
Serial.print("Counter value: ");
Serial.println(counter, DEC);
counter += tmpdata;
}
}

/* returns change in encoder state (-1,0,1) */
int8_t read_encoder()
{
static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
static uint8_t old_AB = 0;
/**/
old_AB <<= 2; //remember previous state
old_AB |= ( ENC_PORT & 0x03 ); //add current state
return ( enc_states[( old_AB & 0x0f )]);
}

Il codice va bene ma io avrei bisogno di qualcosa di leggermente diverso.
I dati vengono scritti ad ogni click (il dato nuovo compare solo quando giro la manopola, se la manopola rimane ferma la scrittura si arresta all'ultimo dato rilevato), mentre io avrei bisogno che i dati vengano scritti di continuo, ad una frequenza da me scelta, rilevando ovviamente tutte le variazioni di stato anche...
Oppure che ad ogni dato riguardante la rotazione sia affiancato uno con l'orario in cui è avvenuta (preciso ai millisecondi ad esempio).
Ho provato un po' ma non ne sono venuto fuori, qualcuno può aiutarmi?
Ultima modifica di Foto Utentemixmaxmaxxx33 il 4 ott 2014, 9:35, modificato 1 volta in totale.
Avatar utente
Foto Utentemixmaxmaxxx33
0 2
 
Messaggi: 14
Iscritto il: 1 ott 2014, 15:59
Località: Udine

0
voti

[2] Re: Problema programmazione encoder rotativo

Messaggioda Foto UtenteStefDrums » 4 ott 2014, 9:34

Non ho capito esattamente cosa vuoi fare e cosa l'encoder non fa correttamente.
Hai capito cosa fa il codice (tutto) ?
Avatar utente
Foto UtenteStefDrums
240 1 6 9
Stabilizzato
Stabilizzato
 
Messaggi: 367
Iscritto il: 20 feb 2013, 14:15

0
voti

[3] Re: Problema programmazione encoder rotativo

Messaggioda Foto Utentemixmaxmaxxx33 » 4 ott 2014, 9:39

Facciamo prima cosi forse; come faccio ad affiancare ad ogni dato riguardante i click avvenuti sull'encoder una data precisa al millisecondo nel qualè è avvenuta la misurazione (il click rilevato)?
Avatar utente
Foto Utentemixmaxmaxxx33
0 2
 
Messaggi: 14
Iscritto il: 1 ott 2014, 15:59
Località: Udine

0
voti

[4] Re: Problema programmazione encoder rotativo

Messaggioda Foto UtenteStefDrums » 4 ott 2014, 9:43

puoi usare un timer, è una soluzione a costo zero.
In caso poi ti serva avere un controllo più "raffinato" per l'orario, puoi utilizzare un RTC (real time clock).
Avatar utente
Foto UtenteStefDrums
240 1 6 9
Stabilizzato
Stabilizzato
 
Messaggi: 367
Iscritto il: 20 feb 2013, 14:15

0
voti

[5] Re: Problema programmazione encoder rotativo

Messaggioda Foto Utentemixmaxmaxxx33 » 4 ott 2014, 9:45

StefDrums ha scritto:puoi usare un timer, è una soluzione a costo zero.

Ma ARDUINO dovrebbe avere un clock interno...io non so come modificare il codice per sfruttare quel clock come timer.
A me il riferimento temporale mi basta che sia espresso in millisecondi dall'avvio della misurazione, non una data giornaliera precisa (dd/mm/yy hh:mm:ss)
Scusate la mia ignoranza
Ultima modifica di Foto Utentemixmaxmaxxx33 il 4 ott 2014, 9:51, modificato 1 volta in totale.
Avatar utente
Foto Utentemixmaxmaxxx33
0 2
 
Messaggi: 14
Iscritto il: 1 ott 2014, 15:59
Località: Udine

0
voti

[6] Re: Problema programmazione encoder rotativo

Messaggioda Foto UtenteStefDrums » 4 ott 2014, 9:50

mixmaxmaxxx33 ha scritto:
StefDrums ha scritto:puoi usare un timer, è una soluzione a costo zero.

Ma ARDUINO dovrebbe avere un clock interno...io non so come modificare il codice per sfruttare quel clock come timer.
Scusate la mia ignoranza


"ARDUINO" non è niente di più che un processore ATMEL, quindi ti consiglio di prendere il datasheet e controllare.
Inoltre ti consiglio di cominciare a guardarti come si programma in C, perché senza conoscere i fondamenti sarà molto difficile utilizzare qualsiasi microprocessore.
Avatar utente
Foto UtenteStefDrums
240 1 6 9
Stabilizzato
Stabilizzato
 
Messaggi: 367
Iscritto il: 20 feb 2013, 14:15

0
voti

[7] Re: Problema programmazione encoder rotativo

Messaggioda Foto UtenteWALTERmwp » 4 ott 2014, 15:08

Ciao Foto Utentemixmaxmaxxx33, aprendo un nuovo thread, quando il contenuto di questo ha origine e si riconduce alle valutazioni derivate da un altro, di quest'ultimo sarebbe il caso di recuperare parte dei contenuti in modo tale che chi legge possa farsi un'idea, semplicemente perché nessuno legge tutto.
Per questa volta mi faccio interprete, a beneficio anche di altri utenti: la questione è partita da qui.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[8] Re: Problema programmazione encoder rotativo

Messaggioda Foto Utentesolideo » 4 ott 2014, 17:20

A me il riferimento temporale mi basta che sia espresso in millisecondi dall'avvio della misurazione

Arduino ha la funzione "millis()" che restituisce il tempo trascorso dall'accensione.
Deve essere una variabile "unsigned long int" occupa memoria ma registra circa 50 gg prima di riazzerarsi.
Praticamente devi assegnare una variabile per esempio la puoi chiamare time:
Codice: Seleziona tutto
unsigned long int time;

poi nel loop quando fai la misurazione
Codice: Seleziona tutto
time = millis();
cosi nella variabile time avrai i millisecondi, rispetto all'avvio.
Il vantaggio di usare mills() è che il programma continua la sua normale esecuzione, quindi puoi utilizzare tipo un IF dichiarando che se time > di time + millisecondi fai una lettura.
Ricorda che millis() restituisce un valore in millisecondi quindi anche te devi ragionare in millisecondi.
Avatar utente
Foto Utentesolideo
100 1 6
New entry
New entry
 
Messaggi: 82
Iscritto il: 11 lug 2014, 6:20


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 22 ospiti