Go Down

Topic: The Arduino robot and freshman (Read 3162 times) previous topic - next topic

zugni

Excuse me if I'm stubborn so, could You write this code for my Robot) unless of course You have the opportunity and time:)

zugni


zugni

   

 The distance data seem reasonable? Yes they are reasonable

CrossRoads

Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

zugni

   

 I mean on the robot? Or what

CrossRoads

The robot. Are you talking about something else?
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

zugni

I can not seem to write code for the Robot ( will You help me in writing code ?



Code: [Select]
#include <Ultrasonic.h>
#include <Servo.h>

#define MOTOR_1_FORWARD 8   //Вперед
#define MOTOR_1_BACK 9      //Назад
#define MOTOR_2_FORWARD 10 //Вперед
#define MOTOR_2_BACK 11    //Назад

#define TRIG 6
#define ECHO 7

#define HEAD_SERVO 5 // pIN 5

#define OBSTRACLE_DISTANCE 35.0 // РАССТОЯНИЕ ПРЕПЯТСТВИЙ
#define TURN_DELAY 200 //ОЧЕРЕДЬ ЗАДЕРЖКА 200


#define LOG true  //Журнал ложного

Ultrasonic ultrasonic(TRIG, ECHO);

Servo headServo;


int servoAngle = 90;//Угол
int angleStep = 30; //угол шага 30

float distance = 0; //Запись расстояния float

void setup()
{
 
  pinMode(MOTOR_1_FORWARD, OUTPUT);
  pinMode(MOTOR_1_BACK,    OUTPUT);
  pinMode(MOTOR_2_FORWARD, OUTPUT);
  pinMode(MOTOR_2_BACK,    OUTPUT);
 
  stopMove(); // перестать двигаться
 
  headServo.attach(HEAD_SERVO); //руководить cервой
 
  if(LOG) Serial.begin( 9600 );//Журнал
 

}

void loop()
{
  updateHeadAngle();  //обновление головой угол
 
  checkDistance();    //проверить расстояние
 
  moove();            //переместите
 
  delay(200);
}

void checkDistance()    //проверьте расстояние
{
  distance = ultrasonic.Ranging(CM);   //расстояние ультразвуковом диапазоне
  if(LOG) Serial.println(distance);
   if(LOG)
  {
     Serial.print("distance = ");
     Serial.println(distance);
  }


}

void moove()
{
  if( distance > OBSTRACLE_DISTANCE )
  {
    if(LOG) Serial.println("FORWARD");
   
    goForward();
    delay(TURN_DELAY);
  }
  else
  {
    stopMove();
   
    checkObstracle();
  }
}

void checkObstracle()// проверить препятствие
{
  int obsLeft  = 0;
  int obsRight = 0;
 
  // График препятствий с левой и правой сторон
 
  for(servoAngle = 0; servoAngle <= 180; servoAngle += 30)
  {
    headServo.write(servoAngle);
    delay(TURN_DELAY);
   
    checkDistance();
    {
        if(servoAngle > 90)
           obsLeft++;
        else
           obsRight++;
    }
 
  }
  if(LOG) Serial.print("TURN");
   
  if(obsLeft && obsRight)
  {
    goBack();
   
    delay(TURN_DELAY * 2);//2
   
    if(obsLeft < obsRight) goLeft();
    else goRight();
   
 delay(TURN_DELAY);
  }
  else if(obsRight)
  {
    goLeft();
   
    delay(TURN_DELAY);
  }
  else if(obsLeft)
  {
    goRight();
   
    delay(TURN_DELAY);
  }
  else
  {
    goForward();
   
    delay(TURN_DELAY);
  }
}

void updateHeadAngle()      //обновление головой угол
{
 headServo.write(servoAngle);
 
  servoAngle += angleStep;
 
  if(servoAngle >= 0)//150
  {
    servoAngle = 90;
   
    angleStep *= -1;
 }
 
  if(servoAngle <= 30)
 {
    servoAngle = 30;   
   
    angleStep *= -1;
 }
}

void goForward()
{

  digitalWrite(MOTOR_1_FORWARD, HIGH);   //ехать вперед
  digitalWrite(MOTOR_1_BACK,    LOW);
  digitalWrite(MOTOR_2_FORWARD, HIGH);
  digitalWrite(MOTOR_2_BACK,    LOW);
}

void goBack()
{

  digitalWrite(MOTOR_1_FORWARD, LOW);
  digitalWrite(MOTOR_1_BACK,    HIGH);    //ехать назад
  digitalWrite(MOTOR_2_FORWARD, LOW);
  digitalWrite(MOTOR_2_BACK,    HIGH);
}

void goLeft()
{

  digitalWrite(MOTOR_1_FORWARD, LOW);      // поворт на лево
  digitalWrite(MOTOR_1_BACK,    HIGH);
  digitalWrite(MOTOR_2_FORWARD, HIGH);
  digitalWrite(MOTOR_2_BACK,    LOW);
}

void goRight()
{

  digitalWrite(MOTOR_1_FORWARD, HIGH);
  digitalWrite(MOTOR_1_BACK,    LOW);      // поворт на право
  digitalWrite(MOTOR_2_FORWARD, LOW);
  digitalWrite(MOTOR_2_BACK,    HIGH);
}

void stopMove()
{

  digitalWrite(MOTOR_1_FORWARD, LOW);
  digitalWrite(MOTOR_1_BACK,    LOW);     //перестать двигаться
  digitalWrite(MOTOR_2_FORWARD, LOW);
  digitalWrite(MOTOR_2_BACK,    LOW);
}

PaulS

Code: [Select]
float distance = 0; //Запись расстояния float
This is STILL wrong!

Code: [Select]
  updateHeadAngle();  //обновление головой угол
This swings the servo around, and counts the number of times the distance is small, on the left and right, and makes the robot move.

Code: [Select]
  checkDistance();    //проверить расстояние
Then, with the servo still pointing to the far right, you take another useless reading.

Code: [Select]
  moove();            //переместите
Then, you decide what to do, based on that useless reading.

updateHeadAngle() should NOT make the robot move AT ALL.
The call to checkDistance() needs to go away.

Code: [Select]
    checkDistance();
    {
        if(servoAngle > 90)
           obsLeft++;
        else
           obsRight++;
    }

Regardless of whether there is an obstacle, or not, increment the counters. Why? What happened to the if statement that I had?
The art of getting good answers lies in asking good questions.

Go Up