Rasberry Pi에 연결된 사운드 센서가 반응하면 음악을 틀어보세요.

개시하다
이번 보도는 지난번 기사(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이상) 연속으로 발생하면 음악이 나온다.
실행 파일

이런 느낌이에요.
오디오 코드~~'하는 곳에서 음악을 틀고 있다.
최후
글 첫머리에 쓰인 것처럼'아기가 울면 랜덤 음악이 나온다'는 앱을 랩피로 구축했다
만약 음악만 울렸다면 아기는 끊임없이 울었을 것이다
사랑을 품어라
육아 전선부터.

좋은 웹페이지 즐겨찾기