Вы когда-нибудь задумывались, как издают звуки эти крошечные плюшевые мишки? Скорее всего, вы слушали пьезоэлектрический динамик. Вы можете самостоятельно воспроизводить звуки и музыку, используя пьезодинамик вместе с Raspberry Pi!
Также читайте: Как использовать кнопки с контактами GPIO Raspberry Pi
Что такое пьезодинамик?
Пьезодинамики содержат специальный материал, называемый «пьезоэлементом», который способен проявлять пьезоэлектрический эффект — процесс генерирует электрический заряд, когда вы ударяете о что-то твердое.
Contents
Что такое пьезодинамик?
.ru/wp-content/uploads/2024/05/squeezed-vs-unsqueezed-crystal-in-a-piezo-element-1.png" alt="Сжатый и несжатый кристалл в пьезоэлементе 1">Многие твердые предметы, такие как камни или соль, являются твердыми, потому что их атомы плотно упакованы вместе. Такое расположение называется «кристаллической структурой».
В некоторых материалах кристаллические структуры могут изгибаться или сжиматься при приложении к ним достаточной силы. Это заставляет некоторые атомы оставаться рядом с другими атомами, рядом с которыми они обычно не располагаются.
В пьезоэлектрических материалах или пьезоэлементах эти атомы имеют противоположные заряды: один положительный, другой отрицательный. В тот момент, когда эти атомы с противоположными зарядами сближаются, возникает электричество.
Вы также можете сделать обратное — применить электрическое поле к пьезоэлементам, чтобы заставить кристаллические структуры изгибаться, изменяя общую форму материала. При использовании пьезодинамика внутренний пьезоэлемент сжимается и расширяется так быстро, что он вибрирует и издает звук.
Читайте также: Как управлять Raspberry Pi через Windows через SSH
Что вам нужно для проекта
Использовать пьезодинамики с Raspberry Pi для создания звука так же просто, как заставить светодиоды мигать . Вам просто нужно несколько вещей и другой код. Резистор вам не понадобится.
- Пьезодинамики
- 2 перемычки «папа-гнездо».
- Малиновый Пи
Как использовать пьезодинамик с Raspberry Pi
- Откройте свой любимый редактор кода и вставьте следующий код:
# The frequencies in this code was based on the note frequencies found at: # https://pages.mtu.edu/~suits/notefreqs.html # Tuned at A4 = 440Hz. import RPi.GPIO as GPIO from time import sleep GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(7, GPIO.OUT) pin7 = GPIO.PWM(7, 100) pin7.start(50) while True: GPIO.output(7, GPIO.HIGH) pin7.ChangeFrequency(16.35) # C0 sleep(1) pin7.ChangeFrequencyЧто вам нужно для проектаan>) # C4 sleep(1) pin7.ChangeFrequency(293.66) # D4 sleep(1) pin7.ChangeFrequency(329.63) # E4 sleep(1) pin7.ChangeFrequency(349.23) # F4 sleep(1) pin7.ChangeFrequency(392.00) # G4 slКак использовать пьезодинамик с Raspberry Pi
ChangeFrequency(440.00) # A4 sleep(1) pin7.ChangeFrequency(493.88) # B4 sleep(1) pin7.ChangeFrequency(523.25) # A5 sleep(1.5) pin7.ChangeFrequency(16.35) # C0 sleep(1) GPIO.output(7, GPIO.LOW) sleep(1)
- Сохраните файл как «rpi-piezo.py» или любое другое имя, если оно заканчивается расширением «.py», а затем выключите Raspberry Pi.
- Теперь пришло время построить схему. Подключите положительный контакт или провод к контакту 7, а другой контакт — к GND. Некоторые пьезоэлементы имеют знак «+», показывающий, какой вывод положительный. У других торчат провода – как всегда, красный провод означает плюс.
Если у вас возникли проблемы с поиском контакта 7, держите Raspberry Pi так, чтобы контакты GPIO торчали вправо, а затем посмотрите на контакты GPIO. Левый верхний контакт должен быть контактом 1, а справа — контактом 2. Под контактом 1 — контакт 3, справа — контакт 4 и т. д.
- Включите Raspberry Pi и откройте терминал.
- Перейдите в папку, в которой вы сохранили «rpi-piezo.py», через терминал, используя
cd
. Вот пример:cd MTE/experiments/rpi-piezo
. В папке «rpi-piezo» находится наш скрипт «rpi-piezo.py».
- Теперь пришло время запустить скрипт Python. Введите
python3 rpi-piezo.py
и послушайте звуки гаммы до мажор!
Читайте также: Как превратить Raspberry Pi в станцию для видеоконференций
Пояснение кода
На первый взгляд код может показаться беспорядочным, поэтому давайте разделим его на три части:
- Команды импорта
- Команды настройки
- Зацикленные команды
Это не стандартизированная группировка — она была создана потому, что всегда полезно разделять код на легко идентифицируемые части. Это упрощает задачу, когда вы пытаетесь изменить какую-либо часть кода.
Команды импорта
Здесь вы определяете, какие модули вы «импортируете» в свой код. Команды импорта состоят из двух строк кода.
import RPi.GPIO as GPIO from time import sleep
import RPi.GPIO as GPIO
сообщает Python, что вы используете модуль RPi.GPIO для управления выводами GPIO Raspberry Pi. as GPIO
сообщает ему, что всякий раз, когда вы вызываете переменную GPIO
, вы вызываете модуль RPi.GPIO.
from time import sleep
— это еще один способ вызова модулей. Но вместо того, чтобы использовать весь модуль, вы просто импортируете функцию sleep()
из модуля time
. Это может очень помочь с точки зрения производительности, поскольку Python не придется загружать весь модуль; он просто использует эту функцию.
Читайте также: Как установить Windows 11 на Raspberry Pi 4
Команды настройки
В коде команд настройки вы «настраиваете» или определяете все важные части вашей программы, такие как переменные, настройки и обозначения контактов. Их необходимо определить только один раз.
GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(7, GPIO.OUT) pin7 = GPIO.PWM(7, 100) pin7.start(50)
GPIO.setwarnings(False)
предотвращает появление предупреждений при запуске кода. Предупреждения по-прежнему отображаются, когда ваш код выполняется успешно, но добавление этого фрагмента кода предотвращает переполнение терминала предупреждающими сообщениями каждый раз, когда вы вводите python3 rpi-piezo.py
. Но это скорее личное предпочтение — вы можете просто удалить этот бит, если хотите видеть предупреждения. Он работает по-прежнему.
GPIO.setmode(GPIO.BOARD)
сообщает Python, как вы хотите, чтобы были названы контакты ввода-вывода общего назначения (GPIO) вашего Raspberry Pi. Есть два способа: BOARD и BCM.
- BOARD – это
Пояснение кода
тором контактам присваиваются имена на основе их номеров. Здесь контакт 1 находится вверху слева, контакт 2 рядом с ним, контакт 3 ниже контакта 1 и так далее. - BCM означает Broadcom. Вместо физических номеров контактов BCM выбирает свой канал Broadcom SOC. Этот формат именования отличается от платы к плате, поэтому ему может быть немного сложнее следовать, если вы используете BCM в руководстве.
GPIO.setup(7, GPIO.OUT)
сообщает Python, что вы используете контакт 7 в качестве выхода.
pin7 = GPIO.PWM(7, 100)
создает переменную pin7
, содержащую строку GPIO.PWM(7, 100)
. Это сократит ваш код, и вы сможете просто испо
Команды импорта
e>вместо того, чтобы постоянно вызыватьGPIO.PWM(7, 100)
.
Наконец, pin7.start(50)
устанавливает контакт 7 в режим ШИМ (широтно-импульсной модуляции). Это означает, что всякий раз, когда контакт 7 установлен на HIGH
, половину времени он выдает напряжение 3,3 В. В остальное время он ничего не излучает (или находится на уровне 0 В).
Зацикленные команды
Зацикленные команды выполняются циклически — они повторяются до тех пор, пока скрипт работает. Для этого вам необходимо оставить отступ после while True:
.
while True: GPIO.output(7, GPIO.HIGH) pin7.ChangeFrequency(16.35) # C0 sleep(1) pin7.ChangeFrequency(261.63) # C4 sleep(1) pin7.ChangeFrequency(293.66) # D4 sleep(1) pin7.ChangeFrequency(329.63) # E4 sleep(1) pin7.ChangeFrequency(349.23) # F4 sleep(1) pin7.ChangeFrequency(392.00Команды настройкиG4 sleep(1) pin7.ChangeFrequency(440.00) # A4 sleep(1) pin7.ChangeFrequency(493.88) # B4 sleep(1) pin7.ChangeFrequency(523.25) # A5 sleep(1.5) pin7.ChangeFrequency(16.35) # C0 sleep(1) GPIO.output(7, GPIO.LOW) sleep(1)
GPIO.output(7, GPIO.HIGH)
переключает контакт 7 на HIGH
. Этот вывод работает и выдает сигнал ШИМ. Функция GPIO.output()
принимает два параметра: номер контакта и то, хотите ли вы установить его: HIGH
или LOW
. Если вы перейдете к нижней части, вы найдете GPIO.output(7, GPIO.LOW)
, который делает обратное — переключает контакт 7 на LOW
.
Строки кода между ними представляют собой последовательность pin7.ChangeFrequency()
и sleep(1)
. Настройка их параметров позволяет воспроизводить разные типы нот.
pin7.ChangeFrequency()
на самом деле является сокращенной формой GPIO.PWM(7, 100).ChangeFrequency()
. Использование формы быстрого доступа упрощает смену используемого вами PIN-кода. Если бы вы не определили pin7 = GPIO.PWM(7, 100)
ранее, вам пришлось бы менять номер контакта при каждом изменении частоты.
Читайте также: Монитор Raspberry Pi не работает? Попробуйте эти исправления
То, что внутри .ChangeFrequency()
— это частота ШИМ-сигнала и, следовательно, пьезоэлемент. Помните, что пьезоэлемент — это всего лишь твердый кристалл, который слегка сжимается, когда через него пропускают электричество, и расслабляется, когда вы останавливаетесь. Быстрое сокращение и расслабление издают звуки разной высоты, и вы можете контролировать ее, изменяя число внутри .ChangeFrequency()
. Чтобы вам было проще, после каждого pin7.ChangeFrequency()
есть комментарий, указывающий, что это за нота.
Наконец, sleep(1)
приостанавливает выполнение кода на одну секунду. Если вы приостановите выполнение кода после изменения частоты, по сути, у вас будет одна нота — она будет воспроизводиться до тех пор, пока вы сохраняете код спящим.
Читайте также: Как программировать Arduino через код Visual Studio с использованием PlatformIO
Как создается звук
Как все это превращается из вибрирующего пьезоэлемента в звук, а затем превращается во что-то, напоминающее музыку? Все дело в частоте и высоте тона.
То, что мы воспринимаем ушами как звуки, на самом деле является вибрациями в воздухе. Чем сильнее вибрирует воздух, тем выше высота звука. Мы изображаем это на бумаге в виде волн различной формы и присваиваем единице измерения СИ, то есть единице измерения: Гц (что означает Герц). Звуковые волны с большим количеством Гц вибрируют быстрее, чем с меньшим. Мы, люди, можем слышать звуковые волны Зацикленные команды10924/" target="_blank" rel="noopener" title="вибрация где-то между 20 Гц и 20 000 Гц">вибрация где-то между 20 Гц и 20 000 Гц .
Когда вы использовали ChangeDutyCycle()
, вы меняли количество вибраций пьезоэлемента с течением времени, то есть частоту. Гц – это мера частоты колебаний воздуха.
Чтобы изменить звук так, чтобы он хотя бы напоминал музыку, нужно определенным образом изменить частоту. Другими словами, вам нужно изменить высоту звука. В отличие от частоты, высота тона — это мера того, насколько высоко или низко звук звучитдля наших ушей. Изменяя высоту звука, вы уже делаете что-то близкое к музыке.
Конечно, создание музыки – это нечто большее, чем просто изменение высоты тона. Чтобы сделать ноту, вам также понадобится длительность тона. Вот тут и используется sleep()
— вы заставляете Raspberry Pi оставаться на заданной высоте в течение определенного времени, чтобы дать вам правильную ноту!
Также читайте: Как запрограммировать Arduino с помощью Raspberry Pi
Часто задаваемые вопросы
В чем разница между пьезодинамиком и магнитным динамиком?
Пьезодинамики используют вибрирующий пьезоэлемент для воспроизведения звука. Обычно они изготавливаются из керамики и обычно используются в зуммерах. Между тем, в магнитных динамиках используются электромагниты, которые вибрируют пластиковые мембраны. Они используются в смартфоны и гарнитуры .
Есть ли полярность у пьезоэлементов?
Технически да. Пьезоэлемент внутри пьезодинамиков изгибается в одну сторону, если подать напряжение с одной стороны, и в другую, если повернуть его в обратную сторону.
Помимо динамиков, для чего еще используются пьезоэлементы?
Практически все, что связано с давлением и вибрацией, имеет пьезоэлементы. Сюда входят акселерометры , микрофоны, гитарные звукосниматели и динамики. Но есть и одна необычная вещь: в зажигалках с их помощью образуется искра, которая зажигает пламя.
Фотографии и скриншоты Теренца Йомара Дела Круза