Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?

Я ищу способ выбрать PIN на Arduino Uno. Этот контакт будет использоваться для отправки сигнала ИК-светодиода. Я использую библиотеку IRremote.

напр .

Ниже приведена демонстрационная версия IR send, которая использует вывод 3 широтно-импульсной модуляции для отправки ИК-сигнала. Я хочу сменить этот контакт на любой другой.

Любые подсказки сделают меня очень счастливым, спасибо.

/*
 * IRremote: IRsendDemo - демонстрирует отправку ИК-кодов с помощью IRsend
 * ИК-светодиод должен быть подключен к контакту Arduino PWM 3.
 * Версия 0.1 Июль 2009 г.
 * Copyright 2009 Кен Ширрифф
 * http://arcfn.com
 */


#include <IRremote.h>

IRsend irsend;

void setup()
{
}

void loop() {
    for (int i = 0; i < 3; i++) {
        irsend.sendSony(0xa90, 12);
        delay(40);
    }
    delay(5000); // 5-секундная задержка между каждым сигнальным пакетом
}

, 👍5

Обсуждение

Тогда контакт жестко закодирован в библиотеке? Недавно у меня была такая же проблема с [USB Host library](http://arduinoprosto.ru/q/33379/change-select-pin-of-usb-host-library ). Это раздражает, когда вы не можете определить контакт самостоятельно, хотя у авторов библиотеки, вероятно, есть свои причины для этого. Линия для изменения для ООН, по-видимому, является линией [138 в boarddefs.h] (https://github.com/z3t0/Arduino-IRremote/blob/master/boarddefs.h#L138 ), но я пытаюсь найти, где определен IR_USE_TIMER2..., @Greenonline

[Строка 195 в boarddefs.h](https://github.com/z3t0/Arduino-IRremote/blob/master/boarddefs.h#L196 ) вы можете попробовать сменить 3 на другой вывод. Это может сработать. Я составлю ответ из этих двух комментариев., @Greenonline


2 ответа


2

Поскольку контакт, по-видимому, не может быть определен при создании объекта из класса IRsend, кажется, что вам придется изменить саму библиотеку IRremote.

Недавно у меня была такая же проблема с библиотекой USB-хоста, см. Change select pin of USB Host library. Это раздражает, когда вы сами не можете определить контакт (ы), который использует конкретная библиотека... Однако у авторов библиотеки, вероятно, есть на то свои причины.

Просматривая различные заголовки библиотеки, я нашел в boarddefs.h строки 134-138:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano и т. Д
// ATmega48, ATmega88, ATmega168, ATmega328
#else
    //#определить IR_USE_TIMER1 // tx = вывод 9
    #define IR_USE_TIMER2     // tx = вывод 3

Таким образом, строка для изменения для UNO, по-видимому, будет строкой 138 в boarddefs.h

    #define IR_USE_TIMER2     // tx = вывод 3

Однако это не так, так как это просто утверждает, что для Arduino Uno используется IR_USE_TIMER2 ...

Если посмотреть дальше, где определены таймеры, то вы увидите раздел для Таймера 2 в строке 146. В этом разделе вывод передачи для ряда версий Arduino определяется как TIMER_PWM_PIN в строках 189-197:

#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|| defined(__AVR_ATmega164P__)
#   define TIMER_PWM_PIN  14             // MightyCore
#else
#   define TIMER_PWM_PIN  3              // Arduino Duemilanove, Diecimila, LilyPad, etc
#endif                                   // ATmega48, ATmega88, ATmega168, ATmega328

Вам придется изменить эту строку в библиотеке, строка 196 в boarddefs.h:

#   define TIMER_PWM_PIN  3              // Arduino Duemilanove, Diecimila, LilyPad, etc

Вы можете попробовать изменить 3, чтобы вы могли использовать другой PIN. Это может сработать. Например, чтобы использовать pin 5 вместо pin 3, измените 3 на 5, например:

#   define TIMER_PWM_PIN  5              // Arduino Duemilanove, Diecimila, LilyPad, etc

Будьте осторожны, чтобы не выбрать контакт, который используется чем-то другим, И я думаю, что контакт должен быть способен к ШИМ.

Обратите внимание, что определения, которые находятся в boarddefs.h, раньше были в RemoteInt.h, в более ранних версиях библиотеки. См. Этот комментарий в самом верху:

// Этот файл содержит всю информацию о конкретной плате. Ранее он содержался в
// IRremoteInt.h

Поэтому убедитесь, что у вас есть последняя версия библиотеки IRremote.


Вышеупомянутый хак также должен работать для Mega2560, поскольку он использует тот же таймер, таймер 2, см. Строки 68-71:

// Arduino Mega
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    //#define IR_USE_TIMER1 // tx = вывод 11
    #define IR_USE_TIMER2     // tx = вывод 9

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

,

Обратите внимание, что я _not_ пробовал это, так что мне было бы интересно услышать, работает это или нет., @Greenonline

Спасибо за ваш ответ. У меня есть два вопроса: Как узнать, когда контакт используется чем-то другим? Смогу ли я выбрать более одного вихода для выполнения задачи? например, на данный момент только вывод 3 посылает ИК-сигнал, однако я хотел бы, чтобы pin3, pin 5 и pin6 посылали ИК-сигналы., @MALKAVIAN

1) Ваш код сообщит вам, используется ли контакт. W.R.T. библиотека IRremote, документация сообщит вам, какие выводы она использует. 2) Глядя на библиотеку кажется, что вы не можете, или, по крайней мере, не без дальнейших изменений. Возможно, вы могли бы активировать другой таймер, раскомментировав другую строку, а затем использовать вывод _that_ timer (как и каждый таймер, _appears_ использует свой собственный отдельный вывод - от просмотра этого заголовочного файла). Я не уверен. Если вы действительно хотите это сделать, то задайте / опубликуйте отдельный (связанный) вопрос, так как он значительно отличается от вашего исходного вопроса .. :-), @Greenonline


2

Я попытался найти, где определен PIN-контакт, и сдался, в итоге я переключился на pin9, закомментировав timer2, вот так:

#define IR_USE_TIMER1   // tx = вывод 9
//#define IR_USE_TIMER2     // tx = вывод 3

Не идеально, так как мне тоже нужно было 9, и я добавлю, как раздражает эта библиотека, хотя мне нужно только получать сигналы и никогда send...it все еще берет пин для отправки.

Во всяком случае, сообщения выше помогли мне, по крайней мере, заставить мой моторный щит работать, спасибо, ребята.

,