ساخت یک کامپیوتر فسقلی با رزبریپای زیرو
در این پست شرح میدهم چطور به همراه شایگان یک کامپیوتر فسقلی با صفحه لمسی و بلندگوی توکار در ابعاد بسیار کوچک ساختیم تا آن را به دوستش هدیه بدهد. از جایی که این مقاله بسیار طولانی است، جایی را بخوانید که بدرد کارتان میخورد.
شروع ماجرا
ماجرا از آنجا شروع شد که شایگان با من برای ساخت و سرهم کردن یک کامپیوتر کوچک و نسبتا ارزان مبتنی بر رزبریپای تماس گرفت. ایدهاش این بود که این کامپیوتر به محض روشن شدن تصویر گیف آلبوم صوتی مورد علاقه دوستش را، در حالی که همزمان تعدادی ترانه از آن آلبوم را پخش میکند، به صورت تمامصفحه نمایش بدهد. بله، باید یک کامپیوتر میساختیم! برای اینکار به دو چیز احتیاج داشتیم: سختافزار و نرمافزار. چالش اصلی انتخاب و تهیه و ساخت و مونتاژ قطعات اصلی بود. پس اول میپردازیم به سختافزار.
کاور آلبوم رنگی
سختافزار
همچنان که در اینترنت در جستجوی ایدههای مشابه بودیم به پروژهای به نام تاینی مک یعنی «مک فسقلی» از اوستاکاری بنام «cgenco» رسیدیم و تصمیم گرفتیم آن را الگو قرار دهیم. cgenco یک رزبریپای زیرو و یک صفحهی نمایش لمسی را برای ساخت یک کامپیوتر مکینتاش کوچک بکار برده است. او برای اینکار یک بدنهی عالی با نهایت ظرافت و توجه به جزئیات طراحی کرده است. او در نهایت یک شبیهساز مکینتاش هم روی رزبریپای زیرو نصب میکند و به یک مکینتاش کوچک میرسد. برای پخش صدا هم از یک اسپیکر خارجی بلوتوث استفاده میکند. ما سختافزار او را الگو قرار دادیم و تغییراتی در آن ایجاد کردیم. از جمله افزودن مدار فیلتر صوتی و یک جک ۳.۵ میلیمتری صوتی و یک پیج کم و زیاد کردن صدا و یک جفت اسپیکر توکار. با این اوصاف کامپیوتر کوچک ما چند بخش کوچک و ارزان لازم داشت:
- یک بورد کامپیوتر توکار که جور همه چیز را بکشد
- یک صفحهی نمایش که گیف را نمایش بدهد
- یک جفت اسپیکر که موزیک را پخش بکند
- یک مدار فیلتر صوتی با جک ۳.۵ میلیمتری و پتانسیومتر
- یک کارت حافظه برای نرمافزار
- یک بدنه که همه چیز را در خودش جا بدهد
ما تصمیم گرفتیم که از رزبریپای برای بورد اصلی استفاده کنیم چون کامیونیتی بزرگی دارد و پیدا کردن اطلاعات و نمونهها و قطعات لازم سادهتر است. شرکت سازندهی رزبریپای مدلهای مختلفی از کامپیوترهای تکبورد با امکانات مختلف تولید میکند. از جایی که همهی این کامپیوترها میتوانند آنچه ما میخواهیم انجام بدهند ما کوچکترین و ارزانترین عضو خانواده یعنی رزبریپای زیرو را انتخاب کردیم. صفحهی نمایش را از چین سفارش دادیم و یک جفت اسپیکر هم دوست و همکارم فدریکو، وقتی داشتیم راجع به نحوهی کار فیلترهای صوتی صحبت میکردیم در اختیارم گذاشت. کارت حافظه خودم داشتم. مدار فیلتر صوتی را ساختم و بدنه را هم با چاپگر سه بعدی چاپ کردم. جزئیات را در ادامه شرح میدهم که قصه طولانی است.
شرح مختصری در مورد رزبریپای
وقتی نوجوان بودم خیلی دوست داشتم که یک کامپیوتر کوچک داشته باشم و آنرا جایی در خانه روی دیوار نصب کنم و همیشه روشن بگذارم و بتوانم از آن به عنوان یک ایستگاه کنترل از راه دور استفاده کنم. آنزمان اما کامپیوترها بزرگ و حجیم و پرمصرف بودند و امکان اتصال آنها به سیستمهای برقی دیگر وجود نداشت یا خیلی گران بود. مثلا تصور کنید که میخواهیم یک لامپ را با کامپیوتر روشن و خاموش کنیم. چطور میتوانستم آن را به یک کامپیوتر وصل کنم؟ نمیدانم. شاید از طریقی میشد ولی امکانش برای من نوجوان وجود نداشت، آنهم با جیبهای خالی.
حتی امروز هم اینکار با کامپیوترهای خانگی معمولی سخت است. این کامپیوترها پورتهای USB و شبکه و گرافیک دارند و حتی دیگر از پورتهای سریال برای دستگاههای قدیمی خبری نیست. این کامپیوترها برای سرگرمی و کارهای رایج خانگی و اداری ساخته شدهاند. برق مصرفی آنها هم بیش از آنست که شبانه روز روشن بمانند یا شاید سر و صدای فن کامپیوتر مانع روشن گذاشتن آن بشود.
اما امروزه مدلهای متنوعی از کامپیوترهای کوچک در بازار یافت میشود. کامپیوترهایی کممصرف که توی کف دست جا میشوند و فن هم نیاز ندارند. اغلب این کامپیوترهای کوچک مبتنی بر پردازندههای خانواده ARM هستند نه اینتل. مهمترین ویژگی این معماری کم مصرف بودن آن است. این هم به معنی خود یعنی خنک بودن و عدم نیاز به فن. از طرفی معمولا CPU با یک یا چند هستهی ARM به همراه رم و چندین ورودی/خروجی و حافظهی دائمی معمولا در یک پکیج بنام System on Chip (SoC) بستهبندی میشود و در این کامپیوترهای کوچک بکار میرود. این کامپیوترها را Single Board Computer (SBC) مینامند، یعنی کامپیوتر تکبورده. مشهورترین SBC هم رزبریپای است.
اما مهمترین چیزی که یک SBC بویژه رزبریپای را از یک کامپیوتر معمولی متمایز میکند، در کنار کممصرف و کوچک بودن، وجود GPIO است. GPIO مخفف General Purpose Input/Output است. یعنی ورودی/خروجی چند منظوره. به زبان ساده روی هر رزبریپای حدود چهل پین کنار هم چیده شدهاند که قابل برنامهریزی هستند. این پینها را میتوان به ابزارهای جانبی وصل کرد و رفتار آنها را در یک برنامه کنترل کرد. یک ابزار جانبی میتواند به سادگی یک مقاومت و یک LED باشد که مستقیما با برق ۵ یا ۳ ولت از پینها تغذیه میشود (که از داخل برنامه قابل فعال/غیرفعال شدن هستند) یا به پیچیدگی یک صفحهی نمایش لمسی. از این گذشته ابزارهای جانبی که معمولا Hardware Attached on Top یا HAT نامیده میشوند از پروتکلهای مختلفی مانند SPI یا I²C برای اتصال به رزبریپای میتوانند استفاده کنند. در سایت pinout.xyz میتوان چیدمان پینهای بوردهای مختلف رزبریپای و کاربردهای هر پین را مشاهده کرد.
Raspberry Pi Zero W
تصویر یک رزبریپای زیرو از سایت رزبریپای
رزبریپای زیرو سادهترین عضو خانواده رزبری است. تنها دارای یک پورت micro USB و یک پورت mini HDMI است. دومین پورت میکرو یواسبی برای تغذیه بورد است و هیچ کاربرد دیگری ندارد. این بورد ۵۱۲ مگابایت RAM دارد و فاقد حافظهی دائمی است. درگاه SD Card نقش حافظهی دائمی را بازی میکند. آخرین درگاه موجود روی این بورد مخصوص دوربین است. این بورد در دو مدل عرضه میشود، یکی بدون وایفای و بلوتوث و دیگری با هردوی آنها. ما برای پروژهمان نیاز جدی به وایفای و بلوتوث نداشتیم ولی از جایی که داشتن وایفای هم کار من را راحت میکرد و هم کامپیوتر فسقلی ما را به اینترنت وصل میکرد تصمیم گرفتیم از این نسخه استفاده کنیم. توجه کنید که رزبریپای زیرو خروجی ۳.۵ میلیمتری برای جک صوتی و نیز هیچ نوع صفحه نمایش ندارد. ما برای این پروژه به هر دوی آنها نیاز داریم و در ادامه شرح میدهم که چطور آنها را اضافه کردیم. البته پیش از وصل کردن صفحهی نمایش چهل پین به بورد لحیم کردم، چرا که ما بخاطر صرفهجویی بوردی سفارش دادیم که پینها از پیش به آن لحیم نشده بودند (فقط حفرههایی برای اتصال آنها روی بورد قرار داشت).
صفحهی نمایش ۲.۸ اینچی
ما عینا همان صفحهی نمایشی را که cgenco انتخاب کرده بود از سایت علیاکسپرس سفارش دادیم که دو سه هفته بعد به دست من رسید. همانطور که پیشتر در مورد پینها توضیح دادم، این صفحه نمایش هم مستقیم به پینهای GPIO متصل میشود. من از یک کابل چهل سیمه استفاده کردم تا زیرو را به صفحهی نمایش متصل کنم.
صفحهی نمایش که با کابل ۴۰ سیمه به زیرو متصل شده است
برخلاف خروجیهای ویژهی مانیتورها مانند HDMI، برای آنکه چیزی روی این صفحهی نمایش ببینیم باید سیستم عامل را تنظیم کنیم. صرف وصل کردن آن به پینها هیچ اتفاقی نمیافتد. خوشبختانه مدتهاست که کرنل لینوکس از معماری آرم پشتیبانی میکند و سیستم عامل دبیان و نسخهی رزبریپای آن امکان تنظیم سیستم عامل برای استفاده از پینها را فراهم میکند. در بخش نرمافزار شرح میدهم که چطور اینکار را کردیم.
نصب سختافزار صفحهی نمایش در کل کار نسبتا سادهای بود بنابراین میرویم سروقت بخش بعدی.
اضافه کردن یک جفت اسپیکر
برای پخش موزیک از کامپیوترمان باید یک جفت اسپیکر به رزبریپای زیرو اضافه میکردیم. تصور خام اولیهی من این بود که میتواتم به سادگی یک جفت اسپیکر کوچک را مستقیما به پینهای رزبریهای متصل کنم. ولی به سرعت پی به اشتباهم بردم. رزبریپای زیرو بر خلاف اعضای قویتر خانواده مثل رزبریپای ۳ و ۴ فاقد خروجی ۳.۵ میلیمتری جک صوتی است. بنابراین اتصال یک هدفن یا یک اسپیکر خارجی دارای آمپلیفایر منتفی است. هرچند آنچه از نظر پنهان است یک مدار کوچک فیلتر صداست که آن هم در رزبریپای زیرو وجود ندارد. برای اینکه بتوان یک هدفن یا اسپیکر را به رزبریپای زیرو اضافه کردن باید ابتدا این مدار را ساخت.
رزبریپای زیرو فاقد فیلتر صدا و خروجی ۳.۵ میلیمتری جک صوتی است.
یک هدفن یا اسپیکر یا یک آمپلیفایر (تقویت کننده صدا) نیاز به یک سیگنال آنالوگ ورودی دارد نه یک سیگنال دیجیتال. مثلا یک فایل mp3 حاوی تخمینی دیجیتال/گسسته از یک سیگنال آنالوگ/پیوسته است و کیفیت آن هم بسته به دقت نمونهگیری (sampling rate) آن است. از طرفی رزبریپای زیرو تبدیل کنندهی دیجیتال به آنالوگ (Digital to Analog Converter - DAC) ندارد. پس نمیتواند خروجی مناسب برای اسپیکر تولید کند. یک پین GPIO رزبریپای میتواند در یک لحظه یک منطقی (۳.۳. ولت) یا صفر منطقی (صفر ولت) باشد و نه چیزی بین این دو (البته همه پینها GPIO نیستند). با مقداری جستجو و مطالعه یادگرفتم که همه مدلهای رزبریپای برای تولید صدا از تکنیکی بنام Pulse Width Modulation (PWM) استفاده میکنند. به کمک این روش میتوان یک سیگنال آنالوگ را به کمک یک سیگنال دیجیتال شبیهسازی کرد. در این روش ولتاژ پینها با فرکانسی بالا بین صفر و ۳.۳ ولت سویچ میشود (بسته به نوع اپلیکیشن مورد نیاز، مثلا یک موتور یا یک آمپلیفایر). با کنترل مدت زمانی که هر پالس خروجی را روشن میکند (۳.۳ ولت) میتوان میزان جریان الکتریکی و مجموع توان منتقل شده به مصرف کننده (اینجا اسپیکر) را کنترل کرد. شرح عمیقتر این موضوع از منظر الکتریکی فعلا در حیطهی تخصص من نیست.
خوشبختانه کرنل لینوکس چیپ BCM2835 بکار رفته در رزبری را به خوبی ساپورت میکند و ما در نهایت کافیست کرنل را بدرستی تنظیم کنیم و مدار فیلتر را به رزبریپای زیرو اضافه کنیم. مدار فیلتر سادهای که در در سایر رزبریپایها بجز زیرو وجود دارد ترکیبی است از تعدادی خازن و مقاومت که حاوی یک Low Pass Filter و یک High Pass Filter است که فقط یک رنج فرکانس خاص را از خودش عبور میدهد و باقی را حذف میکند که حداقل باعث حذف نویز میشود. اگر فهم عمیقتری از فیلترها دارید در بخش نظرات بنویسید که مفید فایده بشود. ما این مدار را میسازیم و به کامپیوترمان اضافه میکنیم.
فیلتر صوتی محصولات رزبری بجز زیرو. سمت راست خروجی ۳.۵ میلیمتری است و سمت چپ دو ورودی PWM. ما از دیودها سمت راست پایین صرف نظر کردیم.
مدار این فیلتر خیلی ساده است. اگر به تصویر بالا دقت کنید دو بخش بالا و پایین عینا مثل هم هستند. حتی یکی از آنها کافی است اما خروجی احتمالا مونو و تک کاناله خواهد شد. من هر دو را اضافه کردم. برای هر بازوی مدار به قطعات زیر احتیاح است:
- یک مقاومت ۲۷۰ اهمی
- یک خازن ۳۳ نانو فارادی
- یک مقاومت ۱۵۰ اهمی
- یک خازن ۱۰ پیکو فارادی
من بیشتر این قطعات را در خانه داشتم بجز خازن ۳۳ نانو فارادی که تعدادی تهیه کردم. تصویر زیر مداری را نشان میدهد که ساختم.
اولین تلاش من برای ساخت فیلتر صوتی
مدارهای ساده را اول روی Breadboard میسازند. بردبورد از دو بخش کلا مجزای بالا و پایین تشکیل شده. هر طرف هم به نوبه خود به دو بخش تقسیم شده. در امتداد لبهی کناری بورد تمام حفرههای آبی به هم وصل هستند و همهی حفرههای قرمز هم همینطور. یکی برای منفی است و دیگری برای اتصال مثبت. حفرههای درونی برد برد که با پنج حرف a b c d e مشخص شدهاند پنج تا پنج تا به صورت عمودی به هم وصل هستند.
ورودی این فیلتر را به پینهای PWM متصل کردم (شرح در بخش نرمافزار) و خروجی آن را به یک هدفن. بدون مشکل کار کرد صدا هم خوب بود (البته من خوره صدا نیستم!). هرچند با اتصال آن به اسپیکرهای ۳ واتی که از فدریکو گرفتم متوجه شدم که صدا بینهایت ضعیف است و باید گوشت را به اسپیکرها بچسبانی تا بتوانی به زحمت چیزی بشنوی. وقت اضافه کردن یک آمپلیفایر رسیده بود!
بعد از مقداری مطالعه در اینترنت و صحبت با همکارم که متخصص الکترونیک است فهمیدم که برای اینکه سیمهای یک اسپیکر را مستقیم به خروجی فیلتر وصل کنم نیاز به یک آمپلیفایر (تقویتکننده) دارم چرا که توان خروجی فیلتر برای تغذیهی اسپیکر سه واتی من کافی نبود (تصور کنید که اگر اسپیکر بزرگتری با توان بالاتر داشتم احتمالا اصلا چیزی نمیشنیدم). اینجا لازم است اضافه کنم که بیشتر اسپیکرهایی که ما دور و برمان داریم و به کامپیوتر و موبایل متصل میکنم یک مدار آمپلیفایر داخل خودشان دارند. هدفنها به خاطر کوچکیشان و توان پایین نیازی به آمپلیفایر ندارند بنابرین میتوانیم آنها را مستقیما به خروجی ۳.۵ میلیمتری وصل کنیم.
حالا دو انتخاب در پیش رو داشتیم: فقط به هدفن اکتفا کنیم یا یک آمپلیفایر هم بسازیم. خوب، جواب را خودتان حد بزنید :)
با توضیحات فدریکو و مطالعه مقالات دیگرانی که فیلتر صوتی ساخته بودند فهمیدم که میتوان حتی با یک ترانزیستور یک مدار تقویتکنندهی ساده ساخت. کافیست یکسوی آنرا به خروجی ۳.۳ یا ۵ ولت (از رزبری) متصل کرد و سوی دیگر را به خروجی فیلتر صوتی با مقداری جزئیات بیشتر. ولی در این مرحله آنقدر کار باقی مانده بود که تصمیم گرفتم یک مدار نقلی آمپلی فایر بخرم و به فیلتر اضافه کنم. با مقداری جستجو یک آمپلیفایر یک دلاری پیدا کردم بنام PAM8403 (در ایران هم به قیمت ناچیزی پیدا میشود).
آمپلیفایر ارزان و کوچک PAM8403. سمت راست بالا ورودی مثبت و منفی از منبع تغذیه. سمت راست پایین ورودی چپ و راست از فیلتر صدا. سمت چپ بالا خروجی اسپیکر سمت راست. سمت چپ پایین خروجی اسپیکر سمت چپ. عکس از سایت electrodragon.com
با کمک این آمپلیفایر میتوان اسپیکرهای کوچک و متوسط را مستقیما پشتیبانی کرد. به خاطر بیاورید که بدون آمپلیفایر با مدار ما بیش از یک هدفن کوچک را به زحمت میتوان پشتیبانی کرد. روش کار هم ساده است. ما خروجی فیلتر صدا و منبع تغذیه را به آمپلیفایر وصل میکنیم و سپس خروجی آمپلیفایر را به اسپیکرهایمان متصل میکنیم. نکته مهم در مورد این آمپلیفایر اینست که نباید گراوند (زمین/قطب منفی) خروجی به اسپیکرها به هم متصل شود. این را وقتی متوجه شدم که قصد داشتم یک خروجی ۳.۵ میلیمتری به مدار اضافه کنم که گراوند چپ و راست در آن مشترک است. ابتدا این خروجی را به اشتباه بعد از آمپلیفایر قرار داده بودم و با اتصال کابل هدفن گراوند چپ و راست آمپلیفایر به هم وصل میشد و باعث میشد که تقویت کننده از کار بیفتد. البته این را اصلاح کردم. در دیزاین آخر آمپلیفایر بعد از خروجی ۳.۵ میلیمتری قرار گرفته و دو اسپیکر به طور مجزا به خروجیهای آن وصل شدهاند.
جک ۳.۵ میلیمتری
اضافه کردن یک جک ۳.۵ میلیمتری کاری مفرح بود. من نمیدانستم که جکهای ۳.۵ میلیمتری مثل یک کلید عمل میکنند. یعنی نحوهی نصب کردن آن مهم است. جکی که من اضافه کردم ۵ پین داشت. یک پین گراوند و دو پین ورودی صدا و دو پین خروجی صدا. در حالتی که هیچ فیشی به جک وصل نیست ورودیها به خروجیها وصل هستند و صدا میرود به طرف آمپلیفایر و بعد اسپیکرها. اما به محض اتصال فیش یک هدفن سویچ باز میشود و صدا میرود به هدفن و ورودی آمپلیفایر قطع میشود. به همین سادگی! هیچ تکنولوژی خاصی در کار نیست. یک کلید ساده. البته من در ابتدا جک ۳.۵ میلیمتری را هم به خروجی آمپلیفایر وصل کرده بودم که نه تنها مشکلآفرین بود (اتصال کوتاه آمپلیفایر) بلکه کلا اشتباه بود چرا که هدفن به آنهمه توان خروجی نیاز نداشت و صدا گوش کر کن میشد. که همانطور که پیشتر گفتم آنرا اصلاح کردم.
بعد از اضافه کردن جک صوتی متوجه شدم که جای یک ولوم صدا خالی است. در غیر اینصورت امکان کم و زیاد کردن صدا بدون نرمافزار ممکن نبود. پس دست به کار شدم و بعد از چند تست با مقاومتها یک پتانسیومتر یک مگااهمی سفارش دادم. البته تا رسیدن به ترکیب صحیح هنوز راه درازی باقی مانده بود!
پتانسیومتر برای کم و زیاد کردن صدا
پتانسیومترها را خیلی جاها دیدهاید. روی رادیوهای قدیمی برای کم و زیاد کرن صدا و روی تجهیزات صوتی یا گاهی برای کم و زیاد کردن نور لامپهها یا کم و زیاد کردن گرمکنندههای برقی و مانند اینها زیاد پیدا میشود. سادهترین کارش اینست که مثل یک مقاومت متغیر عمل میکند. البته بسته به نحوهی قرار دادن آن در مدار میتوان با آن ولتاژ متغیر هم بوجود آورد. اینجا ما از آن به عنوان مقاومت متغیر برای کم و زیاد کردن صدا استفاده میکنیم.
یک پتانسیومتر. عکس از ویکیپدیا
اولین اشتباه از سری اشتباهاتم انتخاب مقاومت بسیار بزرگ بود. بعد از نصب پتانسومتر متوجه شدم که به محض اینکه ذرهای پیچ صدا را میچرخانم صدا به سرعت قطع میشود. در حقیقت فقط وقتی میتوانستم چیزی بشنوم که مقاومت پتانسیومتر صفر یا نزدیک صفر بود. به سرعت یک پتانسومتر خطی دیگر با مقاومت ۱۰ کیلواهم سفارش دادم. هنوز روحم خبر نداشت که این هم کار نخواهد کرد.
مهمترین اشتباهم این بود که تصور کردم پتانسیومتر فقط یک مقاومت متغیر خطی است. یعنی مقاومت را با یک شیب خطی زیاد میکند و باعث افت جریان میشود و این برای یک مدار صوتی کفایت میکند. مثلا فکر میکردم اگر پیج صدا را ۴۵ درجه بچرخانم با ۲۵ درصد افزایش مقاومت، صدا هم ۲۵ درصد کم میشود و اگر ۱۸۰ درجه بچرخانم با ۵۰ درصد افزایش مقاومت، صدا هم ۵۰ درصد کم میشود. تنها بعد از نصب پتانسومتر بود که متوجه شدم اصلا اینطور نیست…
گوش انسان خطی نیست
بعد از این کشف جالب بیشتر مطالعه کردم و فهمیدم که گوش انسان شدت صدا را به صورت خطی حس نمیکند بلکه آنرا به صورت لگاریتمی حس میکند. این [سوال روی استکاکسجنج] کمکم کرد تا موضوع را بفهمم. خلاصهاش اینست که شدت صدا به دسیبل محاسبه میشود و ده دسیبل افزایش یا کاهش شدت سیگنال صدا منجر به دو برابر یا نصف شدن سیگنالی میشود که گوش انسان حس میکند. این یعنی هرچند پات من مقامت را مثلا ۵۰ درصد زیاد میکرد ولی این باعث نصف شدن سیگنالی نمیشد که گوش انسان حس میکرد. اینجا بود که تفاومت پاتهای خطی و لگاریتمی را فهمیدم (مدتی هم طول کشید تا بفهمم اسم کوچک پتانسیومتر، «پات/pot» است).
یک پات خطی برای کم و زیاد کردن نور لامپ یا شدت چرخش یک پنکه مناسب است اما برای کم و زیاد کردن شدت صدا مناسب نیست. برای اپلیکیشنهای صوتی باید از پاتهای لگاریتمی استفاده کرد که مقاومت را نه به صورت خطی، بلکه به صورت لگاریتمی تغییر میدهند. یعنی نمودار تغییر خروجی خطی نیست بلکه منحنی است. بنابراین اگر پیچ صدای یک پات لگاریتمی را ۲۵ درصد بچرخانیم سیگنال صدا هم ۲۵ دسیبل تغییر میکند. همانطوری که ما انتظار آن را داریم. پس کافی بود که یک پات لگاریتمی سفارش بدهم. ولی به دلیل مسافرت دیگر فرصت سفارش پات دیگری نداشتم. در این مرحله حتما تصدیق میفرمایید که دیگر چارهای نبود جز ساخت یک پات لگاریمتی!!!
ساخت یک پتانسومتر لگاریتمی
حالا که چند پات خطی روی دستم مانده بود و فرصت سفارش پات لگاریتمی هم نبود دوباره دست به دامن اینترنت شدم اینبار وبسایت یکی از بچههای قدیم را پیدا کردم. (از کجا میدانم بچهی قدیم است؟ خودتان وبسایت نویسندهی زندگی سحرآمیز پاتها را ببینید و قضاوت کنید! دود همچنان از کنده بلند میشود!) بهترین مقالهای که در این رابطه خواندم مقالهی زندگی سحرآمیز پاتها است. ظاهرا به دلایل مختلفی از جمله سرمایهداری و تلاش برای حداکثر کردن سود، شرکتها دیگر پتانسیومترهای لگاریتمی آنهم با مقاومتهای دلخواه و کلا هرچه کمتر مصرف شود را کمتر تولید میکنند یا دیگر اصلا تولید نمیکنند. ظاهرا نان توی تولید انبوه چیزی است که بیشتر مشتری دارد. اما این وسط هکرها و بچههای قدیم بیکار ننشستهاند و کشف کردهاند چطور مقاومت خطی را به لگاریتمی تبدیل کنند.
اگر جزئیات را دوست دارید بداند آن مقاله را به هر ضرب و زوری که میتوانید بخوانید. خیلی آموزنده بود. خلاصهاش این بود که باید هر سه پین پتانسیومتر را بکار میگرفتم. دقت کنید که پتانسیومتر معمولا سه پین دارد. البته پات من شش پین داشت. یکی برای اسپیکر چپ یکی هم برای اسپیکر راست. اما در حقیقت چیزی جز دو پات به هم چسبیده نیست. پس من همان سه پین را شرح میدهم.
وقتی از یک پات به صورت مقاومت خطی استفاده میشود فقط دو پین کفایت میکند. یک پین ورودی است و یک پین خروجی. پین سوم هم وصل نیست. اما برای تبدیل یک مقاومت خطی به لگاریتمی (یا بکار گرفتن پات به عنوان متغیر ولتاژ) باید هر سه را به کار گرفت. تغییر البته ساده بود. فقط کافی بود پین سوم به گراوند مدار وصل بشود و بین پین ورودی و خروجی هم یک مقاومت اضافه بشود. میزان این مقاومت را به کمک فرمولی که در مقاله بالا داده شده بود محاسبه کردم.
http://www.geofex.com/Article_Folders/potsecrets/potscret.htm
بنابراین فقط کافی بود که فرمول سادهی زیر را برای پات ده کیلوییام حل کنم:
Rt=Rpot/b b=1,2,3,4,5(max)
Rt=10K/5=2K
از جایی که من یک پات ده کیلویی داشتم فقط به دو کیلو مقاومت احتیاج بود. پس پین سوم هر طرف پتانسیومتر را به گراند وصل کردم و در هر سوی پات بین ورودی و خروجی یک مقاومت دو کیلویی اضافه کردم و مشکل حل شد.
مدار کامل صوتی و مونتاژ قطعات
پس از حل همهی چالشهای بالا من مدار فیلتر و پتانسیومتر استریو و جک ۳.۵ میلیمتری و اسپیکرها را در مدار زیر ادغام کردم. فایل دیزاین را میتوانید دانلود کنید و در ادیتور سایت circuit-diagram.org ایمپورت کنید.
مدار صوتی حاوی فیلتر و پتانسیومتر و جت ۳.۵ میلیمتری و اسپیکرها. طراحی به کمک www.circuit-diagram.org.
مدار صوتی کامل
یکی از مقاومتهای دو کیلویی بین پتانسومتر و آمپلیفایر، بالا سمت چپ، قابل دیدن است. دیگری زیر پات است و دیده نمیشود. توجه کنید از جایی که مقاومت بیست اهمی نداشتم، دو مقاومت ده اهمی را سری کردهام که در بخش چپ پایین عکس قابل مشاهده است. برای ورودیها و خروجیها هم تعدادی پین لحیم کردم که اتصال آنها را ساده کند.
تصویر بالا بورد صوتی با همهی ملحقات آن را نمایش میدهد. سیمکشیها و اتصالات زیر بورد قابل دیدن نیست. متاسفانه حین مسافرت تجهیزات کافی همراه نداشتم و هویه و سیم لحیم و سیمهای مسی که بکار بردم مناسب نبودند و سیمها به سختی لحیم شدند و خیلی مستحکم از آب درنیامد. از طرفی چون برای رفع مشکلات مختلف مجبور شدم سیمکشی را تغییر بدهم خروجی سیمکشی زیگ زاگ از آب درآمد که از نمایش آن صرف نظر میکنم (چسب کاغذی را برای فیکس کردن سیمها و جلوگیری از شکستن اتصالات بکار بردهام).
حالا وقت سر هم کردن همه قطعات سختافزاری بود: زیرو و بورد صدا و صفحهی نمایش. برای اتصال صفحهی نمایش فقط کافی بود کابل آن را به زیرو وصل کنم. اما از جایی که کابل صفحهی نمایش تمام پینها را میپوشاند، مجبور شدم پینهای PWM و گراند و پنج ولت تغذیه آمپلیفایر را از زیر به زیرو لحیم کنم. مهمترین چالشی که حین ادغام بورد صوتی و صفحهی نمایش نگران آن بودم این بود که صفحهی نمایش تمام پینهای GPIO را استفاده کند و دیگر پین آزاد برای PWM باقی نماند. خوشبختانه با مطالعهی مستندات صفحهی نمایش و فایل اکسل شرح پینهای آن متوجه شدم که تعدادی از پینها استفاده نشدهاند (هرچند اتصال کابل همه را میپوشاند). از سوی دیگر بخت با ما یار بود و PWM روی پینهای باقی مانده قابل فعالسازی بود. طبق مستندات رزبریپای هر پین تعدادی کاربری دارد، میتواند GPIO باشد یا مثلا PWM یا SPI و مانند اینها باشد. اینها را از طریق تنظیمات سیستم عامل قابل تغییر است که جلوتر اشاره خواهم کرد.
شاید بپرسید چرا کاربریهای مختلفی برای پینها در نظر گرفته شده است. علت اینست که چیپ بکار رفته در زیرو قابلیتهای بسیاری دارد که برای همهی آنها پین کافی وجود ندارد. چرا که اقتصادی نیست و جا هم روی بورد برای آنهمه پین وجود ندارد. بنابراین رایج است که با نرمافزار قابلیت دلخواه را فعال میکنند.
سورپرایز بعدی: ریست شدن ناگهانی
بعد از اتصال همه قطعات و تست پخش صدا و گیف مشکل جدیدی پیش آمد. به محض زیاد کردن صدا یا پخش تصاویر متحرک رزبریپای زیرو ریست میشد. ابتدا فکر کردم مشکل جایی در اتصالات بورد صدا و آمپلیفایر است (چون به محض متصل کردن آن دستگاه ریست میشد). اما مشکل جای دیگری بود: منبعتغذیه. رزبریپای زیرو را برای تغذیه ابتدا به پورت usb کامپیوتر وصل کرده بودم. در استاندارد USB ویژگیهای مکانیکی و الکتریکی این پورتها تعریف شده است منجمله ولتاژ و حداکثر جریان خروجی. در استاندارد USB برای USB 2.0 ولتاژ ۵ ولت و حداکثر جریان ۵۰۰ میلیآمپر تعریف شده است. برای USB 3.0 این مقدار ۵ ولت و حداکثر ۹۰۰ میلیآمپر تعریف شده است. از طرفی تولیدکنندگان همگی این استاندارد را رعایت نمیکنند، پس ممکن است یک کامپیوتر بتواند این را تامین کند و دیگر نتواند. من زیرو را به لپتاپ ۱۹۹ دلاری Pinebook Pro خودم متصل کرده بودم که با اتصال صفحهی نمایش و پخش صدا ریست میشد (بدون اینها مشکلی پیش نمیآمد). طبق مستندات رزبری در مورد منبع تغذیه جریان مصرفی زیرو در حالت عادی ۱۰۰ میلیآمپر است و منبع تغذیه باید تا ۱.۲ آمپر را بتواند تامین کند که بیش از توان خروجی پورتهای USB است. از طرفی اتصال صفحههی نمایش و اسپیکرها میزان جریان مصرفی را افزایش میدهد که با مراجعه به مشخصات هر قطعه قابل محاسبه است (من محاسبه نکردم). جریان مصرفی برابر خواهد بود با مجموع جریان مصرفی هر قطعه. بعد از استفاده از یک منبع تغذیهی USB با ۲ آمپر جریان مشکل حل شد (شارژر یک بلندگو را بکار بردم).
منبع تغذیهی رزبریپای زیرو باید بتواند حداقل ۱.۲ آمپر جریان را تامین بکند.
خلاصه با اطمینان از اینکه سختافزار ما کار میکند میرویم سروقت بدنه.
چاپ سه بعدی بدنه
همانطور که در ابتدا اشاره کردم ما از بدنهای که قبلا طراحی شده استفاده کردیم. cgenco زحمت طراحی یک بدنه شبیه یک مکینتاش قدیمی را کشیده است که برای ما ایدهآل بود. من فایلهای stl برای چاپ سه بعدی آن را دانلود کردم و به کمک یک پرینتر سه بعدی پروسا Prusa I3 MK3S چاپ کردم. اما از روی کم تجربگی «ساپورت» مناسبی برای چاپ انتخاب نکرده بودم. یعنی موقع چاپ بخشهایی که زیرشان خالی است (مثل یک حفره) ممکن است خراب شود. برای ممانعت از اینکار باید از ساپورت استفاده کرد. در آنصورت چاپگر یک ساختار پوک که براحتی قابل حذف کردن است زیر و درون حفرهها چاپ میکند که مانع ریزش آنها حین چاپ میشود (مادهای که از نازل چاپگر خارج میشود داغ و نرم است و فرو میریزد).
دست راست: چاپ شده بدون ساپورت. دست چپ چاپ شده با ساپورت.
ما مجبور بودیم دو حفره برای پتانسیومتر و جت ۳.۵ میلیمتری در بدنه ایجاد کنیم. باید فایلهای سه بعدی را در یک برنامهی CAD اصلاح میکردیم و حفرههای لازم را در بنده ایجاد میکردیم و فایل تغییر یافته را پرینت میگرفتیم. متاسفانه از جایی که هنوز اینکار را بلند نیستم و فرصت یادگیری هم فراهم نشد به روش سنتی سیخ داغ مراجعه کردیم! و البته کار انجام شد.
اگه کار میکنه احمقانه نیست!
خلاصه با یک جسم داغ دو حفره در بدنه ایجاد کردیم و بعد از مقداری صافکاری و تمیزکاری بورد صدا کامل جا خورد. البته جک ۳.۵ میلیمتری کاملا با بدنه همسطح نشد، که باعث میشود برخی هدفنها که فیشهای ضخیمی دارند خوب جا نخورند. اضافه کنم که در بدنه جایی برای محکم کردن زیرو در نظر گرفته شده بود اما نه برای اسپیکرها و بورد صدا و خروجیهای آن. اما از جایی که فضا به مقدار کافی وجود داشت، جای نگرانی نبود. من بورد صدا را در دیوارهی پشتی محکم کردم و کنارههای آن را هم به کمک تفنگ حرارتی با مقداری پلاستیک مایع سفت کردم. پتانسیومتر هم یک مهره داشت که از بیرون بدنه روی آن پیچ میشد و آن را محکم در جای خودش نگاه میداشت. یک کلاه هم برای پات سفارش داده بودم که روی آن از بیرون نصب کردیم.
بدنهی اول به رنگ آبی را برای تست بکار بردیم.
بدنهی نمونهی اول (پروتوتایپ) در مقایسه با بدنهی اصلی.
بدنهی نمونهی اول (پروتوتایپ) در مقایسه با بدنهی اصلی.
حالا میرویم سر وقت اسپیکرها.
نصب نهایی اسپیکرها
اسپیکرهای ما حداکثر سه وات توان دارند و مقاومت درونی هر یک از آنها چهار اهم است. متاسفانه فراموش کردم پیش از نصب از مشخصات فنی پرینت شده روی آنها عکس بگیرم و ممکن است این ارقام اشتباه باشد (طی فرآیند نصب برچسب مشخصات فنی اسپیکر از بین رفت). صدای اسپیکرها چندان بلند نیست و وقتی داخل بدنه قرار میگیرد کمتر هم میشود. اول میخواستیم تعدادی حفره هم برای اسپیکرها ایجاد کنیم (اینکار را روی بدنهی آبی امتحان کردیم)، اما از نظر ظاهری خوب درنیامد و از اینکار صرفنظر کردیم. برای هدف ما صدا به اندازهی کافی خوب بود. بنابراین اسپیکرها را به پینهای خروجی که روی بورد صدا در نظر گرفته بودم متصل کردم و آنها را داخل قاب روی دیوارهها چسباندم.
همه آنچه برای پخش صدا از اسپیکرها نیاز است: رزبریپای زیرو و بورد صدا و یک جفت اسپیکر. دقت کنید که در این تصویر سیمها از رو به پینهای زیرو متصل شدهاند در حالی که در قاب اصلی از زیر به آن لحیم شدهاند.
برای اسپیکرها هم جای خاصی داخل بدنه در نظر گرفته نشده بود اما خوشبختانه فضا به اندازهی کافی برای اسپیکرها وجود داشت.
جای کافی برای اسپیکرها وجود داشت.
بورد صدا و اسپیکرها داخل قاب اصلی. کابلهای بورد صدا از زیر به زیرو لحیم شدهاند چرا که کابل صفحههای نمایش همه فضای بیرونی را اشغال کرده است.
با نصب اسپیکرها دیگر میتوانستیم درب قاب را ببنیدیم.
سختافزار کامل مک فسقلی با سیستم عامل رزبری (دبیان با گرافیک xfce).
با پایان کار سختافزار حالا با اعتماد بنفس خیلی بیشتر میرویم سروقت چیزی که از آن خیلی بیشتر سردرمیآورم یعنی نرمافزار!
نرمافزار
در مقایسه با ساختن کامپیوتر کوچکمان کار نرمافزاری زیادی نداریم. با اینحال موارد زیر را شرح میدهم:
- سیستم عامل: فلش و بوت کردن سیستم عامل مناسب رزبری
- دسترسی سریال: اتصال سریال به رزبری بدون دسترسی به شبکه و مانیتور و کیبورد
- اتصال به وایفای: متصل شدن به شبکهی خانگی
- دسترسی شبکه: فعالسازی ssh و اتصال به رزبری از راه دور
- نصب صفحهی نمایش: نصب و فعالسازی overlay صفحهی نمایش
- راهاندازی بورد صدا
- کپیکردن فایلها
- برنامهی اصلی:نوشتن یک شلاسکریپت ساده برای پخش موزیک و نمایش گیف آلبوم
سیستم عامل
در کامپیوترهای مبتنی بر چیپستهای شرکت اینتل (معماری x86) کامپیوتر با یک برنامهی کمکی در BIOS یا جدیدا UEFI بوت میشود. در کامپیوترهای مبتنی بر ARM بایوس یا UEFI وجود ندارد و بوت به گونهی دیگری و به نوعی سادهتر است. ما فقط نیاز است که سیستمعامل مناسبی را به درستی روی یک کارت حافظه فلش کنیم و آنرا در درگاه کارتخوان رزبریپای زیرو وارد کنیم و کامپیوتر را روشن کنیم. یعنی فرآیند نصب و بود خلاصه میشود به دانلود ایمیج مناسب کامپیوتر و فلش کردن آن روی یک کارت حافظه.
برای کامپیوتر فسقلیمان ما یک کارت حافظهی ۳۲ گیگاباتی استفاده کردیم (من در وسایلم داشتم). برای دانلود سیستم عامل و فلش کردن آن راههای زیادی هست اما سادهترین آن استفاده از [ایمیجساز رزبری ]است. ایمیجساز رزبری میتواند همزمان سیستم عامل مناسب را دانلود کند و آن را روی کارت حافظه بنویسد. من سیستم عامل دسکتاپ رزبری را انتخاب کردم که از همه سادهتر است و البته با حدود ۸ گیگابایت حجم، بزرگترین آنها.
ایمیجساز رزبری برای ویندوز و لینوکس و مک قابل دانلود است.
بعد از دانلود سیستم عامل و فلش کارت حافظه کافیست آن را در درگاه کارتخوان وارد کردن و زیرو را روشن کرد. شرح بدهم که هیچ یک از محصولات خانواده رزبری کلید روشن و خاموش ندارند و به محض اتصال کابل منبع تغذیه روشن میشوند و فرآیند بوت آغاز میشود. در مورد زیرو منبع تغذیه پورت میکرو usb است که باید به یک منبع تغذیهی مناسب (همانگونه که پیش از این شرح آن رفت) متصل بشود.
تنظیمات رایج سیستم عامل رزبری
رزبریپای را به دو شیوه میتوان تنظیم کرد (تنظیمات صدا و HDMI و GPIO و SSH و پورت سریال و مانند اینها). یکی تغییر دو فایل موجود در پارتیشن بوت آن است: cmdline.txt و config.txt. این فایلها به ترتیب پارامترهای کرنل لینوکس و تنظیمات overlay رزبری هستند (دومی ممکن است بیش از این هم باشد، دقیق نمیدانم). این فایلها را میشود مستقیما با اتصال کارت حافظه به یک کامپیوتر تغییر داد بدون آنکه از رزبریپای استفاده کرد. ما هر دو اینها را تغییر خواهیم داد تا کارهای زیر را انجام بدهیم:
- فعال و غیرفعال کردن کنسول لینوکس و پورت سریال
- فعال کردن خروجی صدا روی خروجی PWM
- فعال کردن صفحهی نمایش
روش دیگر تنظیم رزبریپای رزبری استفاده از برنامهایست بنام raspi-config که از پیش روی سیستمعامل رزبری نصب است. ناگفته پیداست که برای استفاده از این برنامه باید به رزبریپای وصل شد که مستلزم دیدن خروجی (کنسول یا گرافیکی) و اتصال کیبورد و مانیتور با کابل mini hdmi و اتصال سریال یا شبکه است. اما آیا میشود بدون کیبورد و ماوس و اتصال شبکه و اتصال مونیتور یک رزبریپای را تنظیم کرد؟ بله میشود! با اتصال UART به اختصار آشنا شوید.
اتصال سریال یا UART
شاید گزاف نباشد اگر بگویم که در عالم کامپیوترهای کوچک و بوردهای الکترونیکی توکار UART محبوبترین روش اتصال و تبادل اطلاعات با یک دستگاه است. در این روش تنها به دو سیم احتیاج است و هیچ برنامه یا درایور خاصی نیاز نیست و در همهی سیستم عاملها هم فراهم است. UART یک کابل TX به معنای ترانسفر و یک کابل RX به معنای دریافت نیاز دارد. و نیز یک سیم سوم برای اتصال گراوند که بدون آن هم شاید کار کند. رزبریپای هم میان انبوه پینها UART هم دارد. کافیست سه پینهای ۸ (TX) و ۱۰ (RX) را به ترتیب به RX و TX یک دستگاه دیگر وصل کرد (TX یکی به RX دیگری وصل میشود و بلعکس). برای متصل کردن رزبریپای به لپتاپ لینوکسیام از یک تبدیل کنندهی سریال به USB استفاده کردم چون لپتاپم خروجی UART ندارد (شاید دارد و هنوز نمیدانم). البته این کار خیلی رایجی است.
اتصال به رزبری از طریق پورت سریال. در سمت راست تصویر میتواند تبدیلکننده USB-UART را که با سه سیم به پینهای رزبری متصل شده است را ببینید.
یک تبدیلکنندهی USB-UART. عکس از waveshare
برای اینکه بتوان خروجی کنسول لینوکس را به کمک UART روی کامپیوتر دید باید به غیر از اتصال صحیح کابلها (TX به RX و RX به TX) رزبریپای را هم تنظیم کرد. یکی برای فعال کردن UART و دیگری برای فعال کردن یا اطمینان از فعال بودن کنسول لینوکس (کنسول لینوکس همه آن چیزی است که کرنل در خروجی/مانیتور به صورت متنی نمایش میدهد که معمولا شامل یک خط فرمان هم میشود). هدف اینست که روی کامپیوترمان به این خط فرمان وصل بشویم و زیرو را کنترل و تنظیم کنیم و نیز آن را به شبکهی وایرلیس خانگی وصل بکنیم.
چیدمان پینهای رزبریپای زیرو و برخی از قابلیتهای هر پین. بالا سمت راست پینهای سریال را میبینید. عکس از سایت pinout.xyz
برای فعال کردن UART رزبریپای زیرو کافیست که فایل /boot/config.txt
را روی کارت حافظه ویرایش کنیم و مطمئن شویم خط زیر در آن وجود دارد:
enable_uart=1
از طرفی باید فایل /boot/cmdline.txt
شامل تنظیمات زیر باشد:
console=serial0,115200 console=tty1
با اطمینان از وجود این تنظیمات کافیست کارت حافظه را در زیرو قرار دهیم و آن را روشن کنیم. با این تغییرات خروجی کنسول لینوکس روی UART فراهم خواهد بود. برای دیدن آن (و گرفتن یک خط فرمان) کافیست از برنامهای مانند picocom برای اتصال به پورت سریال استفاده کنیم. البته تبدیل USB-to-UART ما باید وصل باشد. با فرض اینکه تبدیل با اتصال تبدیل، یک پورت سریال در آدرس /dev/ttyUSB0
باز شده است به آن وصل میشویم:
rock@rock:~$ sudo picocom -b 115200 /dev/ttyUSB0
ممکن است تبدیلکننده در آدرسی به جز این پدیدار بشود. اگر پیش از اتصال تبدیلکننده فرمان sudo dmesg -w
را در یک ترمینال باز کرده باشیم در خروجی لاگ کرنل خواهیم دید که تبدیلکننده در چه آدرسی در دسترس قرار میگیرد.
اگر همه چیز درست پیش رفته باشد از این مرحله به بعد ما یک خط فرمان خواهیم داشت که میتوانیم با نام کاربری pi و پسورد دیفالت raspberry در سیستم وارد شویم و کارمان را ادامه دهیم. اگر در این کار موفق نشدید وحشت نکنید. رزبریپای را با یک کابل mini hdmi به یک مانیتور وصل کنید و به کمک یک مبدل micro USB به USB A (معمول) یک کیبورد و ماوس به آن وصل کنید و کار را دنبال کنید.
من تنها حین راهاندازی اولیه و ساخت بورد صوتی از خروجی سریال استفاده کردم. چرا که به محض فعالسازی صفحهی نمایش پینهایی که برای سریال بکار رفته برای صفحهی نمایش نیاز است و بنابراین باید UART را غیرفعال میکردم:
enable_uart=0
اتصال به وایفای
برای نصب بستههای نرمافزاری لازم و نیز اتصال از طریق شبکه نیاز است زیرو را به شبکه خانگی و اینترنت متصل کنیم. از جایی که ما رزبریپای زیرو نسخه وایفای سفارش دادهایم میتوانیم آنرا به شبکه وایرلس خانگی متصل کنیم. برای اینکار از wpa_supplicant استفاده میکنیم. این ابزار از پیش روی سیستمعامل رزبری نصب است. مطابق مستندات رزبری کافیست فایل /etc/wpa_supplicant/wpa_supplicant.conf
را تغییر بدهیم و سرویس wpa_supplicant را فعال و کامپیوتر را ریبوت کنیم. به فایل بالا کد کشور و نام و پسورد وایفای خانگی را اضافه میکنیم:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=IR
update_config=1
network={
ssid="<Name of your wireless LAN>"
psk="<Password for your wireless LAN>"
}
علت اضافه کردن کد کشور اینست که چیپ وایرلس فرکانس صحبح آن کشور را بکار بگیرد و در ارتباطات رادیویی دیگر اختلال ایجاد نکند. بعد سرویس را فعال و استارت کنید و بعد ریبوت:
$ sudo systemctl enable wpa_supplicant.service
$ sudo systemctl start wpa_supplicant.service
$ sudo reboot
بعد از ریبوت باید اتصال شبکه و اینترنت (اگر برقرار باشد) فراهم شده باشد. یک پینگ ساده معمولا برای بررسی این موضوع کافیست:
rock@rock:~$ ping 1.1
PING 1.1 (1.0.0.1) 56(84) bytes of data.
64 bytes from 1.0.0.1: icmp_seq=1 ttl=49 time=141 ms
64 bytes from 1.0.0.1: icmp_seq=2 ttl=49 time=145 ms
64 bytes from 1.0.0.1: icmp_seq=3 ttl=49 time=391 ms
^C
--- 1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 140.939/225.884/391.216/116.922 ms
بد نیست اشاره کنم که با در نهایت پس از تنظیم صفحهی نمایش و صفحهی لمسی حتی بدون کیبورد و ماوس میشود از این کامپیوتر کوچک استفاده کرد و مثلا به وایفای خانگی متصل شد. فقط باید برای تایپ پسورد از صفحه کلید کوچک مجازی که از پیش روی سیستم عامل نصب است بکار گرفت. آن را میتوان از منوی برنامهها پیدا کرد.
حال با برقراری اتصال وایرلس و اینترنت میرویم سروقت بخش بعدی: فعالسازی ssh.
فعالسازی ssh و اتصال به رزبری از راه دور
فعالسازی ssh اجازه میدهد که بدون اتصال مانیتور و کیبورد و بدون دسترسی به پورت سریال به کامپیوتر وصل شد و دستوراتی را اجرا کرد. برای فعالسازی آن روی رزبری دو راه وجود دارد. یکی قرار دادن یک فایل خالی به نام ssh در پارتیشن بوت کارت حافظه قبل از اولین بوت رزبری است، یعنی بلافاصله بعد از فلش کردن کارت حافظه. روش دوم به کمک خط فرمان است، یعنی یا باید از طریق کنسول یا با کیبورد و مانیتور به رزبری وصل شده باشیم:
$ sudo systemctl enable ssh
$ sudo systemctl start ssh
تمام این روشها [در بخش ssh مستندات رزبری] شرح داده شده است. از جایی که برای فعالسازی صفحهی نمایش باید UART را غیرفعال میکردم فعالسازی ssh ضروری بود. از اینجا به بعد تمام دستورات از طریق ssh انجام شده است. برای پیدا کردن آی پی رزبری هم کافیست در ترمینال دستور ip addr show
را وارد کنید یا در مودم آن را پیدا کنید.
مرحله بعدی نصب صفحهی نمایش است.
نصب صفحهی نمایش
برای نصب صفحهی نمایش من راهنمای سازنده را دنبال کردم:
$ git clone https://github.com/tianyoujian/MZDPI.git
$ cd MZDPI/vga
$ sudo chmod +x mzdpi-vga-autoinstall-online
$ sudo ./mzdpi-vga-autoinstall-online
$ sudo reboot
اگر نصب به درستی انجام شود بجز اضافه شدن یک یا چند فایل جدید به پوشهی /boot/overlays
تنظیمات زیر به انتهای فایل config.txt اضافه خواهد شد:
#gpio=18=op,dh
gpio=7-8=a2
dtparam=spi=on
dtoverlay=ads7846,penirq=27,swapxy=1,xmin=200,xmax=3850,ymin=200,ymax=3850
display_rotate=3
dtoverlay=mzdpi
framebuffer_width=640
framebuffer_height=480
enable_dpi_lcd=1
display_default_lcd=1
dpi_group=2
dpi_mode=87
dpi_output_format=0x07f003
hdmi_timings=480 0 41 20 60 640 0 5 10 10 0 0 0 60 0 32000000 1
البته خط اول را من کامنت کردهام چرا که به گمانم اسکرین با PWM روی این پین کانفلیکت داشت و من کاربری دیگری برای این پین تعریف کرده بودم (PWM). درس حاشیهای اینست که اگر گزارش طویل را هنگام ساخت اندک اندک نوشته بودم الان بهتر بخاطر داشتم که چرا اینکار را کردهام!!
این دستورات هم کار محیرالعقولی انجام نمیدهد. اصل کارش اینست که Device Tree Overlay این صفحهی نمایش را دانلود و کامپایل و نصب میکند. نصب هم چیزی جز کپی کردن در مسیری در پارتیشن بوت و افزودن چند خط به فایل config.txt نیست.
Device Tree
توضیح کوتاه در موردوقتی ما یک وسیلهی USB به یک دستگاه وصل میکنیم آن وسیله طبق پروتکل USB با کامپیوتر صحبت میکند. اما وقتی یک وسیله به چند یا چندین پین رزبریپای متصل میکنیم چه اتفاقی میافتد؟ آنجا دیگر USB یا مانند آن در کار نیست، بلکه قطعات با پروتکلهایی مانند SPI و I²C یا UART با رزبریپای ارتباط برقرار میکنند. برای اینکه سیستم عامل این قطعات را بفهمد نیاز به چیزی شبیه به درایور است که آن سختافزار جانبی را تعریف کند و عملکردش را شرح بدهد. بواسطهی پیچیدگی SoCهای امروزی و نیز تنوع زیاد HATها، رزبریپای و کرنل لینوکس از Device Tree و overlayها برای فهمیدن سختافزارهای مختلف استفاده میکنند.
اما یک overlay چیست؟
کرنلهای رزبریپای و Firmware آن برای شرح سختافزار موجود در رزبریپای از Device Tree یا «درخت تجهیزات» استفاده میکنند. اگر با سیستمهای فایل یونیکسی آشنا باشید، میدانید که فایلسیستم از چشم کرنل مثل یک درخت است. ریشه روت است یعنی /
و «همه چیز فایل است». مثلا پیشتر برای وصل شدن به تبدیل کنندهی UART به USB با یک برنامه فایلی بنام /dev/ttyUSB0
را باز کردیم یا مثلا فایلهای کاربر در «خانهی» او قرار دارند مثلا /home/pi
. همین سبک در Device Tree بکار رفته و در بخشی مشترک مشخصات سیپییو و حافظهی موجود در دستگاه و جزئیات مشترک تعریف شده و سایر سختافزارهای دلبخواهی هر یک این درخت اصلی را توسعه میدهند و آن را با مشخصات خودشان بروز میکنند. به این بخشهای اضافی میگویند overlay.
برای فعالکردن overlayهای مختلف باید در فایل config.txt خطی مانند dtoverlay=… اضافه کرد. هر Device Tree Overlay هم میتواند تنظیماتی داشته باشد که با کلید dtparams=… در فایل کانفیگ اضافه میشود. اسکریپت بالا اینکار را برای صفحهی نمایش ما انجام میدهد. شرح بیشتر این موضوع از حوصلهی این مقاله خارج است.
راهاندازی بورد صدا
بورد صدای ما هم به مانند صفحهی نمایش نیاز به تغییراتی در config.txt به شرح زیر دارد:
- فعال کردن overlay برای PWM
- تنظیم GPIOهای لازم برای PWM
- تنظیم ALSA برای کار با PWM
در این مورد البته کار سادهتر است. مورد اول و دوم را با هم در یک خط به config.txt اضافه میکنیم:
dtoverlay=pwm-2chan,pin=18,func=2,pin2=19,func2=2
این خط GPIO شماره ۱۸ و ۱۹ را برای PWM0 و PWM1 تنظیم میکند. برای اطلاعات بیشتر سورس pwm-2chan overlay را بخوانید.
به محض اضافه کردن این خط و حتی بدون تنظیمات صدای لینوکس میتوان مستقیما روی GPIO شماره ۱۸ و ۱۹ موزیک پخش کرد! البته فقط با برنامهی زیر که برای رزبریپای ساخته شده:
$ omxplayer <somemusic.mp3> --adev local
در ویدیوی زیر با پورت سریال به رزبری وصل میشوم و آهنگ بازی Hotline Miami را پخش میکنم.
اگر یک اسیلوسکوپ به این پینها وصل کنید جهشهای ولتاژ را خواهید دید. با وصل کردن مستقیم یک هدفن هم باید چیزی شبیه موزیک پخش شود اما مواظب گوش خودتان باشید چرا که ممکن است صدای زیاد ناگهانی به گوش صدمه بزند.
تنظیمات بالا هرچند برای پخش صدا با دستوری که گفتیم کفایت میکند اما اگر دسکتاپ را بوت کنید متوجه میشوید که هیچ برنامهای قادر به پخش صدا نخواهد بود و از دید لینوکس کارت صوتی وجود ندارد. برای این مشکل کافیست پارامتر زیر را به کرنل رزبریپای با ویرایش فایل cmdline.txt پاس بدهیم تا کرنل سختافزارهایی را شبیهسازی بکند که ALSA (مخفف Advanced Linux Sound Archiitecture) یک سختافزار صوتی ببیند و بتواند خروجی صدای برنامهها را به آن هدایت بکند:
snd_bcm2835.enable_compat_alsa=1
و ریبوت. کانفیگفایلهای نهایی را میتوانید با کلیک روی config.txt و cmdline.txt دانلود کنید. حالا بالاخره بعد از طی راهی طولانی میتوانیم برویم سروقت پخش موزیک و گیف.
برنامهی اصلی:نوشتن یک شلاسکریپت ساده
حالا با در دست داشتن یک کامپیوتر معمولی که میتواند صدا و گرافیک پخش بکند کافیست به آن بگوییم هر بار که بوت میشود یک گیف را در حالت تمام صفحه پخش بکند و همزمان تعدادی موزیک به ترتیب از اسپیکرها پخش بشود. یعنی دو کار زیر:
- اسکریپتی که گیف و آلبوم صوتی را پخش بکند.
- تنظیماتی که این اسکریپت پس از هر بوت اجرا بشود.
اول میخواستم برای این کار برنامهای با پایتون بنویسم. اما دیدم با شل اسکریپت بسیار سادهتر است. از سویی میخواستم که بشود از کامپیوتر بدون این برنامه هم استفاده کرد. بنابراین روشی را انتخاب کردم که مانع استفاده عادی از کامپیوتر نشود. اسکریپت ما یک برنامه را در حالت تمام صفحه باز میکند که میتوان آن را با فشردن کلید ESC یا با لمس صفحه نمایش و لمس دگمهی ضربدر پنجره بست. از سوی دیگر پس از پخش همهی فایلهای صوتی خود به خود برنامه تمام شده و پنجره بسته خواهد شد.
ابتدا فایلهای لازم شامل گیف و ترکهای آلبوم صوتی را در پوشهی خانه/home روی کارت حافظه کپی کردم. من اینکار را با scp انجام دادم.سپس شل اسکریپت زیر را برای برنامه اصلی نوشتم:
#!/bin/bash
sleep 5
cd /home/pi/Rangi
IFS=$(echo -en "\n\b")
sxiv -bfa rangi.gif &
for i in $(ls *.mp3); do
omxplayer "$i" --adev local
done;
برنامه چه کار میکند؟ خط اول که به Shebang معروف است میگوید در صورتی که این فایل به صورت مستقیم اجرا شود کدام برنامه باید آن را هندل کند. بعد برنامه در صورت اجرا ۵ ثانیه به خواب میرود. اینکار برای این لازم بود تا اجازه دهد دسکتاپ رزبری کامل لود شود، در غیر اینصورت پنجره بعدی تمام صفحه نمیشد. بعد برنامه مسیر جاری خودش را به فولدری که حاوی فایلهای صوتی و تصویری است تغییر میدهد. خط بعدی که حاوی IFS به bash میگوید که برای جدا کردن خروجی دستوراتی مانند ls از newline استفاده کند. دیفالت space است.
خط بعدی به کمک برنامهی sxiv که مخفف Simple X Image Viewer است گیف را در حالت تمام صفحه باز میکند و آن را به بکگراند میفرستد. هر فرمانی که & در انتها داشته باشد میرود به بکگراند و اجرای آن ادامه پیدا میکند و شل میرود سروقت فرمان بعدی.
بعد یک لوپ ساده داریم. روی خروجی دستوری ls *.mp3
لوپ میزنیم (که با newline تفکیک خواهد شد) و به ازای هر خروجی با برنامهی omxplayer آن فایل را پخش میکنیم.
تنها لازم بود برنامهی sxiv را روی رزبری نصب کنم که با دستورات زیر انجام شد:
$ sudo apt update
$ sudp apt install sxiv
اسکریپت را هم قابل اجرا کردم که بتوان آن را مستقیم اجرا کرد:
$ chmod +x rangi.sh
اجرای خودکار اسکریپت پس از بوت
سیستمعامل رزبری از دسکتاپ XFCE استفاده میکند. بنابراین من برای اجرای خودکار اسکریپت پس از هر بوت از قابلیت autostart در XFCE استفاده کردم. برای اینکار فایلی بنام rangi.desktop
با محتویات زیر ساختم و در مسیر /etc/xdg/autostart/
کپی کردم:
[Desktop Entry]
Name=Rangi
Exec=/home/pi/Rangi/rangi.sh
این باعث میشود که شل اسکریپت ما پس از هر بوت به دسکتاپ اجرا شود. و تمام.
خلاصه
در این مقاله شرح دادیم که چطور یک کامپیوتر کوچک ساختیم. کامپیوتری با صفحهای لمسی و دو اسپیکر توکار و نیز پیچ تنظیم بلندی صدا و یک خروجی ۳.۵ میلیمتری صوتی و یک بدنه چاپ شده توسط یک چاپگر سه بعدی. به تفصیل چگونگی ساخت یک بورد صوتی را شرح دادیم و مداری برای آن طراحی کردیم. و نیز نحوه اتصال از طریق پورت سریال و شبکه را نشان دادیم و Overlayهای لازم را راهاندازی کردیم.
ویدیوی زیر توسط شایگان ادیت شده که خروجی نهایی را نمایش میدهد.
مقالهای بود بسیار طولانی در مورد پروژهای طولانی! امیدوارم برای علاقهمندی مفید فایده بشود. زنده باشید.
خخخخخخ خیلی خوب بود