2

I have this assignment and I have been tinkering a long time about it. I need to make a simulation of a parking lot where servos would represent the ramps.

I will be using 2 Arduinos running the same script, one representing the entry ramp and the other one the exit. Servos are controlled by reading a json request of an web application and manually by buttons. I have connected two LED's when the buttons are pressed. I would also need to make state when servo would be always up or always down (that would represent the off times of parking lot), should I add extra buttons for that? Any idea would be appreciated.

The problem I'm having with this project is that servos are not responding well on push buttons. They are shaking and very slow moving. And I think that it isn't a good solution to move the servos while they are sending application request because it can lead to conflict. Please help me there.

I have written pretty major piece of script, but it still needs adjusments. Any help is welcomed. Here is the code:

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

Servo myservo;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "ramp-rampcontrol.rhcloud.com"; 
EthernetClient client;
IPAddress ip(192,168,1,17);

int button_5 = 5;
int button_6 = 6;
const int ledPin = 3;
const int ledPinG = 2;
int time = 5*1000;
int val=0;
String content = "";
boolean begin1 = false;

void setup() {

Serial.begin(9600);
pinMode(button_5, INPUT);
pinMode(button_6, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPinG, OUTPUT);
myservo.attach(9);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, ip);
}
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.println("connecting...");

// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connected");
// Make a HTTP request:
client.println("GET /api/actions?parking_id=39 HTTP/1.1");
client.println("Host: ramp-rampcontrol.rhcloud.com");
client.println("Connection: close");
client.println();
}
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");
 }  
}

void loop()
{ 

val = digitalRead(button_5);
if (val == HIGH)
{
  performServoAction("up");

      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);
      delay(1000);

}

val = digitalRead(button_6);
if (val == HIGH)
{
  performServoAction("down");

      digitalWrite(ledPinG, HIGH);
      delay(1000);
      digitalWrite(ledPinG, LOW);
      delay(1000);    
 }

 while(client.available()) {
 char c = client.read();   
    if(c == '{'){
      begin1 = true;
    }

  if (begin1) { 
    content += c;
   }

  if (c == '}') {
      break; 
    }
 }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    performAction();
  }
  }

bool performServoAction(String action_type) {
if (action_type == "up") {
    Serial.println("doing up");
    myservo.write(95);
    delay(time);
   // lastRampStatus = action_type ;
   // notifyServerAboutAction("true", action_id);
    return true;
  }

  if (action_type == "down") {
    Serial.println("doing down");
    myservo.write(135);
    delay(time);
    //lastRampStatus = action_type;
  // notifyServerAboutAction("true", action_id);
    return true;
  }
}

 void performAction() {
  int nstart = content.indexOf("action_id") + 12;
  int nend = content.indexOf(",", nstart);
  String actionID = content.substring(nstart, nend);

    int nstart1 = content.indexOf("action_type") + 14;  
   //Get position of "action_type" in a string, increment by 13 
    (length of 'action_type":"')
    int nend1 = content.indexOf("\"", nstart1); // Get next position 
    of '"' starting from nstart
    String actionType = content.substring(nstart1, nend1); 
    //Return substring between this position
    performServoAction(actionType);
    Serial.println(nstart1);
    Serial.println(nend1);
    Serial.println(actionID);
    Serial.println(actionType);
    Serial.println(content);
}
  • Do the servos behave when moving after receiving the json command? You have the program waiting for 5 seconds after the servo is told to move 'up' or 'down' - I don't see where a conflict could creep in to cause the servos to move slowly. – CharlieHanson Sep 9 '15 at 12:41
  • They just vibrate, and they dont react to the push buttons. I'm starting to think that it may be a hardware problem. – FunKction Sep 9 '15 at 13:06
  • 1
    I would start with just some servo example sketches and make sure you haven't made a simple mistake. It happens to us all. – CharlieHanson Sep 9 '15 at 13:08
  • Yeah sounds like the problem is servo issue just play with a servo example and then expand. – Namphibian Sep 10 '15 at 4:01
1

Instead of using:

myservo.write(135);

You should use:

myservo.writeMicroseconds();

https://www.arduino.cc/en/Reference/ServoWriteMicroseconds

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.