Работа с GPIO в Linux. Часть 7. Управление подсветкой (backlight) экрана используя ШИМ (PWM)

В публикации Подключение дисплея SPI LCD ILI9341 был подключен данный дисплей к плате Banana Pi BPI-M64. Все управление подсветкой сводилось к двум состояниям: включено или выключено. Контакт LED на дисплее предназначен для регулирования уровня яркости экрана. Из-за того, что плата Banana Pi BPI-M64 не имеет аналоговых выходов, невозможно было регулировать степень яркости дисплея. Поэтому для регулирования значения напряжения на контакте LED, воспользуемся драйвером двигателя (микросхема TB6612FNG). Входящий сигнал ШИМ (PWM) в микросхеме TB6612FNG регулирует напряжение на выходе. С ШИМ (PWM)  уже работали в публикации LED, ШИМ (PWM), КНОПКА. Поэтому потребуется лишь соединить контакт ШИМ (PWM) на плате Banana Pi BPI-M64 с соответствующим контактом на микросхеме TB6612FNG, и вывод с микросхемы TB6612FNG соединить с входом контакта LED на дисплее. Как это сделать, для возможности регулирования  подсветки экрана, читаем под катом.

Оглавление

  1. Подсветка (backlight)
  2. Двухканальный драйвер двигателя TB6612FNG
  3. Схема подключения двигателя TB6612FNG к дисплею SPI LCD ILI9341
  4. Файл наложения устройств DTS для включения подсветки (backlight)
  5. Управление подсветкой
  6. Управление подсветкой из xorg, xfce4
  7. Решение проблем
  8. Литература

Постановка задачи

Реализовать схему управления подсветки экрана SPI LCD ILI9341 с возможностью установления яркости от 0% до 100%. Управлять напряжением на выходе, будет микросхема драйвера двигателя TB6612FNG.

Подсветка (backlight)

Существует несколько способов управления подсветкой экрана:

  • с помощью горячих клавиш определённых производителем, без предоставления интерфейса для ОС (самый простой способ);
  • с помощью ACPI, либо через драйвер видеокарты. В этом случае по пути  /sys/class/backlight  будет размещено устройство управления подсветкой, доступ к которому можно получить напрямую через Sysfs. Или управлять с помощью соответствующих утилит из пользовательского пространства (userspace);
  • путем прямой записи в регистр видеокарты с помощью setpci (опасный способ, можно записать значение не в тот регистр).

Для управления яркостью дисплея будет использовать устройство/драйвер pwm-backlight, основанный на ШИМ (PWM), будет доступен по пути  /sys/class/backlight . Принцип работы драйвера pwm-backlight достаточно несложный, чем выше значение выставленной яркости, тем коэффициент заполнения ШИМ будет больше, т.е. от 0-100%, частота ШИМ при этом не меняется. В итоге будет создано два устройства, первое — обычный ШИМ — pwm, затем поверх него — pwm-backlight.

Двухканальный драйвер двигателя TB6612FNG

TB6612FNG — это двухканальный мостовой драйвер для двух коллекторных двигателей или одного шагового.

Спецификации контроллера двигателя:

  • Два независимых канала двунаправленного управления двигателем;
  • Диапазон логического напряжения микросхемы 2,7 Вольт — 5,5 Вольт;
  • Диапазон напряжения питания двигателя 2,5 Вольт — 13,5 Вольт;
  • Ток выхода — 1 Aмпер непрерывный, максимальный 3 Aмпер на канал. Имеется возможность переводить каналы на двойной выход;
  • Максимальная частота ШИМ: 100 кГц.

Особенности модуля

Модуль собран на микросхеме TB6612FNG от Toshiba, это двухканальный мостовой драйвер, микросхема функциональна схожа с популярными драйверами L293D, L298N но в отличии от них, в драйвере использованы MOSFET транзисторы, драйвер также имеет защиту по температуре, перенапряжению и короткому замыканию. Управляется логическим уровнем 3.3 вольта.

Двухканальный драйвер двигателя TB6612FNG A1
TB6612FNG

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

Основные достоинства:

  • Низкая цена;
  • Минимальный размер;
  • Автоматическое отключение при перегреве;
  • Высокий выход на канал по току (до 3 А);
  • Защита от обратного тока и переполюсовки на моторах;
  • Широкий диапазон рабочих температур;
  • Фильтрующий конденсатор питания.

Назначение выходов

Метки контактов драйвера двигателя TB6612FNG A1

TB6612FNG

Левая сторона:

  • PWMA — вход управлением скоростью вращения электродвигателем A подключается к выходу PWM (ШИМ) микроконтроллера;
  • AIN2 — вход 2, определяющий направление вращения двигателя А, подключается к одному из цифровых выходов микроконтроллера;
  • AIN1 — вход 1, определяющий направление вращения двигателя А, подключается к одному из цифровых выходов микроконтроллера;
  • STBY — вход ожидания цифровой вывод на микроконтроллере или привязка к VCC;
  • BIN1 — вход 1, определяющий направление вращения двигателя B, подключается к одному из цифровых выходов микроконтроллера;
  • BIN2 — вход 2, определяющий направление вращения двигателя B, подключается к одному из цифровых выходов микроконтроллера;
  • PWMB — вход управлением скоростью вращения электродвигателем B подключается к выходу PWM (ШИМ) микроконтроллер;
  • GND — минус питания GND микроконтроллера и управления микросхемы TB6612FNG.

Правая сторона

  • VM — плюс аккумуляторной батареи электродвигателей (2,5 В -13,5 В по номинальному постоянному току 1,2 А, и пиковому току 3,2 А);
  • VCC — напряжение питания логики от микроконтроллера для питания микросхемы и интерфейса с микроконтроллером (2,7 В — 5,5 В);
  • GND — общая земля для напряжения двигателя и логического напряжения (все контакты GND подключены вместе);
  • AO1 — Выход на (-) вывод двигателя A;
  • AO2 — выход на (+) вывод двигателя A;
  • BO2 — выход на (+) вывод двигателя B;
  • BO1 — выход на (-) вывод двигателя B;
  • GND — минус аккумуляторной батареи электродвигателей.

Ничего не произойдет, если вывод STBY не имеет высокого уровня (логическая 1). Можно подключить этот вывод к микроконтроллеру и управлять им программно, либо просто выставить на нём логическую единицу подав на него питание с вывода VCC микросхемы TB6612FNG .

Для управления двигателями необходимо воспользоваться схемой работы микросхемы TB6612FNG.

H-SW Control Function and H-SW Operationg Description
TB6612FNG H-SW Control Function Description

Вместо двигателей будем подключать контакт к питание LED дисплея, поэтому схема подключения существенно упрощается, т.к. потребуется только один вывод.

Драйвер был куплен на площадке Aliexpress лот 1pcs Dual Motor Driver 1A TB6612FNG for Arduino Microcontroller Better than L298N продавец SAMIORE Store за $1.21.

Схема подключения двигателя TB6612FNG к дисплею SPI LCD ILI9341

Контакт для управления ШИМ (PWM) будем использовать тот же самый, как и в публикации и LED, ШИМ (PWM), КНОПКА. Соответствующий контакт ШИМ (PWM) — PL10 находится на разъеме MIPI DSI. Для получения доступа к контакту необходимо его развести с помощью Адаптера с кабеля FPC на гребенку 2.54 мм, как это делается смотрите в публикации Распиновка GPIO для Banana Pi BPI-M64. Контакт PL10 по номеру 35-pin обозначен как: CN6-P35, функция LCD-PWM.

Теперь определим схему подключения драйвера двигателя TB6612FNG, составим таблицу подключения контактов:

Контакт на TB6612FNG Внешнее подключение
PWMA контакт PL10 на Banana Pi BPI-M64
AIN2 HIGH (3V3)
AIN1 LOW (GND)
STBY HIGH (3V3)
GND GND
VM 3V3 Drive (3V3)
VCC 3V3
GND GND
A02 контакт LED на SPI LCD ILI9341 (0-3V3)

На основе таблицы составим схему подключения:

Linux backlight control

Файл наложения устройств DTS для включения подсветки (backlight)

Как формируются файлы наложения устройств (DTS) можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.

Для использования драйвера pwm-backlight, должен быть включен на используемом контакте pwm (ШИМ), более подробно можно почитать в публикации Работа с GPIO в Linux на примере Banana Pi BPI-M64. Часть 3. Device Tree overlays. LED, ШИМ (PWM), КНОПКА раздел Использование ШИМ (PWM) на плате Banana Pi BPI-M64.

Поэтому подробно остановимся только на устройстве pwm-backlight. Рассмотрим фрагмент файла DTS связанный с данным устройством:

//pwm-backlight
fragment@2 {
	target = <&r_pwm>; /* PL10 */
	__overlay__ {
	  status = "okay";
	};
};

fragment@3 {
  target-path = "/";
  __overlay__ {
	backlightlcdtft: backlightlcdtft {
	  compatible = "pwm-backlight";
	  pwms = <&r_pwm 0 5000000 0>;
	  brightness-levels = <0 8 16 32 48 64 80 96 160 210 240>; //max=255
	  default-brightness-level = <8>;
	  //power-supply = <&reg_dcdc1>;
	  post-pwm-on-delay-ms = <10>;
	  pwm-off-delay-ms = <10>;
	};
  };
};

Рассмотрим параметры:

Фрагмент fragment@2 предназначен для включения устройства PWM. В самом дереве устройств sun50i-a64-bananapi-m64.dts, PWM на 35-pin обозначен как r_pwm. По умолчанию PWM добавлен в дерево устройств, поэтому потребуется лишь его включить, т.е. задать параметр status = «okay».

Далее, фрагмент fragment@3 содержит устройство с именем backlightlcdtft, для управления яркостью, драйвер pwm-backlight. Строка pwms = <&r_pwm 0 5000000 0>, задает:

  • ссылку &r_pwm на само устройство PWM;
  • 0 — номер чипа/канала;
  • 5000000 — период (period), в данном случае 5000000 нс =  200 Гц;
  • 0 — полярность, по умолчанию 0.

Согласно спецификации, чип TB6612FNG рассчитан на входной сигнал с частотой PWM до 100 кГц, соответствие спецификации соблюдено.

Параметр brightness-levels указывает уровни коэффициента заполнения D (duty cycle). Где 0 — подсветка выключена, 255 — коэффициент равен 100%, яркость на максимуме. Можно задавать произвольное количество ступеней яркости. Параметр default-brightness-level определяет 8 ступень яркости при включение устройства. При запуске ОС, устройство задаст коэффициент заполнения, который соответствует уровню 8, т.е. D=160. Параметр post-pwm-on-delay-ms определяет время переключения уровней яркости. Параметр pwm-off-delay-ms определяет время включения/выключения подсветки.

При данной реализации дисплея, линия питания подсветки не выделена отдельно, а запитывается от общего питания. Поэтому в данном случае, параметр enable-gpios не используется по причине невозможности использования данной функции. Контакт указанный в enable-gpios, как раз должен был включать/выключать подсветку.

Как вариант, на контакт enable-gpios можно подключить контакт STBY полного включения/выключения микросхемы TB6612FNG. Это имеет значение в случае использование графического режима при активации хранителя экрана. Если в настройках xorg указать время выключения экрана, то будет использоваться контакт указанный в enable-gpios.

Создадим файл DTS с названием: sun50i-a64-spi-ili9341-pwm-backlight.dts (на основе примера pwm-backlight.txt):

/dts-v1/;
/plugin/;

/ {
  compatible = "allwinner,sun8i-h3";

  //ili9341
  fragment@0 {
    target = <&pio>;
    __overlay__ {
      ili9341_pins: ili9341_pins {
        pins = "PD4", "PC0"; /*RESET, DC_RS*/
        function = "gpio_out", "gpio_out" ;
      };
    };
  };
  
  fragment@1 {
    target = <&spi1>;
    __overlay__ {
      status = "okay";      
      cs-gpios = <&pio 3 0 0>; /* PD0 */

      ili9341: ili9341@0 {
        compatible = "ilitek,ili9341";
        reg = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&ili9341_pins>;
        spi-max-frequency = <16000000>;
        rotate = <90>;
        bgr;
        fps = <25>;
        buswidth = <8>;
        reset-gpios = <&pio 3 4 1>; /*RESET=PD4*/
        dc-gpios = <&pio 2 0 0>; /*DC_RS=PC0*/
        //backlight = <&backlightlcdtft>;
        /*led-gpios = <&pio 2 4 0>; LED=PC4*/
        debug = <0>;
      };
    };
  };

  //pwm-backlight
  fragment@2 {
        target = <&r_pwm>; /* PL10 */
        __overlay__ {
          status = "okay";
        };
  };
    
   fragment@3 {
      target-path = "/";
      __overlay__ {
        backlightlcdtft: backlightlcdtft {
          compatible = "pwm-backlight";
          pwms = <&r_pwm 0 5000000 0>;
          brightness-levels = <0 8 16 32 48 64 80 96 160 210 240>; //max=255
          default-brightness-level = <8>;
          //power-supply = <&reg_dcdc1>;
          post-pwm-on-delay-ms = <10>;
          pwm-off-delay-ms = <10>;
        };
      };
    };
};

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-spi-ili9341-pwm-backlight.dtbo sun50i-a64-spi-ili9341-pwm-backlight.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): sun50i-a64-spi-ili9341-pwm-backlight. После перезагрузки платы, устройство pwm-backlight будет включено вместе с дисплеем SPI LCD ILI9341.

Управление подсветкой

После перезагрузки по пути  /sys/class/backlight  появится новой устройство backlightlcdtft. Рассмотрим структуру каталога, с помощью команды tree:

$ tree /sys/class/backlight/backlightlcdtft

Результат выполнения:

root@bananapim64:~# tree /sys/class/backlight/backlightlcdtft
/sys/class/backlight/backlightlcdtft
├── actual_brightness
├── bl_power
├── brightness
├── device -> ../../../backlightlcdtft
├── max_brightness
├── power
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_time
│   ├── runtime_status
│   └── runtime_suspended_time
├── scale
├── subsystem -> ../../../../../class/backlight
├── type
└── uevent

3 directories, 12 files

Из списка, для нас имеют значения параметры: actual_brightness, brightness, max_brightness и scale.  Рассмотрим каждый из них подробнее:

  • max_brightness — максимальная доступная яркость, в данном случае 10;
root@bananapim64:~# cat /sys/class/backlight/backlightlcdtft/max_brightness
10
  • brightness — параметр управления яркостью в диапазоне от 0 до 10. Для установления яркости на значение 5, выполнить команду:
$ echo 5 > /sys/class/backlight/backlightlcdtft/brightness

Для выключения дисплея, выполнить команду:

$ echo 0 > /sys/class/backlight/backlightlcdtft/brightness

Выставить максимальную яркость:

$ echo 10 > /sys/class/backlight/backlightlcdtft/brightness
  • actual_brightness — текущее значение яркости;
root@bananapim64:~# cat /sys/class/backlight/backlightlcdtft/actual_brightness
10
  • scale — масштабирование значения яркости, в данном случае значения были выставлены вручную. Но если необходимо выставлять в привычном виде от 0 до 100, то можно включить линейную масштабируемость.

Текущее значение:

root@bananapim64:~# cat /sys/class/backlight/backlightlcdtft/scale
non-linear

Демонстрация работы подсветки:

Управление подсветкой из xorg, xfce4

Управлять подсветкой из Sysfs достаточно удобно, но хотелось бы из оболочки воспользоваться графическими утилитами настройки. В публикации Подключение дисплея SPI LCD ILI9341 в разделе Настройка графической подсистемы Xorg и графической оболочки Xfce в шаге создания конфигурационного файла по пути  /usr/share/X11/xorg.conf.d/99-fbdev.conf  необходимо добавить строку со ссылкой на устройство управления подсветкой. Итоговый файл будет выглядеть следующим образом:

Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb0"
  Option "Backlight"  "backlightlcdtft"
EndSection

Где Backlight — параметр указывающий на устройство управления подсветкой — backlightlcdtft.
Дополнительно рекомендуется установить/обновить пакеты:

sudo apt install -y xfce4-panel xfce4-power-manager xfce4-power-manager-plugins

Теперь в графической оболочке xfce4 можно будет регулировать яркость подсветки с помощью доступных графических утилит.

На этом управление подсветкой закончено. В продолжение данной тематики, будем управлять ШИМ (PWM) —  подсветкой экрана, из .NET кода программой на C#. И для более рационального использования контактов GPIO, микросхему TB6612FNG заменим на другую микросхему типа DAC, которая будет подавать аналоговый сигнал напрямую на контакт управления подсветкой дисплея (для этого решения драйвер pwm-backlight уже не подойдет). Все это приправим датчиком получения текущего уровня освещенности — Luminosity Sensor — TSL2561, для автоматической регулировки яркости дисплея.

Решение проблем

Если устройство управления подсветкой не появилось, то отобразите отладочную информацию о загрузке драйвера с помощью команд:

 
$ dmesg | grep -E 'ili'
$ dmesg | grep -E 'pwm'
$ dmesg | grep -E '*backlight*'

Сообщение об отсутствие регулятора питания для backlightlcdtft не является препятствием работы устройства. Просто в данной схеме подключения нет отдельной электролинии для управления питания подсветки.

Результат выполнения:

 
root@bananapim64:~# dmesg | grep -E 'pwm'
[    5.138122] pwm-backlight backlightlcdtft: supply power not found, using dummy regulator
[    5.226804] pwm-backlight backlightlcdtft: supply power not found, using dummy regulator

Файлы DTS для подключения дисплей и управления подсветкой используя PWM доступны в каталоге GitHub Banana-Pi-BPI-M64/dt-overlays/

Литература

  1. pwm-backlight bindings — Kernel.org
  2. Linux/Documentation/devicetree/bindings/leds/backlight — GitHub torvalds/linux
  3. Backlight (Русский) (ENG) — ArchLinux
  4. Backlight (Linux) — Toradex
  5. Backlight — Github notro/fbtft
  6. Add LCD Brightness Control To Manjaro XFCE Panel -Enock Seth Nyamador
  7. XFCE change brightness steps and/or change brightness key behavior — superuser
  8. How to Change the Screen Brightness on an LXDE Desktop — Living the Linux Lifestyle/a>

Вам также может понравиться

About the Author: Anton

Programistik