I am trying to get a rugged circuits yellowjacket to host a WiServer that will allow me to control a robot through a web interface with a wireless connection. However it is getting stuck and I am not even getting the print lines in the:
boolean sendPage()
function.
I've been playing with this and some example code and I can't quite figure out what is wrong with this. Any help would be appreciated.
I have all of the appropriate libraries that are being referenced, well servo and string are both arduino. With other demo programs I've used using #include <WiServer.h> works fine.
Thanks,
Postholes
#include <WiServer.h>
#include <string.h>
#include <Servo.h>
#define WIRELESS_MODE_ADHOC 2
// Variable Declaration ======================================================
#define lasers 8
#define solenoid 12
#define range 9 // Just in case we need to use Analog then use pin A5
#define elevation 10
// pins for motor speed and direction
int speed1 = 5, speed2 = 6, direction1 = 4, direction2 = 7;
// starting speed and rotation offest
int startSpeed = 70, rotate = 30;
// initial speeds of left and right motors
int left = startSpeed, right = startSpeed;
// Elevation Variable
int eleValue;
// Servo Declaration and initialization
Servo eleServo;
// Range finder variables
unsigned int timeNow;
long pwmRange, inch;
boolean firingRange = false;
int fullSteamAhead = 7;
// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = { 10,1,1,5}; // IP address of WiShield
unsigned char gateway_ip[] = { 192,168,1,1}; // router or gateway IP address
unsigned char subnet_mask[] = { 255,0,0,0}; // subnet mask for the local network
const prog_char ssid[] PROGMEM = { "PingTheBot"}; // max 32 bytes
unsigned char security_type = 0; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2
// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = { "12345678"}; // 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_ADHOC;
unsigned char ssid_len;
unsigned char security_passphrase_len;
// End of wireless configuration parameters ----------------------------------------
/* boolean states[3]; //holds led states */
boolean states[7]; // holds states for left, forward, right, laser, fire, stop, elevation up, elevation down
int stateCounter; //used as a temporary variable
char tmpStrCat[512];
char numAsCharBuff[2];
char ledChange;
// Range finding function
boolean findRange()
{
boolean goStopValue = false;
pwmRange = pulseIn(range, HIGH);
// 147uS per inch according to datasheet
inch = pwmRange / 147;
if ((inch <= fullSteamAhead) && (millis() - timeNow) > 250)
{ // If sensor reads something at or closer than 7 inches, send all stop
timeNow = millis();
goStopValue = false;
firingRange = false;
return goStopValue;
}
else
{
goStopValue = true;
if (goStopValue && (inch < 60))
{
firingRange = true;
}
return goStopValue;
}
return goStopValue;
}
// Turn left function
void turnLeft()
{
left = rotate;
right = 0;
analogWrite(speed2, right);
analogWrite(speed1, left);
}
// Turn Right function
void turnRight()
{
right = rotate;
left = 0;
analogWrite(speed2, right);
analogWrite(speed1, left);
}
// Forward Function
void forward()
{
if (findRange())
{
left = startSpeed;
right = startSpeed;
analogWrite(speed1, left);
analogWrite(speed2, right);
}
else
{
left = 0;
right = 0;
analogWrite(speed1, left);
analogWrite(speed2, right);
}
}
// laser function
void laser()
{
digitalWrite(lasers, HIGH);
}
// fire weapon function
void fireWeapon()
{
if (firingRange)
{
digitalWrite(solenoid, HIGH);
delay(250);
digitalWrite(solenoid, LOW);
}
}
// stop funtion, instead of just stopping this puts robot in near reset state
void stopRobot()
{
eleValue = 20;
analogWrite(speed1, 0);
analogWrite(speed2, 0);
digitalWrite(lasers, LOW);
eleServo.write(eleValue);
}
// Elevation up function
void elevationUp()
{
int eleValueMax = 80;
if (eleValue < eleValueMax)
{
eleValue = eleValue + 10;
}
else
{
eleValue = 80;
}
eleServo.write(eleValue);
}
// elevation down function
void elevationDown()
{
int eleValueMin = 20;
if (eleValue > eleValueMin)
{
eleValue = eleValue - 10;
}
else
{
eleValue = 20;
}
eleServo.write(eleValue);
}
// reads states and calls proper function. Takes integer ledChange
// sets all states != ledChange to false.
void writeStates(int pinChange)
{
// turn off all states but the one user updated
int i;
for (i = 0; i < 7; i++)
{
if (i != pinChange)
{
states[i] = false;
}
}
// set States or call functions to run to handle robot control
switch (pinChange)
{
case 0:
turnLeft();
break;
case 1:
forward();
break;
case 2:
turnRight();
break;
case 3:
laser();
break;
case 4:
fireWeapon();
break;
case 5:
stopRobot();
break;
case 6:
elevationUp();
break;
case 7:
elevationDown();
break;
}
}
// This is our page serving function that generates web pages
boolean sendPage(char* URL)
{
// Test print begin =======================================
Serial.println("boolean sendPage Being page printing");
// test print end =======================================
Serial.println("Page printing begun");
//printStates();
writeStates(ledChange);
if (URL[1] == '?' && URL[2] == 'R') // R0 = left, R1 = forward, R2 = right, R3 = laser, R4 = fire, R5 = stop, R6 = elevation up, R7 = elevation down
{
ledChange = (int)(URL[3] - 48);
// Write the states to the board
writeStates(ledChange);
//after having change state, return the user to the index page.
WiServer.print("<HTML><HEAD><meta http-equiv='REFRESH' content='0;url=/'></HEAD></HTML>");
return true;
}
if (strcmp(URL, "/") == false)
{
WiServer.print("<html><head><title>Predator Bot</title></head>");
WiServer.print("<body><center>Select the control state to change:<center>\n<center>");
// R0 = left, R1 = forward, R2 = right, R3 = laser, R4 = fire, R5 = stop, R6 = elevation up, R7 = elevation down
tmpStrCat[0] = '\0';
strcat(tmpStrCat, "<a href=?R0>Left</a>");
strcat(tmpStrCat, "<a href=?R1>Forward</a>");
strcat(tmpStrCat, "<a href=?R2>Right</a>");
strcat(tmpStrCat, "<a href=?R3>Lasers</a>");
strcat(tmpStrCat, "<a href=?R6>Elevation Up</a>");
strcat(tmpStrCat, "<a href=?R7>Elevation Down</a>");
strcat(tmpStrCat, "<a href=?R4>Fire Weapon</a>");
strcat(tmpStrCat, "<p></p><p><h1><a href=?R5>Stop</a></h1></p>");
WiServer.print(tmpStrCat);
WiServer.print("</body></html> ");
return true;
}
}
void setup()
{
// Set pins to proper values
pinMode(speed1, OUTPUT);
pinMode(speed2, OUTPUT);
pinMode(direction1, OUTPUT);
pinMode(direction2, OUTPUT);
pinMode(lasers, OUTPUT);
pinMode(solenoid, OUTPUT);
pinMode(elevation, OUTPUT);
pinMode(range, INPUT);
// set default elevation for servo
eleValue = 20;
// set up servo for elevation control
eleServo.attach(elevation);
eleServo.write(eleValue);
// set motor direction to forward
digitalWrite(direction1, HIGH);
digitalWrite(direction2, HIGH);
// set speed of both motors
analogWrite(speed1, left);
analogWrite(speed2, right);
// begin serial output
Serial.begin(9600);
// Test printing ===============================================
Serial.println("Setup running, WiServer.Init next command");
// End test printing ===============================================
// WiServer Initialization
WiServer.init(sendPage);
// Test printing =======================================
Serial.println("WiServer.init(sendPage) happened");
// end test printing =======================================
// Set all states to false during initial setup
int i;
for (i = 0; i < 7; i++)
{
states[i] = false;
}
// Initially set time values
timeNow = millis();
}
void loop()
{
// Run WiServer
WiServer.server_task();
delay(10);
}