Control stepper motor via ethernet.

Hello everybody,

I am trying to control a stepper motor with Arduino DUE and Ethernet Shield. My idea is to use the arduino as a stand alone device, to log on to and control the stepper. So far I have managed to start, stop and change the direction of the motor. The next challenge I have, is to pass an exact number of steps to the stepper.

void loop(){

  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {

          readString += c; 
          //Serial.print(c);
        } 

        if (c == '\n') {

          Serial.println(readString);

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<BODY>");
          client.println("<a href=/?on1 >FORWARD</a>"); 
          client.println("<a href=/?on2 >BACKWARD</a>"); 
          client.println("

");
          client.println("<a href=/?off3 >OFF</a>"); 
          client.println("</BODY>");
          client.println("</HTML>");
 
          delay(1);

          client.stop();

          if(readString.indexOf('1') >0)
          {
            dir = 1;
          }
          
          if(readString.indexOf('2') >0)//checks for 2
          {
            dir = 2;
          }
          
          if(readString.indexOf('3') >0)//checks for 3
          {
            dir = 0;
          }

          readString="";

        }
      }
    }
  }

My idea is to add a text field and a submit button, but I am not sure how to get the value from POST or GET methods.

Thanks in advance.

Best Regards,

Stoiko

The next challenge I have, is to pass an exact number of steps to the stepper.

You could use a text box web page like below to send what ever number you want to the server. Find the location of the first = in readString, Save the rest of readString from that point, take the int value of that readString, and you would have captured the number you sent.

//zoomkat 12-08-12
//get submit box code
//for use with IDE 1.0
//open serial monitor to see what the arduino receives
//use the \ slash to escape the " in the html or use a '
//address will look like http://192.168.1.102:84 when submited
//for use with W5100 based ethernet shields
//note that the below bug fix may be required
// http://code.google.com/p/arduino/issues/detail?id=605 

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // 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

String readString; 

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

void setup(){

  pinMode(5, OUTPUT); //pin selected to control
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();

  //enable serial data print 
  Serial.begin(9600); 
  Serial.println("server text box test1"); // so I can keep track of what is loaded
}

void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100) {

          //store characters to string 
          readString += c; 
          //Serial.print(c);
        } 

        //if HTTP request has ended
        if (c == '\n') {

          ///////////////
          Serial.println(readString); //see what was captured

          //now output HTML data header

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Arduino GET test page</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");

          client.println("<H1>HTML form GET example</H1>");

          client.println("<FORM ACTION='/' method=get >"); //uses IP/port of web page

          client.println("Pin 5 'on5' or 'off5': <INPUT TYPE=TEXT NAME='LED' VALUE='' SIZE='25' MAXLENGTH='50'>
");

          client.println("<INPUT TYPE=SUBMIT NAME='submit' VALUE='Change Pin 5!'>");

          client.println("</FORM>");

          client.println("
");

          client.println("</BODY>");
          client.println("</HTML>");

          delay(1);
          //stopping client
          client.stop();

          /////////////////////
          if(readString.indexOf("on5") >0)//checks for on
          {
            digitalWrite(5, HIGH);    // set pin 5 high
            Serial.println("Led On");
          }
          if(readString.indexOf("off5") >0)//checks for off
          {
            digitalWrite(5, LOW);    // set pin 5 low
            Serial.println("Led Off");
          }
          //clearing string for next read
          readString="";

        }
      }
    }
  }
}

An alternative approach would be to use pfodApp (www.pfod.com.au) and control the stepper from your Android mobile.
The advantage of pfodApp is the input screens are already built for you. You just open them on the mobile using very simple text commands sent from your Arduino. (You can optionally add 128bit security without using a lot of memory on your Arduino)

There are slider menus and numeric input screens that you could use to send the number of steps. Check out the free pfodDemo for examples screens. (https://play.google.com/store/apps/details?id=au.com.forward.pfodAppDemo)

See the numerous examples on www.pfod.com.au.
email me at www.pfod.com.au via support if you need help.