Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

wykorzystanie optyki myszy do pomiaru

tkalinows 03 Paź 2005 13:12 4554 29
  • #1 03 Paź 2005 13:12
    tkalinows
    Poziom 12  

    Witam serdecznie,

    Podobny temat był już na forum "zaczepiony" jednak nie został rozwinięty dalej z pewnych (nie mających w tym temacie miejsca powodów).


    Tak więc do rzeczy - temat:

    Wykorzystanie optyki od myszki PC do pomiaru przesunięcia.

    Przesunięcie jest w zdłuż jednej osi, w zakresie do 15 (góra 20) cm. Odbywa się bardzo powoli - około 0,5cm na godzinę. Porządana dokładność to 1 - 2mm.

    Czy waszym zdaniem układ z opto rozróżni fakt przesunięcia obiektu poruszającego się tak wolno???

    Jeśli tak, to może ktoś wykonywał już coś podobnego i podpowie jak ugryść problem.

    np, czy warto wykorzystać układ znajdujący się w myszy, czy raczej pozostawić sam czujnik i wzbogacić go odpowiednie elementy (zasilanie, wzmocnienie) i zrobić całą obsługę w uP?

    No i pytanie najważniejesze, jak zacząć?



    pozdrawiam

    0 29
  • Pomocny post
    #2 03 Paź 2005 13:23
    McRancor
    VIP Zasłużony dla elektroda

    Myśle że optyka myszy się do tego nie nadaje, ale to łatwo sprawdzić! Podłącz mysz do komputera i połóż ją na zegarze ściennym z wymontowaną wskazówką minutową. Wskazówka godzinowa będzie powoli przesówać myszkę, sprawdź czy mysz nie lekceważy takich powolnych ruchów.

    0
  • #3 03 Paź 2005 13:25
    tkalinows
    Poziom 12  

    Dzięki za SUPER pomysł na sprawdzenie. Sprawdzę to na pewno.


    hm, i pomyśleć że będąc synem zegarmistrza nie wpadłem na ten pomsył ....

    0
  • Pomocny post
    #4 03 Paź 2005 15:32
    hunterhouse
    Poziom 26  

    myśle że optyczna może gubić takie powolne ruchy chociąż może i nie ale to zegarem może nie wypalic a to dlatego że między optyką myszy i elemętem ruchomym musi byś określona odległość. jeśli ta odległość się nie zgadza to myszka wogule nie działa.

    można by zastosować myszkę ale zwykłą. ona napewno nie będzie gubić bo nie ma gdzie.
    to rozwiązanie ma też swoje minusy np mniejsza dokładność nieliniowiość pomiarów i potrzeba czyszczenia.

    0
  • #5 04 Paź 2005 00:01
    tkalinows
    Poziom 12  

    Generalnie, po eksperymencie (rzeczywiście nie ze skazwóką ze względu na odległość, ale z talerzem aluminiowym i umocowaną myszką nad nim), okazało sie że optyka też nie gubi impulsów. Wydaje mi się, że powinno wypalić.

    Wolałbym wykorzystać optykę, gdyż zależy mi na bezkontaktowości z mierzonym medium. Oczywiście mam pewne możliwości i dało by się to przełożyć na mechanikę i rolkę od myszy kulkowej ale wyszło by więcej komplikacji...

    Ale jak przejść już do pomiaru. O ile wiem, jak wyglądają generowane impulsy z czujnika myszy standardowej, o tyle nie wiem czy jest tak samo w przypadku myszki optycznej. Troche słabszy ze mnie elektronik, choć pewne podstawy i kilka projektów drobnych mam na koncie. Nie mniej jednak trzeba by mnie ukierunkować...

    Więc do rzeczy. Jeżeli chciałbym wykorzystać optykę z myszki, to co muszę zrobić?

    Zasilić źródło, i wzmocnić sygnał odebrany. A jak ma się w tym przypadku odróżnienie kierunku? Czy jest tak jak w myszy z kulką, czyli że są generewone dwa ciągi impulsów, zaś kierunek jest wytyczony wyprzedzeniem czała narastajaćego któregoś z kanałów? Czy w optycznej myszcze jest to wykonane w jakiś inny sposób?

    No i może chociaż jakiś opis blokowego modułu do pracy z uP może ktoś mi przedstawić? Oczywiście wszelkie gotowce bardzo mile widziane....

    Jeśli ktoś robił coś choć trochę zbliżonego, to będę bardzo wdzięczny....


    ps. Dzięki za podjęcie tematu

    0
  • #6 04 Paź 2005 08:09
    hunterhouse
    Poziom 26  

    z tego co mi wiadamo to ten czujnik w myszce to mała kamera i dekodowanie sygnałów może nie być takie łatwe. oczywiście moge się mylić ale chyba na elektrodzie już coś o tym było
    poszukaj w "automatyce i robotyce" tam jest kilka takich tematów

    a czy niemożna by zastosować całej myszki i niewnikać jak ona to robi poprostu podpiąć się pod złącze ps2. jeszcze teego nie robiłem ale widziałem gdzieś opis tej transmisji.

    0
  • Pomocny post
    #7 04 Paź 2005 10:41
    lbugiera
    Poziom 21  

    Jak jest z myszkami optycznymi (bez ołowianej kulki) nie wiem, bo do końca nie wiem jak działają. Ale z ze zwykłą, z ołowianą kulką nie powinno być problemu. Wylutowywujesz z myszki diode nadawcza (najczęściej przez roczysta) i fototranzystor (czarny często z gumową nakładką) oraz tarcze. Rózne myszki mają rózne tarcze (chodzi o ilość szczelin na obrót - im więcej tym lepsza dokładność) Dioda jak dioda - przez rezystor podłączasz do źródła zasilania (przyjmijmy że to 5 V - to rezystor 510-1k). Fototranzystor, a właściwie 2 fototranz. w jednej obudowie maja wspólny emiter, tzn jeden pin jest wspólny dla 2 foto a pozostałe odnogi to kolektory kazdego z tranzystorów, które trzeba podłączyć przez rezystor do masy (wszystkie wylutowane z myszki fototranzystory z którymi sie spotkałem były typu pnp, czyli wspólny emiter podłaczasz od plusa a kolektor tak jak pisałem). Wartosć tego rezystora powinna byc około 20-60 komów ponieważ prąd przezeń płynący jest malutki. Teraz sygnał z kolektora (kolektorów) trzeba ładnie uformować, najlepiej na jakiejś bramce z histerezą (np hc14,hc132,hc7245) na wyjściu takiej bramki będziemy mieli ładny sygnał 0 lub 5V z "ostrymi" zboczami przy przejściach z jednego stanu do drugiego. Taki sygnał można podac na mikrokontroler, aby wywoływał jakies przerwanie i był zliczany. Jesli nie potrzeba Ci znać kierunku w którym porusza się przedmiot to wystarczy ci jeden fototranzystor. Jeśli chcesz znać to dwa (tutaj musisz dokładnie ustawić diode względem fototranzystorów). Dokładność zależy głównie od mechaniki i ilości otworków na tarczy. Problemy jakie się mogą pojawić: Zamocno świecąca dioda powodująca to, że nawet podczas zasłonięcia fototranzystora ten jest w stanie nasycenia. Za duży rezystor w kolektorze powodujący nasycenie się tranzystora prze światło dzienne (które też zawiera składowe podczerwone). Myśle że na początek daj rezystor 33k w kolektor.

    Powodzenia
    Boogie

    0
  • #8 04 Paź 2005 12:39
    tkalinows
    Poziom 12  

    Dzięki za obszerny i bardzo dokładny opis. W el. elektronicznych to sie orientuję i zajarzyłem, po pomiarach, że jest tam układ 2 fototranzystorów w 1 obudowie, i z tym nie ma problemu. Ale oczywiście dzięki, bo nigdy nie wiadomo co człowiek może przekombinować. Szczególnie ważną informacją było dla mnie podanie przykładowych układów formowania stanów. W moim przypadku kierunek jest bardzo ważny. Natomiast ruch kółka przesłoniającego może być bardzo wolny. Wydaje mi się, że jednak nie powinno być to problemem ani ze zliczaniem impulsów ani z odróżnieniem kierunku. Przecież nawet jeśli zdarzy się tak że przesłona zatrzyma się tak, że zasłoni tylko jeden fototranzystor, a drugi będzie oświetlany, określenie kierunku bedzie zależało jedynie od tego który to jest przesłonięty a który nie, czy się mylę? Dokładnie to chodzim o to, czy jest np możliwość że kółko zatrzyma się w takim momencie że z ciągu impulsów nie będę w stanie połapać się co się dzieje...?

    No i jeszcze jedno pytanie. Jeżeli (załużmy) stan wysoki będzie wywołwyał przerwanie, a to z kolei będzie powodować zliczanie impulsów, to czy spowoduje mi to fałszywego naliczania, np w momencie gdy fototr. będzie cały czas przewodził ze względu na to, że tak akurat ustawi się przesłona?

    Poza tym, trzeba by chyba wykorzystać co najmnie 2 porty, na których zmiana syganalu wywoływała by przerwanie....


    proszę podsuwać wszelkie rozważania - pozdrawiam / kali

    0
  • Pomocny post
    #9 04 Paź 2005 15:39
    lbugiera
    Poziom 21  

    Takie ustawienie enkodera jest mozliwe. Reagowanie na stan to bład. Powinieneś reagować na zbocze. Np. przerwanie zewnętrzne AVR'ów potrafi reagować zarówno na zbocze narastajace i/lub opadające. Jak odczytywac w którą strone następuje ruch?. Najlepiej jak sobie znajdziesz gdzieś w internecie opis takiego enkodera z wykresami sygnałów wyjściowych, bo to za duzo pisania :). Potrzebne są dwa porty reagujące na zmiane stanu.

    Pozdrowienia
    Boogie

    0
  • #10 04 Paź 2005 16:23
    hunterhouse
    Poziom 26  

    najlepiej zastosować jakiś mały AVR'ek np attiny2312 który będzie się zajmował tylko czujnikami i napisać program w asm.
    niekonieczni muszą to być przerwania gdyż sam pisałeś że ruchy będą powolne a avr i asembler daje wystarczającą prędkość.

    acha i kiedyś napisałem program do odczytywania właśnie takiego czujnika z myszki i wygądało to tak
    made bt Bascom

    Code:

    Do
    B = Pinc And &B00000011
    If B <> B1 Then GoSub T1_2
    Waitms 1
    B1=B
    Loop

    '-0-1-3-2-0 -
    T1_2:
    Select Case B
    Case 0
       If B1 = 1 Then Incr A
       If B1 = 2 Then Decr A
    Case 1
       If B1 = 3 Then Incr A
       If B1 = 0 Then Decr A
    Case 2
       If B1 = 0 Then Incr A
       If B1 = 3 Then Decr A
    Case 3
       If B1 = 2 Then Incr A
       If B1 = 1 Then Decr A
    End Select
    Return

    0
  • #11 04 Paź 2005 22:42
    tkalinows
    Poziom 12  

    lbugiera:

    Wiem jak wyglądają przebiegi z enkodera. Chyba się nie zastanowiłem pisząc to zdanie. 100% racji przyznaje. Ale idąc dalej i w ten punkt. Czy nie jest możliwe, że przesłona zatrzyma się w tak felornym miejscu, że fototranzystor będzie przewodził i nie oscylując? (To właśnie te powolne ruchy). Wydaje mi się że nie, ale chętnie usłyszę waszą opinie....


    hunterhouse:
    Dzięki za kodzik, ale chyba w tym przypadku pozostaje tylko wykorzystanie przerwań zewnętrznych. Dlaczego? Znowóż wolny ruch kółk się kłania. Jeżeli zbadam stan wejścia uP, a właśnie będzie taki przypadek jak opisywałem poprzednio (oświetlony tylko jeden tranzystor), to akcja będzie sie powtarzać aż do zmiany układu. I właśnie dlatego moim zdaniem lbugiera ma racje...
    A co do pisania w asm, to wcale mi to chyba niczego zmieni. Rzeczywiście dosyć łatwo zareaogować na przerwanie (bezpośrenia lista rozkazów), ale w Bacomie (bo w nim pisze) chyba też nie sprawia to kłopotu... Dlaczego proponujesz asamblera? Możesz to uzasadnić?

    No właśnie... ktoś wspomniał o wykorzystaniu "całej myszy" a nie tylko elementow. Powiedzmy że fizycznie byłoby to możliwe, ale z tego co się zorientowałem, ruch myszą to nie tylko zliczanie impulsów ale także prędkości a wręcz przyspieszenia, co jest powodem tego, że szybki ruch myszy na tej samej drodze spowoduje znacznie większe przesunięcie wskaźnika na ekranie niż bardzo wolny ruch. Nie sądzę, aby za tę czynność odpowiadał driver i przeliczenie odbywało się w PC, raczej (osobiście) wepchnąłbym to w układ w myszcze (bo po co obciążać dodatkowo procek kompa). Czy sie mylę?
    Jeżeli jednak nie jest to najgorszy pomysł, a ja jestem w błędzie, to może ktoś wie jak wygląda transmisja mysz -> PC i jak ją wykorzystać? Czy są to też impulsy, czy konkretne dane przesyłane jakimś protokołem?


    pozdr

    0
  • #12 04 Paź 2005 22:56
    hunterhouse
    Poziom 26  

    przy powolnych ruchach możesz mieć faktycznie wiXy ale tego się nie da przewidzięć poprostu trzeba to sprawdzić.

    co do wykrywania przesunięcia to program musi wykrywać czy nastąpiła zmiana w enkoderze i w zależnośći od rodzaju zmiany podejmie odpowiednią decyzje.
    jeżeli tarcza zatrzyma się w nieszczęśliwym polożeniu to nie szkodzi gdyż dopuki niebędzie zmian to program nic nie zrobi.

    0
  • #13 05 Paź 2005 00:05
    lbugiera
    Poziom 21  

    Jakieś drgania (szumy na kolektorze) napewno będą, ale jeśli mechanike zrobisz tak, że tarcza nie będzie drgać oraz nie będzie jakiś kosmicznych drgań na zasilaniu (bo to by mogło spowodować pulsowanie diody) to nie ma szans na oscylacje ze względu na duża histereze wbudowaną w przerzutnik schmitta - od 0,5V w góre - moim zdaniem takie wahania na kolektorze może spowodować tylko widoczne drgająca tarcza ... lub jakieś źródło światła, np. lampka stojaca obok, świecąca niemalże prosto w fototranzystor itd. (która drga 50 Hz). Szumy rezystorów itd. przy dobrze zrobionym układzie oszacowałbym na max 5mV.

    Co do tarczy i nieszczęśliwych pozycji ... moim zdaniem nie ma takich. Przy dobrym ustawieniu fototranzystora względem diody i tarczy(co nie wymaga jakiejs bajecznej dokładności) są tylko 4 możliwości, bo to jest warunek jednoznacznego odczytu stanu enkodera.

    Chcesz mierzyć prędkość ? Bo jak chcesz to są tutaj pewne ograniczenia związane z duzym rozrzutem produkcyjnym progu przełączania przerzutnika schmitta.

    Powodzenia
    Boogie

    0
  • #14 05 Paź 2005 07:36
    tkalinows
    Poziom 12  

    Ponownie dzięki Boogie za precyzję odpowiedzi.

    Nie, pomiar prędkości nie jest mi potrzebny. Tak tylko nawiązałem do wypowiedzi hunterhouse, który podrzuca pomysł wykorzystania całej myszy....

    Tak czy inaczej - zabieram się za eksperymenty. Jeśli napotkamy problemu, to oczywiście powrócę. Wyczuwam z waszej strony fachowość - sory za męki. pozdrawiam wsyzstkich

    0
  • Pomocny post
    #15 05 Paź 2005 11:49
    McRancor
    VIP Zasłużony dla elektroda

    Według mnie rozbieranie myszy i poprawianie producenta jest mało ekonomicznym podejściem. Narobisz się, a efekt może być bardzo mizerny.

    Zastosuj mysz optyczną PS2, możesz dodatkowo wykorzystać jej przyciski jako bajer na czujniku ;)

    Pozycjonowaniem zajmie się elektronika myszy, a mikrokontroler co jakiś czas będzie odbierał informację o przesunięciu.

    W linkach dokładny opis elektryczny PS2, protokołu i komend.

    http://www.computer-engineering.org/ps2mouse
    http://www.networktechinc.com/ps2-prots.html

    Przeszukaj dokładnie te strony, kody źródłowe też są w necie. Powodzenia

    0
  • #16 14 Paź 2005 11:59
    tkalinows
    Poziom 12  

    Witam ponownie.

    Dzięki za linki McRancor. Zapoznałem się z tematem. Teraz trzeba zacząć coś działać. Trochę się rozchorowałem (i to właśnie w czasie urlopu!) ale mam nadzieję, że już łatwiej będzie mi myśleć.

    A więc czy jest ktoś jeszcze, kto zechce równorzędnie ze mną kontynuować temat podłączenia myszy do uP? Może rzeczywiście zacznę od wykorzystania kompletnej myszy i PS/2, tak jak radzi poprzednik... Tym bardziej że dostarczył bogate źródło teorii....


    jeśli więc są jeszcze inne chętne do zaangazowania się osoby, to możemy próbować wspólnie - bo nie ukrywam że dla mnie temat ten wydaję sie sporym wyzwaniem....

    pozdrawiam - kali

    0
  • #17 14 Paź 2005 19:09
    Paweł Es.
    Pomocny dla użytkowników

    Co do stanów pośrednich z fototranzystorów to rozwiązaniem jest wstawienie pomiędzy nie i mikryprocesor przerzutników Schmitta np w postaci bramek CMOS 4093 (4 bramki NAND z wejściem Schmitta), 40106 (6 inwerterów j/w) ewenetualnie 74HC14 lub HCT14. Jeżeli układ ma być bardzo odporny to można zrobić przerzutniki Schmitta z komparatorów lub nawet wzmacniaczy operacyjnych (akurat szybkość nie gra tu roli) co pozwoli na rozszerzenie histerezy do granic niespotykanych.

    Co do korzystania z informacji z myszki to nalezy pamiętać, że to są informacje względne tj. podają przesunięcie (+ lub -) względem ostatniego odczytu a także brak jest sygnalizacji, jeżeli kulka straciła łączność z podłożem.

    Co do myszki optycznej to analizuje ona obraz z takiej małej matrycy np. 18 na 18 punktów i na podstawie porównania kolejnych odczytów odnajduje kierunek przesunięcia obrazu.
    Nie działa ona w przypadku powierzchni zupełnie gładkich gdzie nie ma na czym piksela zawiesić.

    Poszukaj na forum, ktoś tu kiedyś robił pomiar długości wstęgi papierowej przy pomocy myszki optycznej ale nie wiem czy ten temat jeszcze jest na serwerze.

    0
  • #18 06 Lis 2005 21:09
    tkalinows
    Poziom 12  

    Witam, powracam do tematu.

    1. uP: Atmega8515
    2. Mysz: mysz optyczna PS/2
    3. Środowisko: Bascom AVR


    Zapoznałem z materiałami z linków McRancor - dzięki serdecznie.

    Postanowiłem wykorzystać te informacje i skomunikować uP z Myszką poprzez PS/2.

    Więc podłączyłęm zasilanie myszy - zaświeciła (mysz opto)

    Nie wiem jednak jak ugryść to dalej. Posiadam jeszcze 2 sygnały: clock i data.

    W jaki sposób wprowadzić i co ważniejsze odczytać dane odebrane od myszy. Czy wykorzystać do tego USART, czy też dowolny port, a może wejście Multi Input Single Output?

    Czy sygnał zegara powinien zaś wykorzystać np jako sygnał wywołujący przerwanie?

    Proszę o pomoc: rozważania, przykłady.....

    Do usłyszenia - z góry dzięki

    0
  • #19 09 Lis 2005 22:09
    tkalinows
    Poziom 12  

    hm, no mam nadzieję, że jednak ktoś mnie jeszcze wesprze i nie będę polemizował sam ze sobą .... ;)

    kontynuując (w bascom AVR z Atmegą8515)

    Mam 4 linie pochodzące z myszy:

    1-GND
    2-Vcc
    3-Clock
    4-Data

    Ok. Po podłączeniu zasilania widzę, że mysz świeci. Robię śmieszny zabieg i podłączam CLOCK myszy i Data myszy zarówno do uP i do PC, tak żeby być pewnym że wszystko gra. I owszem - działa. Mysz na ekranie się porusza.

    pisząc również coś w stylu:

    'pinB.0 - clock
    'pinB.1 - Data

    config Portb = input
    portB=&B00000000
    cls

    do
    LCD PinB.1
    waitms 40
    loop


    coś tam obserwuję, że coś się zmienia. Dodawałem jakieś zbiegi z shiftem itp, próbowałem zaprząść ISP, ale słabiutko mi to wychodzi...

    Moje podstawowe problemy to:

    1. Jak zsynchronizować dane z zegarem (patrz załączniki z przebiegami)
    2. Jak zapisać cały pakiet informacji (11 bitów) o akcji myszki?
    3. Czy wewnętrzny zegar atmegi będzie wystarczająco dokładny do zsynchronizowania się?

    Jak pisałem wcześniej, próbowałem użyć rzeczy w stulu waitkey, shiftin itd, ale tak naprawde bez synchronizacji to nie ma sensu.

    Ale jesli już to wykonam... to myślę że nawet zadeklarowanie zmiennej jako słowa bitowego, a następnie zapisywanie kolejnych bitów w pętli powinno zadziałać. Nie wiem tylko jak wprowadzić zależność od zegara.
    Czy jeśli wykorzystam dowolny port jako wejście, i wykonam coś w stylu jeśli Pin=1 to odczytaj, a jeśli 0 to czekaj to wystarczy? Jakoś mi to nie wychodziło. Czy trzeba wykorzystać INT'a ? Jak to zrobić?

    Proszę o podpowiedzi - dzięki

    0
  • #20 09 Lis 2005 22:45
    hunterhouse
    Poziom 26  

    taki prosty kod który powinien odbierać 11 bitów takich jak na rysunku.

    Code:
    Clk Alias Pinx.x
    
    Dat Alias Pinx.x
    Dim Mouse As Word
    Dim Tmp As Byte

    Read_mouse:
    For Tmp = 0 To 10
       Do : Loop Until Clk = 1
       Waitus 1
       Mouse.Tmp = Dat
       Do : Loop Until Clk = 0
       Waitus 1
    Next Tmp
    Return

    odpisz czy chodzi i jaki jest wynik.
    problem będzie jeszcze ze znalezieniem początku transmisji ale do tego musił byś jeszce podać parametry czasowe
    a mianowicie częstotliwość zegara i odstępy między transmisjami.

    ADD:

    można tez spróbować dodać tę procedurkę do przerwania zewnętrznego i wtedy pozbyłi byśmy się problemu z synchronizacją.
    tak czy inaczej sprawdz czy to chodzi. dzisiaj już jest póżno i już nic ciekawego nie wymyślę.

    Pozdrowienia

    0
  • #21 09 Lis 2005 22:54
    tkalinows
    Poziom 12  

    OK. na pewno sprubuję. Odpowiedź podam jutro, bo całość mam w pracy. Generalnie, miałem coś podobnego .... ale być może stosowałem zbyt duży waitms. A ha, i dawałem, że jeśli clock hi to weź bit, jeśli nie to nie. Także ciekaw jestem bardzo ...

    Dzięki wielkie z chęć, pomoc i kod !


    dobrej nocy... :)

    0
  • #22 10 Lis 2005 15:51
    tkalinows
    Poziom 12  

    tak hunterhouse - zadziałało.

    Dzięki za pomoc.

    Wkrótce postaram się przedstawić kompletne wypociny, jednak dziś padł mi uP i za wiele nie zdziałałem, ale wyraźnie odnotowałem pewne sekwencje transmisji przy działaniu myszy (lewy lub prawy button, ruch po x/y, kółko).

    pozdrawiam

    0
  • #23 16 Lis 2005 20:26
    tkalinows
    Poziom 12  

    Witam ponownie.

    powracam z tematem. Jest tak, jak poleciłeś. I jak już pisałem zadziałało. Rzeczywiście jest pewien problem problem, a nawet kilka.
    Primo - nie mogę zainicjowac myszy z uP. Jeśli podłącze myszę równolegle do uP i PC (data i clock), to mysz rusza i potem juz po odłączeniu od PC przesyła mi dane. Próbowałem kąbinowac, ale nic z tego. Nie rozumiem jednej sprawy: jeśli to mysz generuje zegar, to czy generuje go ciągle, czy tylko w trakcie nadawania, bo jeśli w trakcie nadawania, to jak mam do niej wysłać info? Mam ja wygenerować także clock?

    Poza tym, nie jestem pewien, czy dobrze trafiam z czasem odczytu - 1us jak podałeś. Niestety te 11 bitów które odczytuję nie dokońca się zgadza z tym co powinienem uzyskać. Nie wiem, może czytam za wolno, a może za szybko. Bit startu powinien być 0 - jest 1 (z której strony nie patrzeć), jeżeli wykonuje te same zdarzenie (np przesuwanie myszy do przodu), to zdarza się że pojawia się 1 bit to symbolizujący, ale czasem na innych miejscach....

    A ha, jeśli chodzi o zegar to jest to ATMEGA8515 więc 8MHz.

    Aktualnie kod wygląda tak:

    Code:

    $crystal = 8000000

    config PORTB = INPUT
           portB = &B00000000


    clk Alias PinB.0
    dat Alias PinB.1

    Dim mouse as word
    Dim tmp as byte
    Dim A As word , B as word , C as word

    Dim I as Byte


    lcd "WITAJ"
    waitms 50
    cls

    do


     For tmp = 0 to 10
         do
            loop until clk = 1
            waitus 1
            mouse.tmp = dat
            if tmp = 10 then goto wyswietl

           do
           loop until clk = 0
           waitus 1
      next tmp

    wyswietl:
      lcd "" ; bin(mouse)
    waitms 60 ' zeby zobaczyc czy cos sie wyswietla
    cls
    loop


    Czyli generalnie tak jak podałeś. Nie wiem jak zainicjalizować tę mysz. Próbowałem wysłać 0xFE, ale albo nie wysłałem, albo nie zadziałało. z opisu wynika iż jest to instrukcja resetu. Może ktoś wie jak to zrobić?

    Przecież generalnie chodzi mi o uzyskanie efektu odmierzenia przebytej drogi przez myszkę... pomiaru przesunięcia.
    pozdrawiam .... ;)

    0
  • #24 16 Lis 2005 20:58
    hunterhouse
    Poziom 26  

    w programie ci ci podałem

    Code:
    wait 1us
    ma za zadanie poczekac na ustalenie sie lini data. ten czas jest bardzo mały i niepowinien wpływac na szybkość transmisji ani na synchronizacje.
    jeżeli występują błędy w odbioże to można spróbować zwiększyć ten czas ale to już eksperywentalnie (np 10us).

    natomiast za synchronizacje odpowiada pętla
    Code:
    do 
    
    loop until clk = 1

    pętla ta czeka na odpowiedni stan pinu clk
    co do inicjalizacji myszy to nigdy się tym nie zajmowałem ale w opisie transmisji napewno jest to opisane.


    natomiast mi się wydaje że za błedy w synchronizacji odpowiada
    Code:
    wyswietl: 
    
      lcd "" ; bin(mouse)
    waitms 60 ' zeby zobaczyc czy cos sie wyswietla
    cls

    ten fragment kodu gdyż myszka wysyła sygnały napewno częściej i gdy procesorek zacznie czytać myszkę w połowie transmisji to odbieże połowe tej transmisji i pól następnej. z tąd błędy.
    co do inicjalizacji to narazie bym sie nia nie martwił bo trzeba dobrze czytać myszkę potem można ją rozumieć :)

    ADD:

    Proponuje dodać coś takiego
    Code:

    Clk Alias Pinx.x
    Dat Alias Pinx.x
    Dim Mouse As Word
    Dim Tmp As Byte


    wait_end:
    Tmp = 0
    Do
    Incr Tmp
    If Tmp = 35 Then Exit Do
    Waitus 10
    If Clk = 0 Then Tmp = 0
    loop


    Read_mouse:
    For Tmp = 0 To 11
    Do : Loop Until Clk = 1
    Waitus 10
    Mouse.0 = Dat
    Do : Loop Until Clk = 0
    Waitus 10
    Next Tmp

    procedura wait_end powinna czekac na zakończenie aktualnej transmisji i doprowadzić do zsynchronizowani transmisji.
    ale ma on też negatywny skutek a mianowicie będzie pomijał trwająca transmisję i moze doprowadzić do pomijania niektórych bajtów.
    najlepiej było by dodać procedurę doczytu w przerwaniu i zapisywac bity w jakimś buforze. ale to jest kolegi następny cel. teraz musi kolega sprawić aby procedura odbierała 1 pakiet (poprawnie)

    0
  • #25 08 Gru 2005 20:39
    litas
    Poziom 11  

    Hej i jak się to skończyło??Mam ten sam problem!potrzebuje wykorzystać mysz do pomiaru odległości! Jak ją zainicjować??

    0
  • #26 10 Gru 2005 20:49
    tkalinows
    Poziom 12  

    Witam,

    Ze względu na koszta (chodzi tu oczywiście o element przekazujący sygnał - kwarcytowa gałka), eksperymentalny projekt został zawieszony.

    Jeśli chodzi o uP nie zrobiłem inicjalizacji. Jednak jeśli zainicjalizuje mysz poprzez PS/2 PC'ta, to pomiar działa. Nie wiem z jakiego powodu, odczytuję wszystkie przyciski oraz ruch w jednej (poziomej) płaszczyźnie, natomiast kody z ruchu w pionie są identytczne jak za kliknięcia myszą. Być może jest gdzieś jeszcze błąd. W każdym razie pomiar jest przesunięcia działa i to zadawalająco. Odczytuję przesunię w rozdzielczości 0,25mm. Mankamentem może być to iż przy szybkim ruchu niektóre kroki są gubione. Ale to przy szybszym. Poniżej przedstawiam kod (ATmega8515). Jest kompletny kod wyswietlający wynik na LCD 16*1 w cm.

    Code:

     '########################   System configuration   #######################

    $crystal = 8000000


    config PORTB = INPUT
            portB = &B00000000


    clk Alias PinB.0 ' linia zegara dla PS/2
    dat Alias PinB.1 ' linia danych dla PS/2

    Dim mouse as word
    Dim tmp as byte

    Dim A As byte , B as word , C as word

    Dim mm as integer , cm as integer
    dim count as integer
    dim to_mouse as word
    Dim I as Byte
    Declare Sub Zegar
    enable interrupts

    to_mouse = &b11111111
    cls
    lcd "WITAJ"
    waitms 70
    cls
    A = 0
    count = 0
    mm = 0
    cm = 0


    write_mouse:
    For tmp = 0 to 10
       do : loop until clk = 1
       PortB.0 = to_mouse.tmp
       waitus 3
       next tmp
    do

    wait_end:
       Tmp = 0
       Do
         Incr Tmp
         If Tmp = 55 then Exit DO
         Waitus 1
         If clk = 0 Then Tmp = 0
       loop


    read_mouse:
      For tmp = 0 to 10
          do : loop until clk = 1
             waitus 3                                           '5
             mouse.Tmp = dat
             if Tmp = 10 then goto WYSWIETL
          Do : loop Until clk = 0
            waitus 1

    Next Tmp

    wyswietl:
    if tmp = 10 then
       cls
    'mouse = hex(mouse)
     ' lcd hex(mouse)

      if mouse = &b11111101001 then
          decr count
          if count < 0 then
             count = 4
             decr mm
                 if mm < 0 then
                    mm = 9
                    decr cm
                 endif
          endif


      endif


       if mouse = &b11000001 then
          incr count
             if count > 4 then
             count = 0
             incr mm
                if mm > 9 then
                mm = 0
                incr cm
                endif
             endif
       endif

       lcd cm ; "." ; mm ; " cm"

       mouse = &b0000000000000000

    endif

     loop


    pozdrawiam

    0
  • #27 11 Gru 2005 14:49
    litas
    Poziom 11  

    Hej
    Dzieki za źródło!
    Ja posiadam myszkę optyczną z sensorem AT1080XA.Na wyjścu tego układu jest (dla każdej osi X i Y po dwie linie dla każdej osi żeby odróżnić zwrot) sygnał prostokątny tak że przy przesunięciu jednostkowym zmieniany jest stan na przeciwny.
    dokładność wg mnie jest ok 0.0847mm (300cpi)

    Mam pytanie jaki materiał jest najlepsz do użycia pod mysz optyczną aby dokładność była jak największa???:?:

    0
  • #28 21 Gru 2005 13:25
    mich_s
    Poziom 10  

    czesc czyli zamykasz narazie temat
    bo ja mam podobny mam 2 myszy optyczne i mam je podłaczyc pod atmege32.
    mam mierzyc przesuniecie i kat obrotu
    wynik podac na wyswietlacz i na kompa po rs
    jestem na poczatku pracy

    czy masz jakies ciekawe materiały i czemu ci nie wyszła inicjalizacja na uP?

    jesli mozez napisz jakies wskazówki

    pzdr

    0
  • #29 24 Gru 2005 15:17
    litas
    Poziom 11  

    ja mam mysz z układem ATA1080XA i z tego układu biorę bezpośrednio sygnał do procka. Tylko wstępne pomiary wykazały że mysz gubi wymiar.
    Nie jestem pewny tego w 100%!Moze trzeba zastosować jakąś gumę albo coś pod optykę???

    0
  • #30 04 Lut 2006 21:33
    tkalinows
    Poziom 12  

    Tak, narazie tema uważam za zmaknięty.

    Źródło moich ostatecznych osiągnieć oraz jego działanie podane jest w mojej ostatnie wypowiedzi.

    pozdrawiam wszystkich, którzy brali udział w dyskusji.

    0
  Szukaj w 5mln produktów