WiFi Tank

This post will be updated along with the progress on the tank

A short intro to what this is
[youtube]http://www.youtube.com/watch?v=a2YMYmYldQM[/youtube]

The code for the arduino controlling all of it.

//Volts needed to be functional
int nV = 7;

//PWM amount output to each motor (0-255)
int lM = 120;
int rM = 120;

//H-Bridge pins
int EA = 3; //PWM
int EB = 4; //PWM
int I1 = 41;
int I2 = 40;
int I3 = 39;
int I4 = 38;

//Proximity sensor pins
int pFl = 37; //Front left
int pFr = 36; //Front right

//Battery info
int bV = 15; //Battery voltage
int bA = 13; //Battery voltage

//Relays
int kS = 35; //Kill switch

//Input pins
int iPins[] = {
  pFr, pFl};

//Output pins
int oPins[] = {
  kS, I1, I2, I3, I4};

//Used to make the tank deny all movements
boolean online = true;

//Used for the proximity sensors, to be able to move away from the obstacle
int lastMove = 0; //1 = forwards - 2 = backwards

//Millis to calculate when to call the stopS() function
unsigned long stopMove = 0;

//Milliseconds it should move
int stopTime = 0;

//Milliseconds from when cV was over nV
unsigned long vD = 0;

//Current Voltage
int cV = 0;

//Current Amps
int cA = 0;

#include <WiServer.h>
#define WIRELESS_MODE_INFRA	1
#define WIRELESS_MODE_ADHOC	2
// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {
  192,168,1,15};	// IP address of WiShield
unsigned char gateway_ip[] = {
  192,168,1,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 = {
  "Captain Slow"};		// max 32 bytes

unsigned char security_type = 3;	// 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {
  "xxxxxxxxxxxxxxxxxxxxxxxxxx"};	// 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;
// End of wireless configuration parameters ----------------------------------------

// This is our page serving function that generates web pages and handles requests
boolean sendMyPage(char* URL)
{
  // Use WiServer's print and println functions to write out the page content
  WiServer.print(cV);
  WiServer.print("|");
  WiServer.print(cA);

  if (strcmp(URL, "/F1") == 0)
  {
    stopTime = 750;
    stopMove = millis();
    moveF();
  }

  if (strcmp(URL, "/F2") == 0)
  {
    stopTime = 375;
    stopMove = millis();
    moveF();
  }

  else if (strcmp(URL, "/B1") == 0)
  {
    stopTime = 750;
    stopMove = millis();
    moveB();
  }

  else if (strcmp(URL, "/B2") == 0)
  {
    stopTime = 375;
    stopMove = millis();
    moveB();
  }

  else if (strcmp(URL, "/L3") == 0)
  {
    stopTime = 300;
    stopMove = millis();
    moveL();
  }

  else if (strcmp(URL, "/L2") == 0)
  {
    stopTime = 200;
    stopMove = millis();
    moveL();
  }

  else if (strcmp(URL, "/L1") == 0)
  {
    stopTime = 100;
    stopMove = millis();
    moveL();
  }

  else if (strcmp(URL, "/R3") == 0)
  {
    stopTime = 300;
    stopMove = millis();
    moveR();
  }

  else if (strcmp(URL, "/R2") == 0)
  {
    stopTime = 200;
    stopMove = millis();
    moveR();
  }

  else if (strcmp(URL, "/R1") == 0)
  {
    stopTime = 100;
    stopMove = millis();
    moveR();
  }

  return true;
}

void moveF() //Forwards
{
  if (digitalRead(pFl) == HIGH && digitalRead(pFr) == HIGH)
  {
    lastMove = 1;
    analogWrite(EA, lM);
    analogWrite(EB, rM);
    digitalWrite(I1, LOW);
    digitalWrite(I2, HIGH);
    digitalWrite(I3, HIGH);
    digitalWrite(I4, LOW);
  }
}

void moveB() //Backwards
{
  lastMove = 2;
  analogWrite(EA, lM);
  analogWrite(EB, rM);
  digitalWrite(I1, HIGH);
  digitalWrite(I2, LOW);
  digitalWrite(I3, LOW);
  digitalWrite(I4, HIGH);
}

void moveL() //Left
{
  if (digitalRead(pFl) == HIGH)
  {
    analogWrite(EA, lM);
    analogWrite(EB, rM);
    digitalWrite(I1, HIGH);
    digitalWrite(I2, LOW);
    digitalWrite(I3, HIGH);
    digitalWrite(I4, LOW);
  }
}

void moveR() //Right
{
  if (digitalRead(pFr) == HIGH)
  {
    analogWrite(EA, lM);
    analogWrite(EB, rM);
    digitalWrite(I1, LOW);
    digitalWrite(I2, HIGH);
    digitalWrite(I3, LOW);
    digitalWrite(I4, HIGH);
  }
}

void moveS() //Stop
{
  lastMove = 0;
  stopMove = 0;
  analogWrite(EA, 0);
  analogWrite(EB, 0);
  digitalWrite(I1, HIGH);
  digitalWrite(I2, HIGH);
  digitalWrite(I3, HIGH);
  digitalWrite(I4, HIGH);
}

void moveES() //Emergency Stop
{
  moveB();
  delay(50);
  moveF();
  delay(50);
  moveS();
}

void cutPower() //Pull the latching relay to turn everything off
{
  digitalWrite(kS, HIGH);
  delay(100);
  digitalWrite(kS, LOW);
}

//IP of my NAS
uint8 ip[] = {
  192,168,1,245};

// Function to print response from the web server
void printData(char* data, int len)
{
}

//Define the request
GETrequest getServer(ip, 80, "192.168.1.245", "");

void setup()
{
  pinMode(41, OUTPUT);
  //Set all output pins
  for(int i=0; i < sizeof(oPins) / sizeof(oPins[0]); i++)
  {
    pinMode(oPins[i], OUTPUT);
  }

  //Set all input pins
  for(int i=0; i < sizeof(iPins) / sizeof(iPins[0]); i++)
  {
    pinMode(iPins[i], INPUT);
  }

  //Reset H-Bridge
  moveS();

  //Prepare WiShield
  getServer.setReturnFunc(printData);
  WiServer.init(sendMyPage);
}

void loop()
{
  cV = map(analogRead(bV), 0, 1023, 0, 1933) / 100.0;
  cA = map(analogRead(bA), 512, 1023, 0, 500) / 100.0;

  if (cA < 0.01)
  {
    cA = 0.01;
  }

  WiServer.server_task();

  if (lastMove == 1 && (digitalRead(pFl) == LOW || digitalRead(pFr) == LOW))
  {
    moveES();
  }

  if ((millis() - stopMove >= stopTime || cV <= nV) && stopMove != 0)
  {
    moveS();
  }

  //If not online, pull the latching relay to disconnect from battery
  if (!online)
  {
    delay(250);
    cutPower();
    delay(250);
    return;
  }

  //If voltage is too low, call the web server to flag the tank as offline
  if (cV <= nV)
  {
    if (millis() - vD >= 2000 && vD != 0)
    {
      getServer.setURL("/arduino/control/call.php?status=nopower");
      getServer.submit();

      //Set to offline, to no more commands will be possible
      online = false;
    }
    else
    {
      vD = millis();
    }
    return;
  }
}
2 Comments

Add a Comment

Your email address will not be published. Required fields are marked *