робот идущий по заданному траекторию

igidey
Offline
Зарегистрирован: 16.02.2014

Срочно ищу исполнителя.

Робот идет по заданному траекторию.  Машинка на базе DFRduino Romeo V1.1 с тремя датчиками спереди и один под колесами если надо.  Скетч нашли только идущий по линии. Робот не сворачивает на перекресках. Помогите!!!!!

Вот траектория им робот.

igidey
Offline
Зарегистрирован: 16.02.2014

igidey пишет:

Срочно ищу исполнителя.

Робот идет по заданному траекторию.  Машинка на базе DFRduino Romeo V1.1 с тремя датчиками спереди и один под колесами если надо.  Скетч нашли только идущий по линии. Робот не сворачивает на перекресках. Помогите!!!!!

Вот траектория им робот.

Мы в начали только две недели назад закупили специально для соревнований школьников.

com
Offline
Зарегистрирован: 06.09.2013

траектория - она

igidey
Offline
Зарегистрирован: 16.02.2014

да траектория, 4 день голову ломаем. Все равно не пропускает перекрески

igidey
Offline
Зарегистрирован: 16.02.2014

Люди помогите

fortekom
Offline
Зарегистрирован: 19.02.2014

Три датчика достаточно, если два из них на белом.

Чтобы пройти такой перекресток, нужно : как три датчика видят черное -> выполнять действие - отключить датчики - поворот (если надо) - проехать 1-2 сек (чтобы проехать перекресток), а потом опять включать датчики.

В общем виде так:

Ехать прямо, если перекресток (3 датчика на черном) поворот на право

Ехать прямо, если перекресток (3 датчика на черном) поворот на право

Ехать прямо, если перекресток (3 датчика на черном) поворот на лево

Ехать прямо, если перекресток (3 датчика на черном) едем прямо

Ехать прямо, если перекресток (3 датчика на черном) едем прямо

... поворот на право ....   прямо .... прямо ...  на лево .... на право ... стоп
 

 

igidey
Offline
Зарегистрирован: 16.02.2014

Спасибо. Алгоритм поняли но вот как писать скетч. Мы в этом деле новички. Короче нашли в инете, только идущий по  линии прямо. А как сворачивать на перекресках не нашли. За сколько сделаете скетч?

com
Offline
Зарегистрирован: 06.09.2013

какие нынче школьники предприимчивые.... зачем скетч, сразу грамоту купите и не парьтесь

igidey
Offline
Зарегистрирован: 16.02.2014

а мы не школьники. Недавно для школы закупили Ардуино. Вот и ломаем голову. Ранще на бейсике сидели.  Еще требуют подготовить школьников для соревнований

maksim
Offline
Зарегистрирован: 12.02.2012

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

Клапауций
Offline
Зарегистрирован: 10.02.2013

igidey пишет:

а мы не школьники. Недавно для школы закупили Ардуино. Вот и ломаем голову. Ранще на бейсике сидели.  Еще требуют подготовить школьников для соревнований

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

com
Offline
Зарегистрирован: 06.09.2013

igidey пишет:

а мы не школьники...

и вас таких много?

было бы смешно, если бы не было очень грустно.....

igidey
Offline
Зарегистрирован: 16.02.2014

Было бы время, сами бы справились, бумажная волокита.  Бюрократия совсем замучило. Мужиков в школе совсем не осталось, нескем  нормально посоветоваться....   Хотел от вас помощи, а вы демагогией занимаетесь.  

igidey
Offline
Зарегистрирован: 16.02.2014

Нужны специалисты, а хрен их найдешь в селе.

com
Offline
Зарегистрирован: 06.09.2013

igidey пишет:

Мужиков в школе совсем не осталось, нескем  нормально посоветоваться....   Хотел от вас помощи, а вы демагогией занимаетесь.  

извините, но если бы хотели посоветоваться, то вам бы тут с удовольствием, быстро и бесплатно ответили бы на любой вопрос по делу. а пока только вопросы типа

igidey пишет:

За сколько сделаете скетч?

вот с кого надо брать пример http://koposov.info/

igidey
Offline
Зарегистрирован: 16.02.2014
maksim
Offline
Зарегистрирован: 12.02.2012

Тут пол форума потянет ваш проэкт. Знаете почему никто не хочет браться? Потому что особо денег за это не возьмешь, а времени потрачено бутет много.

fortekom
Offline
Зарегистрирован: 19.02.2014

Покажите свой скетч, попробую изменить.

Я тоже из глубинки.

fortekom
Offline
Зарегистрирован: 19.02.2014

igidey пишет:

Мы в начали только две недели назад закупили специально для соревнований школьников.

Вам везет, вы уже купили роботов, а нам сказали "покажите результаты, потом дадим деньги, может быть"

Вот и приходится клепать роботов "из того что было", а для самоделок соревнований почти нет.

Ардуино купил неделю назад, теперь хочу посмотреть что из него выйдет. Посмотрим получится научить своих школьников Си или все таки вернемся к Алгоритм бюлдеру.

Сколько осталось дней до соревнования?

igidey
Offline
Зарегистрирован: 16.02.2014

5 дней осталость.

1 версия взята отсюда. http://wiki.amperka.ru/%D1%80%D0%BE%D0%B1%D0%BE%D1%82%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0:%D1%80%D0%BE%D0%B1%D0%BE%D1%82-%D1%81-%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC%D0%B8-%D0%BB%D0%B8%D0%BD%D0%B8%D0%B8-%D0%BD%D0%B0-arduino

файл LineRobot_v1.ino

Только идет не обращая на перекрестки прямо, зато хорошо идет по черному квадрату, только надо широко развинуть  датчики.

2 версия с отключаем правый датчик. Если замедлит скорось и увеличит виляние то хорошо сворачивает налево в перекрестке.

Надо соеденить обе программы, так чтобы через какое то время отключался то левый то правый датчик в зависмости поворота на перекрестке.


#define SPEED_LEFT       6
#define SPEED_RIGHT      5 
#define DIR_LEFT         7
#define DIR_RIGHT        4
#define LEFT_SENSOR_PIN  1
#define RIGHT_SENSOR_PIN 2

// Скорость, с которой мы движемся вперёд (0-255)
#define SPEED           80

// Коэффициент, задающий во сколько раз нужно затормозить
// одно из колёс для поворота
#define BRAKE_K          4

#define STATE_FORWARD    0
#define STATE_RIGHT      1
#define STATE_LEFT       2

int state = STATE_FORWARD;

void runForward() 
{
    state = STATE_FORWARD;

    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
    // чем болше, тем быстрее. 
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
    // вперёд, если LOW - назад.
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}

void steerRight() 
{
    state = STATE_RIGHT;

    // Замедляем правое колесо относительно левого,
    // чтобы начать поворот
    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
    analogWrite(SPEED_LEFT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}

void steerLeft() 
{
    state = STATE_LEFT;

    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}


void setup() 
{
    // Настраивает выводы платы 4,5,6,7 на вывод сигналов 
    for(int i = 4; i <= 7; i++)
        pinMode(i, OUTPUT);

    // Сразу едем вперёд
    runForward();
} 

void loop() 
{ 
 
    boolean left = !digitalRead(LEFT_SENSOR_PIN);
    boolean right = !digitalRead(RIGHT_SENSOR_PIN);

 
    int targetState;

   if (left) {
         targetState = STATE_LEFT;
    } else {
        targetState = STATE_RIGHT;
    }

    if (state == targetState) {
 
        return;
    }

    switch (targetState) {
        case STATE_FORWARD:
            runForward();
            break;

        case STATE_RIGHT:
            steerRight();
            break;

        case STATE_LEFT:
            steerLeft();
            break;
    }
// вот виляние 
       delay(20);
}

 

fortekom
Offline
Зарегистрирован: 19.02.2014

В этом скетче нет третьего датчика.

Вы на какой пин его подключили?

igidey
Offline
Зарегистрирован: 16.02.2014

средний датчик пока не использовали, как то не видели неоходимости

fortekom
Offline
Зарегистрирован: 19.02.2014

Если б небыло черного квадрата, то можно было бы обойтись двумя.

На квадрате оба датчика видят черный цвет и на перекрестке тоже самое, две разные ситуации а показания одинаковые.

Если будет три то на квадрате центральный будет белый, а крайнии будут черные, на перекрестке три датчика черные - в этом случае можно разлечить перекресток от квадрата.

тут глянь - http://cxem.net/uprav/uprav40.php

Клапауций
Offline
Зарегистрирован: 10.02.2013

датчика должно быть четыре для отработки тупиков, где короткая линия и начинается/оканчивается линия движения.

igidey
Offline
Зарегистрирован: 16.02.2014

Вот еще одна версия двумя датчиками. 

Попробуем сегодня если найдем время, для терх датчиков.


int leftLinePin = 10;
int rightLinePin = 11;

int leftDirPin = 4;
int leftSpeedPin = 5;

int rightDirPin = 7;
int rightSpeedPin = 6;

int runSpeed = 150;
int turnSpeed = 120;

int logic[11] = {0,2,0,0.0,0,0,0,0,0,2};
int index = -1;
//boolean invertLogic = false;
//boolean colorWhite = true;
boolean prevColorWhite = true;

void setupMotorShield()
{
    pinMode(leftDirPin, OUTPUT);
    pinMode(leftSpeedPin, OUTPUT);
    pinMode(rightDirPin, OUTPUT);
    pinMode(rightSpeedPin, OUTPUT);
}

void go(int currentSpeed)
{
    analogWrite(leftSpeedPin, currentSpeed);
    analogWrite(rightSpeedPin, currentSpeed*1.15);
}

void stop()
{
    analogWrite(leftSpeedPin, 0);
    analogWrite(rightSpeedPin, 0);
}

void goForward()
{
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, HIGH);
    go(runSpeed);
}

void turnLeft()
{
    digitalWrite(leftDirPin, LOW);
    digitalWrite(rightDirPin, HIGH);
    go(turnSpeed);
}

void turnRight()
{
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, LOW);
    go(turnSpeed);
}

void setup()
{
    setupMotorShield();
}



void loop()
{
    // Считываем данные с сенсоров
    boolean whiteLeft = digitalRead(leftLinePin);
    boolean whiteRight = digitalRead(rightLinePin);
    
    /*принятие мною решения*/
    
     if (whiteLeft && whiteRight) {
        // Под обоими датчиками белый цвет. Видимо
        // линия прямо под нами. Полный вперёд!
        if(prevColorWhite == false){
            //это начало дороги после перекрестка
            prevColorWhite = true;
        }else{
            //дорога продолжается
        }
 
    } else if (!whiteLeft && !whiteRight) {
        // Что-то не то: под обоими датчиками чёрный
        // цвет. Видимо мы выехали за пределы трассы.
        // Лучше остановиться
        if(prevColorWhite == true){
            //это начало перекрестка
            index = index +1;
            prevColorWhite = false;
            
        }else{
            //перекресток продолжается
        }

    } else if (whiteRight) {
        // Под левым датчиком — чёрный, под правым —
        // белый. Чтобы выровняться, нужно начать
        // поворот налево
    } else {
        // Последний оставшийся вариант. Под левым
        // датчиком — белый, под правым — чёрный.
        // Чтобы выровняться, нужно начать поворот
        // направо
    }
    
    if(index>-1){
      if(!whiteLeft && !whiteRight){
        if(logic[index]==0){//прямо
            whiteLeft = true;
            whiteRight = true;
        }else if(logic[index]==1){//налево
            whiteRight = true;
            goForward();
            delay(50);
            turnLeft();
            delay(200);
        }else{//направо
            whiteLeft = true;
            goForward();
            delay(50);
            turnRight();
            delay(200);
            prevColorWhite = false;
            
        }
      }
    }
  
  
    /*конец принятия мною решения*/
    
    if (whiteLeft && whiteRight) {
        // Под обоими датчиками белый цвет. Видимо
        // линия прямо под нами. Полный вперёд!
        goForward();
    } else if (!whiteLeft && !whiteRight) {
        // Что-то не то: под обоими датчиками чёрный
        // цвет. Видимо мы выехали за пределы трассы.
        // Лучше остановиться
        //stop();
        
        
    } else if (whiteRight) {
        // Под левым датчиком — чёрный, под правым —
        // белый. Чтобы выровняться, нужно начать
        // поворот налево
        turnLeft();
    } else {
        // Последний оставшийся вариант. Под левым
        // датчиком — белый, под правым — чёрный.
        // Чтобы выровняться, нужно начать поворот
        // направо
        turnRight();
    }
}

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

датчика должно быть четыре.

igidey
Offline
Зарегистрирован: 16.02.2014

как установить и использовать.

Алгоритм какой

fortekom
Offline
Зарегистрирован: 19.02.2014

Если фото вашего робота, то у вас такие датчики - http://dvrobot.ru/shop/i12.infrakrasnyy_datchik_2_sm..htm

И их у вас четыре.

Посмотри по проводам к какому пину подходят твои датчики.

Да и кстати какая у вас ардуина? 

igidey
Offline
Зарегистрирован: 16.02.2014

DFRobot DFRdino Romeo V1.1   Вот ссылка http://www.dfrobot.com/index.php?route=product/product&filter_name=Romeo%20V1.1&product_id=656

Датчики подключили левые и правые на 10 и11    а средние передние  1 и задние  2

 

fortekom
Offline
Зарегистрирован: 19.02.2014

В вашем первом скетче вы используете 1 и 2  датчик

 
005 #define LEFT_SENSOR_PIN  1
006 #define RIGHT_SENSOR_PIN 2

А левый и правый не используете.

igidey
Offline
Зарегистрирован: 16.02.2014

1 левый 2 правый, просто каждый раз меняли выводы для проверки выводов

fortekom
Offline
Зарегистрирован: 19.02.2014
// Моторы подключаются к клеммам M1+,M1-,M2+,M2-  
// Motor shield использует четыре контакта 6,5,7,4 для управления моторами 
#define SPEED_LEFT       6
#define SPEED_RIGHT      5 
#define DIR_LEFT         7
#define DIR_RIGHT        4
#define LEFT_SENSOR_PIN  8
#define CENTR_SENSOR_PIN 9
#define RIGHT_SENSOR_PIN 10
 
// Скорость, с которой мы движемся вперёд (0-255)
#define SPEED            185
 
// Коэффициент, задающий во сколько раз нужно затормозить
// одно из колёс для поворота
#define BRAKE_K          4
 
#define STATE_FORWARD    0
#define STATE_RIGHT      1
#define STATE_LEFT       2
#define STATE_PER        3
 
int state = STATE_FORWARD;
 
void runForward() 
{
    state = STATE_FORWARD;
 
    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
    // чем болше, тем быстрее. 
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);
 
    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
    // вперёд, если LOW - назад.
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerRight() 
{
    state = STATE_RIGHT;
 
    // Замедляем правое колесо относительно левого,
    // чтобы начать поворот
    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
    analogWrite(SPEED_LEFT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerLeft() 
{
    state = STATE_LEFT;
 
    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
    analogWrite(SPEED_RIGHT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerPer()
{
    state = STATE_PER;
    //перекресток тут ставить то что нужно сделать на нем.
    //к примеру поворот на право:
    analogWrite(SPEED_LEFT, 0);
    analogWrite(SPEED_RIGHT, SPEED);
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
    delay (50); // здесь нужно поставить столько времени что бы хватило повернуть на 90 градусов
    runForward();
    delay (100);// время для проезда перекрестка
}
 
void setup() 
{
    // Настраивает выводы платы 4,5,6,7 на вывод сигналов 
    for(int i = 4; i <= 7; i++)
        pinMode(i, OUTPUT);
 
    // Сразу едем вперёд
    runForward();
 
void loop() 
 
  // Наш робот ездит по белому полю с чёрным треком. В обратном случае не нужно
    // инвертировать значения с датчиков
    boolean left = !digitalRead(LEFT_SENSOR_PIN);
    boolean centr = !digitalRead(CENTR_SENSOR_PIN);
    boolean right = !digitalRead(RIGHT_SENSOR_PIN);
 
    // В какое состояние нужно перейти?
    int targetState;
 
    if (left == right == centr){
      // перекресток
      targetState = STATE_PER;
    }
    if (left == right) {
        // под сенсорами всё белое или всё чёрное
        // едем вперёд
        targetState = STATE_FORWARD;
    } else if (left) {
        // левый сенсор упёрся в трек
        // поворачиваем налево
        targetState = STATE_LEFT;
    } else {
        targetState = STATE_RIGHT;
    }
 
    if (state == targetState) {
        // мы уже делаём всё что нужно,
        // делаем измерения заново
        return;
    }
 
    switch (targetState) {
        case STATE_FORWARD:
            runForward();
            break;
 
        case STATE_RIGHT:
            steerRight();
            break;
 
        case STATE_LEFT:
            steerLeft();
            break;
 
        case STATE_PER:
            steerPer();    
            break;
    }
 
    // не позволяем сильно вилять на прямой
    delay(50);
}
 
fortekom
Offline
Зарегистрирован: 19.02.2014

Останется добавить счетчик перекрестков и указать действия для каждого их них.

maksim
Offline
Зарегистрирован: 12.02.2012
igidey
Offline
Зарегистрирован: 16.02.2014

Огромное спасибо  fortekom!!!! И всем кто был в этой ветке.