Долгое обновление ультразвукового датчика
- Войдите на сайт для отправки комментариев
Вс, 29/07/2012 - 12:18
Здравствуйте, помогиет пожалуйста разобраться. При добавлении в программу цикла 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);
}
Так у вас же везде куча delay() натыкано. Что-же вы хотите? На delay() скетч стоит и "ничего не делает".
Смотрите пример http://arduino.ru/tutorials/BlinkWithoutDelay для ознакомление с альтернативным подходом.
Вообще использовать delay() где-то чем "примерчик на пару строк" - напрашиватся на неприятности. Общий подход такой: включили движок, высчитали время когда его нужно будет выключить (и запомнили). Потом в loop() постоянно проверяет "пришло время включить движок или нет". Вообщем нужно что-бы loop() крутился "без задержек", как можно быстрее.
Или "запомнили когда включили движок", а потом постоянно проверяете "сколько времени прошло с тех пор", если "больше чем нужно" - выключаете.
Даже pulseIn и то частеньки не желательно использовать, так как он тожме может "останавливать" и нарушить тайминги (на прерываниях это делается).
Также: почему не попробовать готовую родную библиотеку для этого датчика? Зачем велосипед изобретать?
И последние. На работоспособность не влияет, но... а зачем вы тут PWM используете? Зачем analogWrite?
И еще, если бы я писал этот скетч (вообщем это уже сугубо "дело вкуса"), я бы по другому делал разбивки на функции.
Повысилбы уровень абстракции. Имя функции говорило-бы не "какой мотор включать", а "что нужно сделать".
Тогда логика главного скетча будет более "прозрачна". Сделал-бы функции типа forward - едем вперед, rotateLeft -повернуть влево. А уж какие моторы для этого "включать" - спрятал-бы внутри ее.
Спасибо большое!) Все нормально работает)
А на счет функций хороший совет, так и буду делать, я просто новичек совсем, и собрал из 3х готовых программ одну для своего робота. А так вот на днях только разобрался с драйвером l293dne. Ну крутятся движки плохо, заказываю шилд готовый, правда идти долго с ебея будет(
А вот еще, всетки задержка мне одна нужна, чтоб серва поворачивалась постепенно 54я строка, и вот из-за нее датчи обновляется наверно секунды три( как тогда сделать чтоб серва постепенно поворачивалась?
Все проблема решена, просто цикл мешал немного
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
Синтаксис
pulseIn(pin, value, timeout)
Добавить timeout чтобы не ждать ответа датчика ( секунда по дефаулту)