'Freebasic Rangefinder Reciever Code
#Include "FBGFX.bi"
Using fb
ScreenRes 800,600,32
Const TRUE = 1
Const FALSE = 0
Const maxdistance = 100 'Maximum distance we want to read
Const factor = 250 / maxdistance 'scale factor for drawing bars
Const minang = 10 'Starting angle, as a cheap servo was used moving to 0 causes problems
Const maxang = 150 'Set to keep view in front of robot
Const totalang = maxang-minang
Const angfactor = 1
Const pi = 3.14159265359
Dim As UByte rec_Data
Dim As UByte bounce
Dim As UByte datastart
Dim As uByte fin, gotang, gotmessage
Dim As ubyte serialData
Dim As String message, marker
Dim As Integer ang, i
Dim As Double distance
Declare Function radang(ang As Double) As Double
Declare Sub draw_line(ang As Integer, distance As Double)
fin = FALSE
gotang = FALSE
gotmessage = FALSE
datastart = TRUE
Open com "COM14:57600,N,8,1,BIN,CS0,DS0" As 1 'Opens communication with serial port (in this case bluetooth)
Sleep 100
ang=0
Cls
Circle (400,300),255,RGB(196,0,0),,,,F
Line (0,301)-(800,600),RGB(0,0,0),bf
Do
If MultiKey(SC_ESCAPE) Then fin = TRUE
If LOC(1) > 0 Then
If datastart = TRUE Then
Cls
Circle (400,300),255,RGB(196,0,0),,,,F
Line (0,301)-(800,600),RGB(0,0,0),bf
datastart = FALSE
End If
Get #1, ,serialData
EndIf
If serialdata <> 10 Then message = message & Chr(serialdata) 'start to decode the information coming in
If serialdata = 10 Then
'Print message
If Left(message,5) = "BEGIN" Then 'Start of data stream
datastart = TRUE
Print "TADA"
EndIf
If Left(message,1) = "S" Then 'Angle Data
ang = Val(Right(message,Len(message)-1)) - 10
gotang = TRUE
EndIf
If Left(message,1) = "V" Then 'Distance Data
distance = Val(Right(message,Len(message)-1))
gotmessage = TRUE
EndIf
message = ""
EndIf
If gotang = TRUE And gotmessage = TRUE Then 'draw line on display if both angle and data recieved
gotang = FALSE
gotmessage = FALSE
If ang = 0 Then
EndIf
draw_line(ang,distance)
EndIf
For i = 0 To 250 Step 50
Circle (400,300),i,RGB(255,255,255),radang(20),radang(160)
marker = Str(Int(i/factor))
Draw String (400-(4*Len(marker)),290-i), marker, RGB(255,255,255)
Next i
Line (399-totalang,350)-(401+totalang,400),RGB(0,0,255),b
Loop Until fin = TRUE
Close #1
End 0
Sub draw_line(ang As Integer, distance As Double)
Dim As Double x1,y1,x2,y2, fdist, anginc, i, inc, ang2
Dim As Integer x3, c, d
If distance = 0 Then distance = maxdistance
Static lastdist As Double
ang2 = 360 - ang - ((180-(totalang))/2)
fdist = distance * factor
inc = (lastdist - distance) /500
x1 = 400
y1 = 300
x3 = ((totalang-ang)*2)+ (400-(totalang))
c = (255-((distance/maxdistance) * 255))
If c < 0 Then c = 0
If c > 255 Then c = 255
For i = -1 To 0 Step 0.002
d = c + (inc*i)
If d > 255 Then d = 255
x2 = ((fdist + (inc*i)) * Cos(radang(ang2 + i))) + x1
y2 = ((fdist + (inc*i)) * Sin(radang(ang2 + i))) + y1
Line (x1,y1)-(x2,y2),RGB(0,0,0)
Line (x3 + i,350) - (x3 + i,400),RGB(d,d,d)
Next i
lastdist = distance
End Sub
Function radang(ang As Double) As Double
Dim rad As Double
rad = ang * (pi/180)
Return rad
End Function
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.