roboforum.ru

Технический форум по робототехнике.

Arduino и Gp2D120

Arduino и Gp2D120

gambit6 » 11 июл 2011, 20:39

Вот, собрал платформочку, начал разбираться с программированием. Столкнулся с такой проблемой:
Подключил инфракрасный дальномер GP2D1. Едет вперед, впереди стенка, лезет на стенку, а отъезжать начинает уже когда на стену лезет.
Получается, что сигнал с датчика не останавливает выполне5ние движения вперед в момент обнаружения препятствия, а срабатывает только при начале следующего цикла основной программы. Как реализовать чтоб он сразу срабатывал и отъезжать начинал?
Вот мой скетч:

/*******************************************************************************
* ROBOT
* Filename : MyRobot01.pde
********************************************************************************/
#include <AFMotor.h> // подключили библиотеку для работы с ДПТ и ШД
AF_DCMotor Motor3(3, MOTOR12_1KHZ); // используем 1-й порт на частоте ШИМ 1 кГц (можно 1,2,8,64)
AF_DCMotor Motor4(4, MOTOR12_1KHZ); // используем 2-й порт на частоте ШИМ 1 кГц (можно 1,2,8,64)
int dalnomer = 4; // дальномер
int gp2;
float distance;
// -----------------------------------------------------------------
void setup(){
Motor3.setSpeed(200); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(200); // устанавливаем скорость вращения двигателя на 2-м порту
} // end setup
// -----------------------------------------------------------------
// О С Н О В Н О Й Ц И К Л П Р О Г Р А М М Ы
void loop() {

gp2=analogRead(dalnomer);
distance=(2914/(gp2+5))-1; // Перевод в сантиметры
if (distance < 7)
{
Backward (250); delay (2000);
Spin_Right(); delay(2000);
}
// БЛУЖДАЮЩИЙ ЦИКЛ
// -----------------------------------------------------------------
Forward (250); delay(2000);
//Spin_Left(); delay(2000);
//Forward(200); delay(2000);
//Spin_Right(); delay(2000);
//Backward (150); delay(2000);
} // end loop

// ПОДПРОГРАММЫ ДВИЖЕНИЙ
// -----------------------------------------------------------------
void Forward (int speed){ // движение вперед
Motor3.setSpeed(speed); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(speed); // устанавливаем скорость вращения двигателя на 2-м порту
Motor3.run(FORWARD); // 1-й моторчик вперед крутится
Motor4.run(FORWARD); // 2-й моторчик вперед крутится
} // end Forward

void Backward (int speed){ // движение вперед
Motor3.setSpeed(speed); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(speed); // устанавливаем скорость вращения двигателя на 2-м порту
Motor3.run(BACKWARD); // 1-й моторчик назад крутится
Motor4.run(BACKWARD); // 2-й моторчик назад крутится
} // end Forward

void Release (){ // выбег с остановом
Motor3.run(RELEASE);
Motor4.run(RELEASE);
} // end Release

void Stop (){ // останов
Motor3.run(BRAKE);
Motor4.run(BRAKE);
} // end Stop

void Spin_Right (){ // поворот влево
Motor3.setSpeed(500); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(500);
Motor3.run(FORWARD); // 1-й моторчик вперед крутится
Motor4.run(BACKWARD);
delay (2000);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
} // end Spin_Right

void Spin_Left (){ // поворот влево
Motor3.setSpeed(500);// устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(500);
Motor4.run(FORWARD); // 2-й моторчик вперед крутится
Motor3.run(BACKWARD);
delay (2000);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
} // end Spin_Left

// -----------------------------------------------------------------

Re: Arduino и Gp2D120

avr123.nm.ru » 11 июл 2011, 21:01

препятствие должно прервать паузу.

Re: Arduino и Gp2D120

gambit6 » 11 июл 2011, 21:06

Как прервать? Нужно вводить прерывание в программу?
Если дистанция < 6см то текущее движение прерывается и разворот 2 секунды...
но как это реализовать программно? Помогите пожалуйста.

Re: Arduino и Gp2D120

=DeaD= » 11 июл 2011, 21:15

сделайте конечный автомат с таймерами по состояниям :)

Re: Arduino и Gp2D120

gambit6 » 11 июл 2011, 21:38

Как его сделать?

Re: Arduino и Gp2D120

=DeaD= » 11 июл 2011, 22:54

короткий цикл с паузой скажем в 50мс, внутри работа с переменными "куда ехать" и "сколько циклов еще ехать".

Если видите препятствие спереди - кладёте в "куда ехать" значение "назад", а в "сколько циклов еще ехать" нужное количество.

Далее едите туда, куда надо, уменьшаете счетчик циклов на 1.

Если счетчик=0, тогда выполняете свой следующий шаг базовой программы, разместив в "куда ехать" и "сколько ехать" параметры этого шага.

Re: Arduino и Gp2D120

gambit6 » 11 июл 2011, 23:09

Звучит все хорошо, взглянуть бы на какой-нибудь скетч для arduino... есть у кого пример?

Re: Arduino и Gp2D120

avr123.nm.ru » 12 июл 2011, 09:21


Re: Arduino и Gp2D120

gambit6 » 12 июл 2011, 13:56

Вот написал цикл движения.
Вопрос теперь в том, как сделать чтобы датчик обновлял свое значение не с начала всего тела программы, а каждые 0,5 секунды???
Гуру, помогите!

void Go() { // БЛУЖДАЮЩИЙ ЦИКЛ // зациклить с условием while

gp2=analogRead(dalnomer); КАК СДЕЛАТЬ ОБНОВЛЕНИЕ ПОКАЗАНИЯ ДАТЧИКА КАЖДЫЕ 0,5 СЕКУНДЫ ЧТОБ ЭТО ВЫПОЛНЯЛОСЬ БЕСКОНЕЧНО И ПАРАЛЛЕЛЬНО ЦИКЛУ DO WHILE???
distance=(2914/(gp2+5))-1; // Перевод в сантиметры

do
{
Forward (250); delay(2000);
Spin_Left(); delay(2000);
Forward(200); delay(2000);
Spin_Right(); delay(2000);
Backward (150); delay(2000);
} while (distance > 6);
Stop (); delay (1000);
Backward (250); delay (2000);
Spin_Right(); delay(2000);
} // end loop

Re: Arduino и Gp2D120

=DeaD= » 12 июл 2011, 14:13

Условно как-то так:
Код: Выделить всёРазвернуть
int obstacleDetected(){
  gp2=analogRead(dalnomer);
  distance=(2914/(gp2+5))-1;
  return (distance<=6);
};

void main(){

int dirL=1,dirR=1; //Направления движения колёс
int stepsLeft=100; //Сколько итераций еще ехать
while(1){
  if(obstacleDetected()){ dirL=-1; dirR=-1; stepsLeft=100; };
  moveChassis(dirL,dirR);
  delay(20);
  steps--;
  if(steps==0){
    //Определиться с новым направлением в зависимости от предыдущего
    if(dirL==1 && dirR==1){
      dirL=-1; dirR=1;
    }else if(dirL==-1 && dirR==1){
      dirL=1; dirR=-1;
    }else if(dirL==1 && dirR==-1){
      dirL=1; dirR=1;
    }else if(dirL==-1 && dirR==-1){
      dirL=-1; dirR=1;
    };
    stepsLeft=100;
  };
};

};

Re: Arduino и Gp2D120

gambit6 » 12 июл 2011, 18:53

Сделал так: ЭФЕКТА НОЛЬ :o
/*******************************************************************************
* ROBOT
* Filename : MyRobot01.pde
********************************************************************************/
#include <AFMotor.h> // подключили библиотеку для работы с ДПТ и ШД
AF_DCMotor Motor3(3, MOTOR12_1KHZ); // используем 1-й порт на частоте ШИМ 1 кГц (можно 1,2,8,64)
AF_DCMotor Motor4(4, MOTOR12_1KHZ); // используем 2-й порт на частоте ШИМ 1 кГц (можно 1,2,8,64)
int dalnomer = 4; // дальномер
int gp2;
float distance;
int obstacleDetected(){
gp2=analogRead(dalnomer);
distance=(2914/(gp2+5))-1; // Перевод в сантиметры
return (distance<=6);
}


// -----------------------------------------------------------------
void setup(){
Motor3.setSpeed(200); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(200); // устанавливаем скорость вращения двигателя на 2-м порту
} // end setup
// -----------------------------------------------------------------
// О С Н О В Н О Й Ц И К Л П Р О Г Р А М М Ы
void loop(){

Go();
}
// -----------------------------------------------------------------

// -----------------------------------------------------------------
void Go() { // БЛУЖДАЮЩИЙ ЦИКЛ // зациклить с условием while

do
{
Forward (250); delay(2000);
//Spin_Left(); delay(2000);
//Forward(200); delay(2000);
Spin_Right(); delay(2000);
//Backward (150); delay(2000);
} while (obstacleDetected);
Stop (); delay (1000);
Backward (250); delay (2000);
Spin_Right(); delay(2000);
} // end loop

// ПОДПРОГРАММЫ ДВИЖЕНИЙ
// -----------------------------------------------------------------
void Forward (int speed){ // движение вперед
Motor3.setSpeed(speed); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(speed); // устанавливаем скорость вращения двигателя на 2-м порту
Motor3.run(FORWARD); // 1-й моторчик вперед крутится
Motor4.run(FORWARD); // 2-й моторчик вперед крутится
} // end Forward

void Backward (int speed){ // движение вперед
Motor3.setSpeed(speed); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(speed); // устанавливаем скорость вращения двигателя на 2-м порту
Motor3.run(BACKWARD); // 1-й моторчик назад крутится
Motor4.run(BACKWARD); // 2-й моторчик назад крутится
} // end Forward

void Release (){ // выбег с остановом
Motor3.run(RELEASE);
Motor4.run(RELEASE);
} // end Release

void Stop (){ // останов
Motor3.run(BRAKE);
Motor4.run(BRAKE);
} // end Stop

void Spin_Right (){ // поворот влево
Motor3.setSpeed(500); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(500);
Motor3.run(FORWARD); // 1-й моторчик вперед крутится
Motor4.run(BACKWARD);
delay (2000);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
} // end Spin_Right

void Spin_Left (){ // поворот влево
Motor3.setSpeed(500);// устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(500);
Motor4.run(FORWARD); // 2-й моторчик вперед крутится
Motor3.run(BACKWARD);
delay (2000);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
} // end Spin_Left

// -----------------------------------------------------------------

Re: Arduino и Gp2D120

=DeaD= » 12 июл 2011, 18:58

gambit6 писал(а):Сделал так: ЭФЕКТА НОЛЬ :o

Вы правда не видите ни одного отличия между вашим:
Код: Выделить всёРазвернуть
do
{
Forward (250); delay(2000);
//Spin_Left(); delay(2000);
//Forward(200); delay(2000);
Spin_Right(); delay(2000);
//Backward (150); delay(2000);
} while (obstacleDetected);
Stop (); delay (1000);
Backward (250); delay (2000);
Spin_Right(); delay(2000);
} // end loop


и моим

Код: Выделить всёРазвернуть
while(1){
  if(obstacleDetected()){ dirL=-1; dirR=-1; stepsLeft=100; };
  moveChassis(dirL,dirR);
  delay(20);
  steps--;
  if(steps==0){
    //Определиться с новым направлением в зависимости от предыдущего
    if(dirL==1 && dirR==1){
      dirL=-1; dirR=1;
    }else if(dirL==-1 && dirR==1){
      dirL=1; dirR=-1;
    }else if(dirL==1 && dirR==-1){
      dirL=1; dirR=1;
    }else if(dirL==-1 && dirR==-1){
      dirL=-1; dirR=1;
    };
    stepsLeft=100;
  };
};


?????

Как по вашему контроллер находясь внутри вашего delay(2000) обнаружит, что робот во что-то въехал???

Re: Arduino и Gp2D120

gambit6 » 13 июл 2011, 14:59

Кажется начинаю понимать... извините за тупость =(((
А можете этот скетч полностью выложить? А то я так понимаю это кусок небольшой...
Хочу более детально разобраться откуда что берется.

Re: Arduino и Gp2D120

=DeaD= » 13 июл 2011, 15:02

Не могу конечно, у меня же вашего робота нету :)

Если что в коде не ясно, зачем и почему, - тогда спрашивайте, отвечу.

Re: Arduino и Gp2D120

gambit6 » 13 июл 2011, 15:33

ВОТ мои вопросы: =)
Давайте пошагово с самого начала программы.
1)Определяем что и куда подключено
#include <AFMotor.h> // подключили библиотеку для работы с ДПТ и ШД
AF_DCMotor Motor3(3, MOTOR12_1KHZ); // используем 1-й порт на частоте ШИМ 1 кГц (можно 1,2,8,64)
AF_DCMotor Motor4(4, MOTOR12_1KHZ); // используем 2-й порт на частоте ШИМ 1 кГц (можно 1,2,8,64)
int dalnomer = 4; // дальномер
int gp2;
float distance;
int obstacleDetected(){
gp2=analogRead(dalnomer);
distance=(2914/(gp2+5))-1; // Перевод в сантиметры
return (distance<=6);

void setup(){
Motor3.setSpeed(200); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(200); // устанавливаем скорость вращения двигателя на 2-м порту
} // end setup
}

2) Пишем основной цикл: КАК ЗАМЕНИТЬ delay(2000); на шаги? Как определять шаги? Где добавить описание одного шага? Хотелось бы что-то типа Spin_Left; количество шагов
// -----------------------------------------------------------------
// О С Н О В Н О Й Ц И К Л П Р О Г Р А М М Ы
void loop(){

do
{
Forward (250); delay(2000);
//Spin_Left(); delay(2000);
//Forward(200); delay(2000);
Spin_Right(); delay(2000);
//Backward (150); delay(2000);
} while (obstacleDetected);
Stop (); delay (1000);
Backward (250); delay (2000);
Spin_Right(); delay(2000);
} // end loop

// -----------------------------------------------------------------

3) ДАЛЕЕ ПОШЛИ ПОДПРОГРАММЫ ДВИЖЕНИЙ:

// ПОДПРОГРАММЫ ДВИЖЕНИЙ ЗДЕСЬ ВСЕ ПОНЯТНО
// -----------------------------------------------------------------
void Forward (int speed){ // движение вперед
Motor3.setSpeed(speed); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(speed); // устанавливаем скорость вращения двигателя на 2-м порту
Motor3.run(FORWARD); // 1-й моторчик вперед крутится
Motor4.run(FORWARD); // 2-й моторчик вперед крутится
} // end Forward

void Backward (int speed){ // движение вперед
Motor3.setSpeed(speed); // устанавливаем скорость вращения двигателя на 1-м порту
Motor4.setSpeed(speed); // устанавливаем скорость вращения двигателя на 2-м порту
Motor3.run(BACKWARD); // 1-й моторчик назад крутится
Motor4.run(BACKWARD); // 2-й моторчик назад крутится
} // end Forward


Rambler\'s Top100 Mail.ru counter