Прошу помощи с ультразвуковым датчиком расстояния и сервоприводом.

Тема в разделе "Arduino & Shields", создана пользователем Wiskas, 29 июл 2016.

  1. Wiskas

    Wiskas Нерд

    Появилась проблема, не могу придумать логику для задачи, которую придумал. Написал код и пытаюсь добавить функцию, задача заключается в следующем: Если расстояние до объекта больше 10 см, то ардуино держит сервопривод под углом в 90 градусов, если расстояние меньше 5 см, то повернуть сервопривод до нуля градусов на 3 секунды. Прошу помощи именно с написанием кода.
     
    Последнее редактирование: 29 июл 2016
  2. alex-prog

    alex-prog Гик

    Так а Вы с датчиком работать пробовали, расстояние получается определять?
     
  3. Wiskas

    Wiskas Нерд

    Да пробовал, расстояние получил, перевёл в сантиметры для удобства, сервопривод тоже работает. Но я не могу придумать сам код именно для действия : "Если датчик выдаёт, к примеру, меньше 5, то сервопривод поворачивается на 0 градусов на 3 секунды". Но у меня получается только повернуть сервопривод, до тех пор, пока показания датчика остаются "Меньше 5 см". То есть, мне нужно отследить момент, когда показания датчика стали таковыми и повернуть сервопривод на три секунды, а не повернуть сервопривод, пока показания остаются меньше пяти. У меня есть лишь момент, чтобы засечь факт того, что показания датчика стали "меньше пяти сантиметров"
     
  4. alex-prog

    alex-prog Гик

    Ну, померили расстояние, если зафиксировали момент, что оно меньше, то выполняете поворот. Сервопривод сам по себе ведь не крутится, Вы ему команду дали встать на угол, и он её выполняет до подачи другой команды. В чём проблема возникает?
     
  5. Я кажется понял о чем вы.

    Получили вы 5 см повернули серв и установили поле/флаг в значение 1
    Получили вы 10см повернули серв на 90градусов и установили поле/флаг в значение 0

    Если у вас растояние < 5см и поле/флаг == 1 ничего не делаем
    Если у вас растояние >= 10см и поле/флаг == 0 ничего не делаем

    В коде это выглядит как то так (только не придираться это что то типа псевдокода)

    Код (C++):
    bool isBeside=0;

    float distance = getDistance();
    if(distance <=5 && isBeside==0){
        setTurn();
        isBeside=1;
    }
    if(distance >=10 && isBeside==1){
        setTurn(90);
        isBeside=0;
    }
    естественно isBeside глобальная переменная

    если нужно через 3 секунды повернуть обратно то придется ещё одну переменную хранящую сколько секунд прошло и если их прошло более 3-х то повернуть его обратно не сбросив флаг
    как то так

    Код (C++):

    bool isBeside=0;
    byte second=0;

    float distance = getDistance();

    if(distance <=5){
        if (second  == 0 && isBeside==0){
            setTurn();
             isBeside=1;
        }
        if(second  <3){second ++;}
    }

    if(distance >=10 && isBeside==1){
        setTurn(90);
        isBeside=0;
        second=0;
    }
    if(second > 3 && isBeside==1){
        setTurn(90);
    }
    расчитано что код срабатывает раз в секунду.

    Ну думаю мысль донёс, код отстой но без нормальной постановки задачи хз что там у вас и как.
     
    Последнее редактирование: 30 июл 2016
    Wiskas и alex-prog нравится это.
  6. alex-prog

    alex-prog Гик

    РусНекромант, это не код отстой, а формулировка такая ;)

    Я так понял, что при расстоянии от 5 до 10 см нужен угол 90 градусов, если меньше 5-ти, то угол должен быть 0 градусов. Думаю, может у автора проблема с логическим условием? Сделал два if, а они оба выполняются, так как там расстояние задается интервалами, и конец одного [0..5], является началом другого [5..10]? Вот привод и крутится...

    А вообще, если бы Wiskas привёл хоть немного кода того, что он пытается реализовать, было бы проще. А так, игра в угадайку какая-то...
     
    Wiskas нравится это.
  7. Wiskas

    Wiskas Нерд

    Огромное спасибо за помощь, всё получилось! :)
    И "alex-prog" так же спасибо за уделённое внимание к проблеме! )
     
    РусНекромант и alex-prog нравится это.
  8. alex-prog

    alex-prog Гик

    Wiskas, пожалуйста :) Главное что получилось. Будут вопросы - пишите ;)