Первая версия робота объезжающего комнату по периметру.

Тема в разделе "Глядите, что я сделал", создана пользователем Вячеслав, 24 мар 2012.

  1. semenko

    semenko Нерд

    какие именно контакты подключать?

    я подключил:

    TXD -> 1 (TX)
    RXD ->0 (RX)
    NC -> 5V
    GND -> GND

    а точно так?
     
  2. <Lame>

    <Lame> Гик

    Наоборот-Rx k Tx, a Tx k Rx. Вот так то. А еще на дальномере не забыть надо режим TTL врубить, ато Дуня сгорит синим пламенем :)
     
  3. semenko

    semenko Нерд

    Так, а как это сделать?

    Тут прочитал, что надо что-то отсоединить, но что именно не понял
     
  4. semenko

    semenko Нерд

    Вячеслав, а точно надо подключать дальномер ко 2 и 3 контакту?
    ведь тогда дальномер работать не будет..... Блин, я запутался:mad:
     
  5. Вы можете подключить его к любым контактам, но потом это подключение надо описать в команде:
    PHP:
    urm.begin(2,3,9600); //RX Pin, TX Pin Подключаем сериал соединение дль дальномера
    тем самым создается СофтСериал порт у которого:
    пин 2 - RX
    пин 3 - TX

    Можно использовать и другие пины.
     
  6. semenko

    semenko Нерд

    и ещё одна строчка у меня вызвала вопрос:

    int DalnomerRightPin = A1; //Дальномер правый на А1

    это тоже относится к подключению дальномера?
     
  7. Да. Только это другой дальномер.
    С правой стороны стоит инфракрасный дальномер. Для контролирования расстояния до стены.
     
  8. semenko

    semenko Нерд

    какой лучше брать дальномер для установки справа?
     
  9. semenko

    semenko Нерд

    Хммм. Что-то не работает...
    вы через troyka shield подключали?
     
  10. Не работает что?
    Он подключается на аналоговый вход. Не принципиально через что. Он что, ни чего не выдает?
    Подключается на GND, +5 и аналоговый вход.
    http://wiki.amperka.ru/сенсоры:3-провода
     
  11. semenko

    semenko Нерд

    Код (Text):
     if (DalnomerRightCurrent >= MaxDistRight  && DalnomerRightCurrent < MimDistRight)
      //отменяем корректировочный угол
      {
        if (LastLefttPos != MaxDistRight)
            {
              MoveRobot(3, 5); //Возвращаем робота на прямой курс
            }
            else if (LastRightPos != MimDistRight)
            {
              MoveRobot(1, 5); //Возвращаем робота на прямой курс
            }  
      }
    меня интересует этот момент.
    как я понял, это вхождение в коридор движения прямо

    на сколько градусов робот должен довернуться?
     
  12. MoveRobot(3, 5) - означает вращение влево на 5 градусов
    MoveRobot(1, 5) - означает вращение вправо на 5 градусов
    Если честно, сейчас я сам удивляюсь такому решению. Код весьма непонятен. :(
     
  13. semenko

    semenko Нерд

    Я пишишу свой, так как у меня другая платформа и немного другой мотор шилд.
    Просто хотелось бы разобраться в алгоритме движения...
     
  14. semenko

    semenko Нерд

    еще интересует этот момент:
    Код (Text):

    povorot:
      digitalWrite(13, HIGH);
      MoveRobot(3, 90); //3 - вращение в налево
      digitalWrite(13, LOW);
      MoveRobot(5, 90);//Остановиться
      //delay(3000); // Почему то, дальномер
    forvard:
    //  MoveRobot(5, 90);//Остановиться
      DalnomerForwardValue = distance(); //замеряем расстояние спереди
    //  delay(3000); // stop
      if (DalnomerForwardValue < DistForward) goto povorot; //если есть припятствие то поворачиваем влево еще раз
      MoveRobot(0, 1); //если припятствия нет 0 - двигаться вперед
      DalnomerRightCurrent=analogRead(DalnomerRightPin);
      Serial.print("Distation Right:");
      Serial.println(DalnomerRightCurrent);
    if (DalnomerRightCurrent >= MaxDistRight  && DalnomerRightCurrent < MimDistRight) //проверка на то что мы попали в корридор движения прямо
      //отменяем корректировочный угол
      {
        if (LastLefttPos != MaxDistRight)
            {
              MoveRobot(3, 5); //Возвращаем робота на прямой курс
            }
            else if (LastRightPos != MimDistRight)
            {
              MoveRobot(1, 5); //Возвращаем робота на прямой курс
            }
      }
     
      // проверка на конец внешнего угла
                if (DalnomerRightCurrent <= 50)
                {
                Serial.println("Possible end of wall");
                Serial.print("Distation Right:");
                Serial.println(analogRead(DalnomerRightPin));
                //если стена закончтилась т.е. расстояние <50 то надо проехать угол, повернуть направо, проехать еще 25 сантиметров
                //Сначало  проедем немного и убедимся что это правда кончился угол а не дырка в стене
                MoveRobot(0, 15); //0 - двигаться вперед
                if (analogRead(DalnomerRightPin) <= 50)
                  {
                    Serial.println("Exactly end of wall!!!");
                    Serial.print("Distation Right:");
                    Serial.println(analogRead(DalnomerRightPin));
                    digitalWrite(12, HIGH);
                    MoveRobot(1, 90); //3 - вращение в право 90
                    MoveRobot(0, 20); // 0 - двигаться вперед
                    digitalWrite(12, LOW);
                    MoveRobot(5, 90);//Остановиться
                    delay(500); // stop
                  }
                }
                else if (DalnomerRightCurrent >= MimDistRight && DalnomerRightCurrent > LastRightPos) //если приближаемся к стене то отруливаем от него влево
                {                                                             // и если корректировка выключена то заходим и корректируем
                  digitalWrite(6, HIGH);
                  LastRightPos = DalnomerRightCurrent; //Сохранили позицуу с которой начали корректировку
                  MoveRobot(3, 5); //3 - отворачиваем в лево 3 градус
                    Serial.println("correct course in left:");
                  digitalWrite(6, LOW);
                }
                else if (( DalnomerRightCurrent < MaxDistRight  && DalnomerRightCurrent > 50) && DalnomerRightCurrent < LastLefttPos) //если отдаляемся к стены то подруливаем к ней вправо
                {                                                                                         // и если корректировка выключена то заходим и корректируем
                      digitalWrite(7, HIGH);
                      LastLefttPos = DalnomerRightCurrent; //запоминаем позицию от которой начинаем отруливать
                      MoveRobot(1, 5); //3 - отворачиваем в право 3 градус
                        Serial.println("correct course in right:");
                      digitalWrite(7, LOW);
                }
              goto forvard;
    }
    когда заканчивается пункт forward ?
     
  15. Так ни когда и не заканчивается, робот обходит комнату по периметру.
    1. Он проверяет нет ли препятствия спереди,
    2. Если нет двигается на "шаг" вперед,
    3. Проверяет не кончилась ли стена справа и если не кончилась пункт 1
     
  16. Cruzer

    Cruzer Нуб

    Вячеслав в есть схема как собрать ? Можете поделится?
     
  17. Не схемы нет. Да и забросил я уже его. Надо делать по другому. Нужно на Raspberry делать, там и камера есть и WiFi
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

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