Ultrasonic HC RS-04

Тема в разделе "Arduino & Shields", создана пользователем Hector, 14 июн 2019.

  1. Hector

    Hector Нуб

    Здравствуйте, помогите пожалуйста разобраться с программированием ардуино, необходимо подключить ультразвуковой сенсор к проекту, но так чтобы сенсор работал постоянно контролируя пространство, и при обнаружении объекта выполнял необходимую мне операцию(прерывая работу программы, но после выполнения, программа продолжала работу), пробовал в прерывании. не получилось. Кто сталкивался с такой проблемой. В интернете куча проектов подключения, но только в основном цикле программы, мне же необходимо что бы основной цикл сам по себе, сенсор сам по себе.
     
  2. Daniil

    Daniil Гуру

    покажите как пробовали, пожалуйста.
    Код вставляется через теги, в каждой ветке форума есть пример как это сделать.
     
  3. Hector

    Hector Нуб

    Спасибо за ответ, если можно то поподробнее "код вставляется через тэги"?
    мой код-\
    // ===============================================================
    Include "TimerOn.h"
    Include "Ultrasonic.h"
    void setup(){
    Timer1.initialize(1000000);
    Timer.attachInterrupt(TimerOn);
    }
    void TimerOn()
    { float dist_cm=ultrasonic.Ranging(CM);}
    //==================================================================
    программа действительно прерывается, но только если время не менее 1 сек, если меньше то программа вообще не работает, мне же необходимо что бы ультрасоник мониторил постоянно(параллельно) программе.
     
  4. BAR__MEN

    BAR__MEN Вселенский Няш Команда форума

    Смотрите закрепленное сообщение в разделе
    @Daniil, надо уточнять где, не все понимают ;)
     
    Daniil нравится это.
  5. b707

    b707 Гуру

    Hector - всю программу целиком выложите. Тот кусок. что вы выложили - ничего не делает.
     
    DetSimen нравится это.
  6. Hector

    Hector Нуб

    Изините, но Вы ошибаетесь, тут дело в том что ультросоник работает по принципу послал сигнал-принял сигнал, прием - передача, для этого он использует два пина выход-вход, и еще что прискорбно, использует delay в прерывании, что не рекомендуют делать. вот этот кусочек скетча"float dist_cm=ultrasonic.Ranging(CM)".
    Спасибо за ответы. я уже сам частично разобрался, наверно буду использовать второй ардуино.
     
  7. b707

    b707 Гуру

    в чем я ошибаюсь? - в том, что приведенный код ничего не делает? - попробуйте опровергнуть. В коде вы читаете расстояние в переменную, которая нигде после не используется.
    это не Ультрасоник использует делай в прерывании, а вы. Это же вы засунули Ультрасоник в прерывание, хотя в этом нет никакого смысла. Ультрасонику вообще прерывание не нужно. Минимальный период опроса этого датчика - 50мс, рекомендованный - 100мс, то есть не чаще 10 раз в секунду. Для такого редкого опроса прерывание не нужно совсем, это прекрасно делается прямо в основном цикле программы. И вторая ардуина тут не нужна.

    Hector - вы если пришли на форум что-то спросить - так спрашивайте, а не стройте из себя знатока, который сам все понимает. Понимали бы - зачем бы вопросы задавали, верно?
     
    Последнее редактирование: 15 июн 2019
    BAR__MEN, Daniil, Andrey12 и ещё 1-му нравится это.
  8. Airbus

    Airbus Радиохулиган

    Что делает основная программа?Что делается в прерывании?
     
  9. Hector

    Hector Нуб

    Я далеко не знаток, а мой вопрос см. выше. я делаю программу в которой ультрасоник будет мониторить пространство отдельно от программы, при изменении переменной на ультрасонике должна прерваться основной цикл программы и выполнятся другая программа, а потом возвращатся в основной цикл. с прерыванием не получилось, в основном цикле ультрасоник работает только когда до него дойдет очередь.меня это не устраивает.
     
  10. Airbus

    Airbus Радиохулиган

    Так я и спрашиваю Вас
    Мониторинг это основная программа?Другая программа какая?Или вопрос чисто теоретический?
     
  11. a1000

    a1000 Гик

    Я конечно понимаю, что ваш проект сверхсекретный и имеет огромную коммерческую ценность, по этому выложить код нельзя. Но так мы будем долго гадать, чем вам нужно помочь. Будут даны только общие советы. Не возвращается программа из прерывания - ищите где она зависает в обработчике. Там по другому быть не может, дошли до конца функции обработчика и автоматом вернулись. Это не асма. Не работает delae в прерывании - сымитируйте его вручную.
     
    Daniil нравится это.
  12. Asper Daffy

    Asper Daffy Гуру

    Попробуй ещё раз.
    Из тех, кто умеет писать программы с прерываниями - никто даже не слышал о том, что здесь есть какая-то проблема.
    Кто использует? Программу Вы пишете или кто-то другой? Если Вы, то не используйте, Вас ведь никто не заставляет.
    Ну, так кто ж Вас заставлял писать
    Ну, и, наконец
    Достойное решение. Можно ещё и третий. Помните, сколько солдат нужно, чтобы вкрутить лампочку?

    Этот модуль программируется легко и непринуждённо и практически вовсе не занимает никаких ресурсов. Просто нужно аккуратно расписать прерывания. Но, если Вам нравится городить сеть из 10-ти ардуин - в путь. Только там возникнет точно такая же проблема. Нужно будет, чтобы главная ардуина принимала результат от "датчиковой" и чтобы это не мешало её основной программе. Заметьте, от чего шли, туда и вляпались.

    И ещё один момент (об этом крайне редко пишут в сети). В таком примитивном использовании этого датчика изначально заложена погрешность аж до 10%. По уму датчик очень точный, но должен использоваться в комбинации с датчиком температуры.
     
    Последнее редактирование: 16 июн 2019
    Andrey12, b707, BAR__MEN и ещё 1-му нравится это.
  13. Hector

    Hector Нуб

     
  14. b707

    b707 Гуру

    Проблема решается правильным написанием основной программы. Цикл loop() основной программы должен длится не более 100мс, после каждого цикла вызываете работу датчика - вот и получаете контроль расстояния 10 раз в секунду без всяких прерываний. А чаще дергать этот датчик нет смысла - он медленный.
    Только. скорее всего, для этого придется переписать Ваш "основной код" почти полностью. В программе не должно быть операторов задержки (delay) и длинных блокирующих циклов. Когда освоитесь - будете писать код сразу правильно. В практически любой ардуино программе можно написать работу так, чтобы loop() выполнялся не более 10 миллисекунд
     
    Daniil нравится это.
  15. Hector

    Hector Нуб

    Большое спасибо за ответ, буду думать.
     
  16. parovoZZ

    parovoZZ Гуру

    Сразу после подачи импульса на датчик, следующей инструкцией запускаете таймер. В прерывании его останавливаете. В основной программе считаете значение таймера. Все. На работу с датчиком ушло всего 5 инструкций.
    Значение таймера можете читать хоть тысячу раз в секунду - там всегда актуальное значение.
     
    Hector нравится это.
  17. Asper Daffy

    Asper Daffy Гуру

    Но ответ остаётся тем же.
    Или ты хочешь кода?

    Так сначала свой покажи. Что именно ты там
     
  18. Daniil

    Daniil Гуру

    я уже просил, 2 дня назад, тс выложил что-то, но как-то смотреть страшно без форматирования то.
     
  19. a1000

    a1000 Гик

    Как обычно в таких ситуациях есть два пути решения проблемы - программный и аппаратный.
    Если ТС не может это решить программно, а код упорно показывать не хочет, давайте решать аппаратно. Убираем ультразвуковой дальномер (ну не поддаётся он ТС) и берём HC-SR501, а если хотим отследить зомби с комнатной температурой - PCWL-0516. Там при возникновении движений единичка на выходе висит долго. При любой длительности цикла loop поймать можно.
     
  20. Asper Daffy

    Asper Daffy Гуру

    Что он выложил? Семь строчек в #3? Это не "выложил", а "поиздевался".