roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 05:45

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Подскажите с написанием кода для управления мтором
СообщениеДобавлено: 27 май 2015, 14:22 
Не в сети

Зарегистрирован: 23 май 2015, 10:24
Сообщения: 2
Делаю из сломанной машинки на радио управлении робота на ардуино уно. Робот должен ехать и реагируя на показания УЗ-датчика изменять траекторию направления.
Подключения мотора использую самодельный 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);
  }


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите с написанием кода для управления мтором
СообщениеДобавлено: 28 май 2015, 10:46 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите с написанием кода для управления мтором
СообщениеДобавлено: 28 май 2015, 22:15 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите с написанием кода для управления мтором
СообщениеДобавлено: 28 май 2015, 22:26 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите с написанием кода для управления мтором
СообщениеДобавлено: 28 май 2015, 23:47 
Не в сети
Аватара пользователя

Зарегистрирован: 22 янв 2015, 10:33
Сообщения: 207
прог. языки: kotlin, golang, java, c#
Попробуйте так.

Код:
#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 (ее тогда переименовать надо будет =)), то должно работать как вы хотите, если я правильно понял.

Надеюсь что помог


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO