Module1 - 1 '_________________________________________________________________________________________ ' ' Rotinas para uso de um ou mais SRF08 em barramentoI2C pelo BX01. ' ' O endereço do SFR08 vem de fábrica como &HE0. portanto se tivermos ' mais de um no mesmo barramento, torna-se necessário mudar o endereço ' de cada um para que não tenhamos endereços repetidos. Isso é feito ' através da rotina: ' ' SRF08_Change_Addr(ByVal Addr As Byte, ByVal NewAddr As Byte) ' ' onde damos o endereço atual e o novo. Para essa mudança, o SRF08 ' deverá estar sozinho no barramento. Os endereços válidos são: ' &HE0,&HE2,&HE4,&HE6,&HE8,&HEA,&HEC,&HEE,&HF0,&HF2,&HF4,&HF6,&HF8, ' &HFA,&HFC,&HFE. O SRF08 responde ao endereço &H00 (General Broadcast), ' portanto podemos solicitar o início da medida para todos ao mesmo ' tempo via broadcast. Porém a leitura das medidas deverá ser feita ' um a um individualmente. As outras rotinas são: ' ' SRF08_Do_Ranging(ByVal Addr As Byte) ' Executa o "Ping" e recebe os ecos (17) num tempo de 70ms ' ' Function SRF08_Read_Ldr(ByVal Addr As Byte) As Byte ' Lê a intensidade de luz ' ' Function SRF08_Read_Distance(ByVal Addr As Byte, ByVal Echo As Byte) As UnsignedInteger ' Lê a distância em Cm de um determinado eco (1 a 17) ' '_________________________________________________________________________________________ Public Sub SRF08_Change_Addr(ByVal Addr As Byte, ByVal NewAddr As Byte) 'Rotina para troca do endereço de um SRF08. 'Addr - Endereço atual 'NewAddr - Novo endereço Call Call Call Call Call Call Call I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(0) I2C_nack I2C_out_byte(&HA0) I2C_nack Call Call Call Call Call Call Call I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(0) I2C_nack I2C_out_byte(&HAA) I2C_nack Call I2C_start Call I2C_out_byte(Addr) Module1 - 2 Call Call Call Call Call I2C_nack I2C_out_byte(0) I2C_nack I2C_out_byte(&HA5) I2C_nack Call Call Call Call Call Call Call Call I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(0) I2C_nack I2C_out_byte(NewAddr) I2C_nack I2C_stop End Sub '_________________________________________________________________________________________ Public Sub SRF08_Do_Ranging(ByVal Addr As Byte) 'Rotina para executar uma medida pelo SRF08 endereçado 'Addr - Endereço do SFR08 Call Call Call Call Call Call Call Call I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(0) I2C_nack I2C_out_byte(81) ' Cm - 81, polegadas - 80, us - 82 I2C_nack I2C_stop Call Delay(0.07) End Sub '_________________________________________________________________________________________ Public Function SRF08_Read_Ldr(ByVal Addr As Byte) As Byte 'Rotina para ler o valor relativo (adimensional) da intensidade de luz 'Addr - Endereço do SRF08 Dim Ldr As Byte Call Call Call Call Call Call Call Call Call I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(1) I2C_nack I2C_start I2C_out_byte(Addr + 1) I2C_in_byte(Ldr) I2C_ack Module1 - 3 Call I2C_stop SRF08_Read_Ldr = Ldr End Function '_________________________________________________________________________________________ Public Function SRF08_Read_Distance(ByVal Addr As Byte, ByVal Echo As Byte) As UnsignedInteger 'Rotina para ler a distância correspondente a um determinado eco (1 a 17) 'Addr - Endereço do SRF08 Set SRF08_Read_Distance = New UnsignedInteger Dim Dim Dim Dim Temp1 As Byte Temp2 As Byte MSB As Byte LSB As Byte If (Echo < 1) Or (Echo > 17) Then Echo = 1 End If MSB = Echo * 2 LSB = MSB + 1 Call Call Call Call Call Call Call Call Call Call Call Call Call Call Call Call Call Call Call I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(MSB) I2C_nack I2C_start I2C_out_byte(Addr + 1) I2C_in_byte(Temp1) I2C_ack I2C_start I2C_out_byte(Addr) I2C_nack I2C_out_byte(LSB) I2C_nack I2C_start I2C_out_byte(Addr + 1) I2C_in_byte(Temp2) I2C_ack I2C_stop SRF08_Read_Distance = CuInt(Temp1) * 256 + CuInt(Temp2) End Function '_________________________________________________________________________________________