Control car using arduino ethernet

Hi there,

Im new to the forum! i wanted to know if you could help me out with this one!

Im trying to control a RC car using arduino ethernet (the final idea would be that the car itself would have an access point on it and the arduino ethernet connected to it)

I bought a 4WD chasis and i decided to use the two motors in the front to make the car go forward and the two on the back to make the car go backwards, that way i dont have to mess myself up with electronics so that motors can spin clockwise and anti-clockwise , at least not in the first version of the code.

The problem is that the values im giving to the pin are not reflected, i mean, i tell the car to go forward but when i see whats happening with the dc motors on the back, they are spinning two. I checked my methods and they seem to be right.
Any idea would help a lot !!

Thanks!

The code:

#include <SPI.h>
#include <Ethernet.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192 ,168 ,1 ,9 };
byte gateway[] = { 192 ,168 ,1 ,1 };
byte subnet[] = { 255 ,255 ,255 ,0 };
EthernetServer server(80); 
EthernetClient client;

String readString = String(40);
 
int pindelanteroderecho = 8;
int pindelanteroizquierdo = 9;
int pintraseroderecho = 10;
int pintraseroizquierdo = 11;
int delanteroderecho,delanteroizquierdo,traseroderecho,traseroizquierdo; 

void setup(){

Ethernet.begin(mac, ip, gateway, subnet);
delay(1000);

pinMode(pindelanteroderecho, OUTPUT);
pinMode(pindelanteroizquierdo, OUTPUT);
pinMode(pintraseroderecho, OUTPUT);
pinMode(pintraseroizquierdo, OUTPUT);

Serial.begin(9600);
} 




void loop(){
  
client = server.available();

if (client) {
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        if (readString.length() < 40)
        {
          readString = readString + c;
        }
if (c == '\n') {

   
  if(readString.indexOf("GET /?main") >= 0) {

    
   client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("access-control-allow-origin: *");
  client.println("Cache-Control: no-cache, must-revalidate");
  client.println("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
 client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println();
          client.println("<!DOCTYPE HTML>");
           client.println("<html>");
	  client.println("<head>");
		  client.println("<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js'></script>");
		  client.println("<script type='text/javascript'>");	
  client.println("function revisar() {");
				
	  client.println("var vectorx,vectory;	");	
	  client.println("window.ondevicemotion = function(event) {");  
      client.println("var accelerationX = event.accelerationIncludingGravity.x;");  
      client.println("var accelerationY = event.accelerationIncludingGravity.y; "); 
      client.println("if(Math.abs(accelerationX) < 2) {");
    	  client.println("document.getElementById('estado').innerHTML = 'Quieto';");
    	  client.println("vectorx = 0;");
      client.println("}");
      client.println("else {");
    	  client.println("vectorx = Math.ceil(accelerationX);");
    	  client.println("if(accelerationX>0) {");
    		  client.println("document.getElementById('estado').innerHTML = 'Avanzando a:'+vectorx;");
    	  client.println("}");
    	  client.println("else {");
    		  client.println("document.getElementById('estado').innerHTML = 'Retrocediendo a'+vectorx;");
    	  client.println("}");
      client.println("}");
      client.println("if(Math.abs(accelerationY) < 2) {");
    	  client.println("document.getElementById('giro').innerHTML = 'Ningun lado';");
    	  client.println("vectory = 0;");
      client.println("}");
      client.println("else {");
    	  client.println("vectory = Math.ceil(accelerationY);");
    	  client.println("if(accelerationY>0) {");
    		  client.println("document.getElementById('giro').innerHTML = 'Izquierda a:'+vectory;");
    	  client.println("}");
    	  client.println("else {");
    		  client.println("document.getElementById('giro').innerHTML = 'Derecha a:'+vectory;");
    	  client.println("}");
      client.println("}");
  client.println("}  ");
  client.println("scaleAndSend(vectorx,vectory);");
  client.println("}");


  client.println("function scaleAndSend(x,y) {");
	// 9 - 255
	// int - x
	  client.println("if(y>0) {");
		  client.println("var newY = (y*255)/9;");
	  client.println("}");
	  client.println("else {");
		  client.println("var newY = ((Math.abs(y)*255)/9) + 255;");
	  client.println("}");
	  client.println("if(x>0) {");
		  client.println("var newX = (x*255)/9;");
		  client.println("$.get('http://192.168.1.6/?adelante=1&x='+newX+'&y='+newY , function(data) {});");
	  client.println("}");
	  client.println("else {");
		  client.println("var newX = ((Math.abs(x)*255)/9);");
		  client.println("$.get('http://192.168.1.6/?atras=1&x='+newX+'&y='+newY , function(data) {});");
	  client.println("}");	
  client.println("}");
  client.println("setInterval(function(){revisar()}, 200);");			
		  client.println("</script>");	
	  client.println("</head>");
	  client.println("<body>");
		  client.println("<div id='costados'>");
			  client.println("<div id='cual' style='font-size:30px;'>Estoy girando a: </div>");
			  client.println("<div id='giro' style='font-size:30px;'></div>");
		  client.println("</div>");
		  client.println("<div id='avance'>");
			  client.println("<div id='adonde' style='font-size:30px;'>Estoy: </div>");
			  client.println("<div id='estado' style='font-size:30px;'></div>");
		  client.println("</div>");
	  client.println("</body>");
  client.println("</html>");






  }
  
  
  

if(readString.indexOf("GET /?adelante=1") >=0)
{
  
  client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html"); 
  client.println("access-control-allow-origin: *");
  client.println("Cache-Control: no-cache, must-revalidate");
  client.println("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
  
  String url = readString;

    int primerAnd = url.indexOf("&");
    int segundoAnd = url.indexOf("&",primerAnd+1);
    
    int x = url.substring(primerAnd+3,segundoAnd).toInt();
    int y = url.substring(segundoAnd+3,url.length()).toInt();
    int velocidadyderecha; 
    int velocidadyizquierda;
    
    if(y>255) {
       velocidadyderecha= y-255; 
       velocidadyizquierda = 0;
    }
    else {
       velocidadyderecha= 0; 
       velocidadyizquierda = y;
    }
    
    client.println(url);
    client.println(x);
    client.println(velocidadyderecha);
    client.println(velocidadyizquierda);
     
     adelante(x,velocidadyderecha,velocidadyizquierda);  
}

if(readString.indexOf("GET /?atras=1") >=0)
{
  
  client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html"); 
  client.println("access-control-allow-origin: *");
  client.println("Cache-Control: no-cache, must-revalidate");
  client.println("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
  
  String url = readString;

    int primerAnd = url.indexOf("&");
    int segundoAnd = url.indexOf("&",primerAnd+1);
    
    int x = url.substring(primerAnd+3,segundoAnd).toInt();
    int y = url.substring(segundoAnd+3,url.length()).toInt();
    
    int velocidadyderecha; 
    int velocidadyizquierda;
    
    if(y>255) {
        velocidadyderecha= y-255; 
       velocidadyizquierda = 0;
    }
    else {
       velocidadyderecha= 0; 
       velocidadyizquierda = y;
    }
    
    client.println(url);
    client.println(x);
    client.println(velocidadyderecha);
    client.println(velocidadyizquierda);
     
     adelante(x,velocidadyderecha,velocidadyizquierda);  
}


if(readString.indexOf("GET /?check=1") >=0)
{
  
  client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("access-control-allow-origin: *");
  client.println("Cache-Control: no-cache, must-revalidate");
  client.println("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
 client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println();
          client.println("<!DOCTYPE HTML>");
           client.println("<html>");
	  client.println("<head></head>");
  
  client.println("<body>");
  
 client.println("Motor delantero derecho: ");
 client.println(pulseIn(pindelanteroderecho,HIGH));
 
client.println("Motor delantero izquierdo: ");
 client.println(pulseIn(pindelanteroizquierdo,HIGH)); 
 
client.println("Motor trasero derecho: ");
 client.println(pulseIn(pintraseroderecho,HIGH)); 
 
 client.println("Motor trasero izquierdo: ");
  client.println(pulseIn(pintraseroizquierdo,HIGH)); 
  
 client.println("</body>");
 client.println("<html>");
 

}


readString="";
client.stop();
}
}
}
}
else {
 client.stop(); 
}




}

More code:

boolean avanzando = true;

void adelante(int velocidadx,int velocidadyderecha, int velocidadyizquierda) {
  
   
       delanteroderecho = velocidadx-velocidadyderecha;
       delanteroizquierdo = velocidadx-velocidadyizquierda;
       
   
      analogWrite(pindelanteroderecho, delanteroderecho);  
     
      
      analogWrite(pindelanteroizquierdo, delanteroizquierdo); 
     
  
  if(!avanzando) {
   traseroderecho=1;
  traseroizquierdo=1; 
  analogWrite(pintraseroderecho, traseroderecho); 
 
  
  
  analogWrite(pintraseroizquierdo, traseroizquierdo); 
 
  
   avanzando = true; 
  }
  
}

void atras(int velocidadx,int velocidadyderecha, int velocidadyizquierda, EthernetClient client) {
   
   traseroderecho = velocidadx-velocidadyderecha;
   traseroizquierdo = velocidadx-velocidadyizquierda;
     
   analogWrite(pintraseroderecho, traseroderecho);  
  
   
   analogWrite(pintraseroizquierdo, traseroizquierdo); 
    

  if(avanzando) {
     delanteroderecho = 1;
     delanteroizquierdo = 1;
    analogWrite(pindelanteroderecho, delanteroderecho);  
    
    
    analogWrite(pindelanteroizquierdo, delanteroizquierdo);  
    
  
   avanzando = false; 
  }
  
}

I'm surprised the arduino doesn't crash due to running out of available memory. Use the F() macro like in the below code for static text strings and see if the code works better.

.

// zoomkat's meta refresh data frame test page 8/17/13
// use http://192.168.1.102:84 in your brouser for main page
// http://192.168.1.102:84/data static data page
// http://192.168.1.102:84/datastart meta refresh data page
// for use with W5100 based ethernet shields
// set the refresh rate to 0 for fastest update
// use STOP for single data updates

#include <SPI.h>
#include <Ethernet.h>

const int analogInPin0 = A0;
const int analogInPin1 = A1;
const int analogInPin2 = A2;
const int analogInPin3 = A3;
const int analogInPin4 = A4;
const int analogInPin5 = A5;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // arduino ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(84); //server port
unsigned long int x=0; //set refresh counter to 0
String readString; 

//////////////////////

void setup(){
  Serial.begin(9600);
    // disable SD SPI if memory card in the uSD slot
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();
  Serial.println(F("meta refresh data frame test 8/17/13")); // so I can keep track of what is loaded
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
         if (readString.length() < 100) {
          readString += c; 
         } 
        //check if HTTP request has ended
        if (c == '\n') {

          //check get atring received
          Serial.println(readString);

          //output HTML data header
          //client.println("HTTP/1.1 200 OK");
          //client.println("Content-Type: text/html");
          //client.println();
          
          client.print(F("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));

          //generate data page
          if(readString.indexOf("data") >0) {  //checks for "data" page
            x=x+1; //page upload counter
            client.print(F("<HTML><HEAD>"));
            //meta-refresh page every 1 seconds if "datastart" page
            if(readString.indexOf("datastart") >0) client.print(F("<meta http-equiv='refresh' content='1'>")); 
            //meta-refresh 0 for fast data
            if(readString.indexOf("datafast") >0) client.print(F("<meta http-equiv='refresh' content='0'>")); 
            client.print(F("<title>Zoomkat's meta-refresh test</title></head><BODY>
"));
            client.print(F("page refresh number: "));
            client.print(x); //current refresh count
            client.print(F("

"));
            
              //output the value of each analog input pin
            client.print(F("analog input0 is: "));
            client.print(analogRead(analogInPin0));
            
            client.print(F("
analog input1 is: "));
            client.print(analogRead(analogInPin1));
                        
            client.print(F("
analog input2 is: "));
            client.print(analogRead(analogInPin2));
            
            client.print(F("
analog input3 is: "));
            client.print(analogRead(analogInPin3));
                                    
            client.print(F("
analog input4 is: "));
            client.print(analogRead(analogInPin4));
            
            client.print(F("
analog input5 is: "));
            client.print(analogRead(analogInPin5));
            client.print(F("
</BODY></HTML>"));
           }
          //generate main page with iframe
          else
          {
            client.print(F("<HTML><HEAD><TITLE>Zoomkat's frame refresh test</TITLE></HEAD>"
            "Zoomkat's Arduino frame meta refresh test 8/17/13"
            "

Arduino analog input data frame:
"
            "&nbsp;&nbsp;<a href='/datastart' target='DataBox' title=''yy''>META-REFRESH</a>"
            "&nbsp;&nbsp;&nbsp;&nbsp;<a href='/data' target='DataBox' title=''xx''>SINGLE-STOP</a>"
            "&nbsp;&nbsp;&nbsp;&nbsp;<a href='/datafast' target='DataBox' title=''zz''>FAST-DATA</a>
"
            "<iframe src='/data' width='350' height='250' name='DataBox'>"
            "</iframe>
</HTML>"));
          }
          delay(1);
          //stopping client
          client.stop();
          //clearing string for next read
          readString="";
        }
      }
    }
  }
}

zoomkat:
I'm surprised the arduino doesn't crash due to running out of available memory. Use the F() macro like in the below code for static text strings and see if the code works better.

.

// zoomkat's meta refresh data frame test page 8/17/13

// use http://192.168.1.102:84 in your brouser for main page
// http://192.168.1.102:84/data static data page
// http://192.168.1.102:84/datastart meta refresh data page
// for use with W5100 based ethernet shields
// set the refresh rate to 0 for fastest update
// use STOP for single data updates

#include <SPI.h>
#include <Ethernet.h>

const int analogInPin0 = A0;
const int analogInPin1 = A1;
const int analogInPin2 = A2;
const int analogInPin3 = A3;
const int analogInPin4 = A4;
const int analogInPin5 = A5;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // arduino ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(84); //server port
unsigned long int x=0; //set refresh counter to 0
String readString;

//////////////////////

void setup(){
  Serial.begin(9600);
    // disable SD SPI if memory card in the uSD slot
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();
  Serial.println(F("meta refresh data frame test 8/17/13")); // so I can keep track of what is loaded
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
         if (readString.length() < 100) {
          readString += c;
         }
        //check if HTTP request has ended
        if (c == '\n') {

//check get atring received
          Serial.println(readString);

//output HTML data header
          //client.println("HTTP/1.1 200 OK");
          //client.println("Content-Type: text/html");
          //client.println();
         
          client.print(F("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));

//generate data page
          if(readString.indexOf("data") >0) {  //checks for "data" page
            x=x+1; //page upload counter
            client.print(F(""));
            //meta-refresh page every 1 seconds if "datastart" page
            if(readString.indexOf("datastart") >0) client.print(F(""));
            //meta-refresh 0 for fast data
            if(readString.indexOf("datafast") >0) client.print(F(""));
            client.print(F("Zoomkat's meta-refresh test
"));
            client.print(F("page refresh number: "));
            client.print(x); //current refresh count
            client.print(F("

"));
           
              //output the value of each analog input pin
            client.print(F("analog input0 is: "));
            client.print(analogRead(analogInPin0));
           
            client.print(F("
analog input1 is: "));
            client.print(analogRead(analogInPin1));
                       
            client.print(F("
analog input2 is: "));
            client.print(analogRead(analogInPin2));
           
            client.print(F("
analog input3 is: "));
            client.print(analogRead(analogInPin3));
                                   
            client.print(F("
analog input4 is: "));
            client.print(analogRead(analogInPin4));
           
            client.print(F("
analog input5 is: "));
            client.print(analogRead(analogInPin5));
            client.print(F("

"));            }           //generate main page with iframe           else           {             client.print(F("Zoomkat's frame refresh test"             "Zoomkat's Arduino frame meta refresh test 8/17/13"             "

Arduino analog input data frame:
"
            "  <a href='/datastart' target='DataBox' title=''yy''>META-REFRESH"
            "    <a href='/data' target='DataBox' title=''xx''>SINGLE-STOP"
            "    <a href='/datafast' target='DataBox' title=''zz''>FAST-DATA
"
            "

"));           }           delay(1);           //stopping client           client.stop();           //clearing string for next read           readString="";         }       }     }   } } > ```

hey zoomkat !! thanks for the answer

after all i dont know the reason why but it seems like my 10 pin on the ethernet shield was failing, after changing it it all works :smiley:

thanks for the answer !