- A2DP
- Chuẩn bị Raspberry Pi để thiết lập không đầu
- Điều kiện tiên quyết để được cài đặt trong Raspberry Pi
- Ghép nối thiết bị Bluetooth với Raspberry Pi
- Tự động hóa quy trình phân tích cú pháp Bluetooth với tập lệnh Python
- Kích hoạt Tập lệnh ghép nối Bluetooth bằng một nút
- Sơ đồ mạch
- Thiết lập Công việc Cron để bắt đầu Chương trình Python của Loa Bluetooth khi Khởi động
Raspberry Pi là một máy tính có kích thước bằng lòng bàn tay có tích hợp Bluetooth, Wi-Fi, cổng Ethernet, cổng Camera, v.v., điều này làm cho nó trở thành vi điều khiển phù hợp nhất cho các ứng dụng nhúng dựa trên IoT. Nó cũng được sử dụng để tạo ra nhiều loại máy chủ như Print server, Media Server, Web Server, v.v. Hôm nay chúng ta sẽ tìm hiểu cách Raspberry Pi có thể chuyển đổi một chiếc loa bình thường có giắc cắm 3.5mm thành một chiếc loa bluetooth không dây.
Trong bài đăng này, chúng tôi sẽ xây dựng Loa Bluetooth dựa trên Raspberry Pi bằng cách kết hợp sức mạnh của A2DP, Linux và codec âm thanh để truyền các gói dữ liệu từ nguồn âm thanh đến ổ cắm âm thanh không dây. Để làm như vậy, chúng tôi sẽ hack một chút hệ thống Linux và viết một đoạn mã bằng bash và python và chúng tôi sẽ kinh doanh.
A2DP
A2DP là từ viết tắt của Advanced Audio Distribution Profile. Đây là một giao thức có mặt trong hầu hết các thiết bị hỗ trợ Bluetooth. Nó mở đường cho việc truyền dữ liệu âm thanh từ thiết bị này sang thiết bị khác với điều kiện cả hai đều được kết nối với nhau qua Bluetooth. A2dp sử dụng thuật toán nén không mất dữ liệu để nén các gói âm thanh trước khi truyền để giảm độ trễ nhưng những tổn thất do nén này khó có thể cảm nhận được đối với tai người.
Chuẩn bị Raspberry Pi để thiết lập không đầu
Để chuyển Raspberry Pi thành Loa không dây, trước hết hãy cài đặt HĐH (Raspbian Stretch) vào thẻ Raspberry PI SD, nếu bạn chưa quen với Raspberry Pi thì hãy làm theo bài viết này để bắt đầu với Raspberry Pi.
Hầu hết chúng ta đều sở hữu Raspberry Pi và máy tính xách tay nhưng lại thiếu màn hình. Nhưng để SSH vào Raspberry Pi, chúng tôi muốn kết nối tương tự trong cùng một mạng mà máy tính của chúng tôi được kết nối. Chúng tôi cần màn hình được kết nối với Pi qua đó chúng tôi có thể chọn Wi-Fi và kết nối?
Trên thực tế, chúng tôi không. Raspberry Pi có thể được kết nối với Wi-Fi bằng cách thêm mục nhập vào tệp có tên wpa_supplicant.conf
Để làm như vậy, hãy kết nối thẻ SD với máy tính và mở tệp rootfs / etc / wpa_supplicant / wpa_supplicant.conf và thêm mục sau vào cùng. Đừng quên mở tệp với đặc quyền của quản trị viên (root).
mạng = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
Mục nhập phải trông tương tự như thế này.
Mục nhập trên sẽ giúp chúng tôi kết nối với Wi-Fi nhưng điều đó không đủ để tạo và duy trì kết nối SSH giữa Raspberry Pi và máy tính. Theo mặc định, SSH bị tắt trong Raspberry Pi, vì vậy để kích hoạt nó, hãy tạo một tệp trống có tên ssh trong thư mục khởi động.
Hiện Raspberry Pi đã được kích hoạt về mặt kỹ thuật để có thể truy cập từ xa. Kết nối pi raspberry với nguồn điện. Bây giờ pi sẽ tự động được kết nối với Wi-Fi nhưng địa chỉ IP của nó là bắt buộc để SSH vào đó. Có nhiều cách để tìm ra giống nhau. Tôi sử dụng lệnh nmap
nmap -sn / 24
Lệnh này sẽ cung cấp cho chúng tôi địa chỉ IP của tất cả các thiết bị được kết nối trong mạng của chúng tôi. Ví dụ,
Một trong số đó là của raspberry pi's. Bây giờ chúng ta biết địa chỉ IP của pi, hãy để chúng ta kết nối với nó
ssh pi @ pi_ip_address
Ngoài ra còn có các cách khác để bắt đầu với Raspberry Pi một cách dễ dàng, hãy kiểm tra liên kết để tìm hiểu tương tự.
Điều kiện tiên quyết để được cài đặt trong Raspberry Pi
BlueZ
BlueZ là ứng dụng mặc định đi kèm với bản phân phối Raspbian. Nó được sử dụng để truy cập các điều khiển bluetooth của hệ thống. Nó cũng có thể được cài đặt trong trường hợp bạn không có sẵn nó trong pi vì những lý do chỉ bạn mới có thể biết.
Lệnh dưới đây sẽ cài đặt ứng dụng giao diện Bluetooth trong pi của chúng tôi.
apt-get cài đặt bluez
PulseAudio
Pulse Audio là một ứng dụng chuyển đổi từng byte dữ liệu máy tính thành nhận thức của con người. Nó còn được gọi là máy nghe nhạc. Giao thức A2DP có sẵn trong các plugin ứng dụng PulseAudio. Vì vậy, hãy để chúng tôi cài đặt tất cả các ứng dụng liên quan đến âm thanh xung bằng cách sử dụng lệnh dưới đây:
apt-get cài đặt pulseaudio- *.
Ghép nối thiết bị Bluetooth với Raspberry Pi
Mở ứng dụng BlueZ bằng lệnh
bluetoothctl
Tác nhân Bluetooth là người môi giới nói chuyện giữa hai thiết bị hỗ trợ bluetooth và khởi tạo kết nối giữa chúng. Có nhiều loại tác nhân bluetooth khác nhau. Cái mà chúng tôi sẽ sử dụng là NoInputNoOutput agent vì nó cho phép chúng tôi kết nối mà không cần sự can thiệp của người dùng. Vì vậy, chúng ta hãy khởi tạo tác nhân bằng cách chạy các lệnh sau.
đại lý NoInputNoOutput
Bạn sẽ nhận được thông báo “ Đại lý đã đăng ký ” làm phản hồi. Bây giờ chúng tôi đã đăng ký đại lý của mình, hãy để chúng tôi đặt nó làm đại lý mặc định .
tác nhân mặc định
Phản hồi phải là "Yêu cầu tác nhân mặc định thành công"
Bây giờ, hãy để thiết bị của chúng tôi có thể phát hiện được
có thể khám phá trên
Đối với câu trả lời phải là "Thay đổi có thể phát hiện được khi thành công"
Bây giờ hãy thử kết nối điện thoại di động của bạn hoặc máy tính với Raspberry Pi
Ứng dụng sẽ nhắc chúng tôi cho phép các dịch vụ và chúng tôi không cần làm chúng. Thay vào đó, chúng tôi sẽ chỉ tin tưởng vào thiết bị và kết nối nó. Việc tin tưởng vào thiết bị là rất quan trọng vì khi thiết bị đáng tin cậy cố gắng kết nối với pi, nó sẽ cho phép điều tương tự mà không có sự can thiệp của người dùng.
kết nối tin cậy
Sau tất cả các hành động này, thiết bị đầu cuối của bạn sẽ trông giống với thiết bị này.
Yay! Chúng tôi đã kết nối điện thoại với Raspberry Pi qua Bluetooth. Nhưng như vậy đã đủ chưa? Rõ ràng là không, chúng tôi muốn các gói dữ liệu âm thanh của mình được chuyển từ điện thoại sang pi và sau đó từ pi tới loa được kết nối với cổng âm thanh của pi.
Hãy để chúng tôi đảm bảo rằng điện thoại của chúng tôi được liệt kê trong nguồn âm thanh của ứng dụng PulseAudio bằng cách chạy lệnh dưới đây:
danh sách pactl ngắn
Nó sẽ liệt kê tất cả các mô-đun âm thanh đã tải, bộ chìm âm thanh và nguồn âm thanh
Nhìn vào các giá trị so với số sê-ri 30. Bluez_source có nghĩa là nguồn âm thanh qua ứng dụng BlueZ là bluetooth. Kiểm tra chéo địa chỉ mac của thiết bị nằm giữa bluez_source và a2dp_source và địa chỉ mà bạn có trong ứng dụng BlueZ. Trong trường hợp của tôi, đó là bluez_source.3C_28_6D_FD_65_3D.a2dp_source, giống với nguồn từ ứng dụng BlueZ. Bây giờ nếu bạn phát một bài hát từ thiết bị được kết nối với pi Nó phải được định tuyến đến loa được kết nối với cổng âm thanh của raspberry pi.
Eureka! Chúng tôi đã chế tạo thành công loa Bluetooth. Chúng tôi đã định tuyến âm thanh nhưng đó không phải là tất cả. Chúng tôi không thể thực hiện tất cả các bước trên theo cách thủ công vì vậy hãy để chúng tôi tự động hóa chúng bằng cách sử dụng tập lệnh mong đợi và giao diện pi với một công tắc mà khi được nhấn, sẽ ghép nối Pi với các thiết bị.
Mát mẻ? Bây giờ chúng ta hãy bắt tay vào công việc.
Tự động hóa quy trình phân tích cú pháp Bluetooth với tập lệnh Python
Expect Scripts giống như các tập lệnh bash nhưng được tự động hóa. Nó tìm kiếm từ đã cho trong thiết bị đầu cuối và khi đến từ tương tự, nó sẽ gửi lệnh theo tập lệnh. Hãy để chúng tôi tự động hóa quá trình ghép nối. Tạo một tệp có tên là pair_bl Bluetooth_device.expect
đặt thời gian chờ 30 đẻ trứng bluetoothctl mong đợi "#" send "đại lý tắt \ r" mong đợi "? gistered" gửi "\ r" mong đợi "#" gửi "đại lý NoInputNoOutput \ r" mong đợi "Đại lý đã đăng ký" gửi "\ r" mong đợi "# "send" default-agent \ r "mong đợi" Yêu cầu tác nhân mặc định thành công "gửi" \ r "mong đợi" # "gửi" có thể phát hiện được trên \ r "mong đợi" Ủy quyền "gửi" có \ r "gửi" thoát \ r "
Sao chép mã và dán mã tương tự vào tệp. Nó chỉ tự động thực hiện các hành động mà chúng tôi đã thực hiện khi ghép nối thiết bị di động với raspberry pi. Nó chỉ cho phép thiết bị kết nối nhưng không tin tưởng vào nó. Để tin tưởng một thiết bị, chúng ta cần địa chỉ mac của nó. Vì vậy, chúng tôi sẽ in đầu ra của tập lệnh mong đợi này vào một tệp nhật ký mà từ đó địa chỉ mac có thể được nắm bắt.
grep -Pom 1 "(? <= Device). * (? = Connected)"
Lệnh trên in ra giá trị giữa chuỗi “Thiết bị” và “Đã kết nối”. Trong trường hợp của chúng tôi (Thiết bị 3C: 28: 6D: FD: 65: 3D Connected: không), đó là địa chỉ mac của thiết bị.
Hãy để chúng tôi viết một tập lệnh mong đợi sẽ lấy địa chỉ mac làm đối số đầu tiên và tin tưởng và kết nối với thiết bị đó.
Tạo một tệp có tên là trust_and_connect.expect
thiết lập thời gian chờ 30 spawn bluetoothctl mong đợi "#" gửi "đại lý tắt \ r" mong đợi "? egistered" gửi "\ r" mong đợi "#" gửi "đại lý trên \ r" mong đợi "Agent đăng ký" gửi "\ r" mong đợi "# " send" default-agent \ r " mong đợi" Yêu cầu tác nhân mặc định thành công " gửi" \ r " mong đợi" # " gửi" tin cậy \ r " mong đợi" Thay đổi " gửi" kết nối \ r " mong đợi" Kết nối thành công " gửi" thoát \ r "
Sao chép đoạn mã trên vào tệp đó. Nó thực hiện phần tin cậy và kết nối tự động.
Bây giờ chúng ta hãy đặt tất cả điều này vào một tệp kịch bản Python để toàn bộ quá trình ghép nối có thể được tự động hóa.
Hãy để chúng tôi tạo một tệp pair_and_trust_bl Bluetooth_device.sh
cd $ (dirname $ 0) echo "Ghép nối…" mong đợi pair_bl Bluetooth_device.expect> hope_script.log chmod 777 hope_script.log sleep 2 echo "Tin tưởng và kết nối.." device_mac_address = $ (cat hope_script.log - grep -Pom 1 " (? <= Device). * (? = Connected) ") địa chỉ echo mac là $ device_mac_address if]; sau đó mong đợi trust_and_connect.expect $ device_mac_address else echo "Không có thiết bị nào được kết nối" fi rm mong_script.log
Vì vậy, kịch bản bash,
- Gọi một tập lệnh mong đợi (đầu ra của nó sẽ được in ra một tệp có tên là hope_script.log),
- Khởi tạo tác nhân NoInputNoOutput
- Đặt nó làm tác nhân mặc định
- Bật khả năng phát hiện của pi
- Chờ ai đó kết nối và thoát ra khi ai đó thực hiện hoặc hết giờ
- Ngủ trong 2 giây
- Lấy tệp mong đợi_script.log cho địa chỉ mac thiết bị
- Tin tưởng và kết nối thiết bị nếu mac_address không có giá trị
- Xóa tệp dư thừa mong_script.log
Kích hoạt Tập lệnh ghép nối Bluetooth bằng một nút
Bây giờ chúng ta có tập lệnh để tự động hóa quá trình ghép nối. Nhưng script này phải chạy một cách thuận tiện, bất cứ khi nào người dùng muốn. Vì vậy, hãy kết nối tập lệnh này với một nút vật lý để tập lệnh này được gọi mỗi khi nhấn nút. Ngắt là một trong những phần quan trọng của lập trình nhúng. Đối với người mới bắt đầu, các ngắt khi được phát hiện sẽ đặt quy trình thông thường của chương trình và chạy ISR được xác định trước được gọi là Quy trình dịch vụ ngắt.
Vì vậy, chúng ta hãy kết nối nút nhấn với gpio pin 11 và gán ISR cho cùng một. Bên trong ISR, chúng ta sẽ gọi là script.
Hãy để chúng tôi tạo tệp python có tên Bluetooth-speaker-main.py và thêm mã bên dưới vào tệp đó. Tôi đã thêm các nhận xét trong chương trình nên trong trường hợp nếu bạn sử dụng mã này, bạn vẫn có chúng
#import gói bắt buộc nhập quy trình con nhập RPi.GPIO dưới dạng thời gian nhập gpio nhập os nhập nhật ký cặp_pin = 11 # tìm nạp thư mục tệp mà từ đó tập lệnh python được chạy fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # Đặt vị trí tệp nhật ký giống như vị trí tập lệnh python logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filename = logFile, filemode = 'w', format = '% (name) s -% (levelname) s -% (message) s ', level = logging.INFO) def pairNewDevice (channel): #ISR cho pin 11 print ("Đang chờ ghép nối") logging.info ("Đang chờ ghép nối") output = subprocess.call () gpio.setmode (gpio.BẢNG) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) hãy thử: # Đặt pair_pin làm chân ngắt để phát hiện cạnh rơi và khi nó xuất hiện, hãy gọi hàm pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("Chương trình Bluetooth đã bắt đầu") logging.info ("Chương trình Bluetooth đã bắt đầu") trong khi True: time.sleep (5) ngoại trừ KeyboardInterrupt: gpio.cleanup ()
Sơ đồ mạch
Dưới đây là sơ đồ mạch kết nối một nút với GPIO11 của Raspberry Pi để kích hoạt quá trình ghép nối Bluetooth để truyền âm thanh qua Bluetooth.
Thiết lập Công việc Cron để bắt đầu Chương trình Python của Loa Bluetooth khi Khởi động
Bây giờ cuối cùng chúng ta hãy thiết lập một công việc cron sẽ khởi động chương trình python này mỗi khi pi khởi động.
crontab -e
Chọn trình chỉnh sửa yêu thích của bạn và thêm dòng dưới đây vào cuối tệp
@reboot python3 /home/pi/blueooth-speaker/Bl Bluetooth-speaker-main.py
Điều này sẽ gọi chương trình python của chúng tôi mỗi khi pi khởi động.
Và đây là nó. Con đại bàng đã hạ cánh. Bạn đã tạo một Loa Bluetooth Raspberry Pi không đầu.
Khởi động lại Pi của bạn, ghép nối điện thoại của bạn và phát trực tuyến âm thanh.:)
Tất cả các tập lệnh cho Loa Bluetooth Raspberry Pi này có thể được tải xuống từ Tài khoản GitHub. Cũng kiểm tra video dưới đây.