Синхронизация внутренних часов двух ардуин

Тема в разделе "Arduino & Shields", создана пользователем Daemon2017, 10 мар 2014.

  1. Daemon2017

    Daemon2017 Нерд

    Доброго дня всем!
    Хочу синхронизировать две дуины с точностью до микросекунд для выполнения следующей задачи:
    одновременно сделать замер двумя УЗ-дальномерами на двух ардуинах, т.е. по одному дальномеру на каждой. Если быть точнее, одна ардуина будет только вещать, а другая - только принимать. Но суть в том, что импульс они должны подать одновременно, иначе будет отклонение результата.

    На одной ардуинке с двумя дальномерами(у одного изолентой замотан излучатель, у другого - приемник) это делается элементарно. А вот как быть с двумя ардуинками, связанными через I2C или UART?

    У меня только одна догадка: нужно как-то синхронизовать внутренние часы двух ардуин и делать замеры по расписанию(т.е. "мастер" говорит "слейву", что в 100500 микросекунд по внутренним часам мы начинаем подачу импульса). А вот способов синхронизации я пока не придумал. Разве что использовать данные времени, полученные с GPS(но это дороговато, да и не очень ясно, как оттуда именно микросекунды вытащить) или синхронизация по NTP с помощью ethernet шилда.

    Может у кого-нибудь есть хорошие идеи?
     
  2. NR55RU

    NR55RU Гик

    В реальных протоколах устройства синхронизируются во время общения сотни и даже тысячи раз в секунду.
    В вашем случае скорее стоит говорить ни о синхронизации а об управляющих сигналах.
    Зачем вам мучатся с поддержкой синхронности двух мк когда один мк может просто говорить второму мк когда ему выполнять свою работу.

    К примеру по вешали функцию снятия показаний с дальномера на прерывание, головной мк подал импульс на подчиненный и подчиненный снял показания в то время как головной делает то же самое сразу после подачи сигнала.

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

    Daemon2017 Нерд

    Я примерно так и делаю. Для начала я записал время micros() в момент отправки данных, а затем, это же время на этой же ардуинке после получения ответа("полезный" код ни на одной рдуинке в это время не выполнялся). Получал примерно 176-184 мкс. Из этого сделал вывод, что время на поход информации в одну сторону занимает ~90 мкс.

    Далее, я записал в ардуинки полезный код и поступил следующим образом:
    Ардуино-мастер подает команду о пуске ардуино-слейву и выполняет задержку в 90 мкс, после чего включает УЗ-излучатель на 10 микросекунд.
    Ардуино-слейв получает команду и сразу же включает УЗ-приемник на 10 микросекунд, затем замеряет длину импульса и конвертирует во время.
    Проблема: расстояние выводит неправильное, из чего я делаю вывод о наличии какой-то ошибки. На одной дуине этот же код дает значения с точностью до 0.5 см.
    Код (Text):
      digitalWrite(client_T, HIGH);
      digitalWrite(sputnic_T_1, HIGH);
      delayMicroseconds(10);
      digitalWrite(client_T, LOW);
      digitalWrite(sputnic_T_1, LOW);

      tim1=pulseIn(sputnic_E_1, HIGH);
     
  4. NR55RU

    NR55RU Гик

    Есть у меня такое мнение что тут дело не в коде.
    Если взять скорость звука в 330 м/с то за 1 микросекунду звук улетает на 33 см .. таким образом ошибись вы с "синхронизацией" всего на 1 микросекунду то при домашних условиях вы вообще вряд ли получите хоть какие либо дельные результаты :)
    Так что замеры типа примерно 90 микросекунд в таких играх не годятся это уже другой уровень :)

    Мили секунда по меркам МК это вечность, за которую можно родится, повзрослеть, состариться и умереть :)

    P.s. Знаете почему Ethernet не работает если непрерывная длинна кабеля больше 250 метров (по крайней мере витая пара 3 категории), время прохождения сигнала на такое расстояние больше периода ожидания очередного сигнала по протоколу :)
     
    Последнее редактирование: 10 мар 2014
    Daemon2017 нравится это.
  5. Daemon2017

    Daemon2017 Нерд

    Не совсем так)
    Микросекунда это 0.000001 секунд. А 0.000001*343м/с это 0.000343 метров. Так что погрешность даже в десятки микросекунд допустима :)
    На тему миллисекунд полностью согласен)
     
  6. NR55RU

    NR55RU Гик

    Ах блин черт точно, микро с мили чуток спутал :)
     
    Daemon2017 нравится это.