Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Elettronica - Encoder Parte 2
Forum - Elettronica - Encoder Parte 2

Avatar
Thejuster (Member)
Guru^2


Messaggi: 1708
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:46
Mercoledì, 15/11/2017
Salve ragazzi, dopo un pò di lavoraccio effettuato su quel macchinario.
Ho trovato da un amico questo encoder.
L'ho preso perché me lo ha regalato, ai fronte di 300€ del suo costo originale.

https://www.distrelec.it/it/trasduttore-di-velocita-angolar ...

E' un encoder ad uso industriale quindi andrà benissimo per quello che sto facendo.


https://s17.postimg.org/qxy1lcq1b/thumbnail_IMG_20171115_12 ...


https://s17.postimg.org/5csyxab5r/thumbnail_IMG_20171115_12 ...


https://s17.postimg.org/d5jmppju7/thumbnail_IMG-20170323-_W ...


In una delle foto c'è un sensore di prossimità.
Credevo che andava bene, ma invece no.
Perché la misurazione che mi serve e a decimi di millimetro e non a centimetri.
il sensore ti legge bene i centimetri ma non i millimetri quindi l'ho scartato.

C'è un solo problema o dubbio.

Prima di iniziare con l'installazione
e la riprogrammazione di tutto il progetto, non vorrei andare a casaccio


Questo encoder ha 6 cavi.
Non sò perché ne ha così tanti, ma andiamo avanti.


sempre su quel sito, ho trovato questo schema

https://www.distrelec.it/Web/Downloads/_t/ds/e6b2-c_eng_tds ...

Da quel che ho letto, correggetemi se sbaglio.

Dovrebbe collegarsi in questo modo


Color Terminal
Brown Power supply
(+Vcc)
Black Output phase
A
White Output phase
B
Orange Output phase
Z
Blue 0 V (common)

Quindi Marrone e Blu per la corrente

A e B Sarebbe il passo che legge se non erro.
Fatto questo ho trovato questo esempio in rete

andrà bene o i valori vengono letti diversamente?


Codice sorgente - presumibilmente C++

  1. int encoderPin1 = 2;
  2. int encoderPin2 = 3;
  3. int ledPin1     = 5; // PWM
  4.  
  5. volatile int lastEncoded = 0;
  6. volatile long encoderValue = 0;
  7.  
  8. long lastencoderValue = 0;
  9.  
  10. int lastMSB = 0;
  11. int lastLSB = 0;
  12.  
  13. void setup() {
  14.   Serial.begin (9600);
  15.  
  16.   pinMode(encoderPin1, INPUT);
  17.   pinMode(encoderPin2, INPUT);
  18.   pinMode(ledPin1, OUTPUT);
  19.  
  20.   digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  21.   digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
  22.   analogWrite (ledPin1,LOW);
  23.  
  24.   attachInterrupt(0, updateEncoder, CHANGE);
  25.   attachInterrupt(1, updateEncoder, CHANGE);
  26.  
  27. }
  28.  
  29. void loop(){
  30.   Serial.println(encoderValue);
  31.   if ( encoderValue > 255 ) { encoderValue = 255; }
  32.   if ( encoderValue < 0 )   { encoderValue = 0; }
  33.  
  34.   analogWrite(ledPin1,encoderValue);
  35. }
  36.  
  37. void updateEncoder(){
  38.   int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  39.   int LSB = digitalRead(encoderPin2); //LSB = least significant bit
  40.  
  41.   int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  42.   int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
  43.  
  44.   if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  45.   if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
  46.  
  47.   lastEncoded = encoded; //store this value for next time
  48. }







PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1708
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:07
Domenica, 26/11/2017
Buonasera ragazzi, dovo aver testato questo codice,
Dal monitor seriale continuo a vedere

0
0
0
0

Cioè e come se non legge i valori dell'encoder.
Il codice è sbagliato?

Ho collegato tutto seguendo lo schema del produttore ma non riesco a leggere i valori


PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1708
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:55
Lunedì, 27/11/2017
Risolto.

Leggendo direttamente i valori dati dall'encoder senza nessun algoritmo o conversione di dati.
semplicemente facendo

Codice sorgente - presumibilmente Plain Text

  1. lcd.print(digitalRead(encoderPin1));



ottengo

0b0100  Quando è LOW
0b0111 Quando è HIGH

mi è bastao fare che quando entrambi i valori Encoder Pin 1 = 0b0111 e EncoderPin 2 = 0b0111
mi incrementa il passo

altrimenti rimane inviariato.
l'unico problema e che devo far avanzare fin quando il valore non è 0b0100
altrimenti continua ad incrementarmi il passo.

Sono andato in confusione perché questo modello di encoder ha 4 cavi
di cui 3 sono per la lettura

C'è un'altro cavo, il Z
che a differenza di un normale encoder, può essere letto semplicemente quel valore

in modo che,
Anzichè effettuare mezzo giro per aumentare il passo, ad ogni giro completo corrisponde un HIGH e LOW.
Comodo se si ha la necessità di un passo più lungo.

Spero che può essere di aiuto a qualcuno che si troverà in questa situazione.
Così saprà come uscirne fuori.

Saluti




PM Quote