Configurar o Raspberry Pi 3 como alto-falante bluetooth


36

Estou procurando uma maneira de configurar o Raspberry Pi 3 como alto-falante Bluetooth usando o Raspbian Jessie. O que quero dizer com alto - falante bluetooth é usá-lo para receber fluxo de áudio via bluetooth usando A2DP e reproduzi-lo através de alto-falantes conectados ao Raspberry Pi por meio da tomada de áudio, da porta HDMI ou do adaptador de áudio USB.

Tutoriais diferentes estão disponíveis online, mas estão desatualizados e a maioria deles não funciona mais.


Não está claro o que você quer dizer com "como Bluetooth orador"
Milliways

1
Editado. A esperança é claro agora
gtatr

Perfeitamente claro para mim, estou interessado em ler quaisquer respostas reais.
Burt_Harris 26/05

A solução votada é uma rota semelhante que eu acabei seguindo. No entanto, eu tenho um repositório no github que irá configurá-lo para você em uma nova instalação do raspbian Jessie Lite (não sei se ele funciona sem uma pequena configuração para Jessie com pixel) simplesmente siga as instruções de instalação aqui: github.com/bareinhard/… . O principal problema que vejo nas soluções existentes é que elas usam o pulseaudio5 por padrão. Isso compila o pa6 e elimina muitos problemas de reprodução que o pa5 enfrenta.
Brett Reinhard

Respostas:


25

Eu estive neste projeto depois de um tempo (para ajudar meu amigo a fazer o trabalho deles para se formar) e encontrar o projeto on-line muito bem (embora o pi que processa o áudio esteja muito abaixo do pi, e a queda de tensão o congele como a única maneira para reinicializar é desconectar o cabo de alimentação).

Este é o passo em que estou trabalhando e funciona no raspberry pi 3.

1. Faça o download do pacote necessário

Este projeto depende do pulseaudio, então pegue-o e instale-o digitando:

sudo apt-get update && sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 bluez-tools udev

Prefiro atualizar o firmware do raspberry primeiro antes de instalá-los, pois tenho problemas com o rpi-bluetoothpacote, então faço:

sudo rpi-update

e instale-o e avance para o próximo passo.

2. Edite a Configuração e aplique-a

Primeiro, adicione o nome de usuário pi ao grupo pulseaudio com

sudo usermod -a -G lp pi

crie uma nova configuração em /etc/bluetooth/audio.conf usando o editor de texto e adicione a seguinte linha

[General]:
Enable=Source,Sink,Media,Socket

edite o arquivo /etc/bluetooth/main.confusando o seu editor de texto preferido (estou usando o nano).

Defina a classe Bluetooth, modifique a seguinte linha para:

 Class = 0x00041C

0x000041C significa que o rpi bluetooth suporta o protocolo A2DP.

alterar /etc/pulse/daemon.conf adicionar / modificar (não se esqueça de verificar o código completamente antes de adicioná-lo) e alterar

resample-method = trivial

você pode usar qualquer método que quiser, eu pessoalmente uso speex-float-3como referência, você pode ver este link

inicie o serviço pulseaudio com:

pulseaudio -D

vamos usar o script ragusa87 para automatizar a fonte do bluetooth no coletor de áudio. Primeiro, adicione nova configuração ao udev init.d editando o arquivo /etc/udev/rules.d/99-input.rulese adicione-o ao arquivo

SUBSYSTEM="input", GROUP="input", MODE="0660"
KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"

adicionar pasta udevpara /usr/libusando mkdir

sudo mkdir /usr/lib/udev && cd /usr/lib/udev

e adicione isso ao arquivo bluetooth (créditos ragusa87)

#!/bin/bash
# This script is called by udev when you link a bluetooth device with your computer
# It's called to add or remove the device from pulseaudio
#
#

# Output to this file
LOGFILE="/var/log/bluetooth_dev"

# Name of the local sink in this computer
# You can get it by calling : pactl list short sinks
# AUDIOSINK="alsa_output.platform-bcm2835_AUD0.0.analog-stereo"
AUDIOSINK="alsa_output.0.analog-stereo.monitor"
# User used to execute pulseaudio, an active session must be open to avoid errors
USER="pi"

# Audio Output for raspberry-pi
# 0=auto, 1=headphones, 2=hdmi. 
AUDIO_OUTPUT=1

# If on, this computer is not discovearable when an audio device is connected
# 0=off, 1=on
ENABLE_BT_DISCOVER=1

echo "For output see $LOGFILE"

## This function add the pulseaudio loopback interface from source to sink
## The source is set by the bluetooth mac address using XX_XX_XX_XX_XX_XX format.
## param: XX_XX_XX_XX_XX_XX
## return 0 on success
add_from_mac(){
  if [ -z "$1" ] # zero params
    then
        echo "Mac not found" >> $LOGFILE
    else
        mac=$1 # Mac is parameter-1

        # Setting source name
        bluez_dev=bluez_source.$mac
        echo "bluez source: $mac"  >> $LOGFILE

        # This script is called early, we just wait to be sure that pulseaudio discovered the device
        sleep 1
        # Very that the source is present
        CONFIRM=`sudo -u pi pactl list short | grep $bluez_dev`
        if [ ! -z "$CONFIRM" ]
        then
            echo "Adding the loopback interface:  $bluez_dev"  >> $LOGFILE
            echo "sudo -u $USER pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0"  >> $LOGFILE

            # This command route audio from bluetooth source to the local sink..
            # it's the main goal of this script
            sudo -u $USER pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0  >> $LOGFILE
            return $?
        else
            echo "Unable to find a bluetooth device compatible with pulsaudio using the following device: $bluez_dev" >> $LOGFILE
            return -1
        fi
    fi
}

## This function set volume to maximum and choose the right output
## return 0 on success
volume_max(){
    # Set the audio OUTPUT on raspberry pi
    # amixer cset numid=3 <n> 
    # where n is 0=auto, 1=headphones, 2=hdmi. 
    amixer cset numid=3 $AUDIO_OUTPUT  >> $LOGFILE

    # Set volume level to 100 percent
    amixer set Master 100%   >> $LOGFILE
    pacmd set-sink-volume 0 65537   >> $LOGFILE
    return $?
}

## This function will detect the bluetooth mac address from input device and configure it.
## Lots of devices are seen as input devices. But Mac OS X is not detected as input
## return 0 on success
detect_mac_from_input(){
    ERRORCODE=-1

    echo "Detecting mac from input devices" >> $LOGFILE
    for dev in $(find /sys/devices/virtual/input/ -name input*)
    do
        if [ -f "$dev/name" ]
        then
            mac=$(cat "$dev/name" | sed 's/:/_/g')
            add_from_mac $mac

            # Endfor if the command is successfull
            ERRORCODE=$?
            if [ $ERRORCODE -eq 0]; then
                return 0
            fi
        fi
    done
    # Error
    return $ERRORCODE
}
## This function will detect the bt mac address from dev-path and configure it.
## Devpath is set by udev on device link
## return 0 on success
detect_mac_from_devpath(){
    ERRORCODE=-1
    if [ ! -z "$DEVPATH" ]; then
        echo "Detecting mac from DEVPATH"  >> $LOGFILE
        for dev in $(find /sys$DEVPATH -name address)
        do
            mac=$(cat "$dev" | sed 's/:/_/g')
            add_from_mac $mac

            # Endfor if the command is successfull
            ERRORCODE=$?
            if [ $ERRORCODE -eq 0]; then
                return 0
            fi

        done
        return $ERRORCODE;
    else
        echo "DEVPATH not set, wrong bluetooth device? " >> $LOGFILE
        return -2
    fi
    return $ERRORCODE
}


## Detecting if an action is set
if [ -z "$ACTION" ]; then
    echo "The script must be called from udev." >> $LOGFILE
    exit -1;
fi
## Getting the action
ACTION=$(expr "$ACTION" : "\([a-zA-Z]\+\).*")

# Switch case
case "$ACTION" in
"add")

    # Turn off bluetooth discovery before connecting existing BT device to audio
    if [ $ENABLE_BT_DISCOVER -eq 1]; then
        echo "Stet computer as hidden" >> $LOGFILE
        hciconfig hci0 noscan
    fi

    # Turn volume to max
    volume_max

    # Detect BT Mac Address from input devices
    detect_mac_from_input
    OK=$?

    # Detect BT Mac address from device path on a bluetooth event
    if [ $OK != 0 ]; then
        if [ "$SUBSYSTEM" == "bluetooth" ]; then
            detect_mac_from_devpath
            OK=$?
        fi
    fi

    # Check if the add was successfull, otherwise display all available sources
    if [ $OK != 0 ]; then
        echo "Your bluetooth device is not detected !" >> $LOGFILE
        echo "Available sources are:" >> $LOGFILE
        sudo -u $USER pactl list short sources >> $LOGFILE
    else
        echo "Device successfully added " >> $LOGFILE
    fi
    ;;

"remove")
    # Turn on bluetooth discovery if device disconnects
    if [ $ENABLE_BT_DISCOVER -eq 1]; then
        echo "Set computer as visible" >> $LOGFILE
        sudo hciconfig hci0 piscan
    fi
    echo "Removed" >> $LOGFILE
    ;;

#   
*)
    echo "Unsuported action $action" >> $LOGFILE
    ;;
esac
echo "--" >> $LOGFILE

Observe que o seu AUDIOSINK pode ser diferente do meu, verifique-o antes de usar pactl list short sinks

torne o script executável inserindo este código

chmod 777 bluetooth 

conecte o fone de ouvido para testar se a tomada de áudio está funcionando e teste com

 aplay /usr/share/sounds/alsa/Front_Center.wav

ou você pode definir o roteamento de áudio padrão com

sudo amixer cset numid = 3 n

onde n poderia estar: 0 = auto 1 = jack 2 = hdmi

3. Emparelhe e conecte o áudio

vá para o terminal e digite bluetoothctl. Primeiro ative o bluetooth com power one agent on, em seguida , defina o agente padrão com o qual você estava editando antes e , em seguida , ative o default-agentmodo detectável e o modo de pareamento discoverable on; pairable on. Você verá o raspberrypi bluetooth no seu telefone ou laptop e poderá emparelhá-lo ao telefone clicando nele e tocando em par. No terminal você digita y. De volta ao terminal, você se conecta ao telefone digitando connect xx:xx:xx:xx:xx:xxonde xx:xx:xx:xx:xx:xx é o seu endereço mac bluetooth do telefone. e não se esqueça de confiar no trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxendereço mac do bluetooth do seu telefone. E pronto, você tem um amplificador bluetooth (ou qualquer que seja o nome) usando framboesa.

4. Conclusão

depois de tentar e experimentar, descobri que a qualidade do áudio é baixa e prefiro não usá-lo, pois a framboesa congelará se você a usar com a música sendo transmitida para a framboesa. Eu aconselho a usar o projeto de alto-falante UPNP usando gmediarenderer. O áudio é excelente e não há atraso e som de dispersão e pode reproduzir arquivos de áudio sem perdas (flac, wav, dll). Este é o detalhado como configurá-lo

referência: tutorial do jobpassion ; roteiro de ragusa ; trabalho relacionado ;


Eu não sou capaz de executar sudo service pulseaudio restart, estou ficandoFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr

Além disso, com bluetoothctlquando eu faço connect xx:xx:xx:xx:xx:xxeu me Failed to connect: org.bluez.Error.Failedusando meu telefone ou laptop
gtatr

O que você está usando? O único sistema operacional que suporta raspberry pi 3 a bordo do bluetooth é o raspbian Jessie e o Ubuntu Mate> 16.04. No Ubuntu Mate, o bluetooth a2dp já está presente, então você pode verificá-lo no Bluetooth Manager.
Xdhe 31/05/16

Se você já tentou algum tutorial on-line e estragou tudo, acho melhor reinstalar e limpar a configuração dos pacotes. Estou mexendo nos pacotes Bluetooth instalando manualmente o pacote 'rpi-bluetooth' e o Bluetooth não está funcionando. Então, reflash a imagem raspbian e ela funciona muito bem, embora o som não seja agradável na IMO.
Xdhe 31/05/19

Estou usando uma Jessie raspbian recém-instalada e segui suas instruções passo a passo, talvez exista uma etapa ausente de um sistema operacional recém-instalado. Eu poderia dar uma chance ao Ubuntu Mate
gtatr 31/05

16

Aqui está uma solução alternativa que não depende do PulseAudio: https://github.com/lukasjapan/bt-speaker

Instale no raspbian como root com:

curl -s https://raw.githubusercontent.com/lukasjapan/bt-speaker/master/install.sh | bash

Ele iniciará um daemon de alto-falante bluetooth que aceita automaticamente um único cliente para A2DP / AVRCP e canaliza o fluxo de áudio diretamente para o ALSA.


Lembrete de segurança: eu escrevi o script sozinho para garantir que ele é seguro, mas verifique o conteúdo por conta própria
Lukas

legais! Vou tentar testar isso nos próximos dias
gtatr

1
Eu estava tentando sua solução, e funcionou, mas o áudio ficou preso a cada segundo. Por que isso está acontecendo?
wolfram77

Provavelmente o problema do Wifi: github.com/lukasjapan/bt-speaker/issues/4
Lukas

3

Eu escrevi instruções sucintas para o Raspberry Pi 3 no meu blog . A maioria das instruções online são para versões mais antigas do Debian / Xbian. Aqui estão as instruções que eu testei e estou trabalhando no Raspberry Pi 3 com o Xbian.

  1. Comece instalando / atualizando todos os pacotes

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Adicione usuários a grupos. Isto é muito importante. Se estiver usando outra distro, substitua 'xbian' pelo seu nome de usuário.

    sudo gpasswd -a xbian pulse
    sudo gpasswd -a xbian lp
    sudo gpasswd -a pulse lp
    sudo gpasswd -a xbian audio
    sudo gpasswd -a pulse audio
    
  3. Configurar a classe de dispositivo PulseAudio e Bluetooth

    sudo sh -c "echo 'extra-arguments = --exit-idle-time=-1 --log-target=syslog' >> /etc/pulse/client.conf"
    sudo hciconfig hci0 up
    sudo hciconfig hci0 class 0x200420
    sudo reboot
    

A classe de serviço / dispositivo Bluetooth 0x200420 significa que o dispositivo está configurado para Car Audio. Consulte este link para explorar mais opções de classe Bluetooth.

  1. Para parear com um dispositivo, precisaremos usar a ferramenta "bluetoothctl".

    sudo bluetoothctl
    
  2. Defina o agente como KeyboardOnly e torne-o padrão. Isso precisa ser feito apenas uma vez. Dentro do bluetoothctl, execute os seguintes comandos:

    agent KeyboardOnly
    default-agent
    
  3. Ligue o bluetooth no seu telefone / tablet e verifique se ele é detectável. Execute os seguintes comandos dentro do bluetoothctl:

    scan on
    pair xx:xx:xx:...
    trust xx:xx:xx:...
    exit
    

    xx: xx: xx: .. é o endereço MAC do seu telefone / dispositivo. Depois de executar o 'scan on', aguarde um minuto para que o dispositivo apareça junto com o endereço MAC. Depois de executar 'pair xx: xx: xx: ..', verifique seu dispositivo e aceite a conexão de entrada. Faça o mesmo no terminal digitando yes.

  4. Agora, conecte-se ao Raspberry Pi do seu telefone e ele deve se conectar como um dispositivo de áudio. Todo o áudio reproduzido através do dispositivo agora deve ser produzido usando a saída HDMI ou Analógica do Raspberry Pi, dependendo da configuração do seu Pi.

  5. Se a conexão falhar, tente novamente, às vezes são necessárias duas tentativas.


Obrigado por reservar um tempo para responder. As respostas somente para links são desencorajadas, pois não há como saber o que está do outro lado - se o artigo vinculado mudar ou desaparecer, o mesmo ocorre com essa resposta. Você pode resumir os pontos importantes?
goobering

@ goobering: Postagem atualizada. Não estou muito familiarizado com a formatação nos sites Stack, mas fiz isso da melhor maneira possível. Obrigado por analisar a minha resposta. Tenha um ótimo dia
Abdul Mueid

1
O que você fez para corrigir o áudio instável?
NoBugs

É super agitado. Temos que fazer overclock no pi?
b-ak

1
As instruções de Abdul funcionam perfeitamente, no entanto, a saída de áudio pelo alto-falante BT é muito instável. Em qualquer caso, isso não é de qualidade de áudio aceitável. O áudio nativo do PI através do Pulseaudio é muito ruim. Hora de uma solução muito melhor que o Bluetooth.
Don Allen

0

Antes de iniciar essa rota, você considerou a notoriamente baixa qualidade da saída do conector de áudio RPi 3,5 mm?

Saída de som do Raspberry Pi

Pode ser por isso que você não consegue encontrar um tutorial atualizado.

Para ser justo, o outro motivo pode ser que um par decente de alto-falantes não é menos caro que um alto-falante Bluetooth decente. Eu não seguiria esse caminho, a menos que sua intenção seja também investir em uma placa de som USB (não é caro, mas seu preço total está começando a aumentar agora). Ou talvez você planeja usar a saída HDMI? É realmente muito bom.

Que tal este? Todos os componentes devem estar prontamente disponíveis.

http://www.instructables.com/id/Turn-your-Raspberry-Pi-into-a-Portable-Bluetooth-A/

Este foi o meu primeiro projeto RPi. Não olhei muito detalhadamente, mas acredito que o componente MPD pode ser usado para transmitir Bluetooth ao RPi. Vou deixar você fazer essa pesquisa.

http://www.bobrathbone.com/raspberrypi_radio.htm


Concordo com você sobre o fato de que há melhores soluções prontas lá fora, e não tão caro, mas eu quero que isso seja parte de um projeto maior
gtatr

Eu apenas especulo sobre os motivos das instruções para idosos. Veja outras notas, no entanto, sobre possíveis soluções. Veja o daemon MPD. Posso estar enganado, mas acho que pode transmitir Bt. Poderia usar um pouco mais de detalhes. Se você usar o conector de áudio de 3,5 mm, provavelmente funcionará bem a 75%, mas precisará de um amplificador externo para controle de volume.
KDM

btw eu tentei que tutorial, além de quase qualquer outro tutorial online, mas sem sucesso
gtatr
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.