Rasberry Pi에 연결된 사운드 센서가 반응하면 음악을 틀어보세요.
14709 단어 RasberryPI사운드 센서
이번 보도는 지난번 기사(Rasberry Pi와 사운드 센서 결합)의 후속이다.
'아기가 울면 랜덤 음악을 틀어준다'는 앱은 래피가 구축한다.
※ 사운드 센서만 사용하려는 사람은 지난번 기사를 참고하면 됩니다.
이 메커니즘을 세우기 위해서는 반드시 다음과 같은 일을 해야 한다.
1. Rasberry Pi로 음악 연주
2. 사운드센서로 감지
3. 센서 감지 후 랜덤 트랙 선택
기다리다
지난번까지'1. 래스베리 피로 음악 재생'과'2. 사운드센서로 감지'가능
이번에는'3. 센서를 감지한 후 무작위 곡을 선택한다'는 데 초점을 맞췄다.
환경(준비물)
・Python
・Rasberry Pi
• USB 미니 스피커(DAISO 시스템)
· 사운드 센서 (Grove Loudness Sensor)
・점퍼 케이블(Bus)
※ 사운드 센서가 여기.에서 튀어나왔다.
※ 점프선(모선)은 여기. 볼록점입니다.
이번에 하고 싶은 거.
첫 번째 기사에서는'특정 음악을 틀다'고 할 수 있다.
매번 같은 음악을 들으면 질리기 때문에 다음과 같은 방법을 해보고 싶어요.
"특정 폴더에 저장된 음악 파일에서 임의의 음악을 재생합니다"
그렇다면 지난번까지의 기사를 다시 읽으면 현재 상황은 다음과 같은 일을 할 수 있을 것 같다.
• 사운드 센서 반응 시
• 특정 음악 재생
아무래도 이루고 싶은 일과 할 수 있는 일 사이의 차이는'임의의 음악을 틀다'라는 부분만 빼면 된다.
임의의 악곡 파일 이름 얻기
특정 폴더에 저장된 음악 파일에서 임의의 음악을 재생하는 요소를 분해해 보세요
이 어쨌든 만족 이하의 일은 곧 실현될 수 있을 것이다.
• 특정 폴더에 저장된 음악 파일에서 노래 한 곡 추출
• 추출된 곡을 플레이어에 전달
이걸로 하자.
그중'·특정 폴더에 저장된 음악 파일에서 노래 한 곡을 뽑는다'는 느낌으로 완성됐다.
음악 파일은 '/home/pi/work/mp3' 폴더에서 mp3 확장자로 설정됩니다.
def get_music():
musicFiles = [r.split('/')[-1] for r in glob.glob('/home/pi/work/mp3/*.mp3')]
musicName = random.choice(musicFiles)
return musicName
간단하게 설명해 드릴게요.musicFiles = [r.split('/')[-1] for r in glob.glob('/home/pi/work/mp3/*.mp3')]
상기 처리는 '/홈/pi/work/mp3' 에 저장된 모든 mp3 파일 이름을 가져오는 처리입니다.요소를 분할한 후
'glob.glob('/home/pi/work/mp3/*.mp3')'부분에서 파일 이름을 얻을 수 있습니다.
하지만 이렇게 되면 얻은 파일 이름은 다음과 같다.
・/home/pi/work/mp3/XXX.mp3
・/home/pi/work/mp3/YYY.mp3
・/home/pi/work/mp3/ZZ.mp3
그러나 원하는 것은'XXX.mp3'또는'YYY.mp3'의 파일 이름이며 폴더 이름은 필요하지 않습니다.
따라서 이 파일들을 변수 r에 임시로 저장하고 반복(for in) 처리합니다.
반복적으로 어떤 처리를 한다면, '/home/pi/work/mp3/' 를 삭제하고 순수한 파일 이름만 얻습니다.
r.split('/')[-1]
위에서 설명한 대로 문자열을/로 구분할 수 있습니다.'홈','pi','work','mp3','XXX.mp3'다섯 문자열로 나눌 수 있다.(split 함수 처리)
그 중에서 가장 오른쪽에 있는'XXX.mp3'문자열을 원하기 때문에 [1]에서 가장 오른쪽에 있는 문자열을 얻는다.
하면, 만약, 만약...
r.split('/')[1]
맨 왼쪽 문자열을 얻을 수 있기 때문에 '홈' 을 얻을 수 있습니다.(양의 수는 왼쪽에서 시작한다. 음의 수는 오른쪽에서 값을 얻는다. 느낌이 이렇다.)
이 변수'musicFiles'에는 파일 이름 일람(XXX.mp3, YY.mp3, ZZ.mp3)이 저장되어 있기 때문에 임의의 것을 추출합니다.
musicName = random.choice(musicFiles)
이렇게 처리합니다.임의의 파일 이름을 선택하여 호출 원본으로 되돌려줍니다.
음악 재생 처리
음악을 트는 방법은 첫 번째 기사를 참고하여 다음과 같은 느낌으로 하는 것이 좋다.
def play_music(musicName):
musicFile = '/home/pi/work/mp3/' + musicName
#音楽のメタ情報を取得する
#MP3関数を使うには「from mutagen.mp3 import MP3」を指定しておくこと
audio = MP3(musicFile)
#音楽の長さを表示する
print (audio.info.length)
#音楽を再生する
command = 'omxplayer ' + musicFile
proc = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE)
#-- 音楽が終わるまで(音楽の長さ分)センサー反応を止める処理() --
time.sleep(audio.info.length)
#-------------------------------------
#終了処理
proc.stdin.write("q")
주석에 이미 기재되어 있으며, 각 함수의 해설은 여기서 하지 않는다.아까의 함수와 달리 한 줄도 여러 가지 처리를 채우지 않았기 때문에 비교적 읽기 쉽다.
그냥
처음에 "musicFile='/home/pi/work/mp3/'+musicName"처럼
곡명으로 선택한 방법으로'/home/pi/work/mp3/'부분을 특별히 분할하지 않아도 됩니다.
오하이오
만들어진 서류는 여기 있습니다.
따라서 나중에 작성한 서류를 올려놓는다.
나는 raspi에 설정된 파일을 고스란히 올렸다.
댓글이 더럽고 같은 모듈도 여러 번 가져왔으니 너그러운 눈으로 보세요.
otosensor_music_new.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SEN02281P ----- RaspberryPi GPIO
# =SIG ---------- 13
# =NC
# =VCC ---------- 2
# =GND ---------- 20
#import paho.mqtt.client as mqtt
import time
import RPi.GPIO as GPIO
import subprocess
import time
from mutagen.mp3 import MP3
import glob
import random
#def on_connect(client,userdata,flags,rc):
# print( "Connection with result code " + str(rc) )
# client.subscribe( "sen02281p_1" )
#
#def on_message(client,userdata,msg):
# print( msg.topic + " " + str(msg.payload) )
def get_music():
musicFiles = [r.split('/')[-1] for r in glob.glob('/home/pi/work/mp3/*.mp3')]
musicName = random.choice(musicFiles)
return musicName
def play_music(musicName):
musicFile = '/home/pi/work/mp3/' + musicName
audio = MP3(musicFile)
print (audio.info.length)
#動画を再生する
command = 'omxplayer ' + musicFile
proc = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE)
#-- なんらかの処理() --
time.sleep(audio.info.length)
#time.sleep(10)
#-------------------------------------
#終了処理
proc.stdin.write("q")
def reading(sensor):
sum = -1
if sensor == 0:
# print "test function."
sum = 0
for i in range(0,20):
time.sleep(0.1)
a = GPIO.input(SIG)
sum += a
# print sum
else:
print "Incorrect function."
return sum
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
SIG = 13
GPIO.setup(SIG,GPIO.IN)
#client = mqtt.Client()
#client.on_connect = on_connect
#client.on_message = on_message
#client.connect( "iot.eclipse.org", 1883 )
music_flg = 0
fix_music_flg_ZERO = 0
music_threshold = 5
#while client.loop() == 0:
while True:
msg = reading(0);
print(msg)
#pass
if msg > 5:
music_flg+=1
else:
music_flg = fix_music_flg_ZERO
if music_flg > music_threshold:
musicName = get_music();
play_music(musicName);
music_flg = fix_music_flg_ZERO
time.sleep(10)
GPIO.cleanup()
print('Finiish')
마지막 while문만 쓴 부분에 대해 간단하게 설명해 주세요.fix_music_flg_ZERO = 0
music_threshold = 5
while True:
msg = reading(0); ##以下の説明であるように、センサーが出力した数値を取得
print(msg)
#pass
if msg > 5: ##センサーの出力が「5」以上だったら、
music_flg+=1 ##連続カウント(music_flg)を増やす
else: ##センサーの出力が「5」未満だったら、
music_flg = fix_music_flg_ZERO ##連続カウント(music_flg)を初期値(0)に戻す
if music_flg > music_threshold: ##連続カウント(music_flg)がmusic_threshold(5)より大きい場合
musicName = get_music(); ##楽曲名を取得
play_music(musicName); ##楽曲をかける
music_flg = fix_music_flg_ZERO ##連続カウント(music_flg)をfix_music_flg_ZERO(0)に戻す
time.sleep(10) ##すぐに音楽がかかるのも嫌なので、10秒待たせる
지난번 보도에서 언급한 바와 같이 소리 센서가 반응하면 센서는 수치로 소리의 반응을 출력한다.
이 수치는 변수'msg'입니다.
최대 센서 사용량 20
5'가 5번 이상(6이상) 연속으로 발생하면 음악이 나온다.
실행 파일

이런 느낌이에요.
오디오 코드~~'하는 곳에서 음악을 틀고 있다.
최후
글 첫머리에 쓰인 것처럼'아기가 울면 랜덤 음악이 나온다'는 앱을 랩피로 구축했다
만약 음악만 울렸다면 아기는 끊임없이 울었을 것이다
사랑을 품어라
육아 전선부터.
Reference
이 문제에 관하여(Rasberry Pi에 연결된 사운드 센서가 반응하면 음악을 틀어보세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kazu_tekuru/items/0452cae0796c31026b09텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)