Popularny post Elvis Napisano Sierpień 3, 2009 Popularny post Udostępnij Napisano Sierpień 3, 2009 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 3
riddyk Sierpień 3, 2009 Udostępnij Sierpień 3, 2009 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.
Elvis Sierpień 3, 2009 Autor tematu Udostępnij Sierpień 3, 2009 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.
riddyk Sierpień 3, 2009 Udostępnij Sierpień 3, 2009 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)
Elvis Sierpień 3, 2009 Autor tematu Udostępnij Sierpień 3, 2009 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ł
Kaytec Sierpień 3, 2009 Udostępnij Sierpień 3, 2009 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
Gość Sierpień 3, 2009 Udostępnij Sierpień 3, 2009 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.
Elvis Sierpień 4, 2009 Autor tematu Udostępnij Sierpień 4, 2009 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.
Nawyk Sierpień 5, 2009 Udostępnij Sierpień 5, 2009 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ą
wader_669 Sierpień 6, 2009 Udostępnij Sierpień 6, 2009 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?
Elvis Sierpień 9, 2009 Autor tematu Udostępnij Sierpień 9, 2009 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)
wader_669 Sierpień 9, 2009 Udostępnij Sierpień 9, 2009 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.
Elvis Sierpień 9, 2009 Autor tematu Udostępnij Sierpień 9, 2009 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.
wader_669 Sierpień 9, 2009 Udostępnij Sierpień 9, 2009 To jest nota http://www.pixart.com.tw/upload/PAN3101_V10_20051121170653.pdf Dzisiaj jak bede mial sile to sie pobawie, ciekawe co z tego wyjdzie [ Dodano: 09 Sie 09 08:01 ] Moj czujnik to pan3101db czyli taki jak w nocie. Czytam rejstr 0x16 zeby obadac czy jest cos nowego i nastepnie 0x17 i 0x18 zeby pozycje odczytac
Elvis Sierpień 9, 2009 Autor tematu Udostępnij Sierpień 9, 2009 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. 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »