반응형

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/

 

Setting Up A Composite Ethernet/Audio USB Gadget

In my last post I wrote about setting up a Linux Ethernet gadget on a Raspberry Pi Zero. However, this was really just a proof of concept, to make sure I could do it. What I really need for my curr…

ceworkbench.wordpress.com

라즈베리파이 zero w 에 설정을 한다.

 

위 링크에는 Fe-Pi Audio Z V2 로 했다고 하는데. 저거는 구할 수가 없어서.

알리에서 Waveshare WM8960 를 사서 해봤다.

HAT 만 오는줄 알고 샀는데 박스를 까보니 스피커도 들어있어서 깜놀. 알리에 다시 들어가 봤더니 원래 주는거였네. ㅎ

 

github.com/waveshare/WM8960-Audio-HAT

 

waveshare/WM8960-Audio-HAT

The drivers of [WM8960 Audio HAT] for Raspberry Pi - waveshare/WM8960-Audio-HAT

github.com

여기 나온대로 설정하면 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

 

liquidx/alsa-audio-pipe

Brain dead simple audio piper with ALSA. Contribute to liquidx/alsa-audio-pipe development by creating an account on GitHub.

github.com

여기 나오는 대로 따라하면 되는데

 

먼저 이것들을 깔아준다.

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
Posted by Real_G