Pages: [1]   Go Down
Author Topic: 1st semi intelligent robot, suggestions please!  (Read 1675 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello all!

This is my first post as well as my first arduino project (other than (basic - blink), (servo -sweep) and (hcsr04Ultrasonic - UltrasonicDemo).

i was hoping you all could look at my code and make any suggestions or recommendations.
I was also hoping you all could look at my hardware and make any suggestions or recommendations. (it all works, but I want to make it better!)

1st my harware:
------------------------------------------------------------
arduino uno r2.
tamiya track and wheel set (TAM-008-000)
little bit of lexan (bought from home depot USA)
2 - JR sport st47 servos
HC-SR04 ultrasonic sensor
T-Pro Mini Servo SG-90
Losi 7.2V 1100mAh NiMH Batt
project box
breadboard piece
misc stuff.
------------------------------------------------------------

1st hardware question:
I have all 3 servos as well as the HC-SR04 taking power off of the arduino 5v pin.  Even though i've read this is bad, it is working.  I understand that the arduino uno has a voltage regulator of sorts and will do just fine, as long as the current to the servos and HC-SR04 are less than the breaking point. Am I going to break something?

2nd hardware question:
these tracks blow on carpet... any suggestions?

next few posts will be pics
« Last Edit: February 26, 2012, 11:56:37 am by pesce » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pics 1


* IMG_7095-1.JPG (17.62 KB, 320x240 - viewed 19 times.)

* IMG_7096-1.JPG (17.74 KB, 320x240 - viewed 15 times.)

* IMG_7097-1.JPG (16.5 KB, 320x240 - viewed 11 times.)

* IMG_7099-1.JPG (16.44 KB, 320x240 - viewed 11 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pics2


* IMG_7102-1.JPG (24.45 KB, 320x240 - viewed 13 times.)

* IMG_7104-1.JPG (20.82 KB, 320x240 - viewed 14 times.)

* IMG_7107-1.JPG (24.74 KB, 320x240 - viewed 13 times.)

* IMG_7108-1.JPG (25.17 KB, 320x240 - viewed 13 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pics3


* IMG_7109-1.JPG (23.96 KB, 320x240 - viewed 12 times.)

* IMG_7111-1.JPG (23.73 KB, 320x240 - viewed 10 times.)

* IMG_7112-1.JPG (22.77 KB, 320x240 - viewed 11 times.)

* IMG_7113-1.JPG (19.35 KB, 320x240 - viewed 10 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pics4


* IMG_7114-1.JPG (22.53 KB, 320x240 - viewed 13 times.)

* IMG_7115-1.JPG (18.68 KB, 320x240 - viewed 11 times.)

* IMG_7116-1.JPG (20.75 KB, 320x240 - viewed 9 times.)

* IMG_7117-1.JPG (20.28 KB, 320x240 - viewed 10 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pics5


* IMG_7118-1.JPG (23.43 KB, 320x240 - viewed 16 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Here is the code! please be gentle!  hope this helps anyone else!  good luck! and please respond if you have any questions or suggestions

Code:
#include <Servo.h> //thank you Michael Margolis et al.
#include <Ultrasonic.h>  // thank you ITead studio. Alex, cnobile and Rowan Simms et al.


/*
  robot_7 - for Arduino
  Copyright (c) 2012 Richard Pesce.  All right reserved.

  This is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

  Richard Pesce (please give me a little credit
  PesceTech.com
*/

// -------------------------------------------------------
// 90 = stop                                              |
// forward   = right >90 & left < 90                      |
// backward  = right <90 & left > 90                      |
// left      = right >90 & left >90                       |
// right     = right <90 & left <90                       |
// i belive +- 20 is the fastest my driving servos turn   |
// -------------------------------------------------------

//  #define TRIGGER_PIN  8         // no need for variable
//  #define ECHO_PIN     12        // no need for variable
Ultrasonic ultrasonic(8, 12);      // set pins for HC-SRO4 (sonar) *why cant this be in the "void setup"?

Servo rightservo;                  // create servo object to control a servo *why cant this be in the "void setup"?
Servo leftservo;                   // create servo object to control a servo *why cant this be in the "void setup"?
Servo sonarservo;                  // create servo object to control a servo *why cant this be in the "void setup"?

int stopped = 90;                        // these servos stop moving at 90 *why cant this be in the "void setup"?
int sonarcenter = 98;                    // the center point of my sonar servo *why cant this be in the "void setup"?
int sonarleftlimit = 137;                // how far for sonar to turn left *why cant this be in the "void setup"? 128
int sonarrightlimit = 53;                // how far for sonar to turn right *why cant this be in the "void setup"? 60
int sonardirectionfacing = 0;            // where is sonar facing? *why cant this be in the "void setup"?
int sonarcurrentposition = sonarcenter;  // variable to store the servo position *why cant this be in the "void setup"?
int sonorleftORright = 0;                // 0=left 1=right *why cant this be in the "void setup"?
int StuckInACorner = 0;

void setup()
{
  Serial.begin(9600);                // to talk to serial
  rightservo.attach(10);             // attaches the servo on pin 8 to the servo object
  leftservo.attach(9);               // attaches the servo on pin 9 to the servo object
  sonarservo.attach(11);             // attaches the servo on pin 9 to the servo object
  pinMode(13, OUTPUT);               // LED
  sonarservo.write(sonarcenter);     // center position of my servo          
  delay(500);  
}

void RotateSonar()
{
  if (sonorleftORright == 0) {
    sonarcurrentposition = sonarcurrentposition +10;                      // if sonar is heading left rotate sonar left 10 degrees
  }                  
  if (sonorleftORright == 1) {
    sonarcurrentposition = sonarcurrentposition -10;                      // if sonar is heading right rotate sonar right 10 degrees
  }                  

  if (sonorleftORright == 0 && sonarcurrentposition >= sonarleftlimit) {  // if sonar is heading left but hits the left limit, go right
    sonorleftORright = 1;
  }    
  if (sonorleftORright == 1 && sonarcurrentposition <= sonarrightlimit) { // if sonar is heading right but hits the right limit, go left
    sonorleftORright = 0;
  }  

  sonarservo.write(sonarcurrentposition);                                 // move the sonar servo
  delay(60);                                                              // so servo can catch up
}

int distance()
{
  float inMsec;                                                  // some math with sonar
  long microsec = ultrasonic.timing();                           // some math with sonar
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);         // convert to american (aka imperial)
  Serial.print(inMsec);                                          // print distance to serial
  Serial.println(" inches away");                                // print distance to serial
  return inMsec;                                                 // return the distance to the object in inches
}

void MoveForward()
{
  StuckInACorner = 0;
  digitalWrite(13, LOW);                                          // turn off led
  rightservo.write(stopped +14);                                  // move forward offset is due to servo performance
  leftservo.write (stopped -20);                                  // move forward
}

void EvasiveAction()
{
  int objectlocation;                                            // var to store the location of the object
  digitalWrite(13, HIGH);                                        // turn on the led

  if ( sonarcurrentposition <= sonarcenter ) {                   // if looking right
    Serial.println("Object detected on the right!");              
    objectlocation = 1;                                          // then the object must be on the right (1 = right)
  }
  else {
    Serial.println("Object detected on the left!");
    objectlocation = 0;                                          // otherwise the object must be on the left (0 = left)
  }

  if (objectlocation == 1) {                                       // if object is on right
    rightservo.write(stopped +15);                                 // turn left until the object is not there anymore
    leftservo.write (stopped +15);                                 // see above
    delay(500);
  }

  if (objectlocation == 0) {                                       // if object is on left
    rightservo.write(stopped -15);                                 // turn right until the object is not there anymore
    leftservo.write (stopped -15);                                 // see above
    delay(500);
  }
}

void PlanAhead()
{
  int objectlocation;                                            // var to store the location of the object
  digitalWrite(13, HIGH);                                        // turn on the led

  if ( sonarcurrentposition <= sonarcenter ) {                   // if looking right
    Serial.println("Object detected on the right!");              
    objectlocation = 1;                                          // then the object must be on the right (1 = right)
  }
  else {
    Serial.println("Object detected on the left!");
    objectlocation = 0;                                          // otherwise the object must be on the left (0 = left)
  }

  if (objectlocation == 1){
    StuckInACorner = StuckInACorner +1;
  }
  else{
    StuckInACorner = StuckInACorner -1;                          // this is a buffer of sorts, kinda like counting cards, prevents sporadic movement
  }

  if (StuckInACorner >= 3 ) {                                    // if object is on right
    rightservo.write(stopped +14);                               // turn left until the object is not there anymore
    leftservo.write (stopped);                                   // see above
  }

  if (StuckInACorner <= -3 ) {                                   // if object is on left
    rightservo.write(stopped);                                   // turn right until the object is not there anymore
    leftservo.write (stopped -20);                               // see above
  }
}


void loop()
{
  if ( distance() < 5)                                            // if an oject is less than 5" away
  {
    EvasiveAction();                                              // DANGER take evasive action
  }
  else{                                                           // or
    if ( distance() >= 5 and distance() < 14 ) {                  // if greater than 5" but less than 14"
      PlanAhead();                                                // avoid the object
      RotateSonar();                                              // and rotate sonar
    }
    else{                                                         // otherwise
      MoveForward();                                              // move forward
      RotateSonar();                                              // and rotate sonar
    }
  }
}
« Last Edit: February 26, 2012, 10:03:44 am by pesce » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Working code for 2 servo drive motors and one sonar servo motor

I'm drunk. So please forgive lame posts.
« Last Edit: February 26, 2012, 03:44:58 am by pesce » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schematic of sorts....


* robot 7.jpg (86.38 KB, 960x720 - viewed 42 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Well I've made the switch... I'm now powering everything directly from the battery. Even though I get more speed from my servos. I still feel like I may break something. 7.2V straight to the servos?   And also 7.2V straight to the HC-SR04 ultrasonic sensor?   I feel like something is wrong.

Please help!
Logged

Offline Offline
Newbie
*
Karma: 3
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Well, I haven't read everything, but I find 7,2V straight is really too much, recommanded voltage input is usually MAX 6V
Logged


Belgium
Offline Offline
Sr. Member
****
Karma: 1
Posts: 278
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Do you know how much amps the servos draw? You can use a voltage regulator to to get the voltage down to 5-6V for the servos. I wouldn't power the ultrasonic module straight from the battery, take 5V from your Uno.
Logged


Pages: [1]   Go Up
Jump to: