Проблемы с кодом

Тема в разделе "Arduino & Shields", создана пользователем espilya, 29 фев 2016.

  1. espilya

    espilya Нерд

    Привет всем, сделал робота на мега, с платой мотор шилд L293D, с дальномером, и bluetoohth-модулем
    hc-06.
    Проблема вот в чем: Иногда мой телефон теряет соединение с роботом даже когда расстояние 20 см от робота к тел. В чем может быть проблема?
    Когда подключал bluetoohth-модул к мега без мотор-шилда и дальномера, все работало норм без потери соединения. И вот думаю может ли это быть из-за нехватки тока? Питание у меня 4 х 1.5В
     
  2. geher

    geher Гуру

    Может быть от нехватки тока, может от проседания питания в момент старта двигателей (та же нехватка тока, но кратковременная), может от наводок от двигателей.

    Сталкивался с подобной проблемой сам. У меня, похоже, было второе, поскольку все пропадания были синхронизированны с началом движения двигателей. Решил конденсатором 10 мкФ параллельно пинам питания модуля.
     
  3. Mestniy

    Mestniy Гуру

    а как подключили? Можно схему? Какой источник питания?
     
  4. espilya

    espilya Нерд

    Нашел в чем причина(ну как): Когда даю команду "w" (вперед)(через bluetooth terminal с телефона) 1 и 2 двиг крутятся вперед, потом если дать команду "s" (назад) двигатели остановились и связь потеряна с роботом. Но если сделать паузу то есть после "w" дать команду "p"(у меня при этой команде оба двигателя переходят в режим RELEASE) и только потом дать команду "s" все норм.
    Короче просто паузу делаю.

    Но уже есть новая проблема
    Хочу сделать чтобы при команде "o" мой робот двигался вперед и когда расстояние менее 20 см нужно чтобы он сдал задний ход, потом развернулся и продолжил двигаться вперед.
    Написал код но
    если при отправке команды расстояние более 20см то он просто едет вперед даже когда он уже у стены и расстояние 5 см
    а если более то он едет назад потом поворачивает и повторяет.
    И не знаю что делать код ниже

    Код (C++):
    #include <AFMotor.h> // Подключаем библиотеку для управления двигателями
    char blueToothVal;           //value sent over via bluetooth
    char lastValue;              //stores last state of device (on/off)
    AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
    AF_DCMotor motor2(2); //канал М1 на Motor Shield — задний левый
    const int Trig = 30;
    const int Echo = 34;

    void setup()
    {
    Serial.begin(9600);
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    pinMode(13,OUTPUT);
    }
    unsigned int time_us=0;

    unsigned int distance_sm=0;

    void loop()
    {
      motor1.setSpeed(255); //Устанавливаем скорость 100% (0-255)
      motor2.setSpeed(255); //Устанавливаем скорость 100% (0-255)
     
      digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
      delayMicroseconds(10); // Удерживаем 10 микросекунд
      digitalWrite(Trig, LOW); // Затем убираем
      time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
      distance_sm=time_us/58; // Пересчитываем в сантиметры


     
      if(Serial.available()>0);
      {//if there is data being recieved
        blueToothVal=Serial.read(); //read it
      }
      if (blueToothVal=='w')
      {
           motor1.run(FORWARD);
           motor2.run(FORWARD);

        if (lastValue!='w')
          Serial.println(F("w"));
        lastValue=blueToothVal;
      }
      else if (blueToothVal=='s')
      {
           motor1.run(BACKWARD);
           motor2.run(BACKWARD);

        if (lastValue!='s')
          Serial.println(F("s"));
        lastValue=blueToothVal;
      }
        else if (blueToothVal=='d')
      {
          motor1.run(FORWARD);
          motor2.run(BACKWARD);

        if (lastValue!='d')
          Serial.println(F("d"));
        lastValue=blueToothVal;
      }
        else if (blueToothVal=='a')
      {
          motor1.run(BACKWARD);
          motor2.run(FORWARD);

        if (lastValue!='a')
          Serial.println(F("a"));
        lastValue=blueToothVal;
      }
         else if (blueToothVal=='p')
      {
          motor1.run(RELEASE);
          motor2.run(RELEASE);
        if (lastValue!='p')
          Serial.println(F("p"));
        lastValue=blueToothVal;
      }
          else if (blueToothVal=='o')
          {      
           
            if (distance_sm<20) // Если расстояние менее 20 сантиметром
           {
        motor1.setSpeed(170); //Устанавливаем скорость
        motor2.setSpeed(170);
       motor1.run(BACKWARD);
       motor2.run(BACKWARD);
       delay(1000);
        motor1.setSpeed(255); //Устанавливаем скорость 100% (0-255)
        motor2.setSpeed(255);
       motor1.run(FORWARD);
       motor2.run(BACKWARD);
       delay(200);
            }
         
            else  
            {
                  motor1.run(FORWARD);
                  motor2.run(FORWARD);
          }
        if (lastValue!='o')
          Serial.println(F("o--Auto"));
          Serial.println(distance_sm); // Выводим на порт

        lastValue=blueToothVal;
    }
    }
     
    Как вы сделали свой робот? Можно скетч?
     
  5. espilya

    espilya Нерд

    [​IMG]
     
  6. geher

    geher Гуру

    Возможно, что проблема в том, что код, проверяющий расстояние и выполняющий действие перед препятствием, выполняется лишь однажды, когда от БТ приходит 'o' в переменную blueToothVal.
    А его надо выполнять постоянно до отмены команды, т.е. пока в
    lastValue находится 'o'.

    У меня не робот, у меня просто дистанционно управляемая тележка с достаточно примитивным собственным ПО, получает даже не команды, а скорость и разницу в скорости правого и левого мотора. Причем от БТ пришлось отказаться в пользу APC-220, поскольку ноутбук постоянно терял контакт с модулем и не желал его восстанавливать. Да и с дальнобойностью у пары APC-220 получше как-то получилось.
     
  7. espilya

    espilya Нерд

    И как это сделать не знаете случайно:)?
    А вообще думаю может сделать режим (mode) только не знаю как, просто увидел то что тут используют .
     
    Последнее редактирование: 29 фев 2016
  8. geher

    geher Гуру

    Посмотрел внимательнее код. Вопрос на засыпку. Как осуществляется управление, в смысле с какого устройства и из какой программы?
    В теории, если передается только управляющая команда, т.е. один символ, проблемы быть вроде не должно (по крайней мере не вижу навскидку).
    А если за управляющим символом идет что-то еще, например, какие-то данные или символ перевода строки, то, естественно, на следующем круге система прочитает новый символ и "забудет" про отданную команду 'o'.
     
  9. espilya

    espilya Нерд

    Через телефон (андроид), через bluetooth terminal. Я думал может написать простую программу, но было лень.