Let's Make Robots!

Touch screen monitor

Takes the mouse pointer to the position where we point depending on the distance given by the two SRF05
AttachmentSize
ts.png193.23 KB
Photo0170.jpg710.39 KB
Photo0160.jpg506.91 KB
Photo0167.jpg1021.05 KB
Photo0168.jpg603.05 KB
Photo0166.jpg626.3 KB

Hello everybody !!! :)

The main aim of this project is to convert a normal computer monitor into a touch screen monitor.. For this I use 2 SRF005 ultrasonic range sensors and 1 picaxe 28X2.

The basic plan

The above image is the baisc plan of my project and it will explain you how things work.

I use VB.NET to interface between the Picaxe and the computer.

My picaxe code is :

#picaxe 28x2
main:
pulsout C.1,2    
pulsin C.1,1,w1
pause 10
let w1 = w1 * 10/62

pulsout C.2,2
pulsin C.2,1,w2
pause 10
let w2 = w2 * 10/62

sertxd (w1," ",w2)

and my VB code is :

 

Imports System.IO

Imports Strings = Microsoft.VisualBasic

Imports System.Math

Public Class Form1

    Public Declare Auto Function GetCursorPos Lib "User32.dll" (ByRef lpPoint As Point) As Long

    Public Const MOUSEEVENTF_LEFTDOWN = &H2

    Public Const MOUSEEVENTF_LEFTUP = &H4

    Private Const MOUSEEVENTF_RIGHTDOWN = &H8

    Private Const MOUSEEVENTF_RIGHTUP = &H10

    Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' middle button down

    Public Const MOUSEEVENTF_MIDDLEUP = &H40 ' middle button up

 

    Declare Function apimouse_event Lib "user32.dll" Alias "mouse_event" (ByVal dwFlags As Int32, ByVal dX As Int32, ByVal dY As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As Int32) As Boolean

 

    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)

    Dim WithEvents serialPort As New IO.Ports.SerialPort

    Dim PicaxeRegisters(0 To 2) As Byte

    Dim w1 As Integer

    Dim i As Integer

    Dim var As Integer

    Dim w2 As Integer

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Timer1.Enabled = True

        Timer1.Interval = 1000    ' the interval at which the serial port accepts the data & this can be varied

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

 

        Call SerialTxRx()

    End Sub

    Sub SerialTxRx()

 

        Dim labelstring As String

        Dim labelstring1 As String

        If serialPort.IsOpen Then

            serialPort.Close()

        End If

        Try

            With serialPort

                .PortName = "COM1"

                .BaudRate = 9600

                .Parity = IO.Ports.Parity.None

                .DataBits = 8 ' 8 bits

                .StopBits = IO.Ports.StopBits.One

                .Open()

                .DiscardInBuffer()

                Call Sleep(100)

                .Read(PicaxeRegisters, 0, 3)   ' the 3 is because of the 2 values of the SRF005 + 1 space between the two values

                .Close()

            End With

            Label1.Text = PicaxeRegisters(0)

            Label2.Text = PicaxeRegisters(2)

            labelstring = PicaxeRegisters(0)

            labelstring1 = PicaxeRegisters(2)

 

            If PicaxeRegisters(2) < 116 And PicaxeRegisters(0) < 123 And PicaxeRegisters(0) > 2 And PicaxeRegisters(2) > 2 Then ' limits

                Dim x As Double

                Dim y As Double

 

                If PicaxeRegisters(2) > 30 Then

                    x = (112 - labelstring1) * 18   ' 112 is the extreme value of x & it depends on your monitor

                    y = (120 - labelstring) * 18    '120 is the maximum value of y

                    '18 used to convert the SRF005 value's unit to pixel. My 

                    y = 900 - y                     ' 900 is the maximum pixel value(because my monitor is a 1440 X 900 monitor

                    Me.Cursor = New Cursor(Cursor.Current.Handle)

                    If x > 700 Then

                        x = x + (x - 700) * 0.25 'to maximise accuracy, increase or decrease 0.25 according to your convinience

                    End If

                    Cursor.Position = New Point(x, y)

                Else

                    Call apimouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

                End If

                Label3.Text = x

                Label4.Text = y

            Else

                Call apimouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

            End If

        Catch ex As Exception

            MsgBox(ex.ToString)

            Label1.Text = "Timeout"

        End Try

   End Sub

End Class

What this does is : The two SRF05 sensors send the distance values (horizontal and vertical) to the COM port, which is recieved by the VB code and it makes some calculations as shown above to move the cursor to the position where you pointed to. 

 

You can also use " Call apimouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0)" and " Call apimouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0)" to deal with scrolling

 

 

 

This project is not very tough to make, but it takes a lot of time and patience to do it... Please give me some suggestions and improvements(if any) as comments.

Thank You

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Wow, that is a pretty interesting use of the SRF05. Where are the sensors placed to get a good view of the X, Y positions?

The sensors are placed at the top and at the right hand side of the monitor.. It is highlighted here .. 
http://letsmakerobots.com/files/Photo0166.jpg 

they are placed 36cm above and 20 cm to the right for a good view, and to get the full view of the monitor