Scare Trick-or-Treaters с самодельной звуковой коробкой, активируемой движением

Это снова время года, когда считается социально приемлемым пугать маленьких детей и дарить им конфеты. Ох радость Я здесь, чтобы облегчить вашу работу, показывая вам, как создать простую звуковую коробку Raspberry Pi Halloween для движения. Вот демо:

Вот то, что вам нужно

Вероятно, единственной деталью, которой у вас еще нет, является датчик движения, небольшая и недорогая деталь, которую вы сможете найти в местном микроцентре или на Maplin.

  • Raspberry Pi (подойдет любая модель).
  • Датчик движения (~ 3 доллара).
  • Соединительные провода.
  • Проводной динамик (большинство динамиков Bluetooth имеют возможность использовать линейный вход).
  • 3,5 мм стерео кабель, от мужчины к мужчине.

Как только вы закончите, вы можете добавить некоторые синхронизированные световые эффекты

тоже, но в этом уроке мы только немного расскажем о страшных звуках!

Настройка

Мы используем Raspbian Jessie Lite и Python 2.7, но любой дистрибутив Linux, работающий на вашем Pi, должен быть в порядке. Я оставил его на стандартном имени хоста «raspberrypi.local», поэтому начните с удаленного входа в систему с использованием SSH (откройте окно терминала, если вы работаете на Mac. Вот как это сделать в Windows

) — или если вы решили использовать полный Raspbian с настольным графическим интерфейсом, не стесняйтесь переходить к обновлению.

ssh pi@raspberrypi.local
(enter raspberry as the password)
sudo apt-get update
sudo apt-get install python-pip
sudo pip install gpiozero

Это устанавливает простую библиотеку для работы с выводами GPIO в Python со многими типами встроенных датчиков и кнопок. Подключите датчик с сигнальным контактом на GPIO4, VCC, подключенным к 5 В, и GND, подключенным к GND. Это может варьироваться в зависимости от вашей точной модели, поэтому подтвердите с помощью схемы распиновки.

Raspberry Pi GPIO DiagramИзображение предоставлено: raspberrypi.org

Полезно, что у моего корпуса Pi 2 от Pimoroni есть схема выводов, нанесенная лазером прямо на него.

С надписью Raspberry Pi чехол

Теперь давайте сделаем наш скрипт обнаружения движения.

nano motion.py

Вставить в:

from gpiozero import MotionSensor
pir = MotionSensor(4)
while True:
if pir.motion_detected:
print("Motion detected!")
else:
print ("No motion")

Нажмите CTRL-X, затем Y, чтобы сохранить и выйти, затем запустите:

python motion.py

Вы должны видеть сообщение «нет движения», повторяющееся на экране, пока вы не махнете рукой перед датчиком, когда оно будет задерживаться на «Обнаружено движение!»

Обнаружено движение в терминале

Если сообщение не меняется вообще, вы неправильно его подключили.

Если вам интересно узнать больше об этой простой библиотеке GPIOZero, взгляните на эту фантастическую таблицу.

Воспроизведение звука

Подключите портативный динамик и убедитесь, что он включен, если это необходимо. Мы будем использовать Pygame библиотека для воспроизведения звуков, так что давай и установим ее:

sudo apt-get install python-pygame

Во-первых, нам нужен звуковой файл для воспроизведения. Если вы делаете это из среды рабочего стола, тогда скачайте WAV или же OGG файл откуда-то (я нашел хороший выбор бесплатных звуков Хэллоуина здесь), и поместите его в свой домашний каталог. Я бы посоветовал сначала уменьшить частоту дискретизации и все равно конвертировать в небольшой формат OGG.

Если вы подключаетесь удаленно и используете только командную строку, у нас немного больше проблем с некоторыми сайтами, так как Wget Команда не может получить фактический файл. Вместо этого мы можем загрузить его локально на наш рабочий стол и использовать УПП (безопасное копирование) команда для копирования через командную строку. Вы можете узнать больше о scp здесь, но сейчас откройте новую вкладку Terminal и введите:

scp thunder.ogg pi@raspberrypi.local:

Переименуйте thunder.ogg соответствующим образом, но не забудьте этот финальный : (команда будет выполнена без нее, но она не будет делать то, что мы хотим). По умолчанию это перенесет файл в домашний каталог пользователя Pi.

Теперь давайте изменим скрипт для воспроизведения звука. Начните с импорта некоторых новых модулей:

import pygame.mixer
from pygame.mixer import Sound

Затем, сразу после существующих операторов импорта, мы будем повторять один и тот же звук снова и снова для целей тестирования. Оставьте остальную часть вашего кода, чувствительного к движению, как есть на данный момент — он просто не запустится, так как он застрянет в этом цикле воспроизведения звука навсегда.

pygame.init()
pygame.mixer.init()
#load a sound file, in the home directory of Pi user (no mp3s)
thunder = pygame.mixer.Sound("/home/pi/thunder.ogg")
while True:
thunder.play()
sleep(10)
thunder.stop()

Обратите внимание, что когда я первоначально попробовал этот процесс, звук отказывался воспроизводиться и просто щелкнул вместо этого. Размер файла или битрейта был виновником: он был 24-битным и более 5 МБ для 15-секундного клипа. Масштабирование до 16-битного с использованием преобразователя, с которым я связан выше, сделало все хорошо, а размер был уменьшен до 260 КБ!

Если вы замечаете неприятный шипение ваших ораторов во время работы приложения Python, но не иначе, введите:

sudo nano /boot/config.txt

И добавьте эту строку в конце:

disable_audio_dither=1

Перезапустите, чтобы изменения вступили в силу. Или не беспокойтесь, так как это все равно звучало как дождь для меня.

Наконец, давайте изменим основной цикл проверки движения, чтобы воспроизводить звук при обнаружении движения. Мы будем использовать 15-секундную задержку, чтобы можно было воспроизвести весь цикл и действовать в качестве спам-буфера для случаев, когда есть много безостановочного движения.

while True:
if pir.motion_detected:
print("Motion detected!")
thunder.play()
# ensure playback has been fully completed before resuming motion detection, prevents "spamming" of sound
sleep(15)
thunder.stop()
else:
print ("No motion")

Начать автоматически

Вероятно, мы хотим установить это где-нибудь с батареей и без подключения к интернету, поэтому скрипт должен запускаться при перезапуске без необходимости открывать командную строку. Для этого мы воспользуемся самым простым способом: crontab

, Тип:

sudo crontab -e

Если вы впервые запускаете эту команду, она спросит вас, какой редактор использовать. Я выбрал вариант 2 для нано. Он загрузится в выбранный вами редактор, поэтому добавьте следующую строку:

@reboot python /home/pi/motion.py &

Это означает, что ваш сценарий motion.py будет запускаться при каждом запуске, и будет выполняться без вывода сообщений (поэтому любые выходные данные из сценария будут игнорироваться). Перезагрузитесь, чтобы попробовать это.

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

Добавить больше звуков

Повторять один и тот же эффект немного скучно, поэтому давайте добавим немного случайности. Загрузите еще несколько звуков Хэллоуина, не забывая уменьшать их до разумного размера и битрейта, а затем отправляйте их своему Пи, используя УПП как прежде. Я добавил три разных типа крика.

Измените код так, чтобы вместо определения одной переменной pygame.mixer.Sound мы фактически создавали массив звуков. С Python это просто, просто заключите их в квадратные скобки, разделив их запятыми, например:

sounds = [
pygame.mixer.Sound("/home/pi/thunder.ogg"),
pygame.mixer.Sound("/home/pi/scary_scream.ogg"),
pygame.mixer.Sound("/home/pi/girl_scream.ogg"),
pygame.mixer.Sound("/home/pi/psycho_scream.ogg")
]

Затем импортируйте случайную библиотеку в ваш файл:

import random

Теперь измените основной цикл обнаружения движения следующим образом:

while True:
if pir.motion_detected:
print("Motion detected!")
playSound = random.choice(sounds)
playSound.play()
# ensure playback has been fully completed before resuming motion detection, prevents "spamming" of sound
sleep(15)
playSound.stop()
else:
print ("No motion")

Обратите внимание на незначительное изменение: вместо воспроизведения одной переменной Sound, мы используем random.choice функция, чтобы выбрать случайный звук из нашего массива звуков, а затем воспроизводить его.

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

import pygame
from pygame.mixer import Sound
from gpiozero import MotionSensor
from time import sleep
import random
pygame.init()
pygame.mixer.init()
#load a sound file, same directory as script (no mp3s)
sounds = [
pygame.mixer.Sound("/home/pi/thunder.ogg"),
pygame.mixer.Sound("/home/pi/scary_scream.ogg"),
pygame.mixer.Sound("/home/pi/girl_scream.ogg"),
pygame.mixer.Sound("/home/pi/psycho_scream.ogg")
]
pir = MotionSensor(4)
while True:
if pir.motion_detected:
print("Motion detected!")
playSound = random.choice(sounds)
playSound.play()
# ensure playback has been fully completed before resuming motion detection, prevents "spamming" of sound
sleep(15)
playSound.stop()
else:
print ("No motion")

Только с четырьмя сэмплами высока вероятность повторения каждый раз, но вы можете добавить больше сэмплов, если это раздражает.

Это оно! Спрячь его в кустах с помощью страшных светодиодных глаз монстра

и вы сможете сэкономить немного конфет, так как все дети убежали с криками, даже не дойдя до двери. Или спрячьтесь в шкафу, потому что злая мама жаждет крови после того, как вы заставили маленького Джонни плакать.

Отказ от ответственности: MakeUseOf не несет ответственности за любые травмы, которые могут возникнуть в результате использования вами этого проекта!

Будете ли вы делать эту звуковую коробку, активируемую движением, чтобы напугать местных трюков? Вы настроили какие-нибудь страшные эффекты с Raspberry Pi в этот Хэллоуин? Пожалуйста, дайте нам знать об этом в комментариях ниже!

Ссылка на основную публикацию