Arduino & Visual Basic 6.0 (Continuous Servo Motor)
by Daphne00Z in Circuits > Arduino
8572 Views, 14 Favorites, 0 Comments
Arduino & Visual Basic 6.0 (Continuous Servo Motor)
This Instructable is almost similar to the Light Controller posted previously. It contains the same structure and pattern in controlling the Servo Motor. I used some ideas form Galil Motor Control structures to create my parser. Namely, SH (Servo Here) and some others. Galil is one of the motion control cards used in automation industries. For more info on Galil: http://www.galilmc.com/
My application does not support multi-threading but it is achievable by using interrupts on the Arduino. I think multithreading refers to controlling motors in a parallel manner where they operate together. Instead of using the classes built on my previous post https://www.instructables.com/id/Arduino-Visual-Basic-6-Light-Controller/ , i made it into DLL files which could be used in any other applications that could use its function.
My application does not support multi-threading but it is achievable by using interrupts on the Arduino. I think multithreading refers to controlling motors in a parallel manner where they operate together. Instead of using the classes built on my previous post https://www.instructables.com/id/Arduino-Visual-Basic-6-Light-Controller/ , i made it into DLL files which could be used in any other applications that could use its function.
Visual Basic 6.0 (Making DLL)
When making a DLL in VB6.0, always create independent class. Inside the class, there could be as much Public (accessible by user) and Private (Only accessible by internal functions) functions. It is a good practice to create classes that has specific functions so it could also be used in future projects. Make sure you save the project and class file before making the DLL so you could modify it in the future. *A DLL cannot be modified* without its main project/class files. When creating DLL, make sure:
1. Class is independent, Declare variables as private (more privacy)
2. Do not accept objects into class. Instead, accept 'variants' then 'set' to a privately declared object.
Example:
Private MC as MSComm
Public sub InitializeClass (Byval fileName as String, MsComm as Variant) 'instead of
Public sub InitializeClass (Byval fileName as String, MsComm as MSComm)
Then, Set MC = MsComm
3. Others??? (I have only encountered the problem stated in 2.)
My Servo Function
Private The_File As String, The_Section As String
Private MComm As MsComm, tBox As TextBox
Private TextLength As Long, Command As String
Private Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Const LocWordLength = 20
Public Sub InitServo(PortSettingFileName As String, FileSection As String, MsComm As Variant, txtBoxFeedback As Variant)
The_File = PortSettingFileName
The_Section = FileSection
Set MComm = MsComm
Set tBox = txtBoxFeedback
'Output loaded COMPORT settings
Log "File: " & The_File & vbCrLf & "Section: " & The_Section
'Open ComPort and connect with Arduino
With MComm
If .PortOpen Then .PortOpen = False 'close and set the com port number
.CommPort = SimpleGet("comport")
.Settings = SimpleGet("settings")
.EOFEnable = True
Log "Com Port: " & .CommPort & vbCrLf & "Settings: " & .Settings
End With
SendData ("CO")
End Sub
Public Sub SendData(ByVal Commandx As String)
On Error GoTo Error
Command = Commandx
'check command first
Command = Trim(Command) 'get rid of extra spaces at the side
If (InStr(Command, " ") <> 0) Or (Len(Command) > 10) Then
GoTo Error 'do not send if command format is wrong
End If
Dim i As Integer, Char As String
For i = 1 To 2 'because length of ecpected character is 2 only
Char = Mid(Command, i, 1)
If (Char >= "A" And Char <= "Z") Then 'do nothing if first 2 characters are alphabets
Else
GoTo Error
End If
Next i
If InStr(Char, "C") = 0 Then 'check for numerals for input not related to CT and CO
For i = 3 To Len(Command) 'make sure the rest of the command are integers
Char = Mid(Command, i, 1)
If (Char >= "0" And Char <= "9") Then 'do nothing if remaining characters are numerals
Else
GoTo Error
End If
Next i
End If
If InStr(Command, "L") = 0 Then 'If command does not prompt for Location
TextLength = Len(Command)
Else
TextLength = LocWordLength
End If
With MComm
.DTREnable = False
.RTSEnable = False 'disable request to send signal
If .PortOpen = False Then .PortOpen = True 'Open port
.Output = Commandx 'Send Text
.RThreshold = TextLength 'Save Sent String Length
End With 'leave port open to wait for echo signal to proceed
ServoOnComm
Exit Sub
Error:
If (Err.Description) Then
MsgBox Err.Description
Else
MsgBox "Invalid Command!"
End If
End Sub
Private Sub Log(Text As String)
On Error GoTo ERRR
tBox.Text = Text & vbCrLf & tBox.Text
Exit Sub
ERRR:
MsgBox "Error while logging: " & Err.Description
Resume Next
End Sub
'Manual OnComm Function to detect echo of sent data
Private Sub ServoOnComm()
Dim InString As String
Do
DoEvents
Loop Until MComm.CommEvent = comEvReceive And MComm.InBufferCount >= TextLength
Sleep (5)
If TextLength = LocWordLength Then 'wait for remaining characters to reach buffer
Sleep (30)
End If
' Retrieve all available data.
MComm.InputLen = 0
' Check for data.
If MComm.InBufferCount > 0 Then ' Read data.
InString = MComm.Input
'check if received data is as expected
If InStr(InString, Command) > 0 Then 'if command is an echo
ElseIf InStr(Command, "L") <> 0 Then 'if original command has L and echo is long
If Len(InString) >= LocWordLength Then
End If
Else
GoTo Error
End If
If Len(InString) > 0 Then 'Output echo onto textbox
tBox.Text = InString & tBox.Text
End If
End If
If MComm.PortOpen Then MComm.PortOpen = False 'close port after receiving reply
Exit Sub
Error:
MsgBox "Receive Error!"
End Sub
Public Sub ExitServo()
SendData ("CT")
If MComm.PortOpen Then MComm.PortOpen = False 'If port is open, close if before exit
'maybe can add to home servo before exiting
End Sub
Public Function SimpleGet(VarName As String) As String
Static sLocalBuffer As String * 500
Dim l As Integer
l = GetPrivateProfileString(The_Section, VarName, vbNullString, sLocalBuffer, 500, The_File)
SimpleGet = Left$(sLocalBuffer, l)
End Function
1. Class is independent, Declare variables as private (more privacy)
2. Do not accept objects into class. Instead, accept 'variants' then 'set' to a privately declared object.
Example:
Private MC as MSComm
Public sub InitializeClass (Byval fileName as String, MsComm as Variant) 'instead of
Public sub InitializeClass (Byval fileName as String, MsComm as MSComm)
Then, Set MC = MsComm
3. Others??? (I have only encountered the problem stated in 2.)
My Servo Function
Private The_File As String, The_Section As String
Private MComm As MsComm, tBox As TextBox
Private TextLength As Long, Command As String
Private Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Const LocWordLength = 20
Public Sub InitServo(PortSettingFileName As String, FileSection As String, MsComm As Variant, txtBoxFeedback As Variant)
The_File = PortSettingFileName
The_Section = FileSection
Set MComm = MsComm
Set tBox = txtBoxFeedback
'Output loaded COMPORT settings
Log "File: " & The_File & vbCrLf & "Section: " & The_Section
'Open ComPort and connect with Arduino
With MComm
If .PortOpen Then .PortOpen = False 'close and set the com port number
.CommPort = SimpleGet("comport")
.Settings = SimpleGet("settings")
.EOFEnable = True
Log "Com Port: " & .CommPort & vbCrLf & "Settings: " & .Settings
End With
SendData ("CO")
End Sub
Public Sub SendData(ByVal Commandx As String)
On Error GoTo Error
Command = Commandx
'check command first
Command = Trim(Command) 'get rid of extra spaces at the side
If (InStr(Command, " ") <> 0) Or (Len(Command) > 10) Then
GoTo Error 'do not send if command format is wrong
End If
Dim i As Integer, Char As String
For i = 1 To 2 'because length of ecpected character is 2 only
Char = Mid(Command, i, 1)
If (Char >= "A" And Char <= "Z") Then 'do nothing if first 2 characters are alphabets
Else
GoTo Error
End If
Next i
If InStr(Char, "C") = 0 Then 'check for numerals for input not related to CT and CO
For i = 3 To Len(Command) 'make sure the rest of the command are integers
Char = Mid(Command, i, 1)
If (Char >= "0" And Char <= "9") Then 'do nothing if remaining characters are numerals
Else
GoTo Error
End If
Next i
End If
If InStr(Command, "L") = 0 Then 'If command does not prompt for Location
TextLength = Len(Command)
Else
TextLength = LocWordLength
End If
With MComm
.DTREnable = False
.RTSEnable = False 'disable request to send signal
If .PortOpen = False Then .PortOpen = True 'Open port
.Output = Commandx 'Send Text
.RThreshold = TextLength 'Save Sent String Length
End With 'leave port open to wait for echo signal to proceed
ServoOnComm
Exit Sub
Error:
If (Err.Description) Then
MsgBox Err.Description
Else
MsgBox "Invalid Command!"
End If
End Sub
Private Sub Log(Text As String)
On Error GoTo ERRR
tBox.Text = Text & vbCrLf & tBox.Text
Exit Sub
ERRR:
MsgBox "Error while logging: " & Err.Description
Resume Next
End Sub
'Manual OnComm Function to detect echo of sent data
Private Sub ServoOnComm()
Dim InString As String
Do
DoEvents
Loop Until MComm.CommEvent = comEvReceive And MComm.InBufferCount >= TextLength
Sleep (5)
If TextLength = LocWordLength Then 'wait for remaining characters to reach buffer
Sleep (30)
End If
' Retrieve all available data.
MComm.InputLen = 0
' Check for data.
If MComm.InBufferCount > 0 Then ' Read data.
InString = MComm.Input
'check if received data is as expected
If InStr(InString, Command) > 0 Then 'if command is an echo
ElseIf InStr(Command, "L") <> 0 Then 'if original command has L and echo is long
If Len(InString) >= LocWordLength Then
End If
Else
GoTo Error
End If
If Len(InString) > 0 Then 'Output echo onto textbox
tBox.Text = InString & tBox.Text
End If
End If
If MComm.PortOpen Then MComm.PortOpen = False 'close port after receiving reply
Exit Sub
Error:
MsgBox "Receive Error!"
End Sub
Public Sub ExitServo()
SendData ("CT")
If MComm.PortOpen Then MComm.PortOpen = False 'If port is open, close if before exit
'maybe can add to home servo before exiting
End Sub
Public Function SimpleGet(VarName As String) As String
Static sLocalBuffer As String * 500
Dim l As Integer
l = GetPrivateProfileString(The_Section, VarName, vbNullString, sLocalBuffer, 500, The_File)
SimpleGet = Left$(sLocalBuffer, l)
End Function
Run
The video shows how program is loaded and run on the Arduino and Servo. To fully utilize the Gmail loading, Open the Gmail.ini file and key in your username and password. Remember not to forget you've written your private data in a file.
The application will only load one unread message. If you have more than one unread message, it will display mail not available.
Additional functions that you can add on yourself is the timer (check mail automatically when timer is triggered)
Feel free to ask any questions. :)
Sorry for the bad quality video...