Using Visual Basic 2010 to control Arduino Uno

 by techbitar
PC to Arduino.jpg
I know this has been done in the past a few times so here's one more. This is a skeletal Visual Basic 2010 and Arduino Sketch that I mixed together to test the PC to Arduino Uno connection via serial. It simply turns LED 13 on or off. 

The Visual Basic 2010 code assumes you have Form1 with 2 buttons Button1 and Button2 and SerialPort1 controls. Button1 sends a 1 and Button2 sends a 0 to the serial port COM10 (change this to match your PC to Arduino port setting)

See attached photo of my simple form design.

The Arduino Uno Sketch code simply waits and reads the serial port. If it see 1 it will turn PIN 13 on and if it sees 0 it will turn PIN 13 off. If you have an LED on PIN 13, you can turn it on and off. On the Arduino Uno, PIN 13 is attached to a an on-board LED.

I used COM10 as a serial port but you can (and must) change it to match your Arduino serial port.

The purpose of this code is to simplify explanation of how to connect VB to Arduino. You can add error processing and more intelligence based on your particular needs.  

Make sure you drag the Serial Port control icon from the Toolbox onto your form. It should have the name SerialPort1

WARNING: On my PC I had to close the Arduino IDE Serial Monitor window while runing the VB program, else I run into all sorts of error message about COM port access denied and the program will fail.

You can download Visual Basic Express 2010 for free from Microsoft
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-basic-express


'------------ START OF VB 2010 CODE -----------------
' NOTE: I am using COM10 so you need to change the Visual Basic code to match your COM port

Imports System.IO
Imports System.IO.Ports
Imports System.Threading

Public Class Form1
Shared _continue As Boolean
Shared _serialPort As SerialPort

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "com10" 'change com port to match your Arduino port
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SerialPort1.Open()
SerialPort1.Write("1")
SerialPort1.Close()
End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Open()
SerialPort1.Write("0")
SerialPort1.Close()
End Sub
End Class


'------------ END OF VB 2010 CODE -----------------


//------------- START OF ARDUINO SKETCH -----------------
//
// Mixed by: Hazim Bitar
// Based on: Science Guy 14 youTube tutorial http://youtu.be/g0pSfyXOXj8

int ledPin = 13; // the number of the LED pin

void setup() {
Serial.begin(9600); // set serial speed
pinMode(ledPin, OUTPUT); // set LED as output
digitalWrite(ledPin, LOW); //turn off LED
}


void loop(){
while (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0'; // deduct ascii value of '0' to find numeric value of sent number

if (val == 1) { // test for command 1 then turn on LED
Serial.println("LED on");
digitalWrite(ledPin, HIGH); // turn on LED
}
else if (val == 0) // test for command 0 then turn off LED
{
Serial.println("LED OFF");
digitalWrite(ledPin, LOW); // turn off LED
}
else // if not one of above command, do nothing
{
//val = val;
}
Serial.println(val);
Serial.flush(); // clear serial port
}

//------------- END OF ARDUINO SKETCH -----------------
 
tal bajjali says: Apr 29, 2013. 10:30 PM
can some one please explain this code for me i really feel stupid :(



int incomingByte = 0;
int r = 9;
int g = 10;
int b = 11;
int datar = 0;
int datag = 0;
int datab = 0;
int part = 0;
int numbertrans = 0;

void setup() {
Serial.begin(9600);
}

void loop() {


if (Serial.available() > 0) {

incomingByte = Serial.read();
if (incomingByte == 48) { numbertrans = 1; }
if (incomingByte == 49) { numbertrans = 25; }
if (incomingByte == 50) { numbertrans = 51; }
if (incomingByte == 51) { numbertrans = 76; }
if (incomingByte == 52) { numbertrans = 102; }
if (incomingByte == 53) { numbertrans = 127; }
if (incomingByte == 54) { numbertrans = 153; }
if (incomingByte == 55) { numbertrans = 178; }
if (incomingByte == 56) { numbertrans = 204; }
if (incomingByte == 57) { numbertrans = 255; }
if (incomingByte == 44) { part++; }
if (part == 0) {datar = numbertrans;}
if (part == 1) {datag = numbertrans;}
if (part == 2) {datab = numbertrans;}
if (part == 3) {
analogWrite(9, datar);
analogWrite(10, datag);
analogWrite(11, datab);
part = 0;}
// Below is evil dubug stuff
Serial.println(incomingByte, DEC);
}
}
acalaguin says: Mar 8, 2013. 10:04 AM
How about connecting to ethernet shield using vb2010?
ozzykaka says: Feb 15, 2013. 4:13 AM
it's cool~
But it still not work when I try it in VB
I "change com port to match your Arduino port"
And it work when I test in ARDUINO.(To check if it's ok)
If there any thing I need to check?


czarlesnomad says: Dec 25, 2012. 12:29 AM
Cool! Works out just fine. I'm just wondering about this code:
Shared _continue As Boolean
Shared _serialPort As SerialPort
It happens to have an error and i just commented it, Still the program works. Can you explain why?
Muiz_9989 says: Dec 8, 2012. 4:25 PM
How to read and send serial data from a pushbutton attached to Arduino?
booliminator says: Nov 1, 2012. 9:44 AM
Hey, this lets me control pin 13, what if I want to control multiple pins???
Please let me know, how to control multiple pins.
Thanks,
techbitar (author) in reply to booliminatorNov 29, 2012. 7:29 AM
You can accomplish this in many different ways. One way is to send a byte from the PC to Arduino containing a pin number and a value.

If we divide the byte we are sending into 2 X 4-bits, we can use 4-bits for pin number 0 to 15 and the other 4 bits to also send any value from 0 to 15. This requires basic binary math which is supported by both Arduino and VB. Of course you can decide how to interpret the bit patterns you are getting from the PC

Example: Suppose you want to control pin 4 to turn it on.

1) We can set the most significant 4-bits to number 4: In binary that's 0100.

2) Then we set the least significant 4-bits to 1111 to signify ON. (use whatever system that works for you)

3) Then we send 01001111 from PC to Arduino

4) At the Arduino, our sketch will read each 4-bit into pin# + command and act accordingly.

Hope this helps.
van0502 says: Nov 28, 2012. 6:58 AM
(removed by author or community request)
van0502 in reply to van0502Nov 28, 2012. 7:36 AM
Also which Arduino Uno did you use (Arduino Uno R3 or R2) and what are its specifications?
techbitar (author) in reply to van0502Nov 29, 2012. 7:10 AM
It should not matter.
cmcg182 says: Feb 13, 2012. 6:15 PM
This is great stuff... very helpful!!!! This code helped me understand the concept, however, there's still something I don't understand. How do you control different pins? For instance, if I wanted to add 2 more buttons (button 3 and 4) and have them turn on and off pin 12, along with the other two buttons still controlling pin 13, how would I do that? Thanks!
techbitar (author) in reply to cmcg182Feb 14, 2012. 3:01 PM
Thanks! you can apply the concepts discussed in my serial Arduino guide to send a pin number then act on that value at the Arduino side. For example you can send two bytes, the first one contains the pin number and the second one a 1 or 0 to turn pin on or off. Or you can send a a range of values that you decide their meaning instead of just 1 or 0.
booliminator in reply to techbitarNov 1, 2012. 6:24 PM
Where can we fund your serial ardunio guide?
crob09 in reply to techbitarOct 7, 2012. 9:31 AM
Thank you! I will try it with the easy-driver.
creativen says: May 8, 2012. 9:07 AM
I use visual Basic 2010 but it can not run well, it shows:

Error 1 'SerialPort1' is not declared. It may be inaccessible due to its protection level. C:\Documents and Settings\Sugianto\Local Settings\Application Data\Temporary Projects\WindowsApplication1\Form1.vb 10 9 WindowsApplication1

Anyone knows what happen?
techbitar (author) in reply to creativenMay 8, 2012. 10:10 PM
Change COM ports in the VB code and try it again. My code uses COM10 but may be this port is used by other apps on your PC.
creativen in reply to techbitarMay 8, 2012. 11:35 PM
Finally i got the cause. It is not about the COM things.
I just forgot to drag Serial Port to the design window, now it works well.

Thank you for responding.

Anyway, in your code:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "com10" 'change com port to match your Arduino port
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
End Sub


why do you start with SerialPort1.Close() ?
yhlee92 in reply to creativenAug 15, 2012. 12:53 AM
I have the same problem with you. What you mean by drag Serial Port to the design window? i can't get it!!
techbitar (author) in reply to yhlee92Aug 15, 2012. 7:42 AM
There's a Control icon in your VB tools named serial port. it's a control like a button or field. You drag it onto your form so you can access its properties.
techbitar (author) in reply to creativenMay 20, 2012. 1:04 PM
Glad it worked out.
benjie ababon says: Jul 22, 2012. 3:12 AM
how to drag the serial port icon into the visual basic 2010

any one help me plzzzz
rdesignee says: Jul 6, 2012. 11:52 PM
How to paste the code on the VB, after I create 2 buttons and 1 serial Port,
techbitar (author) in reply to rdesigneeJul 16, 2012. 4:51 AM
i replied to your private message. hope that works for you.
betokardenas says: Jul 2, 2012. 10:59 PM
I have a problem with this , may be it's easy ,i'm new in this stuff,
http://img210.imageshack.us/img210/9445/arduinoproblem.jpg
why ?
HELP PLEASE!!
techbitar (author) in reply to betokardenasJul 3, 2012. 3:30 AM
When I open your link I get an error message.
crob09 says: May 6, 2012. 5:18 PM
How do I do this for a stepper?
I have the VB code working thanks for that!
But I would love to have this work for a stepper motor and don't know how to write the sketch.
Any help greatly appreciated,
Rob

Here is what I have:

#include

while (val == 1) { // test for command 1 then turn on stepper
do
int enA = 10; // Enable pin 1 on Motor Control Shield
int enB = 11; // Enable pin 2 on Motor Control Shield
int dirA = 12; // Direction pin dirA on Motor Control Shield
int dirB = 13; // Direction pin dirB on Motor Control Shield
#If
(val == 0) // test for command 0 then turn on next stepper
do
int enA = 14; // Enable pin 1 on Motor Control Shield
int enB = 15; // Enable pin 2 on Motor Control Shield
int dirA = 16; // Direction pin dirA on Motor Control Shield
int dirB = 17; // Direction pin dirB on Motor Control Shield
end whileloop

const int stepsPerRevolution = 20; // Change this to fit the number of steps per revolution
// for your motor

// Initialize the stepper library on pins 12 and 13:
Stepper myStepper(stepsPerRevolution, dirA, dirB);


void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);

// Enable power to the motor
pinMode(enA, OUTPUT);
digitalWrite (enA, HIGH);

pinMode(enB, OUTPUT);
digitalWrite (enB, HIGH);
}

void loop() {
// Step five revolutions into one direction:
myStepper.step(stepsPerRevolution*5);
delay(2000);

// Step five revolutions in the other direction:
myStepper.step(-stepsPerRevolution*5);
delay(2000);
}

rirdrifta says: Feb 25, 2012. 6:56 PM
Thank You i did it and it worked made it wireless too using xbee. I am going to do crazy amazing things with this like controlling an rc car.
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!