Leonardo: отключить TX - и RX-светодиоды

У меня есть (более или менее) Леонардо-совместимая плата Olimexino-32u4. Оба светодиода TX - и RX-постоянно включены. Чтобы уменьшить энергопотребление, я хочу отключить их с помощью программного обеспечения. Каков надежный способ сделать это?

, 👍3

Обсуждение

Изучите схему и определите, подключены ли они к источникам питания или к выводам ввода-вывода. Если есть источники питания, снимите соответствующие резисторы. Если контакты ввода-вывода остаются включенными, измените загрузчик и USB-ядро, чтобы оставить их выключенными, или попробуйте выдать необработанный доступ ввода-вывода ATmega, чтобы отключить их, если они просто остаются включенными после загрузчика и не постоянно перегружаются USB-трафиком., @Chris Stratton

@ChrisStratton почему бы просто не удалить их в первую очередь? Я вообще не знаю, почему было бы плохо отпаять светодиод..., @Anonymous Penguin

Просто заклейте их скотчем..., @DeveloperACE

Модификации программного обеспечения дешевле и проще реверсировать. Лента не экономит энергию., @Chris Stratton

Как они управляются в настоящее время? Прямой путь с использованием digitalWrite(pin, LOW) не работает. pinMode(pin, INPUT) тоже не работает., @Thomas S.


3 ответа


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

3

Попробуйте добавить это в свою процедуру настройки:

TXLED0;
RXLED0;

Эти макросы (и их двоюродные братья TXLED1, RXLED1) используются для управления светодиодами TX и RX на Leonardo. Они определены в https://github.com/arduino/ArduinoCore-avr/blob/9f8d27f09f3bbd1da1374b5549a82bda55d45d44/variants/leonardo/pins_arduino.h#L95-L98


Если это не сработает, вы можете попробовать решения, предложенные здесь: http://forum.arduino.cc/index.php?topic=145262.0

,

Переключение IDE для загрузки в "Микро" вместо "Леонардо" действительно решило проблему со светодиодами., @Thomas S.

Смотрите мой новый ответ для более подробного объяснения и, возможно, лучшего решения., @user2973

Альтернативно: отображение контактов в мире Arduino-это D17 для RX и D30 для TX, поэтому вместо TXLED1 вы также можете использовать digitalWrite(30, HIGH)., @volzo


1

TXled подключен к физическому контакту 22 или PD5. RXled подключен к контакту 8 или PB0. Они подключены к катоду светодиода, поэтому они должны быть ВЫСОКИМИ, чтобы выключить светодиоды.

Чтобы превратить их в ВЫСОКОЕ использование:

PORTD |= (1<<PORTD5);
PORTB |= (1<<PORTB0);

Не уверен, что делает прошивка, и время от времени ли она снова выключает светодиоды. Поэтому в дополнение я бы предложил также установить эти контакты на входы.

DDRD &= ~(1<<DDD5);
DDRB &= ~(1<<DDB0);
,

Olimexino-32u4 подключает светодиоды к GND, но, как написано в моем комментарии, этот подход не работает., @Thomas S.


7

Прочитав ответ Гербена, я понял суть проблемы: светодиоды TX/RX на Leonardo имеют проводной вывод-светодиод-5 В(общий анод), тогда как на Olimexino-32U4 они имеют проводной вывод-светодиод-GND(общий катод). Таким образом, двум платам понадобятся обратные сигналы для одного и того же визуального вывода.

Сравните:
http://arduino.cc/en/uploads/Main/arduino-leonardo-schematic_3b.pdf
https://www.olimex.com/Products/Duino/AVR/OLIMEXINO-32U4/resources/OLIMEXINO-32U4_rev_A3.pdf


Наиболее элегантным решением будет добавление нового типа платы (приведенный ниже код предназначен для IDE 1.0.x):

  • В вашем альбоме для рисования создайте папку "оборудование", а внутри нее "олимексино". В папке olimexino создайте файл boards.txt с этим содержанием:

    olimexino32u4.name=Olimexino-32U4
    olimexino32u4.upload.protocol=avr109
    olimexino32u4.upload.maximum_size=28672
    olimexino32u4.upload.speed=57600
    olimexino32u4.upload.disable_flushing=true
    olimexino32u4.bootloader.low_fuses=0xff
    olimexino32u4.bootloader.high_fuses=0xd8
    olimexino32u4.bootloader.extended_fuses=0xcb
    olimexino32u4.bootloader.path=caterina
    olimexino32u4.bootloader.file=Caterina-Leonardo.hex
    olimexino32u4.bootloader.unlock_bits=0x3F
    olimexino32u4.bootloader.lock_bits=0x2F
    olimexino32u4.build.mcu=atmega32u4
    olimexino32u4.build.f_cpu=16000000L
    olimexino32u4.build.vid=0x2341
    olimexino32u4.build.pid=0x8036
    olimexino32u4.build.core=arduino:arduino
    olimexino32u4.build.variant=olimexino32u4
    
  • Создайте еще одну папку "варианты" внутри папки olimexino.

  • Внутри этого создайте папку "olimexino32u4".
  • Теперь скопируйте "arduino/оборудование/arduino/варианты/леонардо/pins_arduino.h' к этой папке
  • Откройте копию для редактирования - путь должен быть "альбом для рисования/оборудование/olimexino/варианты/olimexino32u4/pins_arduino.h".
  • Измените раздел, посвященный TXLED и RXLED, заменив макросы, заканчивающиеся на 1, на макросы, заканчивающиеся на 0. Это должно выглядеть так:

    #define TX_RX_LED_INIT  DDRD |= (1<<5), DDRB |= (1<<0)
    #define TXLED1          PORTD |= (1<<5)
    #define TXLED0          PORTD &= ~(1<<5)
    #define RXLED1          PORTB |= (1<<0)
    #define RXLED0          PORTB &= ~(1<<0)
    

У меня нет платы, поэтому я не могу протестировать решение. Я надеюсь, что это решит вашу проблему - просто выберите "Olimexino-32U4" в меню "Сервис" -> "Плата".

,

Я попробовал оба значения на TXLED и RXLED - одно не сработало. Сработал только выбор платы "Микро"., @Thomas S.

Это лучшее решение. Проблема связана с тем, что активность UART берет на себя управление светодиодами Tx и Rx. Переключение на «микро» плату просто меняет состояния этих светодиодов. Создание пользовательской платы pins_arduino.h и пустое определение этих макросов полностью отключит их использование UART, сделав их простыми GPIO., @Scott