VL53L0X Time-of-Flight Distance Sensor Carrier with Voltage Regulator

    • VL53L0X Time-of-Flight Distance Sensor Carrier with Voltage Regulator

      VL53L0X.jpg

      Den VL53L0X Time-of-Flight Distanz-Sensor gibt es beim freundlichen Chinesen schon fertig aufgebaut mit einer kleinen Platine und Spannungsregler für etwa 4-6 Euro.
      Time-of-flight heißt, der Sensor misst die Zeit, die ein Infrarot-Lichtstrahl bis zum Zielobjekt und zurück braucht und berechnet daraus die Entfernung.
      So wie bei einer Ultraschall Entfernungsmessung.
      Das Board hat nur 25x12mm Fläche und ist damit deulich kleiner als ein GP2D120.

      st.com/content/st_com/en/produ…mity-sensors/vl53l0x.html
      Leider hat es ST nicht so mit den Datenblättern, es gibt lediglich eine API, eine anständige Registermap gibt es nicht.

      Ich habe im Netz eine Weile gesucht und ein funktionierendes Programm gefunden und nach Bascom übersetzt.
      protonbasic.co.uk/content.php/…185773b4824f20f06f0665fd9

      Die angesprochenen Register werden nicht erklärt, aber zumindest funktioniert der Sensor so und liefert tatsächlich die Entfernung in Millimetern.

      Eigentlich ein idealer Sensor für kleine Roboterchen ;)

      BASCOM-Quellcode: VL53L0X.BAS

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 24
      6. $baud = 38400
      7. Config Scl = Portc.5
      8. Config Sda = Portc.4
      9. I2cinit
      10. Const Cjvl53_write = &H52
      11. Const Cjvl53_read = &H53
      12. Led Alias Portb.5
      13. Ddrb.5 = 1
      14. Led = 1
      15. Xshut Alias Portd.2
      16. Ddrd.2 = 1
      17. Xshut = 0
      18. Waitms 100
      19. Xshut = 1
      20. Waitms 100
      21. Led = 0
      22. Dim I As Byte
      23. Dim Erg As Word
      24. Dim Daten(12) As Byte
      25. For I = 0 To 254 Step 2
      26. I2cstart
      27. I2cwbyte I
      28. If Err = 0 Then
      29. Print "I2C Adresse = " ; I
      30. End If
      31. Next
      32. Do
      33. Led = 1
      34. Gosub Sensorlesen
      35. Gosub Auswerten
      36. Gosub Ergebnis
      37. Led = 0
      38. Waitms 900
      39. Loop
      40. Sensorlesen:
      41. I2cstart
      42. I2cwbyte Cjvl53_write
      43. I2cwbyte &H00
      44. I2cwbyte &H01
      45. I2cstop
      46. Waitms 5
      47. I2cstart
      48. I2cwbyte Cjvl53_write
      49. I2cwbyte &H14
      50. Waitms 5
      51. I2crepstart
      52. I2cwbyte Cjvl53_read
      53. For I = 1 To 11
      54. I2crbyte Daten(i) , Ack
      55. Next
      56. I2crbyte Daten(12) , Nack
      57. I2cstop
      58. Return
      59. Auswerten:
      60. I = Daten(1) And &H78
      61. I = I / 8
      62. Select Case I
      63. Case $00 : Print "Data OK!"
      64. Case $01 : Print "VCSEL CONTINUITY TEST FAILURE!"
      65. Case $02 : Print "VCSEL WATCHDOG TEST FAILURE!"
      66. Case $03 : Print "NO VHV VALUE FOUND!"
      67. Case $04 : Print "MSRC NO TARGET!"
      68. Case $05 : Print "SNR CHECK!"
      69. Case $06 : Print "RANGE PHASE CHECK!"
      70. Case $07 : Print "SIGMA THRESHOLD CHECK!"
      71. Case $08 : Print "TCC!"
      72. Case $09 : Print "PHASE CONSISTENCY!"
      73. Case $0a : Print "MIN CLIP!"
      74. Case $0b : Print "RANGE COMPLETE!"
      75. Case $0c : Print "ALGO UNDERFLOW!"
      76. Case $0d : Print "ALGO OVERFLOW!"
      77. Case $0e : Print "RANGE IGNORE THRESHOLD!"
      78. Case Else Print "Hurz " ; Hex(i)
      79. End Select
      80. Return
      81. Ergebnis:
      82. Erg = Daten(11) * 256
      83. Erg = Erg + Daten(12)
      84. ' For I = 1 To 12
      85. ' Print Hex(daten(i)) ; " " ;
      86. ' Next
      87. Print "Ergebnis: " ; Erg ; " "
      88. Return
      Alles anzeigen
      Timeofflight.jpg