Полуавтономный робот

Тема в разделе "Arduino & Shields", создана пользователем kornet, 15 фев 2015.

  1. kornet

    kornet Нуб

    Здравствуйте! В ходе подготовки к диплому возникла нужда в изготовлении робота собственными силами... Остановился на ардуино потому, что были в наличии радиомодули NRF24l01, а примеры работы с ними были только на ардуино. Электроникой занимаюсь около восьми лет, а вот программированием - с недавнего времени, так что мои глубочайшие извинения за безграмотность. Собственно, это ещё один аргумент в пользу того же ардуино... Итак, идея состоит в следующем. Робот - охранник катается взад-вперед по одной линии, периодически останавливается и проверяет по датчику движения наличие присутствия чего-либо. Если что не так, подает сигнал... Да хоть звуковой. При необходимости оператор переключает управление на себя, и рулит роботом посредством того же радиомодуля. На роботе установлена независимая от ардуино аналоговая радиокамера. Ардуино собрано самостоятельно, как для передатчика, так и для приемника, как и шилд управления двигателями на L293D, нашел удобный код для радиоуправления, переделал его под свои нужды, платформа также изготовлена из древних конструкторов и игрушек, а также компьютерной мыши, но никак не могу решить вопрос: как по внешней команде включать/выключать управление управление роботом? То есть идея такая: нажали на пульте кнопку вкл - робот останавливает своё блуждание и управляется только с пульта. Нажали выкл - бродит и ищет нарушителей)) Код такой:
    Код (Text):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Servo.h>
    Servo myservo;
    #define CE_PIN  9
    #define CSN_PIN 10
    int pwm = 0;
    const uint64_t pipe = 0xE8E8F0F0E1LL;
    RF24 radio(CE_PIN, CSN_PIN);
    int joystick[5];
    void setup()
    {

      delay(1000);

      radio.begin();
      radio.openReadingPipe(1,pipe);
      radio.startListening();
      myservo.attach(5);
      pinMode(1, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);

    }


    void loop()
    {
      if ( radio.available() )
      {

        bool done = false;
        while (!done)
        {
          done = radio.read( joystick, sizeof(joystick) );

          myservo.write(joystick[0]);
          digitalWrite(1, !joystick[1]);
          digitalWrite(2, !joystick[2]);
          digitalWrite(3, !joystick[3]);
          digitalWrite(4, !joystick[4]);
     

      }
      }
      else
      {

      }
      }
    Пршу вас направить на мысль, в каком направлении копать... Выглядит девайс так: vuo7i6al2Fw.jpg DSC00599[1].JPG
     

    Вложения:

    • DSC00599[1].JPG
      DSC00599[1].JPG
      Размер файла:
      251,6 КБ
      Просмотров:
      686
    Последнее редактирование: 15 фев 2015
  2. Megakoteyka

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

    Код (Text):
    bool Manual = false;
    void loop()
    {
      // прием команд по радио
      if(Manual)
      {
        // управление с пульта
      }
      else
      {
        // автономный режим
      }
    }
    Переменную меняете по приходу нужной команды.
     
  3. kornet

    kornet Нуб

    Увы, не работает вообще, хоть и компилируется. И, насколько понимаю, при таком коде он будет выключаться один раз - и всё. Потому что команд с радио принимать больше не будет и переменная меняться, соответственно, тоже не будет... Если не прав, поправьте, плиз)
     
  4. vvr

    vvr Инженерище

    Надо делать (я во всяком случае так поступаю) по частям.
    Сначала отработали автономный режим.
    Потом отработали управление с пульта.
    Только потом объединяем.
     
  5. Megakoteyka

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

    Код (Text):
    bool Manual = false;
    void loop()
    {
      ReceiveCommand();
      if(Manual)
      {
        // управление с пульта
      }
      else
      {
        // автономный режим
      }
    }
    void ReceiveCommand()
    {
      // тут при наличии новой команды меняются переменные,
      // задающие режим работы
    }
    Я примерно такой алгоритм имел ввиду. Ветка приема команд работает всегда. По приему нужной команды меняется переменная. От состояния этой переменной зависит режим работы робота.
     
    kornet нравится это.
  6. vvr

    vvr Инженерище

    Ну это уже объединение режимов.
    Как я понимаю, базовых кодов пока нет
     
  7. kornet

    kornet Нуб

    Так код управления вполне рабочий, робот бодро катается, серва крутится... Если заливаю простенький скетч реакции на движение, то же всё норм. вот собственно и соединяю...
     
  8. kornet

    kornet Нуб

    Спасибо! Я несмного не так понял... Пробовал делать так: при нажатии на одну из кнопок выполняются команды с пульта, если нет нажатия - выполняется код блинк, для примера, естесно, не на 13 выводе... вообще тишина. Попробую с переменной, как Вы советовали, хотя пока и не очень ясно себе это представляю)