Эмулятор 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 нм на схему данных
- мой ИК-светодиод работает (я вижу, как он излучает, когда я направляю его на камеру телефона)
Мой Код:
Я попробовал код, приведенный в приведенных выше ссылках, большинство из них не используют манипуляции с портами, а вместо этого методом проб и ошибок определяют длительность задержки для учета накладных расходов в функциях 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 футов.
Кто-нибудь пробовал это раньше? Есть ли ошибка в моем подходе или коде?
@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 кГц.
- Arduino IRremote перестает работать
- Использование ИК-пульта с Arduino
- ИК приемник принимает только 0
- Звуковые библиотеки UNremote и PCM мешают
- ИК-пульт дистанционного управления на UNO
- Ошибка загрузки Arduino IDE
- Как использовать ЖК-экран и ИК пульт дистанционного управления для трансляции обратного отсчета
- Arduino Uno продолжает цикл setup() каждый раз, когда я нажимаю определенную кнопку на пульте дистанционного управления.
генерация сигнала 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