Since this is my first post to this forum, please be indulgent.
Objective
Control the opening and closing of my astronomical observatory roof (www.fjbastro.webs.com) via my computer (i.e. the applicaiton I am writing in vb.net).
Board
Arduino Uno
Devices being used
2 transistors/relays (i.e. digital pin 2 and 3) to control one motor and 2 limit switches (digital pin 4 and 5) to stop the motor when the roof is fully open or closed (see attached schematic).
Softwares
vb.net application (EasyObs.exe) using firmatavb.dll to firmata 2.2 loaded on Arduino (see attached vb.net code).
Issue
When I power on the arduino board and/or when I connect to it, the observatory roof is normally closed, therefore, one of the limit switch is closed and the associated digital pin (5) should read HIGH. However, at power on or after Arduino reset, the pin state allways show LOW. My vb.net code therefore allways report "WARNING: Unknown Status of Roof" (as per my code) because both pin 4 and 5 read LOW (even though, I have one switch closed).
The only way I found to make sure to have my code read the pin state as High, is to use "firmata_test.exe" to read all of the Arduino pins state and force digital pin 4 and 5 to output mode and then back to input mode. As soon as I switch these pins to input mode, they start reading high. I then, close "firmata_test.exe" and fire up my application where the pin states are ok. After that, my application will work ok until I shut down the power to the Arduino.
Does anyone have an idea of why this is happening and how I can resolve this?
Public Class EasyObs
Public Const HIGH As Integer = 1
Public Const LOW As Integer = 0
Public Const INPUT As Integer = 0
Public Const OUTPUT As Integer = 1
Public STOPPED As Boolean
Public sw As Stopwatch
Public RoofStatus As String
Public Sub EasyObs_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Insert here automatic connection to Arduino once ready for ASCOM implementation
LblRoofStatus.Text = "-"
LblBoardStatus.Text = "Disconnected"
cmdCloseRoof.Enabled = False
cmdOpenRoof.Enabled = False
CmdDisconnect.Enabled = False
End Sub
Public Sub CmdConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdConnect.Click
'ComboComPort.Items.AddRange(FirmataVB1.COMPortList())
'ComboComPort.Text = Firmata.FirmataVB.DEFAULT_COM_PORT
FirmataVB1.Connect(ComboComPort.Text, ComboBaudRate.Text)
CmdConnect.Enabled = False
FirmataVB1.PinMode(2, OUTPUT)
wait(100)
FirmataVB1.PinMode(3, OUTPUT)
wait(100)
FirmataVB1.PinMode(4, INPUT)
wait(100)
FirmataVB1.PinMode(5, INPUT)
wait(100)
FirmataVB1.PinMode(4, OUTPUT)
wait(100)
FirmataVB1.PinMode(5, OUTPUT)
wait(100)
FirmataVB1.PinMode(4, INPUT)
wait(100)
FirmataVB1.PinMode(5, INPUT)
wait(100)
If FirmataVB1.DigitalRead(5) = HIGH Then
LblRoofStatus.Text = "Roof Closed"
Else
If FirmataVB1.DigitalRead(4) = HIGH Then
LblRoofStatus.Text = "Roof Opened"
Else
LblRoofStatus.Text = "WARNING: Unknown Status of Roof"
End If
End If
LblBoardStatus.Text = "Connected"
CmdDisconnect.Enabled = True
cmdOpenRoof.Enabled = True
cmdCloseRoof.Enabled = True
End Sub
Public Sub cmdOpenRoof_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpenRoof.Click
STOPPED = False
cmdCloseRoof.Enabled = False
LblRoofStatus.Text = "OPENING"
Do Until FirmataVB1.DigitalRead(4) = HIGH Or STOPPED = True
Application.DoEvents()
FirmataVB1.DigitalWrite(2, HIGH)
Loop
FirmataVB1.DigitalWrite(2, LOW)
LblRoofStatus.Text = "Roof Opened"
cmdCloseRoof.Enabled = True
End Sub
Public Sub cmdCloseRoof_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCloseRoof.Click
STOPPED = False
cmdOpenRoof.Enabled = False
LblRoofStatus.Text = "CLOSING"
Do Until FirmataVB1.DigitalRead(5) = HIGH Or STOPPED = True
Application.DoEvents()
FirmataVB1.DigitalWrite(3, HIGH)
Loop
FirmataVB1.DigitalWrite(3, LOW)
LblRoofStatus.Text = "Roof Closed"
cmdOpenRoof.Enabled = True
End Sub
Public Sub CmdStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdStop.Click
STOPPED = True
FirmataVB1.DigitalWrite(2, LOW)
FirmataVB1.DigitalWrite(3, LOW)
cmdCloseRoof.Enabled = True
cmdOpenRoof.Enabled = True
End Sub
Public Sub CmdDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdDisconnect.Click
LblBoardStatus.Text = "Disconnected"
LblRoofStatus.Text = "-"
If FirmataVB1.PortOpen = True Then
FirmataVB1.Disconnect()
CmdConnect.Enabled = True
cmdCloseRoof.Enabled = False
cmdOpenRoof.Enabled = False
CmdDisconnect.Enabled = False
Else
LblBoardStatus.Text = "Already Disconnected"
End If
End Sub
' Loops for a specificied period of time (milliseconds)
Public Sub wait(ByVal interval As Integer)
Dim sw As New Stopwatch
sw.Start()
Do While sw.ElapsedMilliseconds < interval
' Allows UI to remain responsive
Application.DoEvents()
Loop
sw.Stop()
End Sub
End Class
My bad, I agree with the 9v in the pin statement. My original schematic had 9v in the pin...after blowing a board, I had to purchase a new one and connected the switches using the 5volts pin.
His circuit appears to show that, although I'm not sure that DC 9V Gnd means. Hopefully this is the same as the Arduino Gnd. Otherwise, trouble brewing.
For more help with the programming side, can you clarify how you are running VB on the Arduino?
And why make them output and then input again? Even though I don't understand how you are running VB here, it looks a bit indecisive what you are doing there.
I have inserted delays between the pinmode settings otherwise they don't go through...seems to be a timing problem.
I switch from input to output back to input in my code because I wanted to replicate what I was doing manually (i.e. using firmata_test.exe). However, it does not work.
Nick, I have used IDE 0023 to upload the StandardFirmata_2_2_forUNO_0_3.pde on the board.
But I am not using the Arduino IDE to program it. I am using Visual Studio to build my own application. That application is using a library Firmatavb.dll to talk to the above pde on the board.
I don't like the delays either. But it's the only way that I was able to make this work. Furthermore, the point is not about these delays...go back to my description of the issue:
The Arduino board is reading LOW on pin 5 at power on when the switch is closed (therefore when current flows from 5v to pin 5).
Frankjb:
Furthermore, the point is not about these delays...go back to my description of the issue:
Oh, sorry. But if you need delays to make pinMode work:
I have inserted delays between the pinmode settings otherwise they don't go through ...
What makes you think you don't need delays to make digitalRead work?
I'm sorry, but if you have to randomly insert delays to make code work, and your code doesn't work in places where you don't have a delay, I don't think you can say "the point is not about these delays".
Frankjb:
The Arduino board is reading LOW on pin 5 at power on when the switch is closed ...
Let's be a little more precise. The Arduino may or may not be reading a LOW. But you aren't directly looking at that. You have code running on the Arduino, which sends data via a serial port, to your program running on your PC, via a DLL, which works it way up through a Visual Basic program, which eventually (at the end of a rather long food chain, if I may say) apparently does not report things correctly.
Then close and open the switch on pin 5 and see if the LED on pin 13 goes on and off. That will confirm the hardware part. After that, well it's somewhere in Firmata.
The issue exist even when I use firmata_test.exe to read the pin state. See the screenshot of that app at:
At power on, all pins are reading LOW (even though I have current flowing from 5v to pin5). The only way I can have it read HIGH, is by using this interface to switch the pinmode to output and then back to input. Then it reads HIGH.