Pages: [1]   Go Down
Author Topic: HS 311 only turns to the left  (Read 1379 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so i bought a HS 311 to use for the swivel mount for my ping sensor but for some odd reason the servo only turns left. I have been googling this problem since last night and really havent found an easy solution besides people saying buy another servo.
Code:
/*MAEP 2.0 Navigation
by Noah Moroze, aka GeneralGeek
This code has been released under a Attribution-NonCommercial-ShareAlike license, more info at http://creativecommons.org/licenses/
PING))) code by David A. Mellis and Tom Igoe http://www.arduino.cc/en/Tutorial/Ping
Edited by: Jason Miller for Project KITT
*/

#include <Servo.h> //include Servo library
#include <LiquidCrystal.h> //include lcd library

LiquidCrystal lcd(2, 3, 6, 7, 8, 9);

const int RForward = 0;
const int RBackward = 180;
const int LForward = RBackward;
const int LBackward = RForward;
const int RNeutral = 90;
const int LNeutral = 90; //constants for motor speed
const int pingPin = 4;
const int dangerThresh = 5; //threshold for obstacles (in inches)
int leftDistance, rightDistance; //distances on either side
Servo panMotor; 
Servo leftMotor;
Servo rightMotor; //declare motors
long duration; //time it takes to recieve PING))) signal

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Hello Jason");
  delay(1000);
  lcd.clear();
  lcd.print("Activating KITT");
  delay(1000);
  lcd.clear();
  lcd.print("KITT Online");
  delay(1000);
  rightMotor.attach(11);
  leftMotor.attach(10);
  panMotor.attach(5); //attach motors to proper pins
  panMotor.write(90); //set PING))) pan to center
}

void loop()
{
  int distanceFwd = ping();
  if (distanceFwd>dangerThresh) //if path is clear
  {
    leftMotor.write(LForward);
    rightMotor.write(RForward); //move forward
    lcd.print("Forward");
  }
  else //if path is blocked
  {
    leftMotor.write(LNeutral);
    rightMotor.write(RNeutral);
    panMotor.write(0);
    delay(500);
    rightDistance = ping(); //scan to the right
    lcd.print("Scan Right");
    delay(500);
    panMotor.write(180);
    delay(700);
    leftDistance = ping(); //scan to the left
    lcd.print("Scan Left");
    delay(500);
    panMotor.write(90); //return to center
    delay(100);
    compareDistance();
  }
}
 
void compareDistance()
{
  if (leftDistance>rightDistance) //if left is less obstructed
  {
    leftMotor.write(LBackward);
    rightMotor.write(RForward); //turn left
    lcd.print("Turn Left");
    delay(500);
  }
  else if (rightDistance>leftDistance) //if right is less obstructed
  {
    leftMotor.write(LForward);
    rightMotor.write(RBackward); //turn right
    lcd.print("Turn Right");
    delay(500);
  }
   else //if they are equally obstructed
  {
    leftMotor.write(LForward);
    rightMotor.write(RBackward); //turn 180 degrees
    lcd.print("Turn 180");
    delay(500);
  }
}

long ping()
{
  // Send out PING))) signal pulse
  long duration, inches;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
 
  //Get duration it takes to receive echo
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
  inches = microsecondsToInches(duration);
  lcd.print(inches);
  lcd.print("in to obstacle");
  delay(100);
  lcd.clear(); 
  delay(100);
}
 
  long microsecondsToInches(long microseconds)
  {
  return duration / 29 / 2;
}
 
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Update: I managed to get the servo to move slightly to the right but the movements are very twitchy and the servo constantly twitches
Logged

0
Offline Offline
Tesla Member
***
Karma: 141
Posts: 9548
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

How are you powering your servo? Servo test code below.

Code:
// zoomkat 10-22-11 serial servo test
// type servo position 0 to 180 in serial monitor
// or for writeMicroseconds, use a value like 1500
// for IDE 0022 and later
// Powering a servo from the arduino usually *DOES NOT WORK*.

String readString;
#include <Servo.h>
Servo myservo;  // create servo object to control a servo

void setup() {
  Serial.begin(9600);
  myservo.writeMicroseconds(1500); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo control
  Serial.println("servo-test-22-dual-input"); // so I can keep track of what is loaded
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }

  if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured string
    int n = readString.toInt();  //convert readString into a number

    // auto select appropriate value, copied from someone elses code.
    if(n >= 500)
    {
      Serial.print("writing Microseconds: ");
      Serial.println(n);
      myservo.writeMicroseconds(n);
    }
    else
    {   
      Serial.print("writing Angle: ");
      Serial.println(n);
      myservo.write(n);
    }

    readString=""; //empty for next input
  }
}

Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i was using an e-flite 7.4 volt lipo with a voltage divider down to 4.8 volts
Logged

Dubuque, Iowa, USA
Offline Offline
Faraday Member
**
Karma: 46
Posts: 2502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i was using an e-flite 7.4 volt lipo with a voltage divider down to 4.8 volts

"A voltage divider" as in two resistors? Please explain.
Logged

New Jersey
Offline Offline
Faraday Member
**
Karma: 67
Posts: 3677
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

4.8V is apparently the minimum voltage required to run that servo. Were you measuring the voltage when the servo was powered up? If not, you may well not even be providing that - better to provide 6V if you can.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes i was measuring the voltage when the servo was powered up and yes a voltage divider as in two resistors
Logged

0
Offline Offline
Tesla Member
***
Karma: 141
Posts: 9548
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You would do better to use a simple 7805 voltage regulator than a voltage divider.
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i will see if i have one of those in my parts box but if that still doesnt work how would i get that servo to do more than turn to the left?
Logged

Dubuque, Iowa, USA
Offline Offline
Faraday Member
**
Karma: 46
Posts: 2502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You didn't mention the resistances in your voltage divider, but I suspect that they are too high to supply enough current (160ma no load requirement) to the servos. The linear regulator is a much much better choice.
Logged

0
Offline Offline
Tesla Member
***
Karma: 141
Posts: 9548
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

servos usually turn in one direction until they hit the hard stop when they are receiving malformed control signals.
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok i modified the hs311 into a continuous rotation servo but still am not having any luck with making it turn in any direction other than left
Logged

Pages: [1]   Go Up
Jump to: