آموزش پخش صدا و آهنگ با رزبری پای (کتابخانه PyGame)
سلام. آموزش استفاده از کتابخانه PyGame صدای بازی رزبری پای را آماده کردیم.
محتویات
پخش صدای بازی ها با برد رزبری پای
در این آموزش رزبری پای میخواهیم از توابع Pugame برای پخش صدا استفاده کنیم. به طور کلی ما قصد داریم چند دکمه را به پین های GPIO برد RAspberry Pi متصل کنیم که با فشردن هر کدام از انها فایل های ذخیره شده در حافظه پخش شوند. این فایال های صوتی را میتوان یک به یک و همه با هم پخش کرد. یعنی میتوانید یک دکمه را فشار دهید یا چند دکمه را با هم فشار دهید تا فایل های صوتی پخش شوند.
فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.
در مورد پین های GPIO در سری آموزش های رزبری پای قبلا بسیار صحبت کرده ایم.
پیکربندی پخش موسیقی با رزبری پای
1. اول از همه 6 فایل صوتی را بارگیری کنید یا می توانید از فایلهای صوتی خود استفاده کنید ، اما باید نام فایل ها را در کد تغییر بدهید.
فایلهای صوتی را از اینجا بارگیری کنید
2. یک پوشه جدید در صفحه دسک تاپ Raspberry Pi ایجاد کنید و آن را “PI SOUND BOARD” بنامید.
3. فایل های صوتی بارگیری شده را در پوشه ای که در مرحله قبل در DESKTOP ایجاد کرده ایم از حالت فشرده خارج کنید.
4. پنجره ترمینال را در Raspberry Pi باز کنید و زیر دستور وارد کنید:
sudo amixer cset numid=3 1 <press enter>
این دستور به PI می گوید که خروجی صوتی را از طریق جک صوتی 3.5 میلی متری روی برد فراهم کند.
اگر می خواهید از درگاه HDMI خروجی صوتی بگیرید، می توانید از دستور زیر استفاده کنید:
$ sudo amixer cset numid=3 2 <press enter>
5. بلندگوها را به جک خروجی صوتی 3.5 میلی متری در برد رزبری پای متصل کنید.
6. یک فایل PYTHON (پسوند * .py) ایجاد کنید و آن را در همان پوشه ذخیره کنید.
7. میکسر Pygame به طور پیش فرض در سیستم عامل نصب می شود. اگر برنامه بعد از اجرا PYMIXER را اجرا نمیکند، با وارد کردن دستور زیر در پنجره ترمینال، سیستم عامل Raspberry Pi را به روز کنید. اطمینان حاصل کنید که رزبری پای به اینترنت وصل شده است.
sudo apt-get update <press enter>
چند دقیقه صبر کنید تا سیستم عامل به روز شود.
مدار پروژه پخش صدا با رزبری پای
برای این آموزش ما از Raspberry Pi 2 Model B با سیستم عامل Raspbian Jessie استفاده می کنیم. به یک بلندگو، 6 عدد مقاومت 1 کیلو اهم، 6 دکمه و یک خازن 1000uf نیاز داریم. در اینجا ما از 6 دکمه فشار برای پخش 6 فایل صوتی استفاده کرده ایم. می توانیم دکمه ها و پرونده های صوتی بیشتری را برای توسعه دادن این پروژه اضافه کنیم تا با فشار دادن این دکمه ها الگوی بیشتری ایجاد کنیم.
برنامه نویسی رزبری پای برای پخش آهنگ
وقتی همه چیز را مانند شماتیک مدار متصل کردید، می توانیم Raspberry Pi را روشن کنیم تا برنامه را در پایتون (PYHTON) بنویسیم. کد کامل در انتهای صفحه قرار داده شده است. در اینجا در مورد قسمت های مهم کد صحبت میکنیم. در اینجا ما برنامه Python را برای پخش فایلهای صوتی با فشار دکمه ایجاد کرده ایم. باید دستورات معدودی را بشناسیم که در برنامه استفاده کرده ایم.
ما میخواهیم پرونده GPIO را از کتابخانه وارد کنیم. کد زیر باعث میشود بتوانیم پین های GPIO برد رزبری پای را برنامه ریزی کنیم. همچنین مانند قسمت قبلی آموزش، نام GPIO را به IO تغییر میدهیم. و هر بار بخواهیم به پین های GPIO مراجعه کنیم از کلمه IO استفاده میکنیم.
import RPi.GPIO as IO
بعضی اوقات، پین های GPIO که سعی در استفاده از آنها داریم، ممکن است عملکردهای دیگری را انجام دهند. در این حالت، هنگام اجرای برنامه، هشدارهایی دریافت خواهیم کرد. دستور زیر به PI می گوید هشدارها را نادیده گرفته و به برنامه ادامه دهد.
IO.setwarnings(False)
ما می توانیم پین های GPIO رزبری پای یا شماره پین آن یا شماره GPIO آن ها وارد کنیم. به طور مثال پین 35 روی برد Raspberry pi، همان پین GPIO 19 است. بنابراین ما میتوانیم آن را با 19 یا 35 معرفی کنیم.
IO.setmode (IO.BCM)
import pygame.mixer
ما برای پخش فایلهای صوتی در حال فراخوانی میکسر Pygame هستیم.
audio1 = pygame.mixer.Sound("buzzer.wav")
ما در حال درخواست فایل صوتی “buzzer.wav” که در پوشه دسک تاپ ذخیره شده هستیم. اگر می خواهید فایل دیگری را پخش کنید، فقط کافیست نام فایل صوتی را در کدی که در بالا آورده شده است، تغییر دهید. می توانید هر پرونده موجود در پوشه دسک تاپ را نام ببرید.
channel1 = pygame.mixer.Channel(1)
در اینجا ما در حال تنظیم کانال برای هر دکمه هستیم تا بتوانیم تمام فایلهای صوتی را بطور همزمان پخش کنیم.
if (IO.input(21) == 0): channel1.play(audio1)
در کد بالا ما یک شرط تعیین کرده ایم، در صورتی که بر طبق شرط دکمه متصل به پین 21 فشرده باشد، صدای مخصوص آن دکمه پخش میشود.
پرونده به متغیر audio1 اختصاص یافته است. مطابق نمودار مدار ، می توانیم ببینیم که وقتی دکمه اول را فشار می دهیم، پین 21 GPIO ، صفر می شود. بنابراین می توانیم با فشار دادن دکمه مربوطه ، هر فایل صوتی را پخش کنیم.
کد کامل :
بقیه توضیحات در باکس زیر به طور کامل داده شده است.
#working import pygame.mixer #فراخوانی کتابخانه پخش صدا import time #فراخوانی کتابخانه تاخیر import RPi.GPIO as IO #فراخوانی کتابخانه استفاده از پین های GPIO IO.setwarnings(False) #نادیده گرفتن هشدار ها IO.setmode(IO.BCM) #برنامه نویسی بر اساس شماره پین های GPIO IO.setup(21, IO.IN) #معرفی پین 21 به عنوان ورودی IO.setup(20, IO.IN) #معرفی پین 20 به عنوان ورودی IO.setup(16, IO.IN) #معرفی پین 16 به عنوان ورودی IO.setup(12, IO.IN) #معرفی پین 12 به عنوان ورودی IO.setup(25, IO.IN) #معرفی پین 25 به عنوان ورودی IO.setup(23, IO.IN) #معرفی پین 23 به عنوان ورودی pygame.mixer.init(48000, -16, 1, 1024) #پیکربندی پخش موسیقی audio1 = pygame.mixer.Sound("buzzer.wav") #ارتباط با فایل صوتی audio2 = pygame.mixer.Sound("cartoon002.wav") #ارتباط با فایل صوتی audio3 = pygame.mixer.Sound("baby_x.wav") #ارتباط با فایل صوتی audio4 = pygame.mixer.Sound("ahem_x.wav") #ارتباط با فایل صوتی audio5 = pygame.mixer.Sound("clap.wav") audio6 = pygame.mixer.Sound("baseball_hit.wav") channel1 = pygame.mixer.Channel(1) # استفاده از کانال یک برای دکمه اول channel2 = pygame.mixer.Channel(2) # استفاده از کانال دو برای دکمه دوم channel3 = pygame.mixer.Channel(3) # استفاده از کانال سه برای دکمه سوم channel4 = pygame.mixer.Channel(4) # استفاده از کانال چهار برای دکمه چهارم channel5 = pygame.mixer.Channel(5) # استفاده از کانال پنجم برای دکمه پنجم channel6 = pygame.mixer.Channel(6) # استفاده از کانال ششم برای دکمه ششم while 1: #execute loop forever if (IO.input(21) == 0): channel1.play(audio1) #اگر دکمه فشرده شد، موسیقی اول پخش شود if (IO.input(20) == 0): channel2.play(audio2) #اگر دکمه فشرده شد، موسیقی دوم پخش شود if (IO.input(16) == 0): channel3.play(audio3) #اگر دکمه فشرده شد، موسیقی سوم پخش شود if (IO.input(12) == 0): channel4.play(audio4) #اگر دکمه فشرده شد، موسیقی چهارم پخش شود if (IO.input(25) == 0): channel5.play(audio5) #اگر دکمه فشرده شد، موسیقی پنجم پخش شود if (IO.input(23) == 0): channel6.play(audio6) #اگر دکمه فشرده شد، موسیقی ششم پخش شود time.sleep(.01) #sleep for 100ms
شما می توانید در برنامه Python تغییراتی ایجاد کنید تا بتوانید بهترین عملکرد را دریافت کنید و صداهای مورد نظر خود را پخش کنید.