Глава 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-транзистор в качестве переключателя. .. code-block:: text 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. **Убедитесь, что у вас установлены необходимые библиотеки:** .. code-block:: bash sudo apt update sudo apt install libgtk-3-dev libgpiod-dev 2. **Сохраните исходный код**: Сохраните ваш C-код в файл, например, `buzzer_app.c`. 3. **Скомпилируйте программу** с помощью следующей команды: .. code-block:: bash gcc buzzer_app.c -o buzzer_app $(pkg-config --cflags --libs gtk+-3.0 gpiod) Эта команда компилирует `buzzer_app.c`, создавая исполняемый файл с именем `buzzer_app`. Опции `pkg-config` автоматически добавляют необходимые флаги компилятора и библиотеки для GTK+ и `libgpiod`. --- Как запустить программу ------------------------ После успешной компиляции вы можете запустить программу из терминала: .. code-block:: bash ./buzzer_app Если вы столкнулись с ошибками прав доступа, убедитесь, что ваш пользователь входит в группу `gpio` или что у вас настроены `udev`-правила для доступа к GPIO без `sudo`. В крайнем случае, для тестирования можно запустить с `sudo`, но это не рекомендуется для постоянного использования: .. code-block:: bash sudo ./buzzer_app --- Что вы услышите? ------------------ В зависимости от выбранной мелодии, зуммер воспроизведёт следующие звуковые паттерны: * **Мелодия 1**: Два коротких писка разной длины (один короче, один длиннее), разделённые небольшой паузой. * **Мелодия 2**: Серия из четырёх коротких, равномерных писков с равными паузами между ними. * **Мелодия 3**: Два длинных писка, разделённые короткой паузой. --- Как создать ярлык для запуска (опционально) ------------------------------------------- Чтобы сделать программу более удобной для запуска без терминала, вы можете создать файл `.desktop`. 1. **Создайте файл `.desktop`**: Откройте текстовый редактор и создайте файл, например, `/home/pi/.local/share/applications/buzzer_app.desktop` (замените `/home/pi` на ваш домашний каталог, если он отличается). .. code-block:: ini [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. **Сделайте файл исполняемым**: .. code-block:: bash chmod +x /home/pi/.local/share/applications/buzzer_app.desktop Теперь ярлык "Buzzer Controller" должен появиться в меню приложений (например, в категории "Утилиты" или "Образование") или на рабочем столе, если вы его туда перетащите.