Автор Тема: Серво и IRсензор  (Прочетена 16218 пъти)

desislav_77

  • Робо-Новак
  • *****
  • Публикации: 16
    • Профил
Серво и IRсензор
« -: Юни 11, 2011, 03:42:28 pm »
Има ли някой идея,как мога да направя така че когато сервото се движи постоянно( от 0гр.- до 180гр. и обратно) да се изпълни команда когато сервото е в определена позиция.Идеята ми е да използвам сервото като радар,на него да има закачен сензор и когато сензора засече обект и сервото е в определена позиция да изпълни команда :huh:
Десислав Вълчев
гр.Бургас

zen

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 121
    • Профил
Серво и IRсензор
« Отговор #1 -: Юни 11, 2011, 04:32:45 pm »
Имаш една променлива, която е текущият ъгъл на сервото (angle). На нея задаваш стойности от 0 до 180 с каквато стъпка искаш. На всяка стъпка проверяваш за сигнал от IR сензора. При сигнал или изпълбняваш друга функция или копираш стойността на angle в друра промелива.

Ако имаш някакъв код до момента, го пусни и ще ти помогна.

desislav_77

  • Робо-Новак
  • *****
  • Публикации: 16
    • Профил
Серво и IRсензор
« Отговор #2 -: Юни 11, 2011, 07:35:07 pm »
Eто код:
#include <Servo.h>
 
Servo myservo;  
int pos = 0;
int IRsensor = A0;
int SensorVal = 0;
int led1 = 13;
int led2 = 12;
int angle_servo;
int angle_servo_IRsensor;
 
void setup()
{
  myservo.attach(9);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  angle_servo = 45;  
}
 
 
void loop()
{
  SensorVal=analogRead(IRsensor);
  RadarServo();
  if(SensorVal<200 &&angle_servo_IRsensor==angle_servo)
 {
  digitalWrite(led1,HIGH);
  digitalWrite(led2,HIGH);
 }
   
 
 
}
//================================================
void RadarServo()

{
   for(pos = 0; pos < 180; pos += 1)  
  {                                  
    myservo.write(pos);            
    delay(15);                      
  }
  for(pos = 180; pos>=1; pos-=1)    
  {                                
    myservo.write(pos);            
    delay(15);                      
  }
}
//===============================================
Десислав Вълчев
гр.Бургас

zen

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 121
    • Профил
Серво и IRсензор
« Отговор #3 -: Юни 11, 2011, 10:04:05 pm »
Нещо такова си го представям:


#include <Servo.h>

Servo myservo;
int IRsensor = A0;
int SensorVal = 0;
int led1 = 13;
int led2 = 12;

int servo_direction = 0; // 0 - дясно, 1 - ляво
int servo_position = 0;  // първиначална позиция


void setup()
{
myservo.attach(9);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
angle_servo = 45;
InitServo(); //инициализиране на позицията на сервото
}


void loop()
{
SensorVal=analogRead(IRsensor);
MoveServo(); // движение на сервото

if(SensorVal<200 &&angle_servo_IRsensor==angle_servo)
{
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
}



}
//================================================
void MoveServo()
{
  if(servo_direction == 0) // при дясно движение
  {
    servo_position++; // увеличи градуса с 1
    if(servo_position == 181) // ако сервото е стигнало крайна дясна точка (181 градуса)
    {
      servo_position = 180;
       servo_direction = 1; // обърни посоката на движение на ляво
    }
  }
  else if(servo_direction == 1)  // при ляво движение
  {
    servo_position--; // намали градуса с 1
    if(servo_position == -1) // ако сервото е стигнало крайна лява точка (-1 градуса )
    {
      servo_position = 0;
      servo_direction = 0; // обърни посоката на движение на дясно
    }    
  }
  myservo.write(servo_position); // задай градуса на сервото
  delay(15);
}
//===============================================
void InitServo()
{
  myservo.write(servo_position); //инициализиране на сервото
}


Така на всеки цикъл мести сервото с една позиция и в Loop имаш на каква позиция сега е сервото. Написъл съм и коментари. Ако имаш въпроси питай.

desislav_77

  • Робо-Новак
  • *****
  • Публикации: 16
    • Профил
Серво и IRсензор
« Отговор #4 -: Юни 12, 2011, 09:44:36 am »
Нещо не ми стана ясно,къде трябва да се зададе показанията от сензора.Можеш ли да напишеш някой по кратко кодче
Десислав Вълчев
гр.Бургас

zen

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 121
    • Профил
Серво и IRсензор
« Отговор #5 -: Юни 12, 2011, 10:55:42 am »
Идеята е на всяко мръдване на сервото да чете стойностите от сензора. Какво трябва да прави програмата, когато получи сигнал от сензора?

desislav_77

  • Робо-Новак
  • *****
  • Публикации: 16
    • Профил
Серво и IRсензор
« Отговор #6 -: Юни 12, 2011, 12:42:24 pm »
Идеята ми е следната:
Сервото и IRсензора са разположени в предната част на робота,като радар.Робота се движи напред,като сервото се върти постоянно(0 - 180 и обратно) и сензора постоянно сканира.Ако изникне препядствие пред робота;IRсензора го засича и тук вече идва сложното...  :( ако сервото е на 90гр. робота се връща на обратно;ако сервото е на 45гр. робота завива на дясно;ако сервото на 135гр. завива на ляво...
Дано да съм обяснил добре :(
Десислав Вълчев
гр.Бургас

zen

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 121
    • Профил
Серво и IRсензор
« Отговор #7 -: Юни 12, 2011, 01:26:36 pm »
Ето така:



#include <Servo.h>

Servo myservo;
int IRsensor = A0;
int SensorVal = 0;


int servo_direction = 0; // 0 - дясно, 1 - ляво
int servo_position = 0;  // първиначална позиция


void setup()
{
myservo.attach(9);
InitServo(); //инициализиране на позицията на сервото
}


void loop()
{
SensorVal=analogRead(IRsensor);
MoveServo(); // движение на сервото

if(SensorVal<200) //Предполагам, че това значи, че сензорът е засякъл нещо
{
  if (servo_position >= 0 && servo_position < 45)
  {
    // Тук сложи код за завиване
  }
  else if (servo_position >= 45 && servo_position < 90)
  {
    // Тук сложи код за завиване  
  }
  else if (servo_position >= 90 && servo_position < 135)
  {  
    // Тук сложи код за завиване
  }
  else if (servo_position >= 135 && servo_position < 180)
  {
    // Тук сложи код за завиване
  }
}



}
//================================================
void MoveServo()
{
  if(servo_direction == 0) // при дясно движение
  {
    servo_position++; // увеличи градуса с 1
    if(servo_position == 181) // ако сервото е стигнало крайна дясна точка (181 градуса)
    {
      servo_position = 180;
       servo_direction = 1; // обърни посоката на движение на ляво
    }
  }
  else if(servo_direction == 1)  // при ляво движение
  {
    servo_position--; // намали градуса с 1
    if(servo_position == -1) // ако сервото е стигнало крайна лява точка (-1 градуса )
    {
      servo_position = 0;
      servo_direction = 0; // обърни посоката на движение на дясно
    }    
  }
  myservo.write(servo_position); // задай градуса на сервото
  delay(15);
}
//===============================================
void InitServo()
{
  myservo.write(servo_position); //инициализиране на сервото
}


Само рябва да си допишеш кода за управление на колелата.

desislav_77

  • Робо-Новак
  • *****
  • Публикации: 16
    • Профил
Серво и IRсензор
« Отговор #8 -: Юни 13, 2011, 07:57:38 am »
Благодаря ти за помоща,ще изпробвам за да видя какво ще стане.Поздрави :D
Десислав Вълчев
гр.Бургас