Skocz do zawartości

[Czujniki] Czujnik przesunięcia z myszki optycznej


Elvis

Pomocna odpowiedź

http://www.rn-wissen.de/index.php/Maussensor tu tez czyta z tych samych rejestrow co ja.

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.

Zapomnialem o rezystorach hahahah. Kurde zaraz podciagne i zobaczymy. Dziwne ze mi nie wyskoczyl ani razu blad.

Co do zmiennych to wiem, narazie to jest dla testow zobaczyc czy cos wogule pokaze.

Link do komentarza
Share on other sites

O ile rozumiem:

Call Myszka(&B00010001 , X) - czyta z 0x11

Call Myszka(&B00010010 , Y) - z 0x12

Na stronie, którą podałeś jest:

x=pan_read(0x17);

y=pan_read(0x18);

Więc to co i u mnie 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Wiec poprawilem niektore bledy i kod nadal nie dziala. Wiec zabralem sie za pisanie tego programu od podstaw. Staram sie odczytac ten kod w c.

http://www.rn-wissen.de/index.php/Maussensor

Sprawdzal ktos czy ten kod dziala?

Moim zdaniem nie sprawdza tu sie tylko jedna rzecz, ze nie ma hi zi state w read.

Jak mi sie uda to wstawie tutaj gotowy kod w bascomie?

Pytanie do autora:

czy bys mogl umiescic swoj kod w c?

i czy tez inicjalizujesz czujnik?

______________________________________________________________________

wiec dzisiaj jeszcze troche potestowalem kod i dziala. Pomylilem kabelki i inicjalizacje zrobilem w petli glownej. To poprawilem, tu moj kod kazdy moze go uzywac jak chce.


$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

Config Pinc.1 = Output                                      'sda jak output
Config Pinc.0 = Output                                      'scl jak outpu

Sda Alias Portc.1                                           'portc.1 =sda
Scl Alias Portc.0                                           'portc.0=scl


Sda = 1                                                     'sda stan wysoki
Scl = 1                                                     'scl stan wysoki

Declare Sub Pan_write(byval Address As Byte , Byval Zmienna As Byte) 
Declare Sub Pan_read(byval Address1 As Byte , Zmienna1 As Byte) 

Declare Sub Pan_writebyte(byval I2c_write As Byte) 
Declare Sub Pan_readbyte(i2c_read As Byte) 

Dim Status As Byte
Dim X As Byte
Dim Y As Byte

Cursor Off
Cls
Locate 1 , 1
Lcd "0" 
Call Pan_write(&H00 , &H80) 
Call Pan_write(&H00 , &H01) 

Do

Call Pan_read(&H16 , Status) 

If Status.7 = 1 Then

Call Pan_read(&H17 , X) 
Call Pan_read(&H18 , Y) 

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

End If

Loop : End

Sub Pan_write(byval Address As Byte , Byval Zmienna As Byte) 

Address.7 = 1                                               ' ustaw bit 7 wysylanego bitu jako 1 zeby bylo wiadomo ze bedziemy zapisywac
Call Pan_writebyte(address) 
Call Pan_writebyte(zmienna) 

End Sub

Sub Pan_read(byval Address1 As Byte , Zmienna1 As Byte) 

Call Pan_writebyte(address1) 
Call Pan_readbyte(zmienna1) 

End Sub

Sub Pan_writebyte(byval I2c_write As Byte) 
Local I As Byte

  For I = 7 To 0 Step -1                                   'petla zeby odebrac 8 bitow
  Scl = 0                                                  'scl ustaw jako 0
  Sda = I2c_write.i                                        'ustaw na wyjscie sda taki stan jak jest zapisany w bicie
  Scl = 1                                                  'scl ustaw jako 1
  Waitus 1                                                 'poczekj 1 mikrosekunde
  Next

End Sub


Sub Pan_readbyte(i2c_read As Byte) 
Local I As Byte

  Config Pinc.1 = Input                                    'sda ustak jako wejscie
  Sda = 1                                                  'ustaw pull up
  Waitus 3                                                 'poczekaj 3 mikrosekundy

For I = 7 To 0 Step -1                                      'petla zeby odebrac 8 bitow

  Scl = 0                                                  'scl na 0
  Waitus 1                                                 'czekaj 1 mikrosekunde
  Scl = 1                                                  ' scl na 1
  I2c_read.i = Pinc.1                                      'zapisz w zmiennej stan jaki jest na pinc.1 (sda) 

Next

Config Pinc.1 = Output                                      ' ustaw znowu jako wyjscie
Sda = 0                                                     ' ustaw sda na 0

End Sub

Jak beda pytania postaram sie odpowiedziec.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Tez nie watpie, ze ten kod w c na rn-wissen dziala. W koncu prawie 1 w 1 z niego tlumaczylem i dziala, spoko. Jeszcze zrobie:

dodawanie pixeli (ile sie przesunela myszka) (zrobione)

obliczanie na cm (niedlugo)

eliminacja bledu przy transmisji. Czyli bede staral sie odczytac dane z jeszcze innego rejestru i sprawdzal czy delta x i y sie zgadzaja ( w nocie takie rozwiazanie bylo podane) (nie jest to mozliwe, bo z innych rejestrow leci sam syf)

dodam jeszcze opcje jak zmienna sie przepelni (odejmowanie/ dodawanie 128 do delty x/y) (zrobione)

___________________________________________________________________________

...
...
dim x1 as integer
dim y1 as integer

do
...
...
X1 = X1 + X
If X.7 = 0 Then

  If Status.3 = 1 Then
  X1 = X1 + 127
  End If

Else
X1 = X1 - 256

  If Status.3 = 1 Then
  X1 = X1 - 128
  End If

End If

Y1 = Y1 + Y
If Y.7 = 0 Then

  If Status.4 = 1 Then
  Y1 = Y1 + 127
  End If

Else
Y1 = Y1 - 256

  If Status.4 = 1 Then
  Y1 = Y1 - 128
  End If

End If
...
...
loop : end
Link do komentarza
Share on other sites

Witam

Temat trochę stary, ale może ktoś jeszcze mi pomoże 🙂

1. Pytanie o dokładność. Czy przy testach przesunięcie jakie zostało zmierzone odpowiadało dokładnie temu przesunięciu w rzeczywistości ? W temacie jest napisane że mierzy przesunięcie bardzo dokładnie. Jak przesuwałem myszkę o 5cm to wynik jaki mi się wyświetlał to 5,5 - 6cm. Czy to wynika z niedokładnego pomiaru rzeczywistego przesunięcia myszki ? Czy coś innego może być źle z kodem?

2. Przepełnienie. Parę postów wyżej był link do niemieckiej strony. W tamtym kodzie gdy występuje przepełnienie i wartość rejestru delta_y < 0, odejmowane jest ponownie 128 od całego przemieszczenia. A czy przypadkiem nie powinno się dodać 128 ? Wartość rejestru doszła do 127 następnie przeskoczyła na -128 więc oni tam chyba dodają przemieszczenie w przeciwną stronę niż faktycznie wystąpił ruch...

Link do komentarza
Share on other sites

2. Przepełnienie. Parę postów wyżej był link do niemieckiej strony. W tamtym kodzie gdy występuje przepełnienie i wartość rejestru delta_y < 0, odejmowane jest ponownie 128 od całego przemieszczenia. A czy przypadkiem nie powinno się dodać 128 ? Wartość rejestru doszła do 127 następnie przeskoczyła na -128 więc oni tam chyba dodają przemieszczenie w przeciwną stronę niż faktycznie wystąpił ruch...

Jeśli wystąpiło przepełnienie, to nie należy ani dodawać ani odejmować 128. Skąd wiadomo, że przepełnienie było takie? Przecież równie dobrze mogliśmy zgubić 256...

Oczywiście zmniejsza to błąd, ale i tak dokładne nie jest.

Najlepsze rozwiązanie to tak często czytać, żeby przepełnienie nie występował.

O ile dobrze pamiętam przy częstotliwości odczytów 4kHz przepełnienie się nie pojawia.

Wtedy pomiar jest dokładny - do czasu aż odsuniemy czujnik od podłoża.

Link do komentarza
Share on other sites

A błąd w moim pomiarze z czego może wynikać ? chodzi mi o przesunięcie 5cm a zmierzone 5,5-6cm ?

A i jak zastosowałem Twój kod to też pojawiał się ten błąd...

Link do komentarza
Share on other sites

Przenieś procedurę odczytu do przerwania. W głównym programie odczytuj tylko położenie i wyświetlaj/przesyłaj. Wtedy będzie działało lepiej.

Link do komentarza
Share on other sites

Przeniosłem procedurę odczytu do przerwania. Jest lepiej ale bez szału... Pomyślałem sobie że można by zwiększyć rozdzielczość myszki. Próbuje wpisać do rejestru "Operation mode2" w pola CPI wartość 2 czyli to odpowiada rozdzielczości 1600. Następnie jak odczytuje z rejestru "Motion Status" to wartość pól Res jest nadal bez zmian. Czy jest możliwość w ogóle zmiany CPI ? A poza tym na opakowaniu pisze 800dpi, a wartość jest ustawiona na 1000cpi jako defaultowa.

Link do komentarza
Share on other sites

Ciekawy temat, bo ja też za niedługo mam zamiar się zabrać za eksperymenty z myszą optyczną. Tylko mam takie pytanie, podłączyłeś się do myszy przez PS2, czy bezpośrednio do czujnika optycznego na niej ? Oba porty są podobne (sygnały), choć ja mam zamiar bezpośrednio się podłączać pod czujnik, bo to daje większe możliwości.

Obecnie mam do dyspozycji 2 czujniki OMO2 i A2051, ale są chyba kompatybilne, przynajmniej na pierwszy rzut oka.

Link do komentarza
Share on other sites

Spróbujcie dołożyć jakiś zwykły obiektyw do kamery od myszki. Może dzięki temu myszka nie będzie musiała przylegać do podłoża. Nie mam jak poeksperymentować ale może by coś z tego wynikło:)

Link do komentarza
Share on other sites

Niedawno miałem "przyjemność" bawić się tym czujnikiem (PAN3101) w związku z pracą dyplomową. Jeśli chodzi o optykę, to niestety nie wyobrażam sobie dostosowania takowej do pracy z tym układem (np. zmiana ogniskowej) w domowych warunkach, zwłaszcza, że nie mamy bezpośrednio dostępu do obrazu z matrycy CMOS. Przy testach okazało się, jak już to ktoś chyba gdzieś na forum pisał, że odległość czujnika od podłoża jest krytyczna - wystarczy dosłownie milimetr przesunięcia w osi pionowej od pozycji optymalnej i już czujnik wariuje. Podejrzewam, że nawet przy zmianie ogniskowej (czyt. odległości), problem ten by nie zniknął - po prostu występowałby dla innych wartości odległości optyki od podłoża.

Link do komentarza
Share on other sites

Cześć.

Czy mogę prosić Was o pomoc w konstrukcji podobnego czujnika na Arduino? Na wstępie zaznaczę, że nie jestem elektronikiem i nie aspiruję do bycia profesjonalistą w tym temacie, dlatego proszę o wyrozumiałość i ew. wskazówki, które pomogłyby mi na rozwiązanie problemu bez zapoznawania z dziesiątkami pozycji "podstawowej literatury".

Zainspirowany tym tematem postanowiłem zastosować taki czujnik położenia w swoim projekcie. Zakupiłem i rozebrałem odpowiednią myszkę na układzie PAW3101DB. Wymontowałem mikrokontroler z myszki (na zdjęciu wyłamane 2 nóżki, ale ostatecznie wyciąłem cały). Podłączyłem zasilanie i masę w miejscu podłączenia przewodu PS/2, natomiast przewody "komunikacyjne" bezpośrednio do czujnika. Wygląda to mniej więcej tak:

Kod do arduino, najpierw wziąłem na żywca z niniejszego tematu: (kod z drugiego posta)

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

Nie śmigał za bardzo, więc później próbowałem go modyfikować. Przede wszystkim sczytywać rejestry odpowiedzialne za dx i dy. Nie wychodzi to za dobrze. Zwykle rejestry dx i dy dają odczyt 255 (z wyjątkiem nr 17 i 18, które dają coś ok. 130). Z innych rejestrów też wychodzą głupoty, np. wartość z rejestru 0x01 zmienia się w czasie poruszania myszką (chociaż 3 pierwsze bity to product ID).

Zdaję sobie sprawę, że pewnie popełniam jakiś kardynalny błąd, ze względu na brak doświadczenia i wykształcenia w tym temacie. Prosiłbym o wskazówki, jeżeli ktoś ma w miarę konkretny pomysł na to co robię źle.

Z góry dzięki za pomoc i pozdrawiam,
Karol

Link do komentarza
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!

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.