Глава 5: Управление зуммером с помощью GTK+ и libgpiod

В этой главе мы создадим полноценное графическое приложение для Raspberry Pi, позволяющее управлять активным зуммером и воспроизводить различные звуковые паттерны. Мы будем использовать библиотеку GTK+ для создания пользовательского интерфейса и libgpiod для взаимодействия с GPIO.

Обзор программы

Наша программа представляет собой простое приложение с графическим интерфейсом, которое позволяет выбрать одну из трёх предопределённых мелодий и воспроизвести её через активный зуммер, подключённый к GPIO Raspberry Pi.

Как работает GUI (графический интерфейс пользователя)

Интерфейс программы состоит из следующих элементов:

  • Заголовок окна: «Buzzer Melody».

  • Радиокнопки: Три кнопки с метками «Мелодия 1», «Мелодия 2» и «Мелодия 3». Эти кнопки позволяют выбрать, какая мелодия будет проиграна. При выборе одной из них, переменная в программе selected_melody обновляется соответствующим значением.

  • Кнопка «Проиграть»: При нажатии на эту кнопку, выбранная в радиокнопках мелодия воспроизводится.

Принцип работы прост: пользователь выбирает мелодию, затем нажимает «Проиграть», и зуммер издаёт соответствующий звук.

Как работает программа (логика)

Программа состоит из нескольких ключевых компонентов:

  1. Инициализация GPIO: При запуске программа открывает чип gpiochip0 и запрашивает линию GPIO 17 (пин, к которому подключён зуммер) как выходной. Это делается с помощью библиотеки libgpiod, которая предоставляет современный и надёжный способ взаимодействия с GPIO в Linux.

  2. Управление зуммером: Функции buzzer_on() и buzzer_off() отвечают за установку высокого или низкого уровня на GPIO-пине, тем самым включая или выключая зуммер.

  3. Воспроизведение мелодий: Функция play_melody() содержит логику для трёх различных звуковых паттернов. В зависимости от выбранной мелодии, она вызывает buzzer_on() и buzzer_off() с различными задержками (usleep) для создания уникальных звуковых последовательностей.

  4. Обработка событий GUI: * Когда вы выбираете радиокнопку, срабатывает функция on_melody_selected(), которая обновляет глобальную переменную selected_melody. * Когда вы нажимаете кнопку «Проиграть», вызывается функция on_play_clicked(), которая, в свою очередь, запускает play_melody() с текущим значением selected_melody.

  5. Очистка ресурсов: При закрытии окна программы функция on_destroy() гарантирует, что зуммер выключен, а все ресурсы libgpiod (линия и чип GPIO) корректно освобождены. Это предотвращает утечки ресурсов и позволяет другим программам использовать эти GPIO-пины.

Схема подключения

Для работы программы необходимо правильно подключить активный зуммер к Raspberry Pi. Поскольку GPIO-пины Raspberry Pi не могут выдавать достаточный ток для прямого питания большинства зуммеров, мы используем NPN-транзистор в качестве переключателя.

    Raspberry Pi
       +------+
GPIO17 --|      |
           |      |
           +------+
               |
               R1 (1 кОм)
               |
               V
           +---+---+  (База)
           |       |<--- NPN Транзистор (например, BC547)
    (Коллектор) >|       |
           |   +---+---+
           |           ^ (Эмиттер)
           |           |
           |           |
 +5V -----|           |-----> GND (Земля Raspberry Pi)
           |           |
           |           V
           |       +-------+
           +------>| ЗУММЕР |
                   +-------+
                     (-) (+)

Важные моменты:

  • R1 (1 кОм): Токозадающий резистор, ограничивает ток на базу транзистора, защищая GPIO17.

  • NPN-транзистор: Действует как управляемый переключатель. База подключается через резистор к GPIO17. Эмиттер подключается к GND Raspberry Pi. Коллектор подключается к отрицательному выводу зуммера.

  • Активный зуммер: Обязательно соблюдайте полярность! Положительный вывод (+) зуммера подключается к пину +5V Raspberry Pi. Отрицательный вывод (-) зуммера подключается к коллектору NPN-транзистора.

Как скомпилировать программу

Для компиляции программы вам потребуется установленный компилятор GCC, библиотеки gtk+-3.0 и libgpiod.

  1. Убедитесь, что у вас установлены необходимые библиотеки:

    sudo apt update
    sudo apt install libgtk-3-dev libgpiod-dev
    
  2. Сохраните исходный код: Сохраните ваш C-код в файл, например, buzzer_app.c.

  3. Скомпилируйте программу с помощью следующей команды:

    gcc buzzer_app.c -o buzzer_app $(pkg-config --cflags --libs gtk+-3.0 gpiod)
    

    Эта команда компилирует buzzer_app.c, создавая исполняемый файл с именем buzzer_app. Опции pkg-config автоматически добавляют необходимые флаги компилятора и библиотеки для GTK+ и libgpiod.

Как запустить программу

После успешной компиляции вы можете запустить программу из терминала:

./buzzer_app

Если вы столкнулись с ошибками прав доступа, убедитесь, что ваш пользователь входит в группу gpio или что у вас настроены udev-правила для доступа к GPIO без sudo. В крайнем случае, для тестирования можно запустить с sudo, но это не рекомендуется для постоянного использования:

sudo ./buzzer_app

Что вы услышите?

В зависимости от выбранной мелодии, зуммер воспроизведёт следующие звуковые паттерны:

  • Мелодия 1: Два коротких писка разной длины (один короче, один длиннее), разделённые небольшой паузой.

  • Мелодия 2: Серия из четырёх коротких, равномерных писков с равными паузами между ними.

  • Мелодия 3: Два длинных писка, разделённые короткой паузой.

Как создать ярлык для запуска (опционально)

Чтобы сделать программу более удобной для запуска без терминала, вы можете создать файл .desktop.

  1. Создайте файл `.desktop`: Откройте текстовый редактор и создайте файл, например, /home/pi/.local/share/applications/buzzer_app.desktop (замените /home/pi на ваш домашний каталог, если он отличается).

    [Desktop Entry]
    Name=Buzzer Controller
    Comment=Control buzzer melodies on Raspberry Pi
    Exec=/path/to/your/buzzer_app
    Icon=/path/to/your/icon.png  (опционально, путь к иконке)
    Terminal=false
    Type=Application
    Categories=Utility;Education;
    

    Важно: * Замените /path/to/your/buzzer_app на полный путь к вашему скомпилированному исполняемому файлу (например, /home/pi/buzzer_project/buzzer_app). * Опционально укажите Icon= если у вас есть PNG-файл для иконки. * Terminal=false означает, что программа запустится без открытия терминала.

  2. Сделайте файл исполняемым:

    chmod +x /home/pi/.local/share/applications/buzzer_app.desktop
    

Теперь ярлык «Buzzer Controller» должен появиться в меню приложений (например, в категории «Утилиты» или «Образование») или на рабочем столе, если вы его туда перетащите.