Proximity Sensor feedback to Visual Basic 6.0

Hi all, I successfully controlled my arduino using my WRT54gL router, but my problem is I can't see the sensor feedback through visual basic; although it is working ( hardware).

I patterned my code as JB's: Wifi Robot - JBProjects.net

Desired Application: When the sensor detects something, there will a indicator in the visual basic so the user may be alerted.

Any clues?

Thanks in advance

I patterned my code as JB's

This means that your code isn't exactly the same as JB's. So, we need to see your code.

but my problem is I can't see the sensor feedback through visual basic

Either the Arduino isn't sending it (correctly) or the VB application isn't receiving it correctly. Without seeing the code on either end, it is not possible to determine what the problem is.

At the risk of seeming to harass another newbie, I need to ask you for more information. Please post your Arduino and VB code.

Paul,

Arduino code: #define DEBUG 0
#define WAIT_FOR_START 1

unsigned char incomingByte = 0;
unsigned long loop_count = 0;
unsigned char horn = 32;
unsigned char redLED = 64;
unsigned char greenLED = 128;

unsigned char forward = 1;
unsigned char backward = 2;
unsigned char left = 4;
unsigned char right = 8;

unsigned char PORTB_val;
unsigned char PORTD_val;

unsigned char in_char = 0;
int ledPin = 13;
int sensor1 = 3;
int er1=0;
int x=0;
void setup()
{
//PORTD = digital IO 0-7
//horn, redLED, greenLED

pinMode(5, OUTPUT); // sets the digital pin as output
pinMode(6, OUTPUT); // sets the digital pin as output
pinMode(7, OUTPUT); // sets the digital pin as output

//PORTB = digital IO 8 - 13
//right, left, backwards, forward

pinMode(8, OUTPUT); // sets the digital pin as output
pinMode(9, OUTPUT); // sets the digital pin as output
pinMode(10, OUTPUT); // sets the digital pin as output
pinMode(11, OUTPUT); // sets the digital pin as output
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // set up Serial library at 9600 bps

PORTD = redLED; // turn on the red LED

#if DEBUG
flash_led(3,500);
#endif
semi_start();
//wait_for_start(); //Waits for startup message from router serial port
//continues after receiving it.
}

void flash_led(unsigned int count, unsigned int rate)
{
// debug routine that flashes an LED

int n_count = 0;

while (n_count < count)
{
n_count++;
digitalWrite(13, HIGH); // sets the LED on
delay(rate); // waits for a bit
digitalWrite(13, LOW); // sets the LED off
delay(rate); // waits for a bit
}
}

char get_char()
{
//Function that waits for a character from the serial port
//If none are received, it returns 0.
//The timeout is so that if the router stops sending data to the microcontroller,
//the micrcontroller will stop driving the car, rather than just going forever with
//the last command. Timeout is around 250mS.

while (loop_count < 30000)
{
loop_count++;

if (Serial.available() > 0)
{
incomingByte = Serial.read();
loop_count = 0;
return incomingByte;
}
}

loop_count = 0;

#if DEBUG
Serial.print('X', BYTE);
#endif

return 0;
}

unsigned char wait_for_start()
{
//Waits for startup message from router serial port
#if WAIT_FOR_START

#if DEBUG
Serial.println("Waiting...");
#endif

while(1)
{
if (get_char() == 'j' && get_char() == 'b' && get_char() == 'p' && get_char() == 'r' && get_char() == 'o')
{

#if DEBUG
Serial.print("Passcode Accepted");
#endif

return 0;
}
}
#endif
}

void loop()
{
//Function that processes input from serial port and drives the car based
//on that input.

in_char = get_char();
er1= digitalRead(sensor1);
//Split byte received in to upper and lower halves.
PORTB_val = in_char & 0x0F;
PORTD_val = in_char & 0xF0;

//Make sure the greenLED is turned on now.
if ((PORTD_val & greenLED) == 0)
{
PORTD_val = PORTD_val + greenLED;
}

//The following IF statements are sanity checks to make sure that FORWARD and BACKWARD cannot be on at the same time
//and that LEFT and RIGHT can't be on at the same time.
if ((PORTB_val & (left + right)) == (left + right))
{
PORTB_val = PORTB_val - right;
}

if ((PORTB_val & (forward + backward)) == (forward + backward))
{
PORTB_val = PORTB_val - backward;
}

//Write the processed values to the ports.
PORTD = PORTD_val;
PORTB = PORTB_val;
//sensor test
if(er1 == HIGH)
{
digitalWrite(ledPin, LOW);
//this is where we want to put the code to be sent to VB
//is it Serial.print(x,BYTE)??
}

#if DEBUG
Serial.print(PORTD, HEX);
Serial.print(PORTB, HEX);
#endif

}
unsigned char semi_start()
{
digitalWrite(ledPin, HIGH); // set the LED on
delay(5000); // wait for a second
digitalWrite(ledPin, LOW); // set the LED off
delay(1000); // wait for a second
wait_for_start();
}

VB Code: Option Explicit
Public direction As String
Public ttime As Integer
Public address As String
Public upstatus, downstatus, leftstatus, rightstatus, hornstatus As Integer
Public output As Integer

Private Sub call_timer_Timer()
Call motion("manual", upstatus + downstatus + rightstatus + leftstatus + hornstatus)
'Calls motion module. Lets it know manual driving and what value to output to the
'parallel port
End Sub

Private Sub Command1_Click()
If sock.State = sckClosed Then ' if the socket is closed
sock.RemoteHost = lbladdress.Text ' set server adress
sock.RemotePort = "1500" ' set server port
Label5.Caption = "Connected"
sock.Connect ' start connection attempt
Else ' if the socket is open
sock.Close ' close it
Label5.Caption = "Not Connected"
End If
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'Detects if control keys are pressed
If KeyCode = vbKeyEscape Then End 'Exits
If KeyCode = vbKeyT Then Call Command1_Click
If KeyCode = vbKeyUp Or KeyCode = vbKeyW Then: cmd_up.BackColor = &HFF0000: cmd_up.Picture = cmd_up.DownPicture: upstatus = 1
'If up arrow is pressed or W then change pictures (make it blue) and change upstatus.
If KeyCode = vbKeyDown Or KeyCode = vbKeyS Then cmd_down.BackColor = &HFF0000: cmd_down.Picture = cmd_down.DownPicture: downstatus = 2
'If down arrow is pressed or S then change pictures (make it blue) and change downstatus.
If KeyCode = vbKeyLeft Or KeyCode = vbKeyA Then cmd_left.BackColor = &HFF0000: cmd_left.Picture = cmd_left.DownPicture: rightstatus = 4
'If left arrow is pressed or A then change pictures (make it blue) and change rightstatus.
If KeyCode = vbKeyRight Or KeyCode = vbKeyD Then cmd_right.BackColor = &HFF0000: cmd_right.Picture = cmd_right.DownPicture: leftstatus = 8
'If right arrow is pressed or D then change pictures (make it blue) and change leftstatus.
If KeyCode = vbKeyH Then hornstatus = 32
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
'Stops output to that direction when key is lifted.
'Changes pictures back to unactivated (none-blue).
If KeyCode = vbKeyUp Or KeyCode = vbKeyW Then cmd_up.BackColor = &HFFFFFF: cmd_up.Picture = cmd_up.DisabledPicture: upstatus = 0
If KeyCode = vbKeyDown Or KeyCode = vbKeyS Then cmd_down.BackColor = &HFFFFFF: cmd_down.Picture = cmd_down.DisabledPicture: downstatus = 0
If KeyCode = vbKeyLeft Or KeyCode = vbKeyA Then cmd_left.BackColor = &HFFFFFF: cmd_left.Picture = cmd_left.DisabledPicture: rightstatus = 0
If KeyCode = vbKeyRight Or KeyCode = vbKeyD Then cmd_right.BackColor = &HFFFFFF: cmd_right.Picture = cmd_right.DisabledPicture: leftstatus = 0
If KeyCode = vbKeyH Then hornstatus = 0
End Sub

Private Sub Form_Load()
Dim line As String
'Stores {Arrow with white} pic in .DisabledPicture for each button
cmd_up.DisabledPicture = cmd_up.Picture
cmd_down.DisabledPicture = cmd_down.Picture
cmd_left.DisabledPicture = cmd_left.Picture
cmd_right.DisabledPicture = cmd_right.Picture
'Following Opens Config.txt and collect Parallel Port Address and Refresh Rate
Open CurDir & "\config.txt" For Input As #1
Line Input #1, line
Line Input #1, line
address = line 'Sets parallel port address
lbladdress.Text = address 'displays address
call_timer.Interval = 5

End Sub

Private Sub sock_Close()
sock.Close ' has to be
End Sub

Private Sub sock_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "Socket Error " & Number & ": " & Description
sock.Close ' close the erraneous connection
End Sub

'Motion Executor
Sub motion(direction As String, ttime As Integer)
address = Form1.address
Select Case direction
Case 1 To 10
Case "manual"
'If manual driving, parallel port output required for direction has already
'been calculated, so output value passed to ttime
output = ttime
Case "FF"
output = 1
Case "BB"
output = 2
Case "RR"
output = 8
Case "LL"
output = 4
Case "FR"
output = 9
Case "FL"
output = 5
Case "BR"
output = 10
Case "BL"
output = 6
Case "SS"
output = 0
End Select
Rem vbOut address, output
'sock.SendData output & Chr(0)
If sock.State = sckConnected Then
If output = &HC Or output = &H1C Then output = output - 8
If output = &H3 Or output = &H13 Then output = output - 2
sock.SendData Chr(output + 1) & Chr(0)
Label5.Caption = Chr(output + 1) & Chr(0)
Else
Label5.Caption = "NOT sending data"
Label2.Caption = output

End If
End Sub

Need: Sensor Feedback to VB application.
Setup: arduino to router to VB ( wirelessly)

Regards,

   //this is where we want to put the code to be sent to VB
   //is it Serial.print(x,BYTE)??

Yes, it is.

The Arduino code already has plenty of stuff being read from the serial port, and plenty of completely anonymous stuff being written to the serial port.

You will need some way, in the VB app, to sort out what is debug stuff, and what is useful sensor data.

The VB app does not appear to know anything about the COM port to write to/read from at this time. Where is the serial data that the Arduino read/prints coming from/going to now?

Paul,

The serial data is going to the router ( WRT54gL) then to the VB app.
( the arduino is connected to the router by serial port, and the VB app controls the arduino wirelessly via the router).

Here is the server/client ( carserver c) code that is programmed in the router as done by Jon Bennet:

I don't know what code will I edit: arduino code? VB app code? or this carserver c code ( server client mode)?
/*******************************************************************
; Function: Wifi Robot Server Software
; Filename: car_server.c
; Author: Jon Bennett
; Website: www.jbprojects.net/projects/wifirobot
; Credit: Based on TCP Server Test Example
; http://pont.net/socket/index.html
;*******************************************************************/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h> /* close */
#include <fcntl.h>
#include <string.h>

#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>

#define SUCCESS 0
#define ERROR 1

#define DEBUG 1

#define END_LINE 0x0
#define SERVER_PORT 1500
#define MAX_MSG 100

/* function readline */
int read_line();

int main (int argc, char *argv[]) {
int fd;
int sd, newSd, cliLen;
int result1;

struct sockaddr_in cliAddr, servAddr;
char line[MAX_MSG];

fd = open("/dev/tts/1", O_WRONLY);
if (fd < 0)
{
printf("Could not open port.\n");
}

result1 = write(fd, "jbpro", 5);

/* create socket */
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd<0) {
perror("cannot open socket ");
return ERROR;
}

/* bind server port */
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(SERVER_PORT);

if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) {
perror("cannot bind port ");
return ERROR;
}

listen(sd,5);
int count;
count = 0;
while(1) {
#if DEBUG
printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT);
#endif
cliLen = sizeof(cliAddr);
newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen);
if(newSd<0) {
perror("cannot accept connection ");
return ERROR;
}

/* init line /
memset(line,0x0,MAX_MSG);
unsigned char toWrite = 0;
/
receive segments */
while(read_line(newSd,line)!=ERROR) {
count++;
#if DEBUG
printf("%d: %s: received from %s:TCP%d : %s\n", count, argv[0],
inet_ntoa(cliAddr.sin_addr),
ntohs(cliAddr.sin_port), line);
#endif
char *buf="0";
//toWrite = line[0];
toWrite = line[0] - 1;

result1 = write(fd, &toWrite, 1);

if (result1 != 1)
{
printf("Error writing to serial port.\n");
}

/* init line */
memset(line,0x0,MAX_MSG);

} /* while(read_line) */

} /* while (1) */

}

/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING /
/
this function is experimental.. I don't know yet if it works /
/
correctly or not. Use Steven's readline() function to have /
/
something robust. /
/
WARNING WARNING WARNING WARNING WARNING WARNING WARNING */

/* rcv_line is my function readline(). Data is read from the socket when /
/
needed, but not byte after bytes. All the received data is read. /
/
This means only one call to recv(), instead of one call for /
/
each received byte. /
/
You can set END_CHAR to whatever means endofline for you. (0x0A is \n)/
/
read_lin returns the number of bytes returned in line_to_return */
int read_line(int newSd, char *line_to_return) {

static int rcv_ptr=0;
static char rcv_msg[MAX_MSG];
static int n;
int offset;

offset=0;

while(1) {
if(rcv_ptr==0) {
/* read data from socket /
memset(rcv_msg,0x0,MAX_MSG); /
init buffer */

n = recv(newSd, rcv_msg, MAX_MSG, 0); /* wait for data */
if (n<0) {
perror(" cannot receive data ");
return ERROR;
} else if (n==0) {
printf(" connection closed by client\n");
close(newSd);
return ERROR;
}
}

/* if new data read on socket /
/
OR /
/
if another line is still in buffer */

/* copy line into 'line_to_return' /
while(
(rcv_msg+rcv_ptr)!=END_LINE && rcv_ptr<n) {
memcpy(line_to_return+offset,rcv_msg+rcv_ptr,1);
offset++;
rcv_ptr++;
}

/* end of line + end of buffer => return line /
if(rcv_ptr==n-1) {
/
set last byte to END_LINE */
*(line_to_return+offset)=END_LINE;
rcv_ptr=0;
return ++offset;
}

/* end of line but still some data in buffer => return line /
if(rcv_ptr <n-1) {
/
set last byte to END_LINE */
*(line_to_return+offset)=END_LINE;
rcv_ptr++;
return ++offset;
}

/* end of buffer but line is not ended => /
/
wait for more data to arrive on socket */
if(rcv_ptr == n) {
rcv_ptr = 0;
}

} /* while */
}

Regards,

I don't know what code will I edit: arduino code? VB app code? or this carserver c code ( server client mode)?

Yes.

The Arduino code needs to be modified to output data differently. Right now, the output is just a bunch of numbers. There is no way for the router to know what it needs to deal with, and what it needs to forward to the VB app.

The carserver.c code obviously needs to be modified to send some data to the VB app.

And, clearly the VB app needs to be modified to read data and do something with it.

Thanks Paul,

Would you have some clue on how to go about editing the arduino, carserver.c, and the VB app? I have no idea how to make the arduino feedback data through the router ( carserver.c) so that it may be interpreted by the VB app.

In a way that there will be an indicator in the VB app that the sensor has detected anything.

CLIENT ( VB app) SERVER ( Router connected to arduino) problem.

Still got no clue :-/

Regards,