avatar_ete

Lazer mesafe sensörleri

Başlatan ete, 17 Kasım 2025, 14:03:53

ete

Olası bir proje için araştırma yapıyorum. Bu projenin yapılabilmesi için bir Lazer mesafe sensörüne ihtyacım var. Üstelik mm hassasiyetinde çalışabilecek bir sensör olursa çok iyi olur. Bu ihtiyaca yönelik araştırmalarımda fiyat/fayda oranı en yüksek ürün VL53Lxx serisi sensörler çıkıyor.  Bunlar TOF (Time on Flight) sensör diye adlandırılıyorlar. Temel prensibi bir ışık fotonu yollayıp zaman tutarak cisimden geri yansıma süresini bulup süreyi ikiye bölerek ve foto hızınıda 300.000.000mm/sn alarak mesafeyi hesaplıyorlar.
VL53L0X sensörü işimi görecek ancak bunu üreten ST firması register map yayınlamamış. Bir API vererek (Kullanıcı Arayüz Uygulaması) kullanıcıların sensörü kullanmasını bekliyorlar ki anladığım kadarı ile bu API de daha ziyada Arduino uyumlu.  Hal böyle olunca bu sensörü kullanma imkanım kalmıyor. Benzer özelliklerde çalışabilecek bir başka sensör bilen varmıdır acaba. Mesaf aslında 4000 mm ancak bu sensörlerde genelde 2000mm bazında çalışıyor.

Aslında başka sensörler buluyorum ancak fiyatları çok yüksek. Bu işle ilgili sensör bütçesi en fazla 500 TL olabilir.
Ete

onurinci

 Hocam gezerken şöyle bir şey buldum, mesafe'mi toz'mu anlayamadım..

ete

Partikül sensörü yani toz sensörü bu.

Ete

dnaci

@ete hocam firma paylaşmasada kullanıcılar bahsettiğiniz sensörün register bilgilerini github üzerinde paylaşmış. Githubta bulduğum sayfayı ekliyorum.

https://github.com/GrimbiXcode/VL53L0X-Register-Map

Pepe


Device = 16F877A

Config FOSC_HS, WDTE_OFF, PWRTE_OFF, BOREN_ON, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF
   
Declare Xtal 20
Declare Optimiser_Level = 3
Declare Watchdog off
Declare Dead_Code_Remove = 1        ' Remove dead code
Declare Reminders Off
Declare Hints Off
Declare Create_Coff On   

    Dim BufferArray[12] As Word
    Dim J As Byte
    Dim DatoVL As Byte
    Dim DatoSensor[12] As Byte
    Dim Distance As Word
    Dim DistL As Word
    Dim DistFlag As Byte                            ' Flag Used to See When VLX53L0x Has been filled with a Distance to go to TX
    Dim devError As Byte
    Dim SPAD As Float
    Dim Signal As Word
    Dim Ambient As Word
    Dim DisRest As Word                             ' Load VL53L0X "DISTANCE" from (mm) into (cm) Held in "DisRest"

'=======================================================================================
' Setup the VL53L0x - I2C
'---------------------------------------------------------------------------------------
    Declare Hbus_Bitrate = 400
    Declare HSCL_Pin = PORTC.3                              ' (WHITE) Symbol SCL (OUTPUT)- VL53L0x TOF Sensor
    Declare HSDA_Pin = PORTC.4                              ' (BLUE)  Symbol SDA (INPUT) - VL53L0x TOF Sensor

'=========================================================================================
' Setup the VL53L0x - TOF Lazer Unit "EAST/POLOLU"
' VL53L0x Registers Write and Read
'-----------------------------------------------------------------------------------------
    Symbol W_ADDRESS = $52
    Symbol R_ADDRESS = $53

'-----------------------------------------------------------------------------------------------
' VL53L0X TOF Sensor
' XSHUNT Pin Must Go (HIGH +5V) To Enable Sensor or (LOW 0V) To Switch Sensor OFF
'===============================================================================================
    VL53Lx:
'System Range Start
    HBusOut W_ADDRESS,[$00,$01]
    DelayMS 5

'Range status
    HBusOut W_ADDRESS,[$14]
    DelayMS 5

' Read The 12 Bit Raw Data Of The VL53L0x Sensor:
    HBusIn R_ADDRESS,[Str DatoSensor]


  For J = 0 To 11
        BufferArray[J] = (DatoSensor[10]*256) + DatoSensor[11]   ' Fill All 12 Elements of the BufferArray With Distance Measurements from VL53L0X
        DistL = BufferArray[J]                                   ' Load BufferArray J Elements into DistL Variable
        Distance =  DistL                                        ' Push DistL Variable into the Distance Variable
      ' HRSOut "BUFj: ",Dec3 BufferArray[J]," "                  ' Switch On For TESTING " Be Careful it Slows Everything Down"
      ' HRSOut "Distance: ",Dec distance," "                     ' Switch On For TESTING " Be Careful it Slows Everything Down"
      ' HRSOut "DistL: ",Dec DistL," "                           ' Switch On For TESTING " Be Careful it Slows Everything Down"
  Next J

'-----------------------------------------------------------------------------------------------
' Resolve Sensor Error List:
'===============================================================================================
 ''devError = DatoSensor[0] & 0x78 >> 3 ' // Check for errors
 ''If devError = $00 Then  RsOut "Data OK!" ';// No device error
 ''If devError = $01 Then  RsOut "VCSEL CONTINUITY TEST FAILURE!"
 ''If devError = $02 Then  RsOut "VCSEL WATCHDOG TEST FAILURE!"
 ''If devError = $03 Then  RsOut "NO VHV VALUE FOUND!"
 ''If devError = $04 Then  RsOut "MSRC NO TARGET!"
 ''If devError = $05 Then  RsOut "SNR CHECK!"
 ''If devError = $06 Then  RsOut "RANGE PHASE CHECK!"
 ''If devError = $07 Then  RsOut "SIGMA THRESHOLD CHECK!"
 ''If devError = $08 Then  RsOut "TCC!"
 ''If devError = $09 Then  RsOut "PHASE CONSISTENCY!"
 ''If devError = $0A Then  RsOut "MIN CLIP!"
 ''If devError = $0B Then  RsOut "RANGE COMPLETE!"
 ''If devError = $0C Then  RsOut "ALGO UNDERFLOW!"
 ''If devError = $0D Then  RsOut "ALGO OVERFLOW!"
 ''If devError = $0E Then  RsOut "RANGE IGNORE THRESHOLD!"
 '''Print At 3,10,"Dist: ",hex2 devError," "

'-----------------------------------------------------------------------------------------------
' Resolve info of sensor VL53L0x:
'===============================================================================================
'If devError = $00 or devError = $06 update Distance
'If devError = $00 Or devError = $06 Then
'endif

   
' Effective SPAD Return Count
    SPAD = DatoSensor[2] + DatoSensor[3]/255

' Signal Rate
    Signal = DatoSensor[6]*256 + DatoSensor[7]

' Ambient Rate
    Ambient = DatoSensor[8]*256 + DatoSensor[9]

' Display Output Data:
    Print At 1,6,"D: ",Dec Distance,"  "                                                        ' Print Distance in mm
    HRSOut "VL: ", Dec3 Distance,"  "                                                           ' PC TESTING
 
 Return

'-------------------------------------------------------------------
' Read VL53L0x Sensor Info
'-------------------------------------------------------------------
 Info_VL53:

'IDENTIFICATION REVISION ID
    HBusIn R_ADDRESS,$C2,[DatoVL]
                                                               

'IDENTIFICATION MODEL ID
    HBusIn R_ADDRESS,$C0,[DatoVL]
 
'PRE RANGE CONFIG VCSEL PERIOD
    HBusIn R_ADDRESS,$50,[DatoVL]

'FINAL RANGE CONFIG VCSEL PERIOD
    HBusIn R_ADDRESS,$70,[DatoVL]

Return

ete

Pepe,
Gracias por el programa. Necesito asegurarme de que el programa funciona. ¿Sabes si funciona o no?
Si estás seguro de que funciona, puedo probarlo en un circuito real. Pero necesito tu ayuda adicional.
En primer lugar, necesito un esquema sencillo, especialmente donde se conecta la pantalla. Puedo ver en el programa dónde está conectado el VL53xx, pero no sé dónde está la pantalla.
Segundo, también necesito el archivo hexadecimal de este programa.
Puedo usar el 16F877, pero me conviene más usar el 16F1827. ¿Podrías transferir el programa a ese procesador si es posible? Por supuesto, con el esquema y el hexadecimal de nuevo.
Saludos,

Ete

ete

#6
Dnaci,
Bu ayarları ve benzer şekilde diğer bazı açıklamaları buldum aslında. Ama dedikleri gibi nbu sensör registerleri çok fazla ve karmaşık. Akıllı uslu bir açıklama olmadan kullanılması benim açımdan pek mümkün gözükmüyor. Zira ve linkteki register listesine bakarsan anlaşılır şekjilde mesafe bilgisini kim alıyor kim veriyor belli değil yada ben anlayamıyorum.
Bir başka açıklamada 30-31 nolu registerlerin mesafe bilgisini içerdiğini söylemiş. Ama aynı kişi testler de yapmış. Çeşitli mesafe ölçümlerinde registerlerin hangi bilgileri verdiğini belirtmiş ancak bir çok tutarsızlık var ve maalesef bana göre ölçüm işlemi sonunda hiç bir register direk mesafeyi söylemiyor. Bir veya bir kaç işlem gerektiğine inanıyorum.
Yukarıda üyelerimizden PEPE de Protonda yazılmış bir örnek verdi. Muhtemelen Les Jhonson (Proton'nun yaratıcısı) tarafından oluşturulmuştur. Öyle ise güvenilir olabilir. Bu prograna bakılacak olursa mesafe hesabı aşağıdaki bölümde yapılıyor.
For J = 0 To 11
            BufferArray[J] = (DatoSensor[10]*256) + DatoSensor[11]   ' Fill All 12 Elements of the BufferArray With Distance Measurements from VL53L0X
            DistL = BufferArray[J]                                   ' Load BufferArray J Elements into DistL Variable
            Distance =  DistL                                        ' Push DistL Variable into the Distance Variable
          ' HRSOut "BUFj: ",Dec3 BufferArray[J]," "                  ' Switch On For TESTING " Be Careful it Slows Everything Down"
          ' HRSOut "Distance: ",Dec distance," "                     ' Switch On For TESTING " Be Careful it Slows Everything Down"
          ' HRSOut "DistL: ",Dec DistL," "                           ' Switch On For TESTING " Be Careful it Slows Everything Down"
      Next J
BU hesap şekline de bir anlam veremedim. 12 defa mesafe hesabı yapıyor ve bana göre en sondakini kullanıyor. Bir ortalama alma işlemi falan yok. Sadecesensör data bilgisinin 10 (HighByte) ve 11 (Lowbyte) elemanlarını buluyor sonra bunlardan sadece 12.sini kullanıyor. Burada da sanki bir terslik var gibi. Galiba en iyisi programı denemek ve sonucu görmek.

Aşağıdaki linkte de vatandaş kendi çapında denemeler yapıp tespitlerde bulunmuş ama senin verdiği n linkteki ile bunun arasında farklar var.

https://www.didel.com/VL53L0X.pdf


Ete

ete

#7
Pepe nin programını inceliyorum. Hatta hep birlikte sesli düşünelim.

Bir mesafe okuması işlemininb aşlatılması için sıfır nolu Register' 1 değeri yazılıyor.
Bu SYSRANGE_START registeri ve 1 yazılarak okumanın Sürekli (Continuous mode) yapılması sağlanacak.

Ardından $14 nolu RESULT_RANGE_STATUS registerine işaret edilerek (bu adres verilerek) 12 adet byte'dan oluşan Sensör bilgisi okunuyor. Ancak açıklamasına nedendir bil,nmez "' Read The 12 Bit Raw Data Of The VL53L0x Sensor:" 12 bitlik ham data okunuyor denilmiş. Ama aslında 12 adet Byte bilgisi okunuyor. Acaba her bir okunan bilginin 12 bitlik'mi olduğunu açıklamaya çalışıyor ama zaten değişken Byte cinsinden 12 bitlik veri alamaz. Her neyse burada bir anlamsız ifade mevcut.
Sonra 12 birimlik bir döngü kuruluyor ve okunan bu byte bilgileri değerlendiriliyor. Önceden de belirtmiş idim burası enteresan zira kurulan 12 birimlik döngünün her birinde  yapılan işlem şu;
            BufferArray[J] = (DatoSensor[10]*256) + DatoSensor[11]   ' Fill All 12 Elements of the BufferArray With Distance Measurements from VL53L0X
            DistL = BufferArray[J]                                   ' Load BufferArray J Elements into DistL Variable
            Distance =  DistL
Sensörden okunan 12 byte'lık bilginin 10 (highByte) ve 11 nolu elemanlarındanbir WORD değeri oluşturulup bu 12 elemandan oluşan BufferArray değişkenine yerleştiriliyor. Burada enteresan olan şey şu hem aynı bilgi alınıp BufferArrayın elemanlarına yerleştiriliyor.Bunun bir amaca hizmet etmesi imkansız. Bir ortalama alırsın bunu anlarım ama öyle bir şeyde yok maalesef. Sonuçta 12 ci adımda Yani J=11 iken oluşturulan BufferArray değeri DistL değişkenine oda Distance değişkenine eşitlenerek mesafe bulunmuş oluyor. Acaba diyorum Protonda benim bilmediğim bir işlem türümü mevcut. Bilen söylesin lütfen.
Bu işlemlerin ardından programda hiç kullanılmayan SPAD isimli bir Float değişkenine bir değer hesaplanarak yerleştiriliyor. Amacı nedir bilmiyorum.
Daha sonra Signal ve Ambient değerleri hesaplanıp değişkenlere yerleştiriliyor.

Programın en altında ise VL53Lxx sensörüne ait İnfo bilgileri okuma bölümü yer alıyor.
Bütün bunlara bakınca bu programın çalışan bir örnek olmaktan ziyade kendi programını oluşturmada kullanabileceğin hazır bölümler içeren bir prototip olduğunu anlıyorum. Ama yinede programın bir mesafe bilgisi verebileceğini düşünüyorum.

Bu arada sensörden okunan 12 adet mesafe bilgisinin hepsinin aynı olmadığını düşünüyorum.
Zira komut $14 nolu adresten 12 adet bilgi okunmasını söylüyor. Continuous modda bu sensörden ard arda gelen 12 adet mesafe bilgisinin olduğunu varsayıyorum. Ancak bu bilgileri değerlendirilirken en azından elde edilen bu değerlerin bir ortalamasının alınması gerekmezmi eksik olan bu bana kalırsa.

Ete

dnaci

#8
Hocam sanırım Pepe'nin paylaştığı kod demo sade bir kod, inc dosyası yok ve protona özel bir durumda yok kodda ve geliştirilmesi gereken bir kod olduğunu düşünüyorum.

Koda göre DatoSensor 2-3-6-7-8-9 verilerinde ortam oranı, sinyal hızı, etkili iade sayısı vb. veriler var. Bu nedenle 12 verinin toplamının alınması yanlış sonuçlar verebilir:

' Effective SPAD Return Count
    SPAD = DatoSensor[2] + DatoSensor[3]/255
 
' Signal Rate
    Signal = DatoSensor[6]*256 + DatoSensor[7]
 
' Ambient Rate
    Ambient = DatoSensor[8]*256 + DatoSensor[9]

Register konusuda gerçekten çok karışık dediğiniz gibi farklı kaynaklarda farklı değerler var devreyi kurup denemeden bir sonuç alınamaz. Lcd için proton kodunda olmayan alttaki bildirimleri eklemeniz gerekiyor PortD kullanılabilir. Gerçi kodda ANSELH=0 gibi register ve port tanımlamaları da yok.

Declare LCD_DTPin = PORTD.4   
Declare LCD_RSPin = PORTD.0
Declare LCD_ENPin = PORTD.1
Declare LCD_Interface = 4   
Declare LCD_Lines = 2 ' Veya 4 satır
Declare LCD_Type = 0

Pepe

#9
demo proteus con simulador vl53l0x (12f1840) potenciometro varia distancia

;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F1827

Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_OFF, STVREN_OFF, LVP_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

Declare Xtal 16
Declare Optimiser_Level = 3
Declare Watchdog off
Declare Dead_Code_Remove = 1        ' Remove dead code
Declare Reminders Off
Declare Hints Off
Declare Create_Coff On


    Dim DatoSensor[12] As Byte
    Dim Distance As Word


    Dim Signal As Word
    Dim Ambient As Word
    Dim DisRest As Word                            ' Load VL53L0X "DISTANCE" from (mm) into (cm) Held in "DisRest"

'=======================================================================================
' Setup the VL53L0x - I2C
'---------------------------------------------------------------------------------------
    Declare Hbus_Bitrate = 400
    Declare HSCL_Pin = PORTB.4                              ' (WHITE) Symbol SCL (OUTPUT)- VL53L0x TOF Sensor
    Declare HSDA_Pin = PORTB.1                              ' (BLUE)  Symbol SDA (INPUT) - VL53L0x TOF Sensor

'LCD module connections

Declare LCD_Interface 4
Declare LCD_DTPin PORTA.0 ' Used for 4-line interface
Declare LCD_ENPin PORTA.6
Declare LCD_RSPin PORTA.7
Declare LCD_Lines 2
Declare LCD_DataUs = 50            ' Time to wait after print a data To LCD
Declare LCD_CommandUs = 2000        ' Time to wait after print a command to LCD
Declare LCD_Type = Alphanumeric    ' LCD type is alphanumeric

'End LCD module connections
'=========================================================================================
' Setup the VL53L0x - TOF Lazer Unit "EAST/POLOLU"
' VL53L0x Registers Write and Read
'-----------------------------------------------------------------------------------------
    Symbol W_ADDRESS = $52
    Symbol R_ADDRESS = $53
'-----------------------------------------------------------------------------------------------
' VL53L0X TOF Sensor
' XSHUNT Pin Must Go (HIGH +5V) To Enable Sensor or (LOW 0V) To Switch Sensor OFF
'===============================================================================================

OSCCON=0b01111000
Do
Loop While OSCSTAT.0 = 0

ANSELB=0b00000000

TRISA = %00000000
TRISB = %00000010  'RB1 como entrada, las demas como salidas.


Cls

Print At 1,2,"VL53L0x - TOF"
Print At 2,4,"Laser Unit"
DelayMS 2000
Cls
Print At 1,1,"Distance: "

Do

    Distance =  VL53Lx()

    Print At 1,11,Dec Distance," mm  "              ' Print Distance in mm

    DelayMS 100
Loop


Proc  VL53Lx() ,Word
'System Range Start
    HBusOut W_ADDRESS,[$00,$01]
    DelayMS 5

'Range status
    HBusOut W_ADDRESS,[$14]
    DelayMS 5

' Read The 12 Bit Raw Data Of The VL53L0x Sensor:
    HBusIn R_ADDRESS,[Str DatoSensor]

  Result  = DatoSensor[10]*256 + DatoSensor[11]  ' Fill All 12 Elements of the BufferArray With Distance Measurements from VL53L0X
EndProc

'

' Effective SPAD Return Count
' SPAD = DatoSensor[2] + DatoSensor[3]/255

' Signal Rate
' Signal = DatoSensor[6]*256 + DatoSensor[7]

' Ambient Rate
' Ambient = DatoSensor[8]*256 + DatoSensor[9]


'-------------------------------------------------------------------
' Read VL53L0x Sensor Info
'-------------------------------------------------------------------


'IDENTIFICATION REVISION ID
'    HBusIn R_ADDRESS,$C2,[DatoVL]


'IDENTIFICATION MODEL ID
'    HBusIn R_ADDRESS,$C0,[DatoVL]

'PRE RANGE CONFIG VCSEL PERIOD
 '  HBusIn R_ADDRESS,$50,[DatoVL]

'FINAL RANGE CONFIG VCSEL PERIOD
 '  HBusIn R_ADDRESS,$70,[DatoVL]


'-----------------------------------------------------------------------------------------------
' Resolve Sensor Error List:
'===============================================================================================
 ''devError = DatoSensor[0] & 0x78 >> 3 ' // Check for errors
 ''If devError = $00 Then  RsOut "Data OK!" ';// No device error
 ''If devError = $01 Then  RsOut "VCSEL CONTINUITY TEST FAILURE!"
 ''If devError = $02 Then  RsOut "VCSEL WATCHDOG TEST FAILURE!"
 ''If devError = $03 Then  RsOut "NO VHV VALUE FOUND!"
 ''If devError = $04 Then  RsOut "MSRC NO TARGET!"
 ''If devError = $05 Then  RsOut "SNR CHECK!"
 ''If devError = $06 Then  RsOut "RANGE PHASE CHECK!"
 ''If devError = $07 Then  RsOut "SIGMA THRESHOLD CHECK!"
 ''If devError = $08 Then  RsOut "TCC!"
 ''If devError = $09 Then  RsOut "PHASE CONSISTENCY!"
 ''If devError = $0A Then  RsOut "MIN CLIP!"
 ''If devError = $0B Then  RsOut "RANGE COMPLETE!"
 ''If devError = $0C Then  RsOut "ALGO UNDERFLOW!"
 ''If devError = $0D Then  RsOut "ALGO OVERFLOW!"
 ''If devError = $0E Then  RsOut "RANGE IGNORE THRESHOLD!"
 '''Print At 3,10,"Dist: ",hex2 devError," "

'-----------------------------------------------------------------------------------------------
' Resolve info of sensor VL53L0x:
'===============================================================================================
'If devError = $00 or devError = $06 update Distance
'If devError = $00 Or devError = $06 Then
'endif


ete

Bu kadar komplike olan ve registerleri gizli tutlan bir sensör için yazılmış diğer uygulamaları görünce bu programın çok hafif kaldığını söyleyebilirim.
Ama yinede deneyeceğiz. Bir arkadaşım deneyip sonucu bildirecek. Bakalım çalışacakmı sistem.
Programı PBP ya da çevirdim. Oda çalışıyor. Ancak sistemin çalışmama ihtimaline karşın kirlilik yaratmasın diye buraya koymadım. Sonradan çalışırsa koyarım.

Ete

dnaci

Sensördeki bu register farklılıkları neden olabilir diye araştırırken sensör modüllerinin diğer sensörlerde olduğu gibi 2. kalite veya fake modellerinin piyasada olduğunu farkettim, özellikle mor ve mavi pcbli modüller. Çinli üreticiler farklı I2C adresleri veya register değerleri kullanmış olabilir. Mor ve mavi pcb'bili versiyonların hepsinin kusurlu olacağı yönünde kesin bir yok görüşüm yok ama temkinli olmakta fayda var.

Pololu diye abd las vegasta bir firma var sitelerinde destek ve forum açısından iyiler. Forumda pololu çalışanları doğrudan sorunlara cevap veriyor. Bir gönderide GYxxxx kodlu modül hakkında sorun bildirilmiş ve pololu çalışanı biz üretmediğimiz için yardımcı olamayız yazmış :-) Pololu modülleri ile aralarında da bariz bir fiyat farkı var.

https://www.pololu.com/category/306/carriers-for-st-time-of-flight-tof-distance-sensors

ete

Bu sensörle hem Pepe'nin hemde kendi programım ile deneme yapma fırsatımız oldu.
Yaklaşık 100 cm ölçülmüş mesafede program çok hızlı değişen değerler ile 179-180 cm gösteriyor. Yaklaşık 80 cm lik sapma yapıyor. Bu kadar büyük sapma kalibrasyon yapılsa düzelirmiydi emin değilim ama programın yeterince doğru çalışmadığından eminim.

Ne yapmamız gerektiği konusunda bilgisi yada fikri olan varsa bildirrsin lütfen.

Pepe,

Este programa no funciona correctamente. Intenta mostrar la distancia medida de 100 cm como 179-180 y con valores que cambian constantemente y con frecuencia. ¿Qué crees que hay que hacer?
Probablemente habrá que calibrar el sensor, pero ¿cómo?

Ete


dnaci

#13
Pic basic proda yazdığınız kodu paylaşırsanız inceleyelim @ete hocam.

Pololu forumunda sensör okuma süreleri ile ilgili bir bilgi var. 33ms sürede sensör okunmuş ama 20ms altına düşürmeyi soruyor. Sanırım  şu prosedürdeki 5ms yazma süresi az. Okuma için zaten bir süre verilmemiş.

https://forum.pololu.com/t/high-speed-with-vl53l0x/16585

Proc  VL53Lx() ,Word
'System Range Start
    HBusOut W_ADDRESS,[$00,$01]
    DelayMS 5
 
'Range status
    HBusOut W_ADDRESS,[$14]
    DelayMS 5
 
' Read The 12 Bit Raw Data Of The VL53L0x Sensor:
    HBusIn R_ADDRESS,[Str DatoSensor]
 
  Result  = DatoSensor[10]*256 + DatoSensor[11]  ' Fill All 12 Elements of the BufferArray With Distance Measurements from VL53L0X
EndProc

Pepe

#14
test this with offset calibrating


;-------------------------------------------------------------------------------
Device = 16F1827
Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_OFF, STVREN_OFF, LVP_OFF
;-------------------------------------------------------------------------------

Declare Xtal 16
Declare Optimiser_Level = 3
Declare Watchdog off
Declare Dead_Code_Remove = 1
Declare Create_Coff On
Declare Hserial_Baud = 9600
Declare HRSOut_Pin = PORTB.2

Declare Hbus_Bitrate = 400
Declare HSCL_Pin = PORTB.4
Declare HSDA_Pin = PORTB.1

;------------------------------------------------
; LCD
;------------------------------------------------
Declare LCD_Interface 4
Declare LCD_DTPin PORTA.0
Declare LCD_ENPin PORTA.6
Declare LCD_RSPin PORTA.7
Declare LCD_Lines 2
Declare LCD_DataUs 50
Declare LCD_CommandUs 2000

Symbol CalBtn PORTB.0

;------------------------------------------------
; VL53L0X ADDR
;------------------------------------------------
Symbol W_ADDRESS = $52
Symbol R_ADDRESS = $53

;------------------------------------------------
; Variables
;------------------------------------------------
Dim dist As Word = $ffff
Dim Distance As SWord
Dim tmp As SWord
Dim DatoSensor[12] As Byte
Dim offset As SWord        ; puede ser negativo
Dim prom As Word
Dim dat As Word
Dim i As Byte


;------------------------------------------------
; Oscilador
;------------------------------------------------
OSCCON = %01111000
Do : Loop While OSCSTAT.0 = 0

TRISA = %00000000
TRISB = %00000011          ' RB1 SDA, RB0 BOTÓN

offset = ERead 0   ' cargar offset guardado
If offset = $FFFF Then offset = 0
Cls
Print At 1,1,"VL53L0X to calib"
Print At 2,2,"Press button"
DelayMS 1500
VL53_Init

Cls
Print At 1,1,"Dist:"

;====================================================================
;                          BUCLE PRINCIPAL
;====================================================================
Do
    '------------------------------------------
    '    SI SE PRESIONA EL BOTON = CALIBRAR
    '------------------------------------------
    If CalBtn = 0 Then
                       calibrar
                  Else 
                       medir
     EndIf
     
     DelayMS 200
Loop

;====================================================================
Sub medir                       
    '------------------------------------------
    '      LECTURA NORMAL DEL SENSOR
    '------------------------------------------
    leer
    Distance = prom        

    If Distance <> dist Then
                             dist =  Distance
                             tmp = Distance + offset
                             If tmp > 0 Then 
                                             Distance = tmp
                                        Else
                                             Distance = 0
                             EndIf
                             Print At 1,7,Dec Distance,"mm  "
                             HSerOutLn ["Dist:",Dec Distance,"mm "]
    EndIf
   
EndSub

;====================================================================
Sub calibrar
Cls
Print At 1,1,"Calibrating..."
Print At 2,1,"Put at 10 cm"

Do
Loop While CalBtn = 0

leer

' Calcular offset:
' offset = distancia_real(100mm) – medicion_promedio
offset = 100 - prom

' Guardar en EEPROM
EWrite  0, [offset]

Cls
Print At 1,1,"OFFSET= ",SDec offset," mm"
DelayMS 2000
Cls
Print At 1,1,"Dist:"
dist = $ffff
EndSub

;====================================================================
Sub leer
  prom = 0
    For i = 1 To 4
        dat=  VL53Lx()
        If dat<>0 Then
                       prom = prom + dat
                  Else
                       Dec i
        EndIf
        DelayMS 50
    Next
    prom = prom / 4
EndSub    
;====================================================================


;====================================================================
;             LECTURA VL53L0X  (SIN CAMBIOS)
;====================================================================
Proc VL53Lx() ,Word
    HBusOut W_ADDRESS,[$00,$01]
    DelayMS 5
    HBusOut W_ADDRESS,[$14]
    DelayMS 5
    HBusIn R_ADDRESS,[Str DatoSensor]
    If DatoSensor[0]= $5E Then 
                              Result = DatoSensor[10]*256 + DatoSensor[11]
                         Else
                              Result= 0
    EndIf
EndProc
;====================================================================

Sub VL53_Init

    HBusOut W_ADDRESS, [$88,$00]
    DelayMS 10

    HBusOut W_ADDRESS, [$80,$01]
    HBusOut W_ADDRESS, [$FF,$01]
    HBusOut W_ADDRESS, [$00,$00]

    HBusOut W_ADDRESS, [$91,$3C]
    HBusOut W_ADDRESS, [$00,$01]
    HBusOut W_ADDRESS, [$FF,$00]
    HBusOut W_ADDRESS, [$80,$00]

EndSub

Powered by EzPortal
▲