Skocz do zawartości
Elvis

[Czujniki] Czujnik przesunięcia z myszki optycznej

Pomocna odpowiedź

Pokaż cały schemat i kod razem z twoimi wszystkimi zmianami.

Udostępnij ten post


Link to post
Share on other sites

Schemat z datasheetu jest następujący:

To co wydaje mi się, że zrobiłem na zdjęciach zamieszczonych w poprzednim poście wygląda chyba następująco:

Jeżeli chodzi o kod, to próbowałem różnych modyfikacji (załączam przykładowe dwie):

- w pierwszej czytałem bezpośrednio rejestry dx oraz dy z innych adresów,
- w drugiej sprawdzałem, czy jestem w stanie zapisać zmiany w jakimś rejestrze i potem je odczytać ( z kiepskim skutkiem).

Pozdrawiam,
Karol

P.S.

Dodam tylko, że z podłączenie wydaje mi się raczej w porządku, ponieważ dioda świeci oraz reaguje na ruch zwiększając jasność.

kod modyfikacja 2.txt

kod modyfikacja.txt

kod podstawowy.txt

Udostępnij ten post


Link to post
Share on other sites

Ale stary temat...

W każdym razie jeśli odczytujesz 255 z rejestrów dx, dy, to wcale nie taka zła wartość. Kodowanie jest U2, więc 255 to po prostu -1, czyli całkiem niewielkie przesunięcie.

Problem z tym detektorem jest taki, że zwraca on za każdym razem przesunięcie względem poprzedniego odczytu. Więc jeśli nie pobierzesz wyniku, a detektor wczyta następną wartość, to utracisz wyniki uzyskane wcześniej. O ile widzę, po każdym odczycie wysyłasz dane przez RS-232. Pamiętaj, że taka transmisja trwa strasznie długo. Więc wszystkie odczyty w tym czasie będą zgubione. W moim programie odczytywałem w pętli 100 razy dane z czujnika, i dopiero wtedy wysyłałem dane przez RS. Dzięki temu wyniki chociaż czasem były w miarę dokładne. Oczywiście najlepiej byłoby wykorzystać przerwania i nie gubić danych.

Udostępnij ten post


Link to post
Share on other sites

Dzięki za odpowiedź. Oczywiście spróbuję wykorzystać powyższą wskazówkę i dam znać jak poszło.. Rozumiem, że podczas "diagonostyki" kodu nie powinienem wpisywać funkcji odczytu rejestru bezpośrednio w Serial.print(). Ale niestety wartości dx oraz dy nie zmieniają się w ogóle, już na samym początku. Pierwotny program najpierw odczytuje i przetwarza dane, a później je wysyła, więc odczyty mogą być zgubione ale powinny być przynajmniej różne. I też nie wiem jak odnieść się do tego, że zmieniają się te wartości rejestrów, które nie powinny.

Udostępnij ten post


Link to post
Share on other sites

Niestety chyba nie w tym problem. Zrobiłem następujący eksperyment:

- główną część programu, bez "serial.print" zamknąłem w pętli do 100,
- w ww. pętli zapisuję odczytane wartości rejestrów dx, dy ( w różnych wersjach są to 0x03, 0x02 lub 0x17, 0x18 lub 0x43, 0x42),

- następnie w kolejnej pętli wypisuję te wartości przez serial.print i czekam 10 s.

Oczywiście tak zmodyfikowany program nie ma zastosowania, posłużył tylko do diagnostyki problemu. To czekanie 10 s zrobiłem dla wygody. Gdyby problemem było przepełnianie, to według mnie tylko pierwsza wartość w tablicach dx i dy powinna być błędna. Pozostałe powinny wynosić 0 (lub przynajmniej wartość stałą) jeżeli myszka się nie porusza i dawać różne odczyty w zależności od prędkości poruszania myszką.

Tymczasem wynik jest następujący:

0x03 - czyta stałą wartość 255

0x02 - waha się ok. 70

0x17 - czyta stałą wartość 133

0x18 - czyta stałą wartość 0

0x43 - czyta stałą wartość 255

0x42 - czyta stałą wartość 0

W załączeniu przesyłam kod i proszę o ew. dalsze sugestie 🙂

mysz_forbot_02.txt

Udostępnij ten post


Link to post
Share on other sites

Moze sprobuj wyrzucic:

WriteAddr(CONF,LORES);

[ Dodano: 10-04-2015, 14:06 ]

Sprobuj jeszcze odczytac rejestry: 0x01 i 0x41. Wartosc PID jaka tam powinna byc jest w dokumentacji. Jesli odczytasz cos innego, znaczy ze jest problem z komunikacja.

Udostępnij ten post


Link to post
Share on other sites

Mocno uprościłem kod i skupiłem się na komunikacji (sam odczyt). Z rejestru 0x01 odczytuje mi "10000000" jeżeli mysz jest w spoczynku i "1xxxxxxx" (gdzie x=0 lub 1) jeżeli poruszam myszą. Product ID wg dokumentacji jest w 3 pierwszych bitach i powinien wynosić 000, także nie bangla 😕

Próbowałem też modyfikować funkcję ReadAddr() (trochę w ciemno, bo nie wiem co może być źle, na przykład zmieniałem typy argumentów na "byte" 😋) albo przenieść jej zawartość na sztywno do void loop().... i nic 😕

mysz_forbot_12.txt

Udostępnij ten post


Link to post
Share on other sites

Możesz jeszcze spróbować wyrzucić opóźnienie przed odczytem. Albo chociaż najpierw zmieniać pin na wejście, a później czekać.

Ale myślę, że powinieneś dokładnie sprawdzić wszystkie połączenia, upewnić się, że sck to sck, a data to data. Ewentualnie sprawdź, czy to na pewno ten układ, który powinien być. Najlepiej byłoby podłączyć oscyloskop i sprawdzić, co się dzieje na liniach.

Udostępnij ten post


Link to post
Share on other sites

Próbowałem już usuwać lub modyfikować czekanie przed odczytem oraz zmiany pinów w różnych konfiguracjach. Spróbuję jeszcze wyjść z innego programu.

A tak przy okazji, ciekawostka 😉

Udostępnij ten post


Link to post
Share on other sites

Zainteresował mnie ten temat.

I na początku zupełnie nie działało ale kilka usprawnień i jakoś ruszyło.

Kod pochodzi połączenia kilku źródeł jak

http://forum.arduino.cc/index.php?PHPSESSID=ma5jgocr5pphjt35onr87955p2&topic=150826.0;prev_next=prev#new

https://conorpeterson.wordpress.com/2010/06/04/optical-mouse-hacking-part-1/

oraz datasheetu układu PAW3205DB-TJ3T z myszki modecom mc-wm4

Gotowy kod który zadziałał na Ardu: http://pastebin.com/sUdEhxs8

Oczywiście musiałem polutować się do zasilania, sclk i sdio od myszki.

Jak kotś bedzię sie z tym bawił to polecam dokładnie sprawdzić które rejestry odpowiadają za Motion_Staus, Delta_X, Delta_Y i Configuration

Pozdrawiam 😎

Udostępnij ten post


Link to post
Share on other sites

Rowniez zamierzam sprobowac zastosowac nyszy optyczne zamiast enkoderow. Do tej pory udalo mi sie przerobic optyke w myszy Logitech. Usunalem plastikowa soczewke, a zamiast niej zamocowalem obiektyw od kamery plytkowej. Odleglosc od obiektywu do podloza wynosi okolo 3 cm. Istniejacy czerwony LED pozostawilem, jednak do oswietlenia powierzchni dolutowalem 2 biale LEDy dodatkowo swiecace wprost w dol. Kursor na ekranie porusza sie prawie 10x wolniej niz w przypadku myszy przed przerobka. Mysz dziala przy oddalaniu obiektywu od podloza od 3 do 5 cm. NIe zawsze dziala nad ciemna powierzchnia, mmozliwe, ze musze dodac jeszcze 2 LEDy z przeciwnej strony obiektywu.

test myszy optycznych.avi

827941332_myszzobiektywem.thumb.JPG.3d20c7414421b28b36c1f18c1dbd8383.JPG

570970512_myszzprzetwornikiemADNS2610.thumb.JPG.92e35b44c3618dc8eee26943dd28fc57.JPG

1359185217_Dodatkowe2LEDy.thumb.JPG.bb8669a2fcff1abe982962c25360cf22.JPG

486571761_Dokreconenowenogimyszy.thumb.JPG.cd8c5f36308a2cee0b89acd288073caf.JPG

Udostępnij ten post


Link to post
Share on other sites

Marekk, dodam dla formalności, że w niektórych przeglądarkach nie działa już podgląd wgrywanych filmów jako załączniki (brak kompatybilności z niektórymi wtyczkami). Najlepiej filmy umieszczać po wcześniejszym wgraniu ich np. na YouTube 🙂

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ść
Napisz odpowiedź...

×   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...