Долгое обновление ультразвукового датчика

Russk1j
Offline
Зарегистрирован: 03.05.2012

 Здравствуйте, помогиет пожалуйста разобраться. При добавлении в программу цикла for для вращения сервомашинки обновление подключенного датчика становится очень медленным, от этого робот уже давно врежится в стену. Не хватает оперативной памяти или частоты? Может код неверный?

#include <Servo.h>
const int Trig = 2; 
const int Echo = 4; 
Servo LexaServo;
int servoPin = 10;
struct MOTOR // структура для хранения номеров pin-ов, к которым подключены моторчики
{
int in1; // INPUT1
int in2; // INPUT2
int enable; // ENABLE1
};
// определяем порты, к которым подключены моторчики
MOTOR MOTOR1 = { 13, 12, 6 };
MOTOR MOTOR2 = { 7, 8, 5 };

void setup()
{
  pinMode(Trig, OUTPUT); 
  pinMode(Echo, INPUT); 
  pinMode(MOTOR1.in1, OUTPUT); // настраиваем выводы
  pinMode(MOTOR1.in2, OUTPUT); // на ВЫВОД
  pinMode(MOTOR2.in1, OUTPUT);
  pinMode(MOTOR2.in2, OUTPUT);
  LexaServo.attach(servoPin);
  Serial.begin(9600); 
}

unsigned int time_us=0;

unsigned int distance_sm=0;

void loop()
{
    digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера 
    delayMicroseconds(10); // Удерживаем 10 микросекунд 
    digitalWrite(Trig, LOW); // Затем убираем 
    time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса 
    distance_sm=time_us/58; // Пересчитываем в сантиметры 
    Serial.println(distance_sm); // Выводим на порт
       if (distance_sm<15) // Если расстояние менее 15 сантиметром 
    { 
      back1(); //первый движок назад
      forward2(); //второй движок вперед
      delay(1000); //в течении 1 секунды
    } 
    else 
    { 
      forward1(); // вращаем оба моторчика вперёд
      forward2();
    }
    for (int i=0; i<=180; i=i+20)
  {
    LexaServo.write(i);
    delay(400);
  }
}

void forward1() // первый вперёд
{
  digitalWrite(MOTOR1.in1, HIGH);
  digitalWrite(MOTOR1.in2, LOW);
  analogWrite(MOTOR1.enable, 254);
}

void forward2() // второй вперёд
{
  digitalWrite(MOTOR2.in1, HIGH);
  digitalWrite(MOTOR2.in2, LOW);
  analogWrite(MOTOR2.enable, 254);
}

void back1() // первый назад
{
  digitalWrite(MOTOR1.in1, LOW);
  digitalWrite(MOTOR1.in2, HIGH);
  analogWrite(MOTOR1.enable, 254);
}

void back2() // второй назад
{
  digitalWrite(MOTOR2.in1, LOW);
  digitalWrite(MOTOR2.in2, HIGH);
  analogWrite(MOTOR2.enable, 254);
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Так у вас же везде куча delay() натыкано. Что-же вы хотите? На delay() скетч стоит и "ничего не делает".

Смотрите пример http://arduino.ru/tutorials/BlinkWithoutDelay   для ознакомление с альтернативным подходом.

Вообще использовать delay() где-то чем "примерчик на пару строк" - напрашиватся на неприятности. Общий подход такой: включили движок, высчитали время когда его нужно будет выключить (и запомнили). Потом в loop() постоянно проверяет "пришло время включить движок или нет". Вообщем нужно что-бы loop() крутился "без задержек", как можно быстрее.

Или "запомнили когда включили движок", а потом постоянно проверяете "сколько времени прошло с тех пор", если "больше чем нужно" - выключаете.

Даже pulseIn и то частеньки не желательно использовать, так как он тожме может "останавливать" и нарушить тайминги (на прерываниях это делается).

Также: почему не попробовать готовую родную библиотеку для этого датчика? Зачем велосипед изобретать?

И последние. На работоспособность не влияет, но... а зачем вы тут PWM используете? Зачем analogWrite?

 

leshak
Offline
Зарегистрирован: 29.09.2011

 И еще, если бы я писал этот скетч (вообщем это уже сугубо "дело вкуса"), я бы по другому делал разбивки на функции.

Повысилбы уровень абстракции. Имя функции говорило-бы не "какой мотор включать", а "что нужно сделать".

Тогда логика главного скетча будет более "прозрачна". Сделал-бы функции типа forward - едем вперед, rotateLeft -повернуть влево. А уж какие моторы для этого "включать" - спрятал-бы внутри ее.

Russk1j
Offline
Зарегистрирован: 03.05.2012

Спасибо большое!) Все нормально работает)
А на счет функций хороший совет, так и буду делать, я просто новичек совсем, и собрал из 3х готовых программ одну для своего робота. А так вот на днях только разобрался с драйвером l293dne.  Ну крутятся движки плохо, заказываю шилд готовый, правда идти долго с ебея будет(

Russk1j
Offline
Зарегистрирован: 03.05.2012

 А вот еще, всетки задержка мне одна нужна, чтоб серва поворачивалась постепенно 54я строка, и вот из-за нее датчи обновляется наверно секунды три( как тогда сделать чтоб серва постепенно поворачивалась?

Russk1j
Offline
Зарегистрирован: 03.05.2012

 Все проблема решена, просто цикл мешал немного

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса

Синтаксис

pulseIn(pin, value, timeout)

Добавить timeout чтобы не ждать ответа датчика ( секунда по дефаулту)