پرش به محتوای اصلی
آزمایشگاه‌های مجازی یادگیری با شبیه‌سازی ورود ثبت‌نام
درس ۶ از ۹ متوسط ۲۵ دقیقه

صدا: بازر و تابع tone

با tone و noTone بسامد بساز، آن را به نُت موسیقی گره بزن و ملودی کوتاهی با دکمه پخش کن.

در پایان این درس می‌توانید

  • با tone و noTone صدا بسازی و تفاوت شکل دوآرگومانی و سه‌آرگومانی را بشناسی.
  • رابطهٔ بسامد و دورهٔ تناوب را حساب کنی و بسامد یک اکتاو بالاتر را به دست بیاوری.
  • بازر فعال و غیرفعال را از هم تشخیص دهی و بدانی کدام برای ملودی به کار می‌آید.
  • بدانی tone از تایمر شمارهٔ دو استفاده می‌کند و با PWM پایه‌های D3 و D11 تداخل دارد.
  • یک ملودی را با دو آرایهٔ بسامد و مدت بسازی و با فشار دکمه پخشش کنی.

صدا چیزی جز نوسان سریع فشار هوا نیست. اگر یک صفحهٔ نازک را در هر ثانیه صدها بار جلو و عقب ببری، هوای جلوی آن را می‌فشاری و رها می‌کنی و گوش این موج فشار را می‌شنود. بازر همین کار را می‌کند: یک قرص پیزوالکتریک که با ولتاژ کمی خم می‌شود و با قطع ولتاژ به جای خود برمی‌گردد. تعداد این رفت‌وبرگشت‌ها در هر ثانیه را بسامد می‌گوییم و یکایش هرتز است. بسامد بالاتر یعنی صدای زیرتر و بسامد پایین‌تر یعنی صدای بم‌تر؛ بلندی صدا موضوع دیگری است و به دامنهٔ نوسان بستگی دارد، نه به بسامد.

بازر فعال و بازر غیرفعال

دو گونه بازر در بازار هست و جابه‌جا گرفتنشان رایج‌ترین دردسر این درس است. بازر فعال یک نوسان‌ساز کوچک درون خودش دارد؛ کافی است پایه‌اش را با digitalWrite() بالا ببری تا با یک بسامد ثابت کارخانه‌ای، معمولاً حدود ۲ کیلوهرتز، شروع به صدا کند. با چنین بازری هرگز ملودی نمی‌سازی، چون بسامد در اختیار تو نیست. بازر غیرفعال نوسان‌ساز ندارد؛ اگر ولتاژ ثابت به آن بدهی فقط یک تِق می‌زند و ساکت می‌ماند، ولی هر موج مربعی که به آن بدهی را با همان بسامد پخش می‌کند. برای نُت و ملودی همین گونهٔ دوم را می‌خواهی، و کیت این درس هم همین را دارد.

دو تابع tone و noTone

tone(pin, frequency) روی پایه یک موج مربعی با چرخهٔ کار پنجاه درصد می‌سازد و تا وقتی خودت جلویش را نگیری ادامه می‌دهد. نکتهٔ کلیدی این است که اجرا را متوقف نمی‌کند: ساختن موج را به یک تایمر سخت‌افزاری می‌سپارد و بی‌درنگ برمی‌گردد، پس خط بعدی کد فوراً اجرا می‌شود. برای بستن صدا noTone(pin) را صدا می‌زنی. شکل سه‌آرگومانی tone(pin, frequency, duration) هم هست که پس از سپری‌شدن مدت، خودش صدا را قطع می‌کند؛ اما باز هم منتظر نمی‌ماند. اگر نُت بعدی را بی‌فاصله بفرستی، نُت فعلی نصفه‌کاره کنار می‌رود و در عمل فقط آخرین نُت را می‌شنوی. راه‌حل، گذاشتن یک delay() به اندازهٔ طول همان نُت است. در هر لحظه فقط یک پایه می‌تواند صدا بدهد؛ فراخوانی tone() روی پایهٔ دوم، صدای پایهٔ اول را می‌بندد.

روی برد Uno تابع tone() از تایمر شمارهٔ دو استفاده می‌کند، و این همان تایمری است که analogWrite() برای پایه‌های D3 و D11 به کار می‌برد. تا وقتی صدایی پخش می‌شود خروجی PWM این دو پایه به هم می‌ریزد و پس از noTone() به حالت عادی برمی‌گردد. اگر پروژه‌ات هم‌زمان صدا و کم‌ونور کردن دارد، ال‌ای‌دی را روی D5، D6، D9 یا D10 ببر که با تایمرهای دیگری کار می‌کنند.

یک نمونهٔ عددی

نُت «لا»ی مرجعِ کوک ارکستر بسامد ۴۴۰ هرتز دارد؛ یعنی صفحهٔ بازر باید در هر ثانیه ۴۴۰ رفت‌وبرگشت کامل انجام دهد. دورهٔ تناوب، یعنی مدت یک رفت‌وبرگشت، وارون بسامد است: یک تقسیم بر ۴۴۰ می‌شود ۰٫۰۰۲۲۷ ثانیه، و چون هر ثانیه هزار میلی‌ثانیه است، برابر ۲٫۲۷ میلی‌ثانیه. در موج مربعی با چرخهٔ کار پنجاه درصد، نیمی از این مدت پایه بالاست و نیم دیگر پایین؛ یعنی حدود ۱٫۱۴ میلی‌ثانیه بالا و همان‌قدر پایین. حالا یک اکتاو بالاتر برویم: اکتاو یعنی دو برابر شدن بسامد، نه افزودن عددی ثابت. پس یک اکتاو بالاتر از ۴۴۰ می‌شود ۸۸۰ هرتز با دورهٔ تناوب ۱٫۱۴ میلی‌ثانیه، و یک اکتاو پایین‌تر می‌شود ۲۲۰ هرتز با دورهٔ ۴٫۵۵ میلی‌ثانیه.

ملودی با آرایه

یک ملودی چیزی جز دو فهرست موازی نیست: فهرست بسامدها و فهرست مدت‌ها. آرایهٔ اول می‌گوید هر نُت چه بسامدی دارد و آرایهٔ دوم می‌گوید چند میلی‌ثانیه بماند؛ حلقه‌ای که با یک شمارنده روی هر دو حرکت می‌کند، آهنگ را پخش می‌کند. سود این کار فقط مرتبی کد نیست: برای عوض کردن آهنگ یک ردیف عدد را دست می‌زنی و به منطق برنامه کاری نداری. تعداد نُت‌ها را هم از sizeof کل آرایه تقسیم بر sizeof یک خانه به دست بیاور تا با افزودن نُت تازه، شمارش خودبه‌خود درست بماند.

بازر پیزو جریان بسیار کمی می‌کشد و می‌شود مستقیم به پایه بستش. اما بازر مغناطیسی و بلندگوی کوچک گاهی بیش از سقف مجاز پایه جریان می‌کشند؛ آنجا یک مقاومت سری صد اهمی یا یک ترانزیستور لازم می‌شود.

کجا به کار می‌آید

صدای هشدار ماشین لباسشویی، بوق تأیید صندوق فروشگاه و همان بوق آشنای رایانه هنگام روشن شدن، همگی یک بازر و چند فراخوانی tone() بیش نیستند. صدا ارزان‌ترین راه گرفتن توجه کاربر است، چون برخلاف چراغ لازم نیست کسی همان لحظه به دستگاه نگاه کند. در کیت این درس دکمه‌ای با مقاومت بالاکش داخلی گذاشته‌ایم تا ملودی فقط با خواست تو پخش شود؛ همان الگوی همیشگی دستگاه‌های واقعی: یک رویداد ورودی، یک پاسخ صوتی.

رابطه‌های کلیدی

T = 1 / f = 1 / 440 Hz = 0.00227 s = 2.27 msدورهٔ تناوب نُت لا؛ مدت یک رفت‌وبرگشت کامل صفحهٔ بازر
f_octave = 2 x f = 2 x 440 = 880 Hz -> T = 1.14 msیک اکتاو بالاتر یعنی دو برابر شدن بسامد و نصف شدن دورهٔ تناوب
tone(pin, frequency [, duration]) ; noTone(pin)امضای دو تابع صدا؛ آرگومان سوم اختیاری است و مدت را برحسب میلی‌ثانیه می‌گیرد
درس قبلی

مأموریت روی میز کار

کیت را اجرا کن؛ بازر روی یک پایهٔ دیجیتال و دکمه فشاری با مقاومت بالاکش داخلی بسته شده است. با هر فشار دکمه یک ملودی هشت‌نُتی پخش می‌شود.

  1. کد را اجرا کن، دکمه را فشار بده و بشمار که ملودی چند نُت دارد و کدام نُت کشیده‌تر است.
  2. بسامد نخستین نُت را از ۲۶۲ به ۵۲۴ ببر و بشنو که همان نُت یک اکتاو زیرتر شده است.
  3. همهٔ عددهای آرایهٔ مدت را نصف کن و ببین ملودی دو برابر تندتر ولی با همان نُت‌ها پخش می‌شود.
  4. خط delay داخل حلقه را موقتاً کامنت کن، دکمه را بزن و بشنو که فقط آخرین نُت به گوش می‌رسد.
  5. دو نُت تازه به هر دو آرایه اضافه کن و تأیید کن که بدون دست‌زدن به حلقه هم پخش می‌شوند.
انتظار می‌رود: با هر فشار دکمه یک ملودی هشت‌نُتی صعودی از بازر شنیده می‌شود و پس از نُت پایانی سکوت کامل برقرار می‌شود.
مدار و کد این درس همین حالا اجرا می‌شود و حساب لازم ندارد. با حساب رایگان پیشرفت و نمرهٔ شما هم ثبت می‌شود و سقف روزانه بالاتر می‌رود.

مدار و کد این درس از پیش چیده شده‌اند. آزادانه تغییرشان بدهید — پروژه‌های خودتان دست‌نخورده می‌مانند. تمام‌صفحه با همین کیت

آزمون این درس

۵ پرسش چهارگزینه‌ای. پس از ثبت، پاسخ درست و توضیح هر پرسش را می‌بینید. می‌توانید هر چند بار که خواستید تلاش کنید؛ بهترین نمره در کارنامه ثبت می‌شود.