Skocz do zawartości
Elvis

[Czujniki] Czujnik przesunięcia z myszki optycznej

Pomocna odpowiedź

W niniejszym artykule chciałbym opisać eksperyment z użyciem czytnika z myszki optycznej.

Jak chyba każdy początkujący fan robotyki po zmontowaniu pierwszego, prostego robota zacząłem zastanawiać się, co do niego można dodać.

W wielu postach pojawia się podobne pytanie: jak odczytać położenie robota.

Informację o otoczeniu można zbierać na wiele sposobów, jednak jeśli chcemy zbudować robota, który potrafi uczyć się otocznia, niezbędne jest określenie jego pozycji.

Szukając sposobu pomiaru przebytej drogi brałem pod uwagę różne możliwości.

Najbardziej chyba oczywiste było zastosowanie enkoderów. Niestety pomiar który zapewniają jest jedynie pośredni. Poślizg, czy zablokowanie kół robota niweczy trud włożony w zastosowanie enkoderów. Poza tym każdy kto ma jakieś doświadczenie z enkoderami zapewne wie, że niełatwo się ich używa.

Wśród różnych rozwiązań trafiłem na jedno, bardzo obiecujące. We właściwie każdej, obecnie sprzedawanej myszce optycznej znajduje się czytnik przesunięcia. Ma on postać kamery oraz procesora DSP analizującego przesunięcie obrazu (a więc i ruch myszki).

Postanowiłem sprawdzić, jak taki czytnik sprawdza się w praktyce.

W najbliższym sklepie kupiłem najtańszą myszkę, którą akurat mieli. Dokładniejszy jej opis jest na

stronie sklepu:

http://www.komputronik.pl/index.php/product/34671/Peryferia/Myszki-i-Klawiatury/A4-TECH_SWOP-3_czarna_2_x_click.html

Myszka wyposażona była w łącze PS/2. Po rozkręceniu okazało się, że oparta jest na układzie

PAW3101DB.

Dokładny opis układu jest pod adresem:

http://www.pixart.com.tw/upload/PAW3101DB_SPEC_V31_20081009154102.pdf

Udało się przy okazji wylutować kilka switchy oraz impulsator (całkiem przyzwoity).

Po analizie datasheeta i układu płytki okazało się, że do eksperymentów można wykorzystać płytkę

myszki, nie trzeba nawet wylutowywać układu detektora.

Wylutowywanie okazało się z resztą, całkiem sporym wyzwaniem. Myszka jest wykonana lutem bezołowiowym, więc wymontowanie elementów to niemały wysiłek.

Po wstępnej analizie ustaliłem, że:

  • * elektronika myszki zasilana jest z 5V (więc idealnie dla AVR-ów)
  • * wystarczy przeciąć 1 ścieżkę i 1 zworkę, aby podłączyć przewody do komunikacji z sensorem

Do celów eksperymentalnych wykorzystałem płytkę ewaluacyjną (więcej info na stronie:

http://www.shop.kristech.eu/product_info.php?cPath=22_41&products_id=64).

Połączenie między elektroniką myszki i płytki ewaluacyjnej wykonałem za pomocą 4-żyłowego przewodu.

Wykorzystane linie:

1) GND - masa

2) 5V - zasilanie

3) SCLK - linia zegarowa, generatorem jest procesor

4) SDIO - linia danych, do transmisji w obu kierunkach

Po sprawdzeniu poprawności połączeń i podłączeniu zasilania nastąpił czas na przygotowanie softu.

Metoda komunikacji okazała się bardzo prosta. Sensor wyposażony jest w ponumerowane rejestry, do

każdego możemy zapisać lub odczytać 8-bitową wartość.

W praktyce do pracy wystarczą 3 rejestry:

Rejestr 0x16 - z niego odczytujemy flagę, czy w kolejnych rejestrach są gotowe dane

Rejestr 0x17 - przesunięcie X

Rejestr 0x18 - przesunięcie Y

W rejestrze 0x16 wystarczy sprawdzić najwyższy bit. Jeśli jest 1, to wykonujemy odczyt przesunięcia.

Rejestry 0x17 i 0x18 przechowują przesunięcie, jako 8-bitowe liczby ze znakiem.

Kod służący do odczytania przesunięcia wygląda wiec następująco:

byte = mouse_read_reg(0x16); 
if (byte & 0x80) { 
dx = mouse_read_reg(0x17); 
dy = mouse_read_reg(0x18); 
x += dx; 
y += dy; 
} 

Otrzymane wyniki są w jednostkach domyślnych pracy sensora. Ponieważ ma on rozdzielczość 800dpi, więc

jednostką jest 1/800 cala.

Pozostała część programu to przeliczanie wyników na mm i wyświetlanie na LCD.

Rezultat okazał się bardzo interesujący, wyniki są dokładne, ale niestety dał znać o sobie istotny

mankament rozwiązania:

Czujnik musi być umieszczony w odpowiedniej odległości od podłoża, nawet minimalna zmiana odległości

uniemożliwia odczyt.

Na szczęście nie wyrzuciłem obudowy myszki, więc testy wykonywałem po umieszczeniu elektroniki w

resztkach obudowy.

Nie wiem jak układ spisywałby się w gotowym robocie. Zagwarantowanie dokładnego przylegania czujnika

do podłoża może być trudne.

Z drugiej strony czujnik pozwala na łatwe i tanie odczytanie położenia (właściwie przemieszczenia)

robota.

Jest jeszcze jeden mały problem. Odczyty przesunięć muszą być wykonywane bardzo często. Rejestry przesunięć nie są buforowane, więc jeśli nie odczytamy danych na czas stracimy je.

Nie analizowałem jeszcze jak często dane z sensora spływają, ale może okazać się konieczne dodanie oddzielnego procesora do odczytywania danych z sensora. Jednak mała płyteczka z atmega8 jest o wiele łatwiejsza do realizacji niż przygotowanie części mechanicznej.

Zalety rozwiązania:

  • * działa, i to bardzo dokładnie
  • * jest łatwe w implementacji i tanie
  • * daje rezultaty lepsze niż typowy enkoder
  • * odczytuje przesunięcia poprzeczne i wymuszone np. zderzeniem

Wady:

  • * wymaga bardzo precyzyjnego umocowania względem podłoża
  • * nie na każdym podłożu odczytuje przemieszczenie (jak myszka optyczna)
  • * wymaga bardzo częstych odczytów danych (najlepiej dodatkowego procesora)

MouseMove.c

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Osobiście temat jest interesujący. Wydaje mi się, że do większość myszek będzie w ten sam sposób obsługiwany. Może trochę więcej detali opisu, przerobienia myszki by się przydało, w tej chwili trochę zbyt tajemniczo to brzmi.

Nie jako zmuszasz mnie do przyśpieszenia skończenia 2 części artykułu w której chcę też przedstawić moją wizję pomiaru przemieszczenia/prędkości.

Udostępnij ten post


Link to post
Share on other sites

Wydawało mi się, że opis jest czytelny. Przeróbka była bardzo prosta. Pewnie inne myszki będą miały w innych miejscach podłączenia, więc nie piszę co gdzie jest na płytce. Każdy powinien szybko zorientować się co i jak.

1) podłączyłem GND płytki ewaluacyjnej do GND myszki (pin 6 układu PAW3101DB)

2) zasilanie 5V podłączone do zasilania myszy (pin 7)

3) wolny pin IO z płytki (wybrałem PG0) podłączyłem do SCLK (pin 4)

4) kolejny wolny pin IO (u mnie PG1) podłączyłęm do SDIO (pin 3)

Jedynie pkt.4 był ciekawy, pozostałe to proste podłączenie przewodów. Na płytce pompy linia SDIO była połączona przez rezystor 100Ohm. Dzięki temu podczas przełączania wysyłanie/odbieranie danych nie występuje zwarcie. Więc podłączyłem płytkę przez ten rezystor.

Pozostało jeszcze odłączyć układ który był w oryginalnej myszce - wystarczyło przeciąć ścieżki od SDIO i SCLK do niego.

Udostępnij ten post


Link to post
Share on other sites

Ja sobie poradzę, tylko nie wiem jak inni by to odczytali. A jakby spojrzeć na myszkę jako całość, od razu odczytywać z linii PS/2? ( tak tylko rzucam hasłem, nie przyglądałem się jeszcze standardowi myszki PS/2)

Udostępnij ten post


Link to post
Share on other sites

PS/2 jest łatwo dekodować, trudniej byłoby w przypadku myszki po USB.

Ale moim celem nie było używanie całej myszy w robocie. Chciałem sprawdzić, czy ma sens wylutowanie sensora z myszki i użycie we własnym projekcie.

Po eksperymentach widzę, że największy problem to część mechaniczna. Soczewkę i czujnik trzeba bardzo dokładnie umieścić - najprościej wykorzystać kawałek obudowy myszki.

Spostrzeżeniami postanowiłem się podzielić i stąd ten artykuł 🙂

Udostępnij ten post


Link to post
Share on other sites
PS/2 jest łatwo dekodować, trudniej byłoby w przypadku myszki po USB.

USB-->PS/2 (Nie wszystkie gryzonie tak działają)

VDC +5V 1 --- 4 VDC +5V

Data- 2 --- 1 Data

Data+ 3 --- 5 Clock

Ground 4 --- 3 Ground

IMG_4a7ed3185d5648493.gifIMG_4a7ed34369776141.gif

Udostępnij ten post


Link to post
Share on other sites

Dioda led w myszce optycznej umieszczona jest tak, ze tylko przy bardzo niewielkiej odległości oświetla podłoże pod czujnikiem myszki - próbowałeś umieścić leda prostopadle do podłoża, żeby cały czas oświetlał podłoże pod czujnikiem?

Wydaje mi się, że to powinno pomóc.

Udostępnij ten post


Link to post
Share on other sites

Co do przejściówki USB<->PS/2 to nie wiem na jakiej zasadzie to działa, ale to ciekawy offtopic. Może ktoś to kiedyś analizował? Bo chociaż elektrycznie przejściówka to nic wielkiego, to jednak protokół USB jest dużo bardziej skomplikowany niż PS/2. Ciekawe na jakiej zasadzie następuje wybór protokołów.

[ Dodano: 04 Sie 09 07:26 ]

Jak chodzi o led-a, to sprawdzę wieczorem czy oświetlenie podłoża da lepsze rezultaty.

Obawiam się jednak, że nie pomoże. W myszce, pod sensorem znajdują się 2 soczewki. Pierwsza jest przy sensorze, druga przy ledzie. Wygląda na to że sam sensor nie widziałby podłoża prawidłowo - wymaga soczewki (w datasheecie piszą o tej soczewce). Z drugiej strony soczewka prawdopodobnie ogniskuje na określoną odległość.

Soczewka przy ledzie pewnie nie jest konieczna, ale przez nią trudniej zamontować leda pionowo.

[ Dodano: 04 Sie 09 08:38 ]

Niestety pomimo wielu prób poprawy podświetlenia, nie udało mi się uzyskać układu działającego na odległość. Może komuś uda się to lepiej, ale według mnie sensor działa, tylko dociśnięty do podłoża. Czyli tak jak typowa myszka.

Udostępnij ten post


Link to post
Share on other sites

Może lepsze wyniki osiągnął byś wykorzystując mysz laserową, zamiast opartej na zwykłym LED? Warto też może pokombinować z optyką (zmiana ogniskowej soczewek, żeby przystosować układ do pracy na większą odległość) - w każdym razie powodzenia z taką zabawą 😎

Udostępnij ten post


Link to post
Share on other sites

Zastanawia mnie ten problem z odlegloscia od podloza. Dzisiaj mam troche wiecej czasu, juz dawno zdobylem myszke z ukladem pan3101 i zaczynam zabawe. Ciekawe co z tego wyjdzie, ja mam nadzieje ze uda mi sie chociaz osiagnac 1,5 cm od podloza.

Mozna cos pokombinowac z laserem od cd-romu, bardzo latwo tam sterowac glowica, Co moze by umozliwilo miec ruchoma ta soczewke.

[ Dodano: 07 Sie 09 02:55 ]

a wiec napisalem szybko kod w bascomie i nic nie ruszylo oto kod:

$regfile = "m32def.dat" 
$crystal = 8000000

$swstack = 200
$hwstack = 200
$framesize = 200

Config Lcdpin = Pin , Db4 = Porta.5 , Db5 = Porta.4 , Db6 = Porta.3 , Db7 = Porta.2 , E = Porta.6 , Rs = Porta.7

Dim Flaga As Bit
  Flaga = 0

Declare Sub Error

Declare Sub Myszka(byval Address As Byte , Byval Zapis As Byte) 
  Dim Stan As Byte
  Dim X As Byte
  Dim Y As Byte
  X = 0
  Y = 0

Config Sda = Portc.1
Config Scl = Portc.0

Cursor Off
Cls
Locate 1 , 1
Lcd "0" 
Do

  Call Myszka(&B00010000 , Stan) 

  If Stan.7 = 1 Then
     Call Myszka(&B00010001 , X) 
     Call Myszka(&B00010010 , Y) 
  End If

Locate 2 , 1
Lcd "X: " : Lcd X : Lcd "Y:" : Lcd Y

  If Err = 1 Then Call Error

Loop Until Flaga = 1
End

' *********** myszka *********
Sub Myszka(byval Address As Byte , Byval Zapis As Byte) 

I2cstart
  I2cwbyte Address                                         '0x16
  I2crbyte Zapis , Nack
I2cstop

End Sub

' ******** error *******
Sub Error

  Cls
  Locate 1 , 1
  Lcd "error" 
  Flaga = 1

End Sub

ma ktos pomysl co jest zle?

Udostępnij ten post


Link to post
Share on other sites

Mogłbyś podać linka do datasheetu tego układu? Znalazłem tylko do PAN301A, do PAN3103 jakoś nie moge.

Program zupełnie nic nie wyświetla, czy czasem coś się pojawia przy ruszaniu myszą?

[ Dodano: 09 Sie 09 07:00 ]

Bascoma nie znam, ale zobacz czy parametr Zapis nie powinen być przekazywany przez referencję?

Sub Myszka(byval Address As Byte , Byval Zapis As Byte) 

Udostępnij ten post


Link to post
Share on other sites

patrz prosze tylko na to czesc:


I2cstart
  I2cwbyte Address                                         '0x16
  I2crbyte Zapis , Nack
I2cstop

End Sub 

Kod mialem wczesniej napisany w 3 subach, ale stwierdzilem, ze nie bede robil siary i go troche zmniejsze.

Czasem cos sie wyswietla, ale totalnie bzdury, np. w Y pojawia mi sie czasem 127 i zawsze ta liczba i zawsze w Y.

Udostępnij ten post


Link to post
Share on other sites

Nie wiem czy czytasz z dobrych rejestrów. Mam tylko datasheet do PAN301 i tam były inne numery rejestrów, dlatego pytałem o linka do dokumentacji.

W tym co znalazłem rejestr Delta_X ma adres 0x03, a Delta_Y 0x04. O ile rozumiem czytasz rejestry 0x11 i 0x12.

Udostępnij ten post


Link to post
Share on other sites

Widzę, że te układy są prawie identyczne. Ja miałem problemy z odczytem z rejestrów 0x02, 0x03, więc czytam z 0x17 i 0x18 - tam już działa poprawnie.

Jesteś pewien, że te układy są zgodne z I2C? Ja ręcznie napisałem procedury komunikacji i działają. Przy i2c wyjścia są OC, a nie wiem, czy ten układ ma wbudowane podciągi.

Jak już coś odczytasz, to chyba jeszcze jeden błąd - rejestry Delta_X, Delta_Y zawierają przesunięcie od poprzedniego odczytu, więc trzeba ich wartości dodawać do większej zmiennej X i Y (większej niż 8 bitów). Poza tym Delta_ to 8-bitowe liczby ze znakiem. W C wystarczy rzutować na signed char i po kłopocie, nie wiem jak to uzyskać w bascomie.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...