Mouse Sensor ADNS-2051

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Mouse Sensor ADNS-2051

      Optische Mäuse haben kleine Kameras drin mit einer Bildverarbeitung in Hardware.
      Das Licht einer LED oder eines Lasers wird flach auf die Oberfläche geschickt und die Kamera mit meist 16x16 Pixel nimmt ein Schwaz-Weiß Bild auf, das die Helligkeit des Untergrundes in 6 Bit wiedergibt. Durch das flache Anleuchten sind auch bei einfarbigem Untergrund Schatten sichtbar (wie auf dem Mond)
      Das Bild wird etwa 1500 mal pro Sekunde abgetastet und die Bewegung in X- und Y- Richtung festgestellt und an Quadratur-Ausgängen ausgegeben.
      Zusätzlich wird die Bewegung in Registern aufsummiert, so dass man sie auslesen kann.
      Die Kommunikation ist recht einfach, der AVR generiert ein Clock-Signal und gibt Daten aus bzw. liest sie auf einem Datenpin des Sensors.
      Über einen Power-Down Pin lässt sich der Chip wecken.
      Das Programm konfiguriert den ADNS2051 auf 800 cpi und LED Shutter on (die LED leuchtet nur, wenn ein Bild gemacht wird)
      Das Auslesen geschieht hier in Software, die Ausgabe erfolgt seriell.

      Die Original-Maus war übrigens eine Logitech Cordless Mouse mit 2 AA Batterien, die ständig leer waren. Den Steuerchip habe ich einfach herausgeschnitten, der hätte meinen Arduino nur gestört
      Auf dem Sensor-Chip steht S2090, das Pinout und der 18MHz Resonator lassen aber nur den ADNS-2051 oder den ADNS-2030 zu.
      Ich habe 5V angelegt und der Chip lebt noch, da kann es nur der ADNS2051 sein, das würde evtl. auch den Batterieverbrauch erklären.

      Arduinomaus.jpg

      Arduinomaus_Chip.jpg


      Arduinomaus_Ausgabe.png

      BASCOM-Quellcode: ADNS-2051

      1. $regfile = "M328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 40
      4. $swstack = 16
      5. $framesize = 64
      6. $baud = 38400
      7. Ddrb.0 = 1
      8. Ddrb.5 = 1
      9. Pd Alias Portb.0 'Low = Ein, High = Powerdown
      10. S_clk Alias Portb.5
      11. Daten Alias Pinb.4
      12. Daten_io Alias Portb.4
      13. Dim Data_out As Byte
      14. Dim Data_in As Byte
      15. Dim I As Byte
      16. Dim Tempb As Byte
      17. Dim Z As Byte
      18. Dim Ausgabe As Integer
      19. Dim L_byte As Byte At Ausgabe Overlay
      20. Dim H_byte As Byte At Ausgabe + 1 Overlay
      21. Declare Sub Schreiben(byval Adresse As Byte , Byval Register As Byte)
      22. Declare Function Lesen(byval Adresse As Byte) As Byte
      23. S_clk = 1
      24. Waitms 100
      25. Pd = 1
      26. Waitms 5
      27. Pd = 0
      28. Waitms 10
      29. Print "Los geht's"
      30. Call Schreiben(10 , 80) 'LED Shutter on, 800 cpi
      31. Waitms 10
      32. 'Register
      33. ' 0 Product ID
      34. ' 1 Revision ID
      35. ' 2 Motion Register
      36. ' 3 Delta_X
      37. ' 4 Delta_Y
      38. ' 5 Surface Quality
      39. ' 6 Average Pixel Value in Current Frame
      40. ' 7 Maximum Pixel Value in Current Frame
      41. '10 Configuration Register
      42. '##############################
      43. Do
      44. Incr Z
      45. If Z < 100 Then Print " ";
      46. If Z < 10 Then Print " ";
      47. Print Z ;
      48. ' Print " Prod_ID" ;
      49. ' Tempb = Lesen(0)
      50. ' If Tempb < 100 Then Print " ";
      51. ' If Tempb < 10 Then Print " ";
      52. ' Print Tempb ;
      53. ' Print " Rev_ID=" ;
      54. ' Tempb = Lesen(1)
      55. ' If Tempb < 100 Then Print " ";
      56. ' If Tempb < 10 Then Print " ";
      57. ' Print Tempb ;
      58. Print " Mot=" ; 'Bit7 = Bewegung erkannt
      59. Tempb = Lesen(2)
      60. Print Tempb.7 ;
      61. Print " D_X=" ; 'relativer X-Wert
      62. Tempb = Lesen(3)
      63. Gosub Int_ausgabe
      64. Print " D_Y= " ; 'relativer Y-Wert
      65. Tempb = Lesen(4)
      66. Gosub Int_ausgabe
      67. Print " SQ=" ;
      68. Tempb = Lesen(5)
      69. If Tempb < 100 Then Print " ";
      70. If Tempb < 10 Then Print " ";
      71. Print Tempb ;
      72. Print " AP=" ;
      73. Tempb = Lesen(6)
      74. If Tempb < 100 Then Print " ";
      75. If Tempb < 10 Then Print " ";
      76. Print Tempb ;
      77. Print " maxP=" ;
      78. Tempb = Lesen(7)
      79. If Tempb < 100 Then Print " ";
      80. If Tempb < 10 Then Print " ";
      81. Print Tempb ;
      82. Print " Conf=" ;
      83. Tempb = Lesen(10)
      84. Print Bin(tempb)
      85. Waitms 200
      86. Loop
      87. End
      88. '##############################
      89. Int_ausgabe:
      90. L_byte = Tempb
      91. If Tempb.7 = 0 Then
      92. H_byte = 0
      93. Else
      94. H_byte = 255
      95. End If
      96. If Ausgabe < 0 Then
      97. If Ausgabe > -10 Then Print " ";
      98. If Ausgabe > - 100 Then Print " ";
      99. Else
      100. Print " ";
      101. If Ausgabe < 10 Then Print " ";
      102. If Ausgabe < 100 Then Print " ";
      103. End If
      104. Print Ausgabe ;
      105. Return
      106. Sub Schreiben(byval Adresse As Byte , Byval Register As Byte)
      107. Ddrb.4 = 1 'I/O Pin auf Ausgang
      108. Adresse.7 = 1
      109. For I = 7 To 0 Step -1
      110. S_clk = 0
      111. Daten_io = Adresse.i
      112. S_clk = 1
      113. Next
      114. For I = 7 To 0 Step -1
      115. S_clk = 0
      116. Daten_io = Register.i
      117. S_clk = 1
      118. Next
      119. Waitus 100 'Pause ist wichtig!
      120. End Sub
      121. Function Lesen(byval Adresse As Byte) As Byte
      122. Local Temp As Byte
      123. Ddrb.4 = 1 'I/O Pin auf Ausgang
      124. For I = 7 To 0 Step -1
      125. S_clk = 0
      126. Daten_io = Adresse.i
      127. S_clk = 1
      128. Next
      129. Ddrb.4 = 0 'I/O Pin auf Eingang
      130. Waitus 100
      131. For I = 7 To 0 Step -1
      132. S_clk = 0
      133. Temp.i = Daten
      134. S_clk = 1
      135. Next
      136. Lesen = Temp
      137. End Function
      Alles anzeigen