Определения дистанции между двумя объектами по каналу радиосвязи

Тема в разделе "Arduino & Shields", создана пользователем Андрей152, 26 дек 2020.

  1. Андрей152

    Андрей152 Нерд

    Добрый день уважаемые гуру и форумчане.

    Я далёк от программирования, но потребовалось некое оборудование для определения дистанции между двумя объектами. Я решил попробовать при помощи ардуино и радиомодулей сваять такое простенькое устройство.

    Поблуждав по интернету и различным сообществам конкретики так и не нашёл. Может быть здесь мне что-то подскажут?

    Что я использовал:

    Передатчик: Ардуино про мини, радиомодуль. Светодиод установлен в разрыв для визуального наблюдения такта исходящего сигнала.

    Использованный программный код:

    PERE_DATCHIC_NANO_0.ino.ino
    Код (C++):
    [code=cpp]#include <iarduino_RF433_Transmitter.h>                   // Подключаем библиотеку для работы с передатчиком FS1000A
    iarduino_RF433_Transmitter radio(2);                     // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён передатчик
    int                        data[100];                       // Создаём массив для передачи данных
    void setup(){
        radio.begin();                                        // Инициируем работу передатчика FS1000A (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate)
        radio.setDataRate     (i433_1KBPS);                   // Указываем скорость передачи данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
        radio.openWritingPipe (5);                            // Открываем 5 трубу для передачи данных (передатчик может передавать данные только по одной из труб: 0...7)
    }                                                         // Если повторно вызвать функцию openWritingPipe указав другой номер трубы, то передатчик начнёт передавать данные по вновь указанной трубе
    void loop(){
        data[0] = analogRead(A1);                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
        data[1] = analogRead(A2);                             // считываем показания Trema потенциометра с вывода A2 и записываем их в 1 элемент массива data
        radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
        delay(1000);                                            // пауза между пакетами
    }
     
    [/code]

    Периёмник: Ардуино уно, радиомодуль. Светодиоды установлены между «-» питания и Data для визуального наблюдения такта приходящего сигнала.

    Использованный программный код должен определить время прерывания сигнала при удалении друг от друга датчиков с последующим переводом в расстояние:

    PRIEM_DATCHIC_UNO_0.ino
    Код (C++):
    const int trigPin = 3;
    const int echoPin = 4;
    // defines variables
    long duration, cm;
    int distance, Pdistance;
    void setup() {
    Serial.begin(9600); // Starts the serial communication
    pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
    pinMode(echoPin, INPUT); // Sets the echoPin as an Input
    }

    void loop() {
    // Сначала генерируем короткий импульс длительностью 2-5 микросекунд.

      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);

      // Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц.
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
    Pdistance=distance;
    Calc();
    distance = duration *0.034;
    if (Pdistance==distance || Pdistance==distance+1 || Pdistance==distance-1  )
    {
    Serial.print("Измеренное Расстояние: ");
    Serial.print(cm);
    Serial.println(" см.");
    }
    //Serial.print("Расстояние: ");
    //Serial.println(distance/2);
    delay(100);
    }
    void Calc()
    {
    duration=0;
    Trigger_US();
    while (digitalRead(echoPin)==HIGH);
    delay(100);
    Trigger_US();
    duration = pulseIn(echoPin, HIGH);
    }
    void Trigger_US()
    {
    // Fake trigger the US sensor
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(2);
    digitalWrite(trigPin, LOW);
    }
     
    Но даже время прерывания приходящего сигнала не могу никак оформить и/или найти нечто подобное в интернете. Всё, что попадается – это лишь тахометры, спидометры и прерывание на кнопках.

    На одном форуме (http://arduino.ru/forum/programmirovanie/izmerenie-vremeni-preryvaniya?page=1) кое что нашёл, но к сожалению получается ерунда. Выводятся в монитор значения от случайной наводке от тела, в прочем от замыкания контакта «Data» к D3 то же самое, и ни с увеличением расстояний, ни с повторными замыканиями ни чего не происходит.
    Материалы на яндекс диске: https://yadi.sk/d/AHU7etAILGPXmg
    Очень прошу откликнуться и помочь.
     
    Последнее редактирование: 26 дек 2020
  2. Un_ka

    Un_ka Гуру

    А какое между ними расстояние?

    На каком физическом принципе вы мерите расстояние?
     
    Андрей152 нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Ничего не получится.

    Изучать технологию TOF на основе SoC BLE. В ардурине не представлена.
     
    Андрей152 нравится это.
  4. Андрей152

    Андрей152 Нерд

    Дистанция на самом деле мала, в пределах 10-15 метров получистого (пара перегородок и с 2 - 3 стены) пространства и/или (иногда) 3-4 метра грунта (работа в переходах).
    Принцип в общем сводится к тому, что транслятор работает без цели, в смысле просто отправляет определённый такт, скажем диод отдаваемого сигнала мерцает 1-н раз в 2-е секунды), а приёмник принимает этот такт и отдаёт его на пин Ардуины. Ардуина принимает сигнал и измеряет время между сигналами, т.е. свежий сигнал "-" (минус) предыдущий и выводит в монитор порта. Далее хотелось бы конечно перевести время между сигналами на приёмнике в расстояние, но это пожалуй будет довольно проблематично в виду неоднородности грунтов над переходами, ведь все знают, что там где стройка, построено меньше, чем зарыто стройматериалов, а вот с переводом там, где просто стены, пожалуй возможно.
     
  5. Андрей152

    Андрей152 Нерд

    А есть пару ссылок на что-то подобное и простое, ввиду не больших требований.
     
  6. a1000

    a1000 Гуру

    Ну и получите вы свои две секунды. Ведь с такой периодичностью вы сигналы и отправляете.
    Где тут расстояние?
     
  7. Андрей152

    Андрей152 Нерд

    Возможно это моя теория, но я полагаю, что две секунды в открытом расстоянии на 3-х метрах - это один интервал по времени, а при нахождении приёмника на тех же 3-х метрах но за препятствием вызовет задержку сигнала, да это мили и даже микросекунды, но при использовании определённой формулы с поправкой в виде коэффициентов результат должен получиться. Может я конечно со своими мыслями и устарел, но ещё дышу ;)
     
  8. a1000

    a1000 Гуру

    Не совсем правильно вы понимаете. Если вкратце задача выглядит так. Два устройства надо синхронизировать с высочайшей точностью. Потом в один момент времени одно испускает импульс, а другое засекает время до его прихода. Далее, вы в курсе с какой скоростью распространяется радиоволна? Один метр она проходит за 3,3 наносекунды. Это 3,3 на десять в минус девятой степени секунды. Чем такой временный интервал можно замерить?
     
    Airbus, issaom и parovoZZ нравится это.
  9. parovoZZ

    parovoZZ Гуру

    измерение пико- и наносекундных интервалов не может быть простым. А я напомню, что метр - это такое расстояние, которое свет в вакууме проходит за 1 / 299 792 458 секунды.

    https://www.compel.ru/lib/97028
     
  10. akl

    akl Гуру

    можно сделать такой лайфхак - первое устройство отправляет импульс одновременно запуская таймер. второе устройство принимает импульс и тут же отправляет обратно такой же импульс, первое устройство приняв вернувшийся импульс тут же отправляет его обратно и так далее много сотен (или тысяч) раз. при приеме последнего (сотого или тысячного) вернувшегося импульса, измеряется таймер и высчитывается откалиброванное расстояние. если допустить что все переходные процессы, обсчеты, приемы, посылы, кульбиты регистров и т.д. внутри микросхем будут происходить одинаково (что не факт), то такое многократное "псевдоотражение" позволит что-то измерить. Но это бред.
    и кстати стены на время вряд ли сильно повлияют (хотя скорость света в разных веществах немножко разная) на время. на амплитуду - да.
     
  11. Андрей152

    Андрей152 Нерд

    Спасибо, заставили окунуться в школьные годы, поковыряю мысль.
     
  12. Андрей152

    Андрей152 Нерд

    Придётся поизучать, возможно это даже очень будет для меня полезно. Спасибо.
     
  13. Андрей152

    Андрей152 Нерд

    Дык пожалуй получится огромный код. Не сварганю я такое точно :(.
     
  14. akl

    akl Гуру

    причем как раз чтобы такое сработало код должен быть очень маленький. и желательно на ассемблере. потому что если время работы этого кода будет хоть чуточку нестабильным или слишком сильно больше чем время пролета сигнала, то ничего не получится в принципе. не уверен что на частотах ардуино такое в принципе возможно
     
  15. Андрей152

    Андрей152 Нерд

    А так есть какие либо мысли. Приёмник и передатчик рядом, напряжение между общим "-" (минусом) и контактом приёмника подплясывает от 0 до 0.50 вольт постоянки, а при удалении передатчика на примерно 4-5 метров напряжение пляшет в пределах 1-1,5 вольта. Ссылка на видео: https://yadi.sk/i/lCdpszXU6xsVhA
     
  16. Андрей152

    Андрей152 Нерд

    Ассемблер для меня как новое в словарном запасе, нет конечно, я знаю что есть такой язык программирования, но это как я зна. что на небе облака, но руками не трогал :).
     
  17. Airbus

    Airbus Радиохулиган Модератор

    Похожий принцип реализован в радивысотомерах самолетов. Одна антенна излучает сигнал а вторая принимает отраженку. Время задержки пропорционально расстоянию как сказал Уважаемый Paravozz
    Но боюсь что ардуино и приемник/передатчик на коленке не смогут обеспечить такое измерение. Там другое железо и другие частоты. Да и должна быть прямая видимость. Но попробуйте даже интересно стало
     
  18. akl

    akl Гуру

    там просто почему-то после удаления передатчика почему-то сигнал стал какой-то нестабильный, видно что светодиод не мограет нормально, а как-то криво мерцает.

    но я так и не понял - измерять надо именно расстояние? или мощность сигнала? это как бы разные вещи
     
  19. Airbus

    Airbus Радиохулиган Модератор

    И да еще один момент
     
  20. Андрей152

    Андрей152 Нерд

    Да по этому вопросу литературу почитал уже, на коленке во дворе не напилишь.