Эмулятор Nikon IR remote trigger (ML-L3) не работает

Я попытался проследить/воспроизвести результаты из нескольких источников для эмуляции инфракрасного дистанционного триггера Nikon:

  • Руководство по фруктам
  • DIY Nikon ML-L3 ИК Беспроводной Удаленный Взлом с Arduino UNO
  • Демонтаж и проект: Клонирование ИК-пульта дистанционного управления Nikon ML-L3 и эмуляция
  • Научу вас, как самостоятельно управлять инфракрасным пультом дистанционного управления Nikon ML-L3, который еще не читал
  • Беспроводной пульт дистанционного управления Arduino для Nikon DSLR
  • Arduino Nikon Инфракрасный код команды
  • Arduino – ИК-пульт дистанционного управления/ интервалометр для Nikon D80 DSLR

Я могу считывать сигнал с моего удаленного триггера, но я не могу воспроизвести его с помощью настройки Arduino. Сигнал, который я могу получить (с приемным диодом TSOP38238), совпадает со всеми сигналами, указанными выше (существует некоторое ожидаемое отклонение длительности импульсов).

Я не думаю, что мое оборудование виновато:

  • TSOP38238 получает @ 950 нм
  • мой ИК-светодиод составляет 940-950 нм на схему данных
  • мой ИК-светодиод работает (я вижу, как он излучает, когда я направляю его на камеру телефона)

schematic

Мой Код:

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

uint16_t Signal[] = [2050, 27800, 430, 1650, 430, 3650, 430, 65000]; // Длительность импульсов включения и выключения (микросекунды)
uint8_t wait = 13; // длительность (микросекунды) между изменениями состояния вывода

// функция настройки запускается один раз, когда вы нажимаете сброс или включаете питание платы
void setup() {
    DDRB = B00000001; // set digital pin 8 to output
    PORTB = B00000000; // set digital pin 8 LOW
    Serial.begin(9600); // start serial monitor
}

// функция цикла выполняется снова и снова бесконечно
void loop() {
    delay(1500); // подождите немного между отправкой сигнала
    sendSignal();
    sendSignal();
    // отправьте сигнал дважды, это то, что делает фактический пульт дистанционного управления
    Serial.println("Signal sent"); // сообщение о том, что сигнал был отправлен
}

// функция, которая отправляет сигнал
void sendSignal(void) {
    for (int i = 0; i < sizeof(Signal)/sizeof(Signal[0]); i++) { 
        if (i%2 > 0) { // индекс с нечетным номером, является импульсом выключения
            PORTB = B00000000; // установите цифровой вывод 8 НИЗКИМ
            delayMicroseconds(Signal[i]); // задержка для длительности импульса выключения
        } else { // четный индекс (включая i=0), является импульсом ВКЛЮЧЕНИЯ, 38 кГц (период использования 26,3 с), рабочий цикл 50% 
            unsigned long currentTime = micros(); // получить текущее время
            while (micros() - currentTime < (unsigned long)Signal[i]) { // while still in ON pulse duration
                PORTB = B00000001; // установить цифровой вывод 8 ВЫСОКОЙ
                delayMicroseconds(wait); // оставить включенным на время
                PORTB = B00000000; // установите цифровой вывод 8 НИЗКИМ
                delayMicroseconds(wait); // оставить на время
            }
        }
    }
}

Я безуспешно держу камеру в прямой видимости светодиода (не блокируя приемник на камере) с расстояния от ~2 дюймов до ~3 футов.

Кто-нибудь пробовал это раньше? Есть ли ошибка в моем подходе или коде?

, 👍1

Обсуждение

генерация сигнала 38 кГц с задержкой в микросекундах не приводит к очень точной частоте. Это, вероятно, ниже из-за того, что цикл while занимает некоторое время для выполнения. Код, приведенный в вашей предпоследней ссылке, на самом деле использует задержку в 7 мкс и использует более простой цикл for. Он также использует задержку 810 мкс после первого импульса, где ваш код использует 27800 мкс, @Gerben

@Gerben Эта ссылка использует задержку(27) и задержку в микросекундах(810) для общей задержки 27810 микросекунд. Он также использует цифровую запись вместо управления портом, что происходит медленнее., @BrendanLuke15

Но документация [Задержка в микросекундах](https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/) действительно говорит: "наибольшее значение, которое приведет к точной задержке, составляет 16383", поэтому я попытаюсь объединить задержку с задержкой в микросекундах, как это делает эта ссылка., @BrendanLuke15

один, если ссылки, которые вы разместили, содержат код ... почему вы им не пользуетесь?, @jsotola

@jsotola ни один из предоставленных кодов не работал для меня, @BrendanLuke15


1 ответ


Лучший ответ:

1

Получилось. Проблемы заключались в слишком большой задержке ввода микросекунд (см. Комментарии) и несоответствиях частот.

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

while (i < 256) {
    /* ваш код для времени здесь */
    i++;
}
i = 0;
unsigned long time = 10000000 + micros();
Serial.println(time);

Убедитесь, что вы рассчитали время пустого цикла и вычли это из ваших показаний с кодом. Возьмите разницу между отсчетами времени, вычтите накладные расходы оператора печати (которые зависят от того, сколько цифр он печатает, следовательно, 10000000 + микро (), чтобы число цифр оставалось постоянным) и разделите на 256.

Я измерил 4 различные комбинации, чтобы найти наиболее близкое совпадение частот:

Тип команды: Продолжительность ожидания (микросекунды): Частота (Гц): % разница с 38 кГц
Манипулирование портами 14 36990 -5.3 %
Манипулирование портами 13 39960 5.2 %
Цифровая запись 11 35980 -2.7 %
10 38790 2.1 %

Окончательный код оказался очень похожим на тот, который был получен по этой ссылке; отсчет циклов включения-выключения импульса 38 кГц.

,