В данной статье мы рассмотрим как с помощью библиотеки PyGame (PyGame Library) и платы Raspberry Pi воспроизводить звуки. В этом проекте мы к контактам Raspberry Pi подсоединим несколько кнопок – при нажатии этих кнопок плата будет воспроизводить аудиофайлы, записанные в ее памяти. Аудиофайлы можно будет воспроизводить как последовательно, один за другим, так и совместно. То есть если мы нажмем одну кнопку, то плата Raspberry Pi будет воспроизводить один аудиофайл, а если нажмем несколько кнопок, то плата Raspberry Pi будет воспроизводить сразу несколько аудиофайлов. Более подробно все эти процессы можно посмотреть на видео, приведенном в конце статьи.
Схема расположения контактов ввода/вывода (GPIO) на плате Raspberry Pi показана на следующем рисунке. Более подробно об этих контактах вы можете прочитать в статье про мигание светодиода с помощью Raspberry Pi.
Каждый из 17 универсальных контактов ввода/вывода (GPIO) может выдерживать ток до 15mA. А суммарный ток от всех контактов ввода/вывода не должен превышать 50mA – таким образом, в среднем на каждый контакт будет приходиться ток примерно 3mA. В этом проекте мы будем использовать резисторы для ограничения тока через контакты платы Raspberry Pi.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- Громкоговоритель.
- Резистор 1 кОм – 6 шт. (купить на AliExpress).
- Кнопка – 6 шт.
- Конденсатор 1000 мкФ (купить на AliExpress).
- Источник питания.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Объяснение работы проекта
В этом проекте мы будем воспроизводить звуки (аудиофайлы) при помощи нажатия кнопок, подключенных к плате Raspberry Pi. Мы будем использовать 6 кнопок для воспроизведения 6 аудиофайлов. При желании, вы можете увеличить количество кнопок и проигрываемых аудиофайлов в этом проекте.
Для реализации данного проекта, прежде всего, выполните следующую последовательность шагов:
1. Скачайте 6 аудиофайлов по следующей ссылке. Вместо них вы также можете использовать и свои собственные аудиофайлы, но тогда вам необходимо будет изменить имена используемых файлов в программе.
2. Создайте новую папку на рабочем столе Raspberry Pi OS и назовите ее “PI SOUND BOARD”.
3. Распакуйте скачанный архив с аудиофайлами в эту папку.
4. Откройте окно терминала в Raspberry Pi OS и введите там следующую команду:
1 |
sudo amixer cset numid=3 1 <press enter> |
Эта команда сообщает плате Raspberry Pi задействовать аудиовыход на своем разъеме 3.5mm audio jack.
Если же вы хотите задействовать аудиовыход на HDMI порту платы, то тогда вам необходимо использовать следующую команду:
1 |
$ sudo amixer cset numid=3 2 <press enter> |
5. Подключите громкоговоритель к разъему 3.5mm audio output jack на плате Raspberry Pi.
6. Создайте PYTHON файл (расширение *.py) и сохраните его в той же самой папке.
7. Программа Pygame mixer должна быть установлена в Raspberry Pi OS по умолчанию. Если программа этого проекта не вызывает PYMIXER, обновите Raspberry Pi OS до последней версии с помощью следующей команды (убедитесь что плата подключена к сети Интернет прежде чем выполнять эту команду):
1 |
sudo apt-get update <press enter> |
Подождите несколько минут пока Raspberry Pi OS обновится.
После этого соберите аппаратную часть проекта, скопируйте программу на Python (приведена в конце статьи) в созданный на рабочем столе файл Python, запустите ее на выполнение, потом нажимайте кнопки и наслаждайтесь воспроизведением звуков.
Схема проекта
Схема проекта для воспроизведения звуков на Raspberry Pi представлена на следующем рисунке.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.
В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.
1 |
import RPi.GPIO as IO |
Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.
1 |
IO.setwarnings(False) |
Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. В представленной выше распиновке контактов ввода/вывода можно увидеть, к примеру, что обозначение GPIO19 соответствует контакту PIN 35. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘35’, либо по номеру ‘19’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:
1 |
IO.setmode (IO.BCM) |
Далее подключим библиотеку pygame mixer чтобы иметь возможность воспроизводить аудиофайлы.
1 |
import pygame.mixer |
Затем мы будем воспроизводить файл ‘buzzer.wav’, который находится в созданной папке на рабочем столе. Если вы хотите воспроизвести другой аудиофайл, просто измените имя файла в приведенной функции.
1 |
audio1 = pygame.mixer.Sound("buzzer.wav") |
Далее мы установим канал для каждой кнопки чтобы мы могли воспроизводить несколько аудиофайлов одновременно.
1 |
channel1 = pygame.mixer.Channel(1) |
Далее мы проверяем условие, если оно истинно, то выражение, следующее за ним, выполнится один раз. То есть если на GPIO21 будет напряжение низкого уровня (low) (а это произойдет если нажать первую кнопку в схеме), то мы воспроизведем аудиофайл, ассоциированный с переменной audio1. Аналогичным образом при нажатии других кнопок мы сможем воспроизводить другие файлы.
1 2 |
if (IO.input(21) == 0): channel1.play(audio1) |
while 1: с помощью этой команды мы будем формировать бесконечный цикл, внутри которой команды будут исполняться непрерывно.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import pygame.mixer # подключаем библиотеку pygame mixer для воспроизведения аудиофайлов import time # подключение библиотеки для работы с задержками import RPi.GPIO as IO # подключение библиотеки для работы с контактами ввода/вывода IO.setwarnings(False) # отключаем показ любых предупреждений IO.setmode(IO.BCM) # мы будем программировать контакты GPIO по их функциональным номерам (BCM), то есть мы будем обращаться к PIN29 как ‘GPIO5’ IO.setup(21, IO.IN) # инициализируем GPIO21 в качестве цифрового входа IO.setup(20, IO.IN) # инициализируем GPIO20 в качестве цифрового входа IO.setup(16, IO.IN) # инициализируем GPIO16 в качестве цифрового входа IO.setup(12, IO.IN) # инициализируем GPIO12 в качестве цифрового входа IO.setup(25, IO.IN) # инициализируем GPIO25 в качестве цифрового входа IO.setup(23, IO.IN) # инициализируем GPIO23 в качестве цифрового входа pygame.mixer.init(48000, -16, 1, 1024) # инициализируем audio mixer audio1 = pygame.mixer.Sound("buzzer.wav") # ассоциируем переменную с аудиофайлом audio2 = pygame.mixer.Sound("cartoon002.wav") # ассоциируем переменную с аудиофайлом audio3 = pygame.mixer.Sound("baby_x.wav") # ассоциируем переменную с аудиофайлом audio4 = pygame.mixer.Sound("ahem_x.wav") # ассоциируем переменную с аудиофайлом audio5 = pygame.mixer.Sound("clap.wav") audio6 = pygame.mixer.Sound("baseball_hit.wav") channel1 = pygame.mixer.Channel(1) # используем 1-й канал для 1-й кнопки channel2 = pygame.mixer.Channel(2) # используем 2-й канал для 2-й кнопки channel3 = pygame.mixer.Channel(3) # используем 3-й канал для 3-й кнопки channel4 = pygame.mixer.Channel(4) # используем 4-й канал для 4-й кнопки channel5 = pygame.mixer.Channel(5) # используем 5-й канал для 5-й кнопки channel6 = pygame.mixer.Channel(6) # используем 6-й канал для 6-й кнопки while 1: # бесконечный цикл if (IO.input(21) == 0): channel1.play(audio1) # если нажата кнопка 1 воспроизводим 1-й аудиофайл if (IO.input(20) == 0): channel2.play(audio2) # если нажата кнопка 2 воспроизводим 2-й аудиофайл if (IO.input(16) == 0): channel3.play(audio3) # если нажата кнопка 3 воспроизводим 3-й аудиофайл if (IO.input(12) == 0): channel4.play(audio4) if (IO.input(25) == 0): channel5.play(audio5) if (IO.input(23) == 0): channel6.play(audio6) time.sleep(.01) # задержка на 100ms |