roboforum.ru

Технический форум по робототехнике.

Подскажите с написанием кода для управления мтором

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

Подскажите с написанием кода для управления мтором

Сообщение laughing » 27 май 2015, 14:22

Делаю из сломанной машинки на радио управлении робота на ардуино уно. Робот должен ехать и реагируя на показания УЗ-датчика изменять траекторию направления.
Подключения мотора использую самодельный H-мост т.к. мотор-шилда нет, а ждать его нет желания. В общем в чем собственно суть:
Как правильно написать скетч, чтобы при условии того что перед дальномером нет ничего ехать вперед, а если расстояние меньше определенной величины (например 40 см) отъезжать поворачивать и снова двигаться.

При использовании оператора условия "if":
Код: Выделить всёРазвернуть
#include "Ultrasonic.h"

#define forward 11
#define backward 13
Ultrasonic ultrasonic(5,6);
void setup() {
  pinMode(forward, OUTPUT);
  pinMode(backward, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  float dist_cm = ultrasonic.Ranging(CM);
  if (dist_cm > 40)
  {
    digitalWrite(forward, HIGH); //Движение вперед
    digitalWrite(backward, LOW);
    Serial.println(dist_cm);
  }
  else
  {
    digitalWrite(forward, LOW); //Движение назад
    digitalWrite(backward, HIGH);   
}


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

В итоге этот код не вращает мотор... как я понимаю по причине того что я не указал продолжительность вращения...

В итоге я изменил часть кода:
Код: Выделить всёРазвернуть
  float dist_cm = ultrasonic.Ranging(CM);
  if (dist_cm > 40)
  {
    digitalWrite(forward, HIGH); //Движение вперед
    digitalWrite(backward, LOW);
    delay(1000);
    Serial.println(dist_cm);
  }
  else
  {
    digitalWrite(forward, LOW); //Движение назад
    digitalWrite(backward, HIGH);
    delay(500);
  }


Но вращение стало рваным, и дерганым... А хочется чтобы вперед машинка ехала без остановок пока не появится препятствие перед ней.
Затем я попробовал использовать цикл "while", но это не принесло мне никакой пользы потому как движок просто постоянно крутился и все в 1 сторону не реагируя на появление препятствий... вот пример моего кода с циклом "while":
Код: Выделить всёРазвернуть
void loop() {

  float dist_cm = ultrasonic.Ranging(CM);
  while(dist_cm > 40)
  {
    digitalWrite(forward, HIGH); //Движение вперед
    digitalWrite(backward, LOW);
    Serial.println(dist_cm);
    float dist_cm = ultrasonic.Ranging(CM);
  }
  while (dist_cm < 40)
  {
    digitalWrite(forward, LOW); //Движение назад
    digitalWrite(backward, HIGH);
    Serial.println(dist_cm);
    float dist_cm = ultrasonic.Ranging(CM);
  }


Жду ваших советов есть ли возможность сделать вращение двигателю вперед без прерываний пока не появится препятствие в зоне видимости датчика?

В дальнейшем после того как разберусь с этой задачей планирую подключить серво для вращения передних колес и поворота.
laughing
 
Сообщения: 2
Зарегистрирован: 23 май 2015, 10:24

Re: Подскажите с написанием кода для управления мтором

Сообщение HarryStar » 28 май 2015, 10:46

для чего у вас внутри циклов стоит переопределение dist_cm?
все из-за этого. почитайте про область видимости переменных. В вашем случае dist_cm в условии цикла в выводе на СОМ-порт и в присвоении от ультрасоника это совершенно разные переменные.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Подскажите с написанием кода для управления мтором

Сообщение laughing » 28 май 2015, 22:15

Я внутри цикла переопределил dist_cm, думая что так смогу сменить значение переменной условия, ведь если внутри цикла значение dist_cm не поменять он у меня я так понимаю бесконечным станет. Если вам не сложно прошу подскажите как бы это могло быть ну или наведите на информацию откуда это можно почерпнуть. Как сделать обновление значения dist_cm внутри цикла чтобы он мог завершиться при поднесении руки например к датчику
laughing
 
Сообщения: 2
Зарегистрирован: 23 май 2015, 10:24

Re: Подскажите с написанием кода для управления мтором

Сообщение Angel71 » 28 май 2015, 22:26

ещё раз перечитайте, что такое определение, присваивание и область видимости. меняйте обратно на условия, циклам тут делать нечего, тем более с таким присваиванием. читайте вдумчиво, что такое delay, подбирайте числа и не будет дёргаться.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Подскажите с написанием кода для управления мтором

Сообщение RoninDev » 28 май 2015, 23:47

Попробуйте так.

Код: Выделить всёРазвернуть
#include "Ultrasonic.h"

#define forward 11
#define backward 13
Ultrasonic ultrasonic(5,6);
void setup() {
  pinMode(forward, OUTPUT);
  pinMode(backward, OUTPUT);
  Serial.begin(9600);
  moveForward();
}

enum Mode
{
  MOVING_FORWARD,
  MOVING_BACKWARD
};

Mode currentMode;

void loop() {
  long dist_cm = getRange();
  Serial.println(dist_cm);
  delay(1000); //немного уменьшаем количество отладочной инфы, но замедляем реакцию на препятствия
  switch (currentMode) {
    case MOVING_FORWARD:
      if (dist_cm <= 40)
      {
        moveBackward();
      }
      break;
    case MOVING_BACKWARD:
      if (dist_cm > 50)
      {
        moveForward();
      }
      break;
  }
}

void moveForward() {
  currentMode = MOVING_FORWARD;
  digitalWrite(forward, HIGH); //Движение вперед
  digitalWrite(backward, LOW);
}

void moveBackward() {
  currentMode = MOVING_BACKWARD;
  digitalWrite(forward, LOW); //Движение назад
  digitalWrite(backward, HIGH);
}

long getRange() {
  return ultrasonic.Ranging(CM);
}


Здесь нет самого разворота. Работать должно так: Вначала нaчинает ехать вперед, до тех пор пока не упрется в препятствие на расстоянии 40 см (но из-за задержки в секунду, это будет не точно). Затем он едет назад, пока не отъедет на 50 см от препятствия. И опять поедет вперед. В общем он будет кататься туда сюда на, примерно, 10 см. Если добавить логику разворота в функцию moveBackward (ее тогда переименовать надо будет =)), то должно работать как вы хотите, если я правильно понял.

Надеюсь что помог
Аватара пользователя
RoninDev
 
Сообщения: 207
Зарегистрирован: 22 янв 2015, 10:33
прог. языки: kotlin, golang, java, c#


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 5