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.)