HC-SR04. Проблема в управлении мотором.

Wiring, Processing, библиотеки

HC-SR04. Проблема в управлении мотором.

Сообщение Jarlaxle » 14 июл 2014, 09:02

Всем доброго времени суток, прошу помощи по коду :ny_tik: Сообщества в VK не помогают, примеры не хотят компилироваться.
Пытаюсь написать код, чтобы при приближении к УЗ-датчику меньше чем на 10 см начинал работать мотор, и работал до тех пор, пока расстояние до объекта не станет больше 10 см.
Буду очень благодарен людям, которые приведут рабочий пример кода или подскажут что можно заменить.

Изображение

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

Код: Выделить всё
#include <AFMotor.h>
#include "Ultrasonic.h"

Ultrasonic ultrasonic(21, 20);
AF_DCMotor motor1(4);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  float dist_cm = ultrasonic.Ranging(CM);    
  Serial.println(dist_cm);
 
  if (dist_cm < 10) 
 
  {
     motor1.run(FORWARD);
     motor1.setSpeed(255); 
     delay(1000);
  }
 
  else
  {
  motor1.run(RELEASE);
  delay(100);
  }
        
}
Jarlaxle
 
Сообщения: 10
Зарегистрирован: 10 мар 2014, 10:10

Re: HC-SR04. Проблема в управлении мотором.

Сообщение noonv » 14 июл 2014, 10:22

а если delay из if-а убрать? :)
Код: Выделить всё
void setup()
{
    Serial.begin(9600);
}

void loop()
{
    float dist_cm = ultrasonic.Ranging(CM);
    Serial.println(dist_cm);
   
    // здесь можно добавить фильтрацию
    // показаний дальномера
   
    if (dist_cm < 10)  {
        // запускаем мотор
        motor1.run(FORWARD);
        motor1.setSpeed(255);
    }
    else {
        // останавливаем мотор
    }
    delay(100);
}
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение Jarlaxle » 14 июл 2014, 10:32

В этом случае при выполнении условия активации мотор делает несколько оборотов и замирает :( Нужно чтобы вращался пока объект находится в пределах 10 см.
Jarlaxle
 
Сообщения: 10
Зарегистрирован: 10 мар 2014, 10:10

Re: HC-SR04. Проблема в управлении мотором.

Сообщение noonv » 14 июл 2014, 10:54

а момент когда мотор "замирает" никак не коррелирует с "пляшущими" показаниями датчика? :)
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение Jarlaxle » 14 июл 2014, 10:59

Даже если показания датчика статичны происходит тоже самое. Если вы можете, приведите пример кода (пусть и с использованием других команд) чтобы получился желаемый результат :ne_vi_del:
Jarlaxle
 
Сообщения: 10
Зарегистрирован: 10 мар 2014, 10:10

Re: HC-SR04. Проблема в управлении мотором.

Сообщение noonv » 14 июл 2014, 11:34

Вот проверил на своём роботе (правда без adafruit-овской либы).
Так же, добавил расчёт среднего значения.

Код: Выделить всё
/*
 * test CraftDuino and L293 or L298 module
 * drive motor by US measurements
 */

#include <Ultrasonic.h>

struct MOTOR    // структура для хранения номеров pin-ов, к которым подключены моторчики
{
    int in1;      // INPUT1
    int in2;      // INPUT2
    int enable;   // ENABLE1
};

// определяем порты, к которым подключены моторчики
MOTOR MOTOR1 = { 12, 11, 10 };
MOTOR MOTOR2 = { 7, 8, 9 };

Ultrasonic ultrasonic(2, 3); // Trig - 2, Echo - 3

// число отсчётов дистанции
#define DIST_NUMBER 5
// для хранения измерений
float us_measurements[DIST_NUMBER] = {0};
int us_counter = 0; // счётчик измерения

void drive1(int speed=254);
void drive2(int speed=254);

void setup()
{
    Serial.begin(57600);

    pinMode(MOTOR1.in1, OUTPUT); // настраиваем выводы
    pinMode(MOTOR1.in2, OUTPUT); // на ВЫВОД
    pinMode(MOTOR2.in1, OUTPUT);
    pinMode(MOTOR2.in2, OUTPUT);

}

void loop()
{
    float dist_cm = ultrasonic.Ranging(CM);
    Serial.print("US: ");
    Serial.print(dist_cm);

    // накапливаем измерения
    if(us_counter < DIST_NUMBER) {
        us_measurements[us_counter] = dist_cm;
        us_counter++;
    }
    else {
        // считаем среднее значение
        us_counter = 0;
        float summ = 0;
        for(int i=0; i<DIST_NUMBER; i++) {
            summ += us_measurements[i];
        }
        dist_cm = summ/DIST_NUMBER;
        Serial.print(":");
    }

    Serial.print(" dist: ");
    Serial.println(dist_cm);

    if (dist_cm < 10)  {
        Serial.println("forward");
        // запускаем мотор
        drive1(100);
    }
    else {
        // останавливаем мотор
        Serial.println("stop");
        drive1(0);
    }
    delay(100);
}

void drive1(int speed)
{
    if(speed > 0) {
        // forward
        digitalWrite(MOTOR1.in1, HIGH);
        digitalWrite(MOTOR1.in2, LOW);
    }
    else {
        // back
        digitalWrite(MOTOR1.in1, LOW);
        digitalWrite(MOTOR1.in2, HIGH);
    }
    analogWrite(MOTOR1.enable, speed);
}

void drive2(int speed)
{
    if(speed > 0) {
        // forward
        digitalWrite(MOTOR2.in1, HIGH);
        digitalWrite(MOTOR2.in2, LOW);
    }
    else {
        // back
        digitalWrite(MOTOR2.in1, LOW);
        digitalWrite(MOTOR2.in2, HIGH);
    }
    analogWrite(MOTOR2.enable, speed);
}
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение Jarlaxle » 14 июл 2014, 12:50

Пожалуйста, покажи схему соединений с своем роботе. Я хочу собрать уже хоть что-нибудь, что было бы способно самостоятельно ездить огибая препятствия :(
Jarlaxle
 
Сообщения: 10
Зарегистрирован: 10 мар 2014, 10:10

Re: HC-SR04. Проблема в управлении мотором.

Сообщение noonv » 14 июл 2014, 13:34

что-то вроде этого.
Пины подключения можно углядеть в исходниках ;)
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение Jarlaxle » 14 июл 2014, 13:51

Не страшно питать моторы от самой платы? Или вы использовали какой-то шилд?
Не могу подредактировать ваш скетч под свой шилд =(
Jarlaxle
 
Сообщения: 10
Зарегистрирован: 10 мар 2014, 10:10

Re: HC-SR04. Проблема в управлении мотором.

Сообщение noonv » 14 июл 2014, 14:03

Jarlaxle писал(а):Не страшно питать моторы от самой платы? Или вы использовали какой-то шилд?

разумеется, через шилд :men:
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение cruetly » 16 мар 2015, 06:21

Привет!Пока не буду создавать тему и напишу здесь,может кто поможет.
У меня проблема, когда расстояние становится такое что ответ в течении заданного времени (по умолчанию в библиотеке стоит 1с)-не получен (тобишь я отвожу датчик на большое расстояние 1м-9999м) ардуинка начинает слать постоянно 0 метров, встроенный светодиод на 13 пине перестает моргать и горит постоянно, даже если я снова подношу руку к датчику на расстояние 0-40 см, она как бы виснет в таком положении.А если залить скеч и не убирать руку от датчика более чем на 50см то всё норм, если больше-виснет. Сейчас заметил что чихнув, я вывел ардуинку из этого состояния :) и она снова начала отправлять сигналы и замерять расстояния, проверил — хлопки, постукивания и прочая имитация сигнала тоже выводит его из этого состояния.В чем может быть проблема? :wo_ol:
Arduino pro mini 5v 16mhz , Arduino IDE 1.6.1 ,использовал библиотеку Ultrasonic и скетч из этого поста - http://robocraft.ru/blog/electronics/772.html
еще пробовал скетч из этого видео http://www.youtube.com/watch?v=MrkyIOtG6ok
он там в описании к видео вставил ссылку на скетч, скетч без использования библиотеки, у меня опять же виснет если отдалить на большое расстояние, и перестает слать импульсы
cruetly
 
Сообщения: 2
Зарегистрирован: 16 мар 2015, 05:02
programming: c++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение admin » 16 мар 2015, 10:00

Попробуйте новую библиотеку - NewPing, которая фиксит зависание контроллера.
Это достигается установкой timeout-а (максимального ожидаемого расстояния) для функции pulseIn().
Аватара пользователя
admin
Администратор
 
Сообщения: 315
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: HC-SR04. Проблема в управлении мотором.

Сообщение cruetly » 16 мар 2015, 20:47

Всё равно ,неужели какой-то датчик бракованный :((( :kli_ny:
cruetly
 
Сообщения: 2
Зарегистрирован: 16 мар 2015, 05:02
programming: c++

Re: HC-SR04. Проблема в управлении мотором.

Сообщение noonv » 17 мар 2015, 12:33

cruetly писал(а):Всё равно ,неужели какой-то датчик бракованный

всё может быть.

Как вариант - попробуйте на другие пины датчик повесить.
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++


Вернуться в Программирование

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

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

© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |