Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Sob Okt 27, 2012 2:04 pm Naslov sporočila: Rotary encoder |
|
|
Lep pozdrav!
Rad bi izdelal nekakšen game controller za letalsko simulacijo, ker potrebujem dodatne gumbe, potenciometre in vrtljiva stikala. Komunikacija poteka preko USB porta. Povezavo s PC sem že vzpostavil. Težave imam z rotary encoder, saj sem se včeraj prvič srečal z njim. Za prvi preizkus sem na uC zvezal nekal ledic in z vrtljivim stikalom uspešno kontroliral svetilnost. Torej princip delovanja sem že naštudiral.
Sedaj pa sem na uC priklopil shift register za inpute ker potrebujem vseh 32 gumbov kolikor jih podpira game controller. Branje posameznih stikal oziroma gumbov na shift registru mi tudi deluje. Problem pa imam, ko namesto stikala gor priklopim rotary encoder. Rotary encoder mi bo služil za nastavljanje različnih vrednosti v igri.
Delovati pa mora na sledeči način. Primer za gumb #12 in #13
Preko software pošljem naslednje nastavitve za encoder:
- Dolžina pulza je 40ms (ob enem zasuku bo gumb pritisnjen 40ms)
- Razmerje pulza je 1:3 (ob enem zasuku se bo gumb 3x pritisnil in 3x ugasnil)
Opomba: Zasuk v levo stran predstavlja Button 12, zasuk v desno stran predstavlja Button 13. To pomeni, da ob enem zasuku v desno stran naprava pošlje signal, da je pritisnjen gumb na sledeči način:
B13 ON (40ms) --- B13 OFF (5ms) --- B13 ON (40ms) --- B13 OFF (5ms) --- B13 ON (40ms) --- B13 OFF (5ms)
Lepo bi prosil za kakšne nasvete kako to sprogramirati in kako meriti čas in dolžine impulze. Mogoče s kakšnim preprostim primerom oziroma že kakšna dobra ideja bi mi pomagala.
Hvala
|
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Pon Okt 29, 2012 11:52 am Naslov sporočila: |
|
|
Nekako sem že naštudiral to zadevo s klikanjem gumbov. Težavo imam samo z branjem inputov, če je encoder priklopljen na shift register.
Če ga priklopim na dva pina na PORTC zadeva deluje:
Koda: |
char encoder_current_state = 0x00;
char encoder_last_state = 0x00;
void main(void) {
while(1) {
// Preberemo zadnja dva bita na PORTC
encoder_current_state = (PORTC & 0x03);
// Primerjamo trenutno stanje in ga primerjamo s prejšnjim. Če je prišlo do spremembe potem vemo, da se je encoder obrnil
if(encoder_current_state != encoder_last_state) {
if(encoder_current_state.F0 == encoder_last_state.F1) {
// encoder v levo ...
}
else {
// encoder v desno ...
}
encoder_last_state = encoder_current_state;
}
}
} |
Tole pa je koda kjer berem stanje iz shift registrov in ne deluje. Mogoče kakšna ideja oziroma drugačen pristop?
Koda: |
char* encoder_current_state = "00";
char* encoder_last_state = "00";
char* buttons = "00000000";
int m;
void main(void) {
while(1) {
// Preberemo vsa stikala in vrednosti shranimo v polje buttons
m = 0;
latch_pin = 0;
latch_pin = 1;
while(m < 8) {
clock_pin = 0;
if(data_pin) buttons[m] = '0'; else buttons[m] = '1';
clock_pin = 1;
m++;
}
encoder_current_state[0] = buttons[0];
encoder_current_state[1] = buttons[1];
if(encoder_current_state != encoder_last_state) {
if(encoder_current_state[1] == encoder_last_state[0]) {
// encoder v levo ...
}
else {
// encoder v desno ...
}
encoder_last_state = encoder_current_state;
}
}
} |
|
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Tor Okt 30, 2012 1:30 pm Naslov sporočila: |
|
|
Nekje na forumu sem zasledil, da ni pametno uporabljati rotary encoder na shift registrih. Nekje so predlagali IO expander MCP23016 oziroma MCP23S17. Mogoče že kdo slišal za to? V datasheetu za MCP23S17 sem zasledil, da imajo internal pull-up upore kar bo meni prišlo prav. Ima mogoče kdo podatek za kakšne upore sploh gre. Ali so to vrednosti manj kot 1k, več kot 5k ???
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.63 Kraj: Trzic
|
Objavljeno: Tor Okt 30, 2012 3:33 pm Naslov sporočila: |
|
|
Enkoderje lahko brez problemov priključiš na shift register. Načeloma je isto, če bereš IO-je direktno ali preko shift registra. Vrednosti pull-up uporov pri stikalih niso ravno problem - vse od 1k do 100k bo delalo.
Za dekodiranje enkoderjev bi ti svetoval, da si malce pogledaš po internetu (npr. https://ccrma.stanford.edu/~dfl/250/rotary.htm, http://stackoverflow.com/questions/34735/using-a-rotary-encoder-with-avr-micro-controller, ...). Za uspešno branje boš moral narediti majhen avtomat stanj, pogoji za prehajanja med stanji bosta izhoda A in B iz enkoderja, izhodi pa bodo komande, ki jih boš poslal na PC.
Za kateri simulator pa delaš to? Če rabiš na hitro, lahko vzameš PoKeys56U, ki dela vse to, kar rabiš.
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Čet Nov 01, 2012 7:16 pm Naslov sporočila: |
|
|
Hvala Neo za odgovor. Poznam ta PoKeys56U ampak se želim sam poigrati s PICI ko ravno prihaja zima in bo čas za to. Tudi sam sem mislil, da bodo inputi na shift registrih delali BP ampak imam dejansko težave pri branju. Kot da bi mi nekaj ciklov preskočlo zato encoder ne deluje pravilno. Kot sem že rekel, branje tipkal na shift registru deluje OK, tudi delovanje encoderja sem že naštudiral (vsaj mislim tako). Jutri dobim še tisto čipovje (MCP23S17) in bom sprobal
|
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Čet Nov 01, 2012 8:44 pm Naslov sporočila: |
|
|
Ravnokar gledam shemo kako povezati dva port expanderja? Potrebujem za to še kakšen dodaten pin na uC ali vseh 5 pinov s prvega MCP23S17 povežem z drugim MCP23S17?
Opis: |
|
Velikost datoteke: |
42.87 KB |
Pogledana: |
24 krat |

|
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.63 Kraj: Trzic
|
Objavljeno: Pet Nov 02, 2012 9:38 am Naslov sporočila: |
|
|
Če imaš težave s shift registri, potem jih boš imel tudi s port expander-jem. Kako hitro pa bereš vhode? Pri poceni enkoderjih boš zaznal kar nekaj 'bouncing' kontaktov, tako da moraš brat čim hitreje.
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Pet Nov 02, 2012 11:10 am Naslov sporočila: |
|
|
Si prepričan? Uporabljam tale encoder (ne vem če je ravno nizek cenovni razred)
http://si.farnell.com/jsp/search/productdetail.jsp?SKU=2113964
Kako hitro berem? Hjaa kodo mam v interruptih brez delayov. Torej tako hitro kot se vsa koda izvede al kako? Ko sem encoder bral direktno iz uC pina je lepo deloval
|
|
Nazaj na vrh |
|
 |
Branez Moderator


Pridružen-a: Pon 14 Apr 2003 7:21 Prispevkov: 7831 Aktiv.: 33.09 Kraj: Koprivnica HR
|
Objavljeno: Pet Nov 02, 2012 11:34 am Naslov sporočila: |
|
|
Bi rekel da je!
_________________ The true sign of intelligence is not knowledge but imagination.
Creativity is intelligence having fun!
Albert Einstein |
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Pet Nov 02, 2012 6:11 pm Naslov sporočila: |
|
|
Mi lahko kdo lepo prosim pomaga kako naj port expander povežem na moj PIC. Uporabljam 18F4550, pina RC4 in RC5 pa sta zasedena za USB komunikacijo. Če pravilno predvidevam, ne bom mogel uporabiti Port Expander knjižnice iz mikroc ampak moram na Software SPI?
Branez je napisal/a: |
Bi rekel da je! |
Katerega mi torej priporočaš?
|
|
Nazaj na vrh |
|
 |
Branez Moderator


Pridružen-a: Pon 14 Apr 2003 7:21 Prispevkov: 7831 Aktiv.: 33.09 Kraj: Koprivnica HR
|
Objavljeno: Pet Nov 02, 2012 6:28 pm Naslov sporočila: |
|
|
Nekaj optičnega iz tega vzroka:
NeoTO je napisal/a: |
Če imaš težave s shift registri, potem jih boš imel tudi s port expander-jem. Kako hitro pa bereš vhode? Pri poceni enkoderjih boš zaznal kar nekaj 'bouncing' kontaktov, tako da moraš brat čim hitreje. |
_________________ The true sign of intelligence is not knowledge but imagination.
Creativity is intelligence having fun!
Albert Einstein |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Ned 19 Sep 2004 22:04 Prispevkov: 16777193 Aktiv.: 70890.33
|
Objavljeno: Pet Nov 02, 2012 7:26 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika.
|
|
Nazaj na vrh |
|
 |
Branez Moderator


Pridružen-a: Pon 14 Apr 2003 7:21 Prispevkov: 7831 Aktiv.: 33.09 Kraj: Koprivnica HR
|
Objavljeno: Pet Nov 02, 2012 7:36 pm Naslov sporočila: |
|
|
Točno! Z malo iznajdljivosti prideš brez Farnella do induktivnega enkoderja.
_________________ The true sign of intelligence is not knowledge but imagination.
Creativity is intelligence having fun!
Albert Einstein |
|
Nazaj na vrh |
|
 |
Stoner Član


Pridružen-a: Sob 27 Okt 2012 13:16 Prispevkov: 49 Aktiv.: 0.32 Kraj: Celje
|
Objavljeno: Pet Nov 02, 2012 10:33 pm Naslov sporočila: |
|
|
Branez je napisal/a: |
Nekaj optičnega iz tega vzroka:
NeoTO je napisal/a: |
Če imaš težave s shift registri, potem jih boš imel tudi s port expander-jem. Kako hitro pa bereš vhode? Pri poceni enkoderjih boš zaznal kar nekaj 'bouncing' kontaktov, tako da moraš brat čim hitreje. |
|
Hvala branez, ampak se motiš Za moj projekt pa res ne mislim porabit cele plače, če vem, da je moj Farnellov enkoder čisto primeren. Mimogrede, sem s port expanderjem rešil zadevo in deluje tako kot sem upal in želel. Tako da tudi tista trditev ni pravilna.
Fantje... Keep it simple
Nazadnje urejal/a Stoner Pet Nov 02, 2012 10:39 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
Branez Moderator


Pridružen-a: Pon 14 Apr 2003 7:21 Prispevkov: 7831 Aktiv.: 33.09 Kraj: Koprivnica HR
|
Objavljeno: Pet Nov 02, 2012 10:37 pm Naslov sporočila: |
|
|
Odlično, glavno da si rešil!
_________________ The true sign of intelligence is not knowledge but imagination.
Creativity is intelligence having fun!
Albert Einstein |
|
Nazaj na vrh |
|
 |
|