raspberry pi zero 를 USB Speaker 또는 Mic 로 만들기.
USB Gadget 을 이용해서 라즈베리 파이을 USB MIC 나 Speaker 로 만들 수 있다.
또는 USB RNDIS 기능을 사용해서 wifi 없이 USB로 네트워크 구성을 할 수도 있다.
이번엔 Audio gadget 을 사용해본다.
출처: ceworkbench.wordpress.com/2019/07/21/setting-up-a-composite-ethernet-audio-usb-gadget/
라즈베리파이 zero w 에 설정을 한다.
위 링크에는 Fe-Pi Audio Z V2 로 했다고 하는데. 저거는 구할 수가 없어서.
알리에서 Waveshare WM8960 를 사서 해봤다.
HAT 만 오는줄 알고 샀는데 박스를 까보니 스피커도 들어있어서 깜놀. 알리에 다시 들어가 봤더니 원래 주는거였네. ㅎ
github.com/waveshare/WM8960-Audio-HAT
여기 나온대로 설정하면 audio HAT 도 잘 동작한다.
이제 USB gadget으로 연결 하기만 하면 된다.
참고한 링크에는 sh 스크립트(sysfs에 usb gadget 설정하는 내용)를 돌리라고 되어있는데. 저거 안해도 g_audio로 그냥 되는거 같다.
먼저
라즈베리파이의
/boot/config.txt
파일 맨 아래다가
dtoverlay=dwc2 를 추가한다.
처음엔 dtoverlay=어쩌구,어쩌구 이렇게 하면 되느줄 알고 그렇게 썼는데 안되고...
이 방법은 찾아보니 dt parameter가 있을 경우 이렇게 한줄로도 넘길 수 있다고 한다.
dwc2는 파라메터도 없기 때문에 그냥 줄바꿔서 써준다.
그리고 /etc/modules 에다가
dwc2
libcomposite
g_audio
이것을 추가한다.
dwc 는 USB OTG host/gadget 을 쓸 수 있게 해주는 driver라고 한다.
libcomposite 는 여러가지 gadget 을 사용하게 해 줄 수 있는 module 이라고 한다. RNDIS 나, 그런거랑 같이 돌아가게 해주는 모양이다.
g_audio를 audio gadget 을 돌리기 위한 모듈
이렇게 설정해주고 껐다켠 후 라즈베리파이zero 와 PC를 USB로 연결하면
PC 에서 이렇게 잡히는 것을 확인 할 수 있다.
$ lsusb
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0424:5734 Microchip Technology, Inc. (formerly SMSC) USB5734
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 2104:0306 Tobii AB EyeChip
Bus 001 Device 004: ID 0bda:565a Realtek Semiconductor Corp. Integrated_Webcam_HD
Bus 001 Device 003: ID 187c:0550 Alienware Corporation AW-ELC
Bus 001 Device 011: ID 0424:2745 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 009: ID 046d:c53a Logitech, Inc. PowerPlay Wireless Charging System
Bus 001 Device 007: ID 1b1c:1b8f Corsair USB2734
Bus 001 Device 005: ID 0d8c:0102 C-Media Electronics, Inc. CM106 Like Sound Device
Bus 001 Device 002: ID 0424:2734 Microchip Technology, Inc. (formerly SMSC) USB2734
Bus 001 Device 010: ID 8087:0029 Intel Corp.
Bus 001 Device 008: ID 0d62:2a1c Darfon Electronics Corp. Keyboard
Bus 001 Device 025: ID 1d6b:0101 Linux Foundation Audio Gadget
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
이렇게 되면
이렇게 Audio Gadget 이 입출력장치로 잡히는 것을 볼 수 있다.
안되면 이 스크립트를 만들어서 실행하면 될것이다.
#!/bin/sh
# Load libcomposite
# modprobe libcomposite
# Create a gadget called usb-gadgets
cd /sys/kernel/config/usb_gadget/
mkdir -p usb-gadgets
cd usb-gadgets
# Configure our gadget details
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "0123456789abcdef" > strings/0x409/serialnumber
echo "Pi Zero USB Gadget" > strings/0x409/manufacturer
echo "Pi Zero USB Gadget" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
# Ethernet gadget
# mkdir -p functions/ecm.usb0
# first byte of address must be even
# HOST="32:70:05:18:ff:7a" # "HostPC"
# SELF="32:70:05:18:ff:7b" # "Ethernet Gadget"
# echo $HOST > functions/ecm.usb0/host_addr
# echo $SELF > functions/ecm.usb0/dev_addr
# ln -s functions/ecm.usb0 configs/c.1/
# UAC2 (audio) gadget
mkdir -p functions/uac2.usb0
ln -s functions/uac2.usb0 configs/c.1
# End functions
ls /sys/class/udc > UDC
이렇게 오디오 장치로 잡히면 라즈베리파이와 USB로 오디오 데이터를 주고받을 수 있는데. 실제 동작을 시키려면
라즈베리에서 해줘야 할것이 있다.
Audio input - output 을 연결해줘야 한다.
github.com/liquidx/alsa-audio-pipe
여기 나오는 대로 따라하면 되는데
먼저 이것들을 깔아준다.
sudo apt-get install python-dev libasound2-dev
git에서는 이렇게 수동으로 하라고 해서 따라하긴 했는데 pyalsaaudio 를 pip로 깔아서 써도 될거같다.
git clone https://github.com/larsimmisch/pyalsaaudio
cd pyalsaaudio
python setup.py build
sudo python setup.py install
그 다음
cd ~
git clone https://github.com/liquidx/alsa-audio-pipe.git
cd alsa-audio-pipe
이거는 alsa audio input - output 같에 pipe를 만들어서 퍼넣어주는 역할을 한다.
아래와 같이 하면 동작하는 것을 확인 할 수 있다.
라즈베리파이 마이크 -> PC audio input (라즈베리가 USB 마이크 역할) 하게 하려면 이렇게 해준다.
./alsa_audio_piper.py --input hw:wm8960soundcard --output hw:UAC2Gadget --floor-noise 0
PC audio output -> 라즈베리파이 스피커 (라즈베리가 USB 스피커 역할) 하게 하려면 이렇게 해준다.
./alsa_audio_piper.py --input hw:UAC2Gadget --output hw:wm8960soundcard --floor-noise 0
이 경우에는 sample rate가 안맞아서 조금 이상하게 들릴 수 있다. 이건 어디서 맞추면 되겠지.
git 에 보면 systemd 에 등록해서 부팅하면서 자동으로 동작하게 하는 방법도 있으니 따라해보면 된다.
'Embeded' 카테고리의 다른 글
hdmi cec (0) | 2022.02.16 |
---|---|
ros2 Navigation2 (0) | 2021.02.02 |
Raspberry pi 에서 BLE 띄우기 (0) | 2020.12.03 |