Analoger Mini-Joystick steuert WS2812 Panel

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Analoger Mini-Joystick steuert WS2812 Panel

      Es gibt beim freundlichen Chinesen so kleine Mini-Joysticks.
      Lassen sich in XY-Richtung, also in der ganzen Fläche verschieben.
      Ein 4-poliger Stecker ist mit GND/VCC und den beiden analogen Ausgängen belegt.

      Thumb Joystick Modul.png

      Das WS2812 Feld mit 64 LEDs ist Zeilenweise organisiert. Es fängt (auf dem Bild) links oben an und geht zeilenweise nach rechts unten.
      Die LEDs sind dabei hintereinander geschaltet. Die 23. LED ist z.B. in Zeile 3 die Nummer 7.

      Die Software liest den Joystick ein und rechnet die Position des Leuchtpunktes um.

      Joystick_Ws2812.jpg

      Zusätzlich habe ich noch einen Pfeil als rudimentäre Grafik in einem Datafeld hinterlegt.
      In den Daten zeigt der Pfeil nach links, andere Richtungen werden daraus mit entsprechender Zählweise generiert, sodass die Grafik nicht 4 mal vorhanden sein muss.

      BASCOM Source Code: Joystick_WS2812

      1. 'Analoger Mini-Joystick steuert 8x8 LED Feld an mit WS2812
      2. 'Michael @bascomforum.de
      3. $regfile = "m328pdef.dat"
      4. $crystal = 8000000
      5. $hwstack = 80
      6. $swstack = 80
      7. $framesize = 100
      8. Led Alias Portb.5
      9. Ddrb.5 = 1 'auf Nano-Board
      10. Ddrb.4 = 1
      11. Led_rot Alias Portb.2
      12. Ddrb.2 = 1
      13. Links Alias Pind.4
      14. Portd.4 = 1
      15. Rechts Alias Pind.5
      16. Portd.5 = 1
      17. Oben Alias Pind.3
      18. Portd.3 = 1
      19. Unten Alias Pind.2
      20. Portd.2 = 1
      21. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      22. 'Für Systemuhr
      23. Config Dcf77 = Pinc.0 , Timer = 1 , Update = 0 , Debug = 1 , Inverted = 0 , Check = 1 , Gosub = Sectic
      24. Enable Interrupts
      25. Dim X As Byte
      26. Dim Y As Byte
      27. Dim Z As Byte
      28. Dim Temp As Byte
      29. Dim X_analog As Word
      30. Dim Y_analog As Word
      31. Dim Timerzaehler As Byte
      32. Config Rainbow = 1 , Rb0_len = 64 , Rb0_port = Portb , Rb0_pin = 3
      33. ' ^ connected to pin 3
      34. ' ^-------------- connected to portB
      35. ' ^-------------------------- 8 leds on stripe
      36. ' ^------------------------------------- 1 channel
      37. 'Global Color-variables
      38. Dim Color(3) as Byte
      39. R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
      40. 'CONST
      41. Const Numleds = 8
      42. '----[MAIN]---------------------------------------------------------------------
      43. Dim n as Byte
      44. RB_SelectChannel 0 ' select first channel
      45. R = 15 : G = 10 : B = 20 ' define a color
      46. RB_SetColor 0 , color(1) ' update leds
      47. Rb_setcolor 7 , Color(1) ' update leds
      48. Rb_send
      49. For X = 0 To 63
      50. Rb_setcolor X , Color(1)
      51. Rb_send
      52. Waitms 1
      53. Next
      54. R = 0 : G = 0 : B = 0
      55. For X = 0 To 63
      56. Rb_setcolor X , Color(1)
      57. Rb_send
      58. Waitms 1
      59. Next
      60. Do
      61. X_analog = Getadc(0) 'Joystick einlesen
      62. Y_analog = Getadc(1)
      63. X_analog = X_analog / 128 'auf 8x8 herunterrechnen
      64. Y_analog = Y_analog / 128
      65. Y = Y_analog * 8 'Zeilensprung
      66. X = X_analog + Y
      67. R = 50 : G = 50 : B = 50
      68. Rb_clearcolors
      69. Rb_setcolor X , Color(1)
      70. Rb_send
      71. If Timerzaehler > 0 Then 'Lebenszeichen
      72. Decr Timerzaehler
      73. Else
      74. Led_rot = 0
      75. End If
      76. Waitms 10
      77. ' ab hier rudimentäre Grafik
      78. If Links = 0 Then
      79. R = 30 : G = 0 : B = 0
      80. Restore Pfeil
      81. For X = 0 To 63
      82. Read Temp
      83. If Temp = 1 Then
      84. Rb_setcolor X , Color(1)
      85. End If
      86. Next
      87. Rb_send
      88. End If
      89. If Rechts = 0 Then
      90. R = 20 : G = 20 : B = 0
      91. Restore Pfeil
      92. For X = 63 To 0 Step -1
      93. Read Temp
      94. If Temp = 1 Then
      95. Rb_setcolor X , Color(1)
      96. End If
      97. Next
      98. Rb_send
      99. End If
      100. If Unten = 0 Then
      101. R = 0 : G = 30 : B = 0
      102. Restore Pfeil
      103. For X = 0 To 7
      104. For Y = 56 To 0 Step -8
      105. Z = X + Y
      106. Read Temp
      107. If Temp = 1 Then
      108. Rb_setcolor Z , Color(1)
      109. End If
      110. Next
      111. Next
      112. Rb_send
      113. End If
      114. If Oben = 0 Then
      115. R = 0 : G = 0 : B = 30
      116. Restore Pfeil
      117. For X = 7 To 0 Step -1
      118. For Y = 0 To 56 Step 8
      119. Z = X + Y
      120. Read Temp
      121. If Temp = 1 Then
      122. Rb_setcolor Z , Color(1)
      123. End If
      124. Next
      125. Next
      126. Rb_send
      127. End If
      128. ' If Links = 1 Then
      129. ' If Rechts = 1 Then
      130. ' If Oben = 1 Then
      131. ' If Unten = 1 Then
      132. ' R = 0 : G = 0 : B = 0
      133. ' For X = 0 To 63
      134. ' Rb_setcolor X , Color(1)
      135. ' Next
      136. ' Rb_send
      137. ' End If
      138. ' End If
      139. ' End If
      140. ' End If
      141. Loop
      142. End
      143. '-------------- DCF77 Interrupt --------------------
      144. Sectic:
      145. Toggle Led
      146. Toggle Led_rot
      147. Timerzaehler = 50
      148. Return
      149. Pfeil:
      150. Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
      151. Data 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0
      152. Data 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0
      153. Data 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1
      154. Data 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
      155. Data 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1
      156. Data 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0
      157. Data 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0
      Display All