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

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 версия с отключаем правый датчик. Если замедлит скорось и увеличит виляние то хорошо сворачивает налево в перекрестке.

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

001#define SPEED_LEFT       6
002#define SPEED_RIGHT      5
003#define DIR_LEFT         7
004#define DIR_RIGHT        4
005#define LEFT_SENSOR_PIN  1
006#define RIGHT_SENSOR_PIN 2
007 
008// Скорость, с которой мы движемся вперёд (0-255)
009#define SPEED           80
010 
011// Коэффициент, задающий во сколько раз нужно затормозить
012// одно из колёс для поворота
013#define BRAKE_K          4
014 
015#define STATE_FORWARD    0
016#define STATE_RIGHT      1
017#define STATE_LEFT       2
018 
019int state = STATE_FORWARD;
020 
021void runForward()
022{
023    state = STATE_FORWARD;
024 
025    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
026    // чем болше, тем быстрее.
027    analogWrite(SPEED_LEFT, SPEED);
028    analogWrite(SPEED_RIGHT, SPEED);
029 
030    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
031    // вперёд, если LOW - назад.
032    digitalWrite(DIR_LEFT, HIGH);
033    digitalWrite(DIR_RIGHT, HIGH);
034}
035 
036void steerRight()
037{
038    state = STATE_RIGHT;
039 
040    // Замедляем правое колесо относительно левого,
041    // чтобы начать поворот
042    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
043    analogWrite(SPEED_LEFT, SPEED);
044 
045    digitalWrite(DIR_LEFT, HIGH);
046    digitalWrite(DIR_RIGHT, HIGH);
047}
048 
049void steerLeft()
050{
051    state = STATE_LEFT;
052 
053    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
054    analogWrite(SPEED_RIGHT, SPEED);
055 
056    digitalWrite(DIR_LEFT, HIGH);
057    digitalWrite(DIR_RIGHT, HIGH);
058}
059 
060 
061void setup()
062{
063    // Настраивает выводы платы 4,5,6,7 на вывод сигналов
064    for(int i = 4; i <= 7; i++)
065        pinMode(i, OUTPUT);
066 
067    // Сразу едем вперёд
068    runForward();
069}
070 
071void loop()
072{
073  
074    boolean left = !digitalRead(LEFT_SENSOR_PIN);
075    boolean right = !digitalRead(RIGHT_SENSOR_PIN);
076 
077  
078    int targetState;
079 
080   if (left) {
081         targetState = STATE_LEFT;
082    } else {
083        targetState = STATE_RIGHT;
084    }
085 
086    if (state == targetState) {
087  
088        return;
089    }
090 
091    switch (targetState) {
092        case STATE_FORWARD:
093            runForward();
094            break;
095 
096        case STATE_RIGHT:
097            steerRight();
098            break;
099 
100        case STATE_LEFT:
101            steerLeft();
102            break;
103    }
104// вот виляние
105       delay(20);
106}

 

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

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

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

001int leftLinePin = 10;
002int rightLinePin = 11;
003 
004int leftDirPin = 4;
005int leftSpeedPin = 5;
006 
007int rightDirPin = 7;
008int rightSpeedPin = 6;
009 
010int runSpeed = 150;
011int turnSpeed = 120;
012 
013int logic[11] = {0,2,0,0.0,0,0,0,0,0,2};
014int index = -1;
015//boolean invertLogic = false;
016//boolean colorWhite = true;
017boolean prevColorWhite = true;
018 
019void setupMotorShield()
020{
021    pinMode(leftDirPin, OUTPUT);
022    pinMode(leftSpeedPin, OUTPUT);
023    pinMode(rightDirPin, OUTPUT);
024    pinMode(rightSpeedPin, OUTPUT);
025}
026 
027void go(int currentSpeed)
028{
029    analogWrite(leftSpeedPin, currentSpeed);
030    analogWrite(rightSpeedPin, currentSpeed*1.15);
031}
032 
033void stop()
034{
035    analogWrite(leftSpeedPin, 0);
036    analogWrite(rightSpeedPin, 0);
037}
038 
039void goForward()
040{
041    digitalWrite(leftDirPin, HIGH);
042    digitalWrite(rightDirPin, HIGH);
043    go(runSpeed);
044}
045 
046void turnLeft()
047{
048    digitalWrite(leftDirPin, LOW);
049    digitalWrite(rightDirPin, HIGH);
050    go(turnSpeed);
051}
052 
053void turnRight()
054{
055    digitalWrite(leftDirPin, HIGH);
056    digitalWrite(rightDirPin, LOW);
057    go(turnSpeed);
058}
059 
060void setup()
061{
062    setupMotorShield();
063}
064 
065 
066 
067void loop()
068{
069    // Считываем данные с сенсоров
070    boolean whiteLeft = digitalRead(leftLinePin);
071    boolean whiteRight = digitalRead(rightLinePin);
072     
073    /*принятие мною решения*/
074     
075     if (whiteLeft && whiteRight) {
076        // Под обоими датчиками белый цвет. Видимо
077        // линия прямо под нами. Полный вперёд!
078        if(prevColorWhite == false){
079            //это начало дороги после перекрестка
080            prevColorWhite = true;
081        }else{
082            //дорога продолжается
083        }
084  
085    } else if (!whiteLeft && !whiteRight) {
086        // Что-то не то: под обоими датчиками чёрный
087        // цвет. Видимо мы выехали за пределы трассы.
088        // Лучше остановиться
089        if(prevColorWhite == true){
090            //это начало перекрестка
091            index = index +1;
092            prevColorWhite = false;
093             
094        }else{
095            //перекресток продолжается
096        }
097 
098    } else if (whiteRight) {
099        // Под левым датчиком — чёрный, под правым —
100        // белый. Чтобы выровняться, нужно начать
101        // поворот налево
102    } else {
103        // Последний оставшийся вариант. Под левым
104        // датчиком — белый, под правым — чёрный.
105        // Чтобы выровняться, нужно начать поворот
106        // направо
107    }
108     
109    if(index>-1){
110      if(!whiteLeft && !whiteRight){
111        if(logic[index]==0){//прямо
112            whiteLeft = true;
113            whiteRight = true;
114        }else if(logic[index]==1){//налево
115            whiteRight = true;
116            goForward();
117            delay(50);
118            turnLeft();
119            delay(200);
120        }else{//направо
121            whiteLeft = true;
122            goForward();
123            delay(50);
124            turnRight();
125            delay(200);
126            prevColorWhite = false;
127             
128        }
129      }
130    }
131   
132   
133    /*конец принятия мною решения*/
134     
135    if (whiteLeft && whiteRight) {
136        // Под обоими датчиками белый цвет. Видимо
137        // линия прямо под нами. Полный вперёд!
138        goForward();
139    } else if (!whiteLeft && !whiteRight) {
140        // Что-то не то: под обоими датчиками чёрный
141        // цвет. Видимо мы выехали за пределы трассы.
142        // Лучше остановиться
143        //stop();
144         
145         
146    } else if (whiteRight) {
147        // Под левым датчиком — чёрный, под правым —
148        // белый. Чтобы выровняться, нужно начать
149        // поворот налево
150        turnLeft();
151    } else {
152        // Последний оставшийся вариант. Под левым
153        // датчиком — белый, под правым — чёрный.
154        // Чтобы выровняться, нужно начать поворот
155        // направо
156        turnRight();
157    }
158}

 

Клапауций
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!!!! И всем кто был в этой ветке.