Hi, I am doing a project which controls a RC car with a VB program. I manage to send instructions in the form of characters to the Arduino by modifying the socketapp example. Now I need the Arduino to provide feedback or acknowledgement, how do I do that? And how do I retrieve these data from Arduino using VB?
Thanks!
/*
* Socket App
*
* A simple socket application example using the WiShield 1.0
*/
#include <WiShield.h>
#include <string.h>
#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2
// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {192,168,0,25}; // IP address of WiShield
unsigned char gateway_ip[] = {192,168,0,1}; // router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0}; // subnet mask for the local network
const prog_char ssid[] PROGMEM = {"SSID"}; // max 32 bytes
unsigned char security_type = 2; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2
// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"Password"}; // max 64 characters
// WEP 128-bit keys
// sample HEX keys
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, // Key 0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 2
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Key 3
};
// setup the wireless mode
// infrastructure - connect to AP
// adhoc - connect to another WiFi device
unsigned char wireless_mode = WIRELESS_MODE_INFRA;
unsigned char ssid_len;
unsigned char security_passphrase_len;
char buffer[20];
//struct socket_app_state *s;
//LED forward
int intForward = 4; //pin 2 must not be used. will cause wifi to hang
//LED backward
int intBackward = 5;
//LED left
int intLeft = 7;
//LED right
int intRight = 8;
//---------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println("BlackWidow has started.");
pinMode(intForward, OUTPUT);
pinMode(intBackward, OUTPUT);
pinMode(intLeft, OUTPUT);
pinMode(intRight, OUTPUT);
InitialDemo();
WiFi.init();
}
void loop()
{
WiFi.run();
switch (buffer[0])
{
case 'F':
Serial.println("Forward");
funcForward();
break;
case 'B':
Serial.println("Reverse");
funcBackward();
// PSOCK_SEND_STR(&s->p, "Instruction ""Reverse"" is received.");
break;
case 'L':
Serial.println("Left");
funcLeft();
//PSOCK_SEND_STR(&s->p, "Instruction ""Left"" is received.");
break;
case 'R':
Serial.println("Right");
funcRight();
break;
case 'S':
Serial.println("Stop");
funcStop();
break;
case 'N':
Serial.println("Keep Straight");
funcKeepStraight();
break;
}
memset(buffer, 0x00, sizeof(buffer)); // Empty buffer
}
void InitialDemo()
{
// Go Forward PWM
digitalWrite(intForward, HIGH);
delay(50);
// Go Backward PWM
digitalWrite(intBackward, HIGH);
delay(50);
// Turn Left Pin
digitalWrite(intLeft, HIGH);
delay(50);
// Turn Right Pin
digitalWrite(intRight, HIGH);
delay(50);
digitalWrite(intForward, LOW);
delay(50);
digitalWrite(intBackward, LOW);
delay(50);
digitalWrite(intLeft, LOW);
delay(50);
digitalWrite(intRight, LOW);
delay(50);
}
void funcForward()
{
digitalWrite(intBackward, LOW);
digitalWrite(intForward, HIGH);
}
void funcBackward()
{
digitalWrite(intForward, LOW);
digitalWrite(intBackward, HIGH);
}
void funcLeft()
{
digitalWrite(intRight, LOW);
digitalWrite(intLeft, HIGH);
}
void funcRight()
{
digitalWrite(intLeft, LOW);
digitalWrite(intRight, HIGH);
}
void funcStop()
{
digitalWrite(intForward, LOW);
digitalWrite(intBackward, LOW);
}
void funcKeepStraight()
{
digitalWrite(intLeft, LOW);
digitalWrite(intRight, LOW);
}
/******************************************************************************
Filename: socketapp.c
Description: Simple socket programming example for the WiShield 1.0
******************************************************************************
TCP/IP stack and driver for the WiShield 1.0 wireless devices
Copyright(c) 2009 Async Labs Inc. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Contact Information:
<asynclabs@asynclabs.com>
Author Date Comment
---------------------------------------------------------------
AsyncLabs 06/06/2009 Initial version
*****************************************************************************/
/*
* This is a short example of how to write uIP applications using
* protosockets.
*/
/*
* We define the application state (struct socket_app_state) in the
* socketapp.h file, so we need to include it here. We also include
* uip.h (since this cannot be included in socketapp.h) and
* <string.h>, since we use the memcpy() function in the code.
*/
#include "socketapp.h"
#include "uip.h"
#include <string.h>
/*
* Declaration of the protosocket function that handles the connection
* (defined at the end of the code).
*/
static int handle_connection(struct socket_app_state *s);
/*---------------------------------------------------------------------------*/
/*
* The initialization function. We must explicitly call this function
* from the system initialization code, some time after uip_init() is
* called.
*/
void socket_app_init(void)
{
/* We start to listen for connections on TCP port 1000. */
uip_listen(HTONS(1000));
}
/*---------------------------------------------------------------------------*/
/*
* In socketapp.h we have defined the UIP_APPCALL macro to
* socket_app_appcall so that this function is uIP's application
* function. This function is called whenever an uIP event occurs
* (e.g. when a new connection is established, new data arrives, sent
* data is acknowledged, data needs to be retransmitted, etc.).
*/
void socket_app_appcall(void)
{
/*
* The uip_conn structure has a field called "appstate" that holds
* the application state of the connection. We make a pointer to
* this to access it easier.
*/
struct socket_app_state *s = &(uip_conn->appstate);
/*
* If a new connection was just established, we should initialize
* the protosocket in our applications' state structure.
*/
if(uip_connected()) {
PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
}
/*
* Finally, we run the protosocket function that actually handles
* the communication. We pass it a pointer to the application state
* of the current connection.
*/
handle_connection(s);
}
/*---------------------------------------------------------------------------*/
/*
* This is the protosocket function that handles the communication. A
* protosocket function must always return an int, but must never
* explicitly return - all return statements are hidden in the PSOCK
* macros.
*/
static int handle_connection(struct socket_app_state *s)
{
PSOCK_BEGIN(&s->p);
PSOCK_SEND_STR(&s->p, "Hello. What is you name?\n");
PSOCK_READTO(&s->p, '\n');
PSOCK_SEND_STR(&s->p, "Hello ");
PSOCK_SEND_STR(&s->p, s->inputbuffer);
memset(s->inputbuffer, 0x00, sizeof(s->inputbuffer));
PSOCK_CLOSE(&s->p);
PSOCK_END(&s->p);
}
/*---------------------------------------------------------------------------*/