دیسک یا صفحه Nipkow یا صفحه اسکن، اختراع Paul Gottlieb Nipkow، یک مهندس الکترونیک اهل آلمان بود، که بعدا این قطعه بخش اصلی تلویزیون های الکترومکانیکی شد، اولین ظهور تلویزیون های الکترومکانیکی در سال های 1920 تا 1930 میلادی بود.
پل نیپکو (Paul Nipkow) یک تکنیسین و مخترع آلمانی بود که بین سال های 1860 تا 1940 میلادی زندگی میکرد!
اختراع معروف پل یک صفحه حلزونی شکل بود که برای تقسیم تصویر به خطوط و نقاط کنار هم استفاده میشد!
این صفحه بعدا نقش اساسی رو توی تلویزیون های نیپکو اجرا کرد!
یک دیسک اسکن که از سوراخ های با فاصله و زاویه های مختلفی از مرکز دایره ساخته شده، با چرخیدن یک مساحتی را پوشش میدهد، از این مساحت تحت پوشش میتوان برای نشان دادن تصویر یا فیلم برداری تصویر استفاده کرد. این دیسک پایه اساسی تلویزیون های الکترومکانیکی بود.
جدای از تاریخ زیبای صفحه نمایش ها، ساختن یک تلویزیون الکترومکانیکی بخش های آموزشی زیادی برای من به همراه داشت، از طراحی دیسک با فرمول های ریاضی گرفته تا طراحی بدنه، ساختن یک LED با فرکانس 9000 هرتز و تنظیم کردن تصویر، همه بخش های آموزشی جدیدی را برای من به همراه داشت!
آشنایی با نحوه کارکرد تکنولوژی های قدیمی مثل صفحه نمایش های الکترومکانیکی،CRT و … همیشه برای من جالب و آموزنده بوده، بخصوص تکامل صفحه های نمایش.
نشان دادن تصاویر ساده با یک تکنولوژی قدیمی بسیار آموزنده بوده، زیرا تکنولوژی های قدیمی سرعت و آسودگی تکنولوژی های امروزی را نداشته اند!
این تکنولوژی قدیمی که باعث ایجاد تصاویر میشد، محدودیت هایی را هم به همراه داشت!
برای نمایش یک تصویر بزرگتر، نیاز به یک دیسک بزرگتر بود، محدودیت بعدی سرعت چرخش بود، که باید ثابت می بود، تا تصویر یک دستی را نمایش دهد، و برای رزولوشن های بالاتر نیاز به سوراخ های بیشتری روی دیسک بود، اما با این حال نمایش تصاویر روی آنها ممکن بود.
قبل از این که به طراحی دیسک با استفاده از برنامه Fusion 360 برویم، نیاز داریم که بدانیم هر سوراخ در چه فاصله ای از مرکز و در چه زاویه ای نسبت به سوراخ قبل از خودش قرار دارد.
در تصویر بالا، یک الگوی مارپیچی مشاهده می شود، هر سوراخ وظیفه نمایش دادن یک ستون را دارد (در این دیسک، 15 سوراخ وجود دارد، به معنی نمایش 15 ستون)، طراحی به صورتی است که بعد از تمام شدن ستون اول ستون دوم شروع می شود، بعد از ستون دوم، ستون سوم شروع می شود و…
و این طراحی خاص به ما اجازه می دهد که صفحه ای به شکل مستطیل داشته باشیم، شما میتوانید از این وبسایت برای مشاهده صفحه های Nipkow با اندازه های مختلف استفاده کنید.
در این وبسایت اطلاعاتی با جزئیات بیشتر برای طراحی یک دیسک بیان شده، اما برای سادگی بیشتر کار و راحتی، با استفاده از زبان برنامه نویسی Python برنامه ای می نویسیم که فاصله از مرکز و زاویه هر سوراخ را به ما بدهد!
کد زیر برای محاسبه محل سوراخ های دیسک نیپکو می باشد. که تعداد سوراخ های مورد نیاز، موقعیت زاویه ای و فاصله هر سوراخ را از مرکز دیسک محاسبه میکند.
ابتدا متغیرهایی مثل قطر دیسک (20mm)، ابعاد پنجره (30mm x 47mm) و فاصله بین سوراخ ها (pitch) و offset اولین (بیرونی ترین) سوراخ تعریف شده است.
بعد تعداد کل سوراخ ها بر اساس عرض پنجره و فاصله زاویه ای میان آنها محاسبه می شود. در ادامه یک حلقه برای هر سوراخ مقدار زاویه سوراخ نسبت به سوراخ قبل از خود را با استفاده از توابع مثلثاتی و فاصله سوراخ تا مرکز دایره را به دست می آورد، در نهایت اطلاعات هر سوراخ شامل زاویه و فاصله آن با دقت دو رقم اعشار چاپ می شود.
حالا اگر برنامه Python بالا را اجرا کنیم، برای یک دیسک با قطر 20mm و پنجره 47mm در 30mm نتیجه زیر را خواهیم داشت:
برای مثال خط اول به ما می گوید که زاویه اولین سوراخ برابر با 17.61 و فاصله آن از مرکز دایره برای با 98mm می باشد، زاویه سوراخ دوم برابر با 18.22 درجه بعد از سوراخ قبلی می باشد و …
حالا که میدانیم هر نقطه در کجا و با چه زاویه ای قرار می گیرد، زمان طراحی آن رسیده است.
در مرحله اول، sketch دیسک را با توجه به داده های به دست آورده رسیم میکنیم. در شکل زیر زاویه های هر سوراخ مشخص شده است:
قطر هر سوراخ در این طراحی برابر با 2.4mm می باشد، و دو سوراخ در وسط برای قرار گیری موتور گذاشته شده است.
در این بخش برای سوراخ با زاویه های 34.6 درجه و 31.3 درجه (آخرین سوراخ) زبانه کوچکی در نظر گرفته شده است، این زبانه قرار است که برای حساب کردن دور موتور در دقیقه یا RPM به ما کمک کند و زمان نشان دادن رنگ ها را برای ما مشخص کند که در ادامه بیشتر به آن می پردازیم!
در مرحله دوم sketch را extrude می کنیم تا به شکل سه بعدی در آید.
برای سبکی دیسک موقع چاپ سه بعدی، ضخامت دیسک 1mm در نظر گرفته شده است، و فقط سورخ مربوط به قرارگیری شافت موتور و زبانه ارتفاع بیشتری دارند!
برای سهولت ساخت، این پروژه با استفاده از چاپگر سه بعدی ساخته شده است، ولی استفاده از چاپگر سه بعدی به معنی بهترین انتخاب نیست، دستگاه های برش لیزر از دقت بیشتری برخوردار هستند، برای مثال یک دیسک تهیه شده با آلومینیوم که با برش لیزر ساخته شده است، از دقت بیشتری برخوردار است و آلومینیوم گزینه خوبی نیز می باشد به علت سبکی این فلز، اما از طرف دیگر ساختن دیسک با چاپگر سه بعدی ارزانتر تمام می شود، از گزینه های دیگر نیز میتوان به چوب اشاره کرد، باید توجه داشت که ماده انتخاب شده نباید نور را از خود عبور دهد، زیرا که باعث اختلال در نمایش تصاویر می شود.
ساختن نمایشگر Nipkow با چوب و فلزات ممکن است، بسته به سلیقه و امکانات خود میتوانید از مواد مختلفی استفاده کنید، از آنجایی که تمام بخش های این نمایشگر داخل Fusion 360 طراحی شده است، استفاده از چاپگر گزینه مناسبی است، همانطور که بیان شد.
بدنه این نمایشگر جدای از دیسک، از 5 بخش دیگر تشکیل شده است، بخش اول پایین یا Bottom نام دارد، این بخش محل قرار گیری برد های الکترونیکی میباشد:
بخش دوم، جلو یا Front بدنه می باشد، این بخش باعث پوشش قطعات الکترونیکی داخل می شود، این بخش با استفاده از پیج به بدنه پایین متصل می شود.
بخش سوم یا Top که به بدنه جلو پیج می شود برای نگهداری موتور، LED و سنسور سرعت (photo interrupter) می باشد، همینطور این بخش با طراحی خاص خودش دارای کمی انحنا برای نگهداری دیسک می باشد که برای باعث زاویه دید بهتری می شود و اجازه میدهد که سیم های مربوط به سنسور، LED و موتور به داخل راه یابند.
بخش چهارم (Connector) به Top متصل میشود و اجازه میدهد که موتور روی آن قرار بگیرد، این بدنه دارای یک طراحی ریلی می باشد، این طراحی به ما کمک میکند که مکان LED و سنسور نور را تنظیم کنیم.
بخش پنجم و بخش آخر، یک جعبه (enclosure) برای نگهداری LED و سنسور تشخیص سرعت (photo interrupter) می باشد که با طراحی منحصر به فرد خود قابل تنظیم روی Connector می باشد.
طرح کلی:
برای نمایش و کنترل تصاویر به یک میکروکنترلر نیاز داریم، اما کدام میکروکنترلر برای این کار مناسبتر است؟
برای نمایش تصاویر به فرکانس نسبتاً بالایی نیاز داریم. بهعنوانمثال، LED باید با فرکانس 9000 هرتز کار کند، و میکروکنترلر نیز باید بتواند سرعت چرخش دیسک را محاسبه کرده و هر بار که زبانهی دیسک از مقابل سنسور عبور میکند، با وقفه (Interrupt) اطلاع دهد. علاوه بر این، میکروکنترلر باید قادر باشد تصاویر را دریافت کرده و آنها را روی نمایشگر نمایش دهد.
حالا که نیازهای خود را مشخص کردهایم، باید میکروکنترلری انتخاب کنیم که علاوه بر داشتن قابلیتهای موردنیاز، از نظر قیمت نیز مقرونبهصرفه باشد. بهعنوانمثال، به فرکانسی بالاتر از 100 مگاهرتز نیاز نداریم، بنابراین میتوان از گزینههای ارزانتر استفاده کرد. میکروکنترلرهای STM32 انتخاب مناسبی هستند، زیرا با قیمت مناسب، فرکانس کاری قابل قبولی ارائه میدهند. یکی از گزینههای ایدهآل STM32F103 است که با فرکانس کاری 72 مگاهرتز برای این پروژه مناسب بوده و دارای سه UART برای انتقال داده و چهار Timer مناسب برای اندازهگیری سرعت دیسک است.
یکی از بردهای معروفی که از این میکروکنترلر استفاده میکند، Blue Pill است. این بورد، کار با STM32 را سادهتر کرده و امکانات مورد نیاز را در اختیار ما قرار میدهد.
میکروکنترلر وظیفه راه اندازی موتور را نیز بر عهده دارد، برای این پروژه موتور استفاده شده از نوع براشلس می باشد، موتور های براشلس سرعت نسبتا زیادی دارند و یکی از استفاده های آنها در پهپاد ها می باشد، در این نمایشگر ما موتوری با حداقل سرعت 1500 دور در دقیقه یا RPM نیاز داریم.
برای راه اندازی موتور های براشلس به قطعه ای به نام speed controller نیاز داریم، این قطعه به ما برای راه اندازی موتور براشلس کمک میکند و با ما اجازه میدهد که سرعت موتور را با توجه به نیاز خود تغییر دهیم!
برای نمایش تصاویر رنگی ما نیاز به یک LED که رنگ آن قابل تنظیم باشد داریم، این نوع LEDها معروف به RGB هستند، در مرحله بعد نیاز است که این LED بتواند پنجره مستطیلی دیسک را پوشش دهد، یکی از LEDهایی که این کار را انجام میدهد معروف است به NeoPixel، این LEDها آدرس پذیر هستند، به معنی این که میتوانیم رنگ آنها را از طریق برنامه تغییر دهیم!
در ماژول بالا 25 تا LED قرار دارد، و ما میتوانیم برای هر کدام از آنها رنگ دلخواهی را تنظیم کنیم، ولی ما نیازی به رنگ متفاوت برای هر LED نداریم و نیاز داریم که تمام LED ها رنگ یکدستی داشته باشند، برای همین انتخاب NeoPixel مفید نخواهد بود، زیرا که زمانی که برای ست کردن هر LED نیاز است 25 برابر می شود (زمان تنظیم رنگ هر LED برابر با 30 میکرو ثانیه است) و در مجموع برای رنگ کردن 25 تا LED نیاز به 750 میکرو ثانیه است که زمان زیادی می باشد، در صورتی که ما حداکثر نیاز به 100 میکرو ثانیه داریم!
گزینه بعدی ساختن یک ماتریس LED سری است، که تمام LED ها با یک بار آدرس دهی تغییر کنند، برای این کار ما نیاز به یک چیپ کنترل LED داریم، شرکت Adafruit سازنده NeoPixel، سازنده تراشه ای به اسم WS2811 نیز می باشد، نحوه کار این نوع تراشه مانند NeoPixel می باشد و جریان ثابت 18.5mA را در اختیار ما قرار می دهد، که ما میتوانیم روی LED های RGB 5050 استفاده کنیم، این LED ها آدرس پذیر نیستند و مانند LED های معمولی کار میکنند، با استفاده از این IC ما میتوانیم 15 LED (این تعداد LED برای پوشش پنجره با اندازه 47mm در 30mm مناسب می باشد) را سری کنیم و همه را با یک آدرس دهی تغییر دهیم، اینگونه سرعت بیشتری برای تغییر LED ها داریم و این فرایند 25 بار سریعتر می شود.
شماتیک این مدار به صورت زیر می باشد:
شکل سه بعدی PCB آن نیز به صورت زیر می باشد:
این مدار ولتاژ 13.5 ولت نور مناسبی را به ما می دهد و با استفاده از یک رگولاتور 5v برق مورد نیاز تراشه WS2811 را تامین می کند!
با استفاده از این PCB ما میتوانیم تمام LEDها را با سرعت 30 میکرو ثانیه + 50 میکرو ثانیه برای Reset تغییر دهیم (در مجموع 80 میکرو ثانیه)، زمان Reset برای این می باشد که این IC به صورت NeoPixel عمل نکند و IC بعدی را برنامه ریزی نکند!
اما یک مشکلی وجود دارد، اکثر IC های موجود در بازار نسخه اصلی نمی باشند، و زمان Reset آنها 50 میکروثانیه نمی باشد، در عوض نیاز به زمان 200 میکرو ثانیه دارند تا دوباره قابل برنامه ریزی باشند، و این زمان زیادی برای کنترل LEDها می باشد.
برای سریع خاموش/روشن کردن LED نیاز به یک درایور جریان ثابت LED داریم که بتوان از آن روی ماتریسی که ساخته ایم استفاده کنیم.
همانطور که اشاره شد، تراشه WS2811 جریان همیشه ثابت 18.5mA را به ما میدهد، که برای LED های 5050 مناسب می باشد، اینجا نیز، نیاز به یک درایور جریان ثابت LED داریم که جریان ثابت 18.5mA را به ما بدهد!
این مدار از دو ترانزیستور، دو مقاومت و 5 LED استفاده می کند، این ترانزیستور ها از نوع NPN می باشد، ترانزیستوری که استفاده میکنیم 2N2222 است که برای کار ما مناسب می باشد.
در این مدار مقاومت های R1، R3، R5 مقدار های برابری دارند و همچنین مقاومت های R2، R4، R6، اما مقدار های این دو دسته مقاومت برای داشتن جریانی برابر با 18.5mA مهم هستند.
مقدار مقاومت دسته دوم برابر است با 33 اهم با توجه به ولتاژ 0.6v و جریان 18.5mA و مقدار مقاومت دسته اول برابر است با 8.75 اهم، مقدار این مقاومت با توجه به مقدار بتای ترانزیستور (برابر با 75) و ولتاژ 2.1 ولت به دست می آید.
این پروژه با زبان C نوشته شده است. دلیل انتخاب این زبان، سرعت بالای اجرای آن است، زیرا در این پروژه نیاز داریم که محاسبات را با سرعت بالا انجام دهیم. انتخاب یک زبان مناسب، اجرای بهینهتر را ممکن میسازد.
علاوه بر این، زبان C در اکثر پروژههای Embedded مورد استفاده قرار میگیرد و مجموعهای غنی از کتابخانهها را برای این نوع توسعه در اختیار ما قرار میدهد.
حالا که درایور جریان ثابت LED را ساختهایم، نوبت به کنترل آن رسیده است؛ مهمتر از آن، باید زمانبندی روشن و خاموش شدن را مشخص کنیم.
از قبل زوایای هر سوراخ را محاسبه کردهایم. هر سوراخ مسئول روشن کردن یک ستون است، اما هر ستون تنها یک رنگ ندارد و به ۱۶ ردیف تقسیم شده است. این بدان معناست که LED باید در هر چرخه، ۱۶ بار بین دو زاویهی مشخص تغییر رنگ دهد.
آما قبل از محاسبه زمان روشن و خاموش شدن LED نیاز داریم که سرعت دقیق دیسک را محاسبه کنیم، این کار توسط Timer های میکروکنترلر انجام می شود، زمان شمارش را برای Timer مشخص میکنیم و با استفاده از سیگنال های ایجاد شده توسط سنسور و موتور، موقع سرریز تایمر مقدار RPM را بروزرسانی میکنیم!
کد بالا با استفاده از زمان شمارش Timer (برابر با 13 میکرو ثانیه) مقدار متغیر RPM را بروزرسانی میکند، در صورتی که مقدار شمارش Timer منفی بود (زمان سنجی بعد از سرریزی) عملیات رو انجام نمی دهیم.
حالا که مقدار RPM را داریم می توانیم با استفاده از آن زمان روشن بودن LED را برای هر سوراخ محاسبه کنیم و آن را در آرایه ای ذخیره کنیم، همچنین میتوانیم زمان صبر کردن برای اولین سوراخ را هم محاسبه کنیم:
حالا با استفاده از RPM محاسبهشده، آرایه را بهروزرسانی میکنیم. مقدار هر خانهی آرایه، که مربوط به سوراخ مشخصی است، برابر با زاویهی آن سوراخ تقسیم بر 16 (تعداد ردیفها) خواهد بود.
در نهایت، زمان بین اولین سوراخ نزدیک به مرکز و آخرین سوراخ را محاسبه میکنیم.
توجه داشته باشید که سنسور تشخیص سرعت روبهروی اولین سوراخ و در میان جعبه LED قرار دارد.
متغیر interruptFlag استفاده شده، مشخص میکند که چه زمانی شروع به نمایش تصاویر کنیم و بعد از عبور زبانه دیسک از سنسور صدا مقدار دهی می شود.
در آخر با توجه به اندازه های محاسبه شده در حلقه اصلی برنامه شروع به نمایش تصاویر می کنیم.
اول برای راحتی کار تابع ای می نویسیم که در مقدار دهی LED به ما کمک کند:
حالا با استفاده از تابع setColor می توانیم 8 رنگ سیاه، سفید، زرد، فیروزه ای، سبز، سرخابی، قرمز و آبی را مشخص کنیم.
حالا که تابع مربوط به رنگدهی را نوشتهایم، نوبت به پیادهسازی حلقهی اصلی میرسد.
در کد بالا متغیر buffer داده های مربوط به هر Frame را در خود نگه می دارد، این آرایه فقط مقدار 0 یا 1 را در خود ذخیره میکنید و اندازه آن برابر با 672 می باشد، این عدد با توجه به طول و عرض قابل نمایش (14 سوراخ برای ستون ها زیرا برای این که ستون آخر نمایش داده نمی شود و 16 ردیف) که در عدد 3 ضرب شده است به دست می آید، دلیل ضرب در عدد 3 این است که ما قابلیت نمایش دادن سه رنگ Red، Green و Blue را داریم و هر عدد به ترتیب بیانگر روشن یا خاموش بودن این رنگ ها می باشند.
بعد از آن با استفاده از آرایه کمکی displayBuffer هر رنگ را با توجه به مدت زمانی که از قبل حساب کردیم نمایش داده می شود.
نحوه کارکرد این نمایشگر به صورتی است که در هر لحظه یک سوراخ روی به روی LED وجود داشته باشد، هر سوراخ فاصله یک دستی را طی میکند تا به صورت مستطیلی شکل تصویر را داشته باشیم، در زمان عبور هر سوراخ LED وظیفه دارد که به مدت 16 بار تغییر رنگ انجام دهد، این کار برای هر 15 تا سوراخ انجام می شود تا ما بتوانیم تصاویر دلخواه خود را داشته باشیم.
طراحی و ساخت این نمایشگر تجربهای لذتبخش و آموزنده بود، از چالشهای طراحی گرفته تا مراحل ساخت. یکی از مهمترین و جذابترین چالشها، پیادهسازی نمایشگری با فرکانس بالا بود. چالش دیگر، تنظیم دقیق (tuning) نمایشگر برای دستیابی به تصویری پایدار و بدون اعوجاج بود.
جالب است که بدانیم تکنولوژیهای قدیمی همچنان نکات ارزشمندی برای یادگیری دارند و میتوانند ما را شگفتزده کنند.
این پروژه هنوز جای بهبود دارد، برای مثال اضافه کردن UART برای مشخص کردن تصاویر میتواند جذاب و کاربردی باشد، یا با استفاده از یک نمایشگر دیگر تعداد رنگ های قابل نمایش را بیشتر کرد.
اما در نهایت، موفق شدیم LED با فرکانس بالا را، هرچند با محدودیت در تعداد رنگها، بسازیم و نمایشگر را بهگونهای تنظیم کنیم که تصاویر یکدست و واضح نمایش داده شوند.
در لینک زیر، تمامی مدلهای سهبعدی و کدهای مربوطه قرار داده شدهاند. شما میتوانید با استفاده از آنها، نمایشگر Nipkow خود را بسازید.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.