Pages: 1 [2] 3   Go Down
Author Topic: encoder rotativo recuperato da mouse  (Read 3265 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

un pin lasciato non collegato è semsibile a distrurbi esterni (effetto antenna+motivi che non conosco) ed interni (motivi che non conosco), in effetti se leggi un pin flottante e un pin vicini è collegato, spesso leggi valori SIMILI al segnale sull'altro pin... ma con abbastanza "sporcizia" da rendere il segnale inutile. Esperienza diretta smiley-mr-green
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono perfettamente d'accordo con te , ma i pin dove sono  collegati i canali dell'encoder non sono flottanti, ma riferiti a massa con una R da 100k  ...

Dovrebbe essere sufficiente per il quieto vivere , o meglio polarizzare anche verso vcc con un altra R ?

Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai messo una pull down, forse esageratamente grande ma va benissimo così. il problema è se per errore leggi il pin VICINO a quello dell'encoder

dai, appena puoi fa questo test sul numero di interrupt al seocndo, e magari già che ci sei fai pure il controllo della DURATA del segnale, ed infine quella della lettura analogica. Così non ci sfugge nulla muaahhahaha smiley-mr-green
« Last Edit: May 09, 2012, 08:15:35 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho soprasseduto sul fatto che tu insistevi ripetutamente chiedendomi di misurare la durata e l'intervallo degli implusi, ho provato insistentemente a fare orecchie da mercante  ma niente!! Si va sempre a cascare li ...

Sembra banale ma non saprei proprio come misurarlo l'intervallo e la durata  visto che all'interno del gestore stesso non posso utilizzare millis() e temporizzazioni varie.  smiley-cry
Alla fine sta brutta figura m'è toccato farla !!
Mi cospargo il capo di cenere mi metto in castigo e attendo lumi .




Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma tu la millis puoi usarla, solo che il suo valore NON cambia. Quindi metti l'interrupt change, e poi ogni volta che entri nell'interrupt salvi il vcalore di millis(), anzi di micro(), in un array che poi dal loop spedirai via seriale. Sta a te incastrare bene le cose. Secondo me la cosa con più importanza al momento è l'analisi del segnale analogico
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Italia, Cefalù
Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

non ho letto attentamente il posto, quidni forse l'avete già menzionata. ma nel playground non vi è una bella libreria per gli encoder? la visionavo giusto ieri, co sono pure tre metodi di applicazione, una iper precisa, una media e una un po imprecisa! dipende dall'uso!

Link

se ho toppato il senso del post, scusate!
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai azzeccato in pieno, nella pagina c'è una piccola animazione dell'andamento dell'encoder e dei segnali generati... e il nostro caro niki77 sta sbagliando per quanto riguarda il rilevamento dell'andamento orario o antiorario.
« Last Edit: May 09, 2012, 09:56:43 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In tutti i casi ti scusiamo z3us   smiley-mr-green

A parte il trovare la ruota tonda bella e che fatta (che spesso non dispiace), guarda quanto è bello ed interessante scambiarsi opinioni e studiare teoricamente le cose.
E' anche uno dei pochi, se non l'unico mio post, dove non si polemizza o si va OT !
Quasi non ci credo.

Comunque grazie mille della segnalazioni appena posso ci do un occhio per capire quanto è diverso come approccio da quello che stiamo utilizzando.

@lesto
Tornando a noi  per ricavare i tempi avevo pensato di giocare a questo modo :

Interrupt 0  Rising e Falling su PD2 gestiti in questa maniera
le variabili che ricavano i timing sono volatile unsigned long

Code:

void interruptEncoderRising() 
{     
 
  long currentmicros = micros();
  // se capita durante l'overflow somma i microsecondi precedenti
  if(currentmicros < tmp_micros)
  {
   pulse_intervall = ulongMaxVal - tmp_micros + currentmicros;
  }
  else
  {
     pulse_intervall = currentmicros - tmp_micros;
  }
  tmp_micros = currentmicros ;
 
  if(PIND&3)
    pulse++;
  else
    pulse--;
}

void interruptEncoderFalling() 
{         
  long currentmicros = micros(); 
  if(currentmicros < tmp_micros)
  {
    pulse_intervall = ulongMaxVal - tmp_micros + currentmicros;
  }
  else
  {
    pulse_duration = currentmicros - tmp_micros;
  }
  tmp_micros  = 0;
}


Però come dicevi tu acquisire i dati cosi a muzzo, non serve a nulla, ci sarebbe da acquisire almento un migliaio di campioni e fare la media, ma soprattutto mi servirebbe di avere un motore che fà girare l'encoder ad un a velocità abbastanza costante, altrimenti serve a poco mi sà.

Quindi dovrei acquisire la media di mille campioni di una rotazione costante ad esempio di 1500rpm ?
Ma mi è venuto un dubbio ,na volta ricavati cosa ci faccio ? smiley-mr-green smiley-mr-green smiley-mr-green
 
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... e il nostro caro niki77 sta sbagliando per quanto riguarda il rilevamento dell'andamento orario o antiorario.

??? e perchè mai??
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

osserva ll'animazione nel link postato da z3us, cliccando sui due pulsanti e osserva l'andamento dell'impulso. ora sappi che una digitalRead (o sostituti) possono fare la loro lettura in una posizione a casto tra un "salto" e l'altro fatto dai pulsanti.
Il sistema di rilevazione deve basarsi sulla distanza temporale tra l'impulso 1 e l'impulso 2, per capire se avviene ----2--1----- opuure -----1---2------
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No, non ho capito.

Io ho un interrupt quando 1 solo canale passa dallo 0 logico al 1 logico , pertanto se prendiamo in considerazione l'animazione del sito, puoi paragonare la generazione del mio interrupt NON alla singola pressione dei tasti dell'animazione, ma a QUATTRO, e se verifichi lo stato delle onde quadre quando quella del PIN1 (riferito all'animazione) passa dallo LOW ad HIGH vedrai che andando verso dx il segnale di PIN2 sarà sempre allo stato logico LOW, mentre invece andando verso sinistra, sarà sempre HIGH.
Questo significa che eventualmente gestisco CW e CCW all'esatto contrario di come stà illustrato li (ma vai anche a capire quale pin del mio rilevatore è A o B )che in questo momento mi interessa poco, ma la logica per capire la differenza di direzione è assolutamente corretta.
« Last Edit: May 09, 2012, 10:24:32 am by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no. pariamo da 0 e dal codice http://arduino.cc/forum/index.php/topic,105034.msg788298.html#msg788298
consideriamo pin1 come l'interrupt, ma RISING (al contrario del tuo codice che è a CHANGE)

giriamo in senso orario: quando hai una condizione di RISING (quindi il pin1 diventa da 0 a 1) se facessi una lettura istantanea dello stato pin leggeresti il pin2 SEMPRE a 0.
con una digitalRead, vedresti sempre 0 a basse velocità, e 1 ad alte velocità. ma non è questo che ci interessa (anzi costituisce un problema)
prendiamo il caso ideale (lettura istantanea o quasi), e quindi le due letture non saranno mai 1 e 1, e quindi non succede nulla

In senso antiorario avresti il contrario: leggeresti sempre 1 e 1.


ora, stessa situazione ma interrupt a CHANGE, lettura istantanea (o quasi)
in senso orario leggeresti 1,0 (quando sale) e 0,1 (quando scende) (quindi non viene fatta nessuna lettura valida)
in senso antiorario avresti 1,1 (quando sale) e 0,0 (quando scende) (lettura valida solo in salita)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...ma usare pulsein no? smiley-roll-blue
Logged

Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 643
La mia prima bromografata!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

qui ci sono delle informazioni molto interessanti sui "tempi" di lettura dei pin e degli interrupt.
http://arduino-pinchangeint.googlecode.com/files/PinChangeInt%20Speed%20Test-1.3.pdf

se guardate qui, in fondo a tutto, ce n'è un riassunto:
http://arduino.cc/playground/Main/RotaryEncoders
Logged

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no. pariamo da 0 e dal codice http://arduino.cc/forum/index.php/topic,105034.msg788298.html#msg788298
consideriamo pin1 come l'interrupt, ma RISING (al contrario del tuo codice che è a CHANGE)

giriamo in senso orario: quando hai una condizione di RISING (quindi il pin1 diventa da 0 a 1) se facessi una lettura istantanea dello stato pin leggeresti il pin2 SEMPRE a 0.
con una digitalRead, vedresti sempre 0 a basse velocità, e 1 ad alte velocità. ma non è questo che ci interessa (anzi costituisce un problema)
prendiamo il caso ideale (lettura istantanea o quasi), e quindi le due letture non saranno mai 1 e 1, e quindi non succede nulla

In senso antiorario avresti il contrario: leggeresti sempre 1 e 1.


ora, stessa situazione ma interrupt a CHANGE, lettura istantanea (o quasi)
in senso orario leggeresti 1,0 (quando sale) e 0,1 (quando scende) (quindi non viene fatta nessuna lettura valida)
in senso antiorario avresti 1,1 (quando sale) e 0,0 (quando scende) (lettura valida solo in salita)

Mhh, non ne sono convinto... o non ho capito esattamente cosa intendi...
Adesso gioco un pò  con quello che abbiamo visto oggi e poi vi faccio sapere.
Per ora grazie mille del supporto.
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Pages: 1 [2] 3   Go Up
Jump to: