Глава 5: Управление зуммером с помощью GTK+ и libgpiod
В этой главе мы создадим полноценное графическое приложение для Raspberry Pi, позволяющее управлять активным зуммером и воспроизводить различные звуковые паттерны. Мы будем использовать библиотеку GTK+ для создания пользовательского интерфейса и libgpiod для взаимодействия с GPIO.
—
Обзор программы
Наша программа представляет собой простое приложение с графическим интерфейсом, которое позволяет выбрать одну из трёх предопределённых мелодий и воспроизвести её через активный зуммер, подключённый к GPIO Raspberry Pi.
—
Как работает GUI (графический интерфейс пользователя)
Интерфейс программы состоит из следующих элементов:
Заголовок окна: «Buzzer Melody».
Радиокнопки: Три кнопки с метками «Мелодия 1», «Мелодия 2» и «Мелодия 3». Эти кнопки позволяют выбрать, какая мелодия будет проиграна. При выборе одной из них, переменная в программе selected_melody обновляется соответствующим значением.
Кнопка «Проиграть»: При нажатии на эту кнопку, выбранная в радиокнопках мелодия воспроизводится.
Принцип работы прост: пользователь выбирает мелодию, затем нажимает «Проиграть», и зуммер издаёт соответствующий звук.
—
Как работает программа (логика)
Программа состоит из нескольких ключевых компонентов:
Инициализация GPIO: При запуске программа открывает чип gpiochip0 и запрашивает линию GPIO 17 (пин, к которому подключён зуммер) как выходной. Это делается с помощью библиотеки libgpiod, которая предоставляет современный и надёжный способ взаимодействия с GPIO в Linux.
Управление зуммером: Функции buzzer_on() и buzzer_off() отвечают за установку высокого или низкого уровня на GPIO-пине, тем самым включая или выключая зуммер.
Воспроизведение мелодий: Функция play_melody() содержит логику для трёх различных звуковых паттернов. В зависимости от выбранной мелодии, она вызывает buzzer_on() и buzzer_off() с различными задержками (usleep) для создания уникальных звуковых последовательностей.
Обработка событий GUI: * Когда вы выбираете радиокнопку, срабатывает функция on_melody_selected(), которая обновляет глобальную переменную selected_melody. * Когда вы нажимаете кнопку «Проиграть», вызывается функция on_play_clicked(), которая, в свою очередь, запускает play_melody() с текущим значением selected_melody.
Очистка ресурсов: При закрытии окна программы функция 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.
Убедитесь, что у вас установлены необходимые библиотеки:
sudo apt update sudo apt install libgtk-3-dev libgpiod-dev
Сохраните исходный код: Сохраните ваш C-код в файл, например, buzzer_app.c.
Скомпилируйте программу с помощью следующей команды:
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.
Создайте файл `.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 означает, что программа запустится без открытия терминала.
Сделайте файл исполняемым:
chmod +x /home/pi/.local/share/applications/buzzer_app.desktop
Теперь ярлык «Buzzer Controller» должен появиться в меню приложений (например, в категории «Утилиты» или «Образование») или на рабочем столе, если вы его туда перетащите.