P
Gemini
گزارش کامل پروژه کارشناسی: طراحی و ساخت همزن مغناطیسی هوشمند نوشیدنی مبتنی بر آردوینو
[صفحه عنوان]
نام دانشگاه: [نام دانشگاه خود را وارد کنید]
دانشکده: [نام دانشکده، مثلاً مهندسی برق یا کامپیوتر]
عنوان پروژه: طراحی، شبیهسازی و ساخت همزن مغناطیسی هوشمند نوشیدنی با قابلیت کنترل دور و زمانسنجی مبتنی بر میکروکنترلر آردوینو
نام دانشجو: [نام و نام خانوادگی خود را وارد کنید]
نام استاد راهنما: [نام استاد راهنما را وارد کنید]
تاریخ: [تاریخ ارائه پروژه را وارد کنید]
تقدیر و تشکر
شایسته است در این مجال، از راهنماییهای ارزشمند و بیدریغ استاد راهنمای گرامی، جناب آقای/سرکار خانم دکتر [نام استاد] که با درایت و هدایتهای علمی خود مسیر انجام این پژوهش را هموار نمودند، کمال تشکر و قدردانی را بهجا آورم. همچنین از خانواده عزیزم که در تمامی مراحل تحصیل پشتیبان و مایه دلگرمی من بودهاند، صمیمانه سپاسگزاری مینمایم. در نهایت، از تمامی اساتید، دوستان و همکلاسیهایی که به نحوی در شکلگیری و پیشبرد این پروژه تحقیقاتی یاریرسان بودهاند، کمال امتنان را دارم.
چکیده
فرآیند همزدن و ترکیب یکنواخت سیالات، از جمله نیازهای اساسی در محیطهای آزمایشگاهی و همچنین صنایع غذایی و کافهها است. استفاده از همزنهای مکانیکی سنتی که دارای تماس مستقیم با نوشیدنی هستند، همواره با چالشهایی نظیر دشواری در شستوشو، استهلاک قطعات مکانیکی و خطر انتقال آلودگی همراه بوده است. در این پژوهش، به منظور غلبه بر این محدودیتها، طراحی، شبیهسازی و ساخت فیزیکی یک «همزن مغناطیسی هوشمند» (Smart Magnetic Stirrer) پرتابل مبتنی بر میکروکنترلر آردوینو (Arduino Uno R3) انجام شده است. اساس کار این دستگاه مبتنی بر پدیده کوپلینگ مغناطیسی است؛ به طوری که با قرارگیری لیوان بر روی سطح دستگاه، چرخش یک آهنربای متصل به موتور در داخل دستگاه، باعث چرخش همگام قطعهای مغناطیسی (کپسول) در داخل لیوان شده و به واسطه ایجاد گرداب سیالاتی، نوشیدنی را به صورت کاملاً یکنواخت و بدون تماس مستقیم فیزیکی مخلوط میکند.
سیستم توسعهیافته مجهز به یک نمایشگر OLED جهت رابط کاربری، ماژول زمانسنج دقیق DS3231 برای مانیتورینگ زمان، و درایور موتور L293D جهت کنترل دقیق سرعت چرخش موتور ۶ ولت است. توان این سیستم پرتابل از طریق یک باتری لیتیوم-یون ۱۸۶۵۰ تأمین میگردد که توسط ماژول TP4056 مدیریت و شارژ شده و ولتاژ آن توسط ماژول افزاینده MT3608 تثبیت و ارتقا مییابد. در این تحقیق، علاوه بر توسعه سختافزار و نرمافزار، مقایسهای تحلیلی بین رفتار ایدهآل مدار در نرمافزار شبیهساز پروتئوس (Proteus) و چالشهای پیادهسازی فیزیکی (نظیر نویز موتور و نیاز به خازنهای دیکوپلینگ) ارائه شده است. نتایج نشان میدهد که دستگاه ساخته شده قادر است با پایداری بالا، انواع نوشیدنیها را در سرعتهای مختلف بدون گسست پیوند مغناطیسی ترکیب نماید.
کلمات کلیدی: همزن مغناطیسی، آردوینو، کوپلینگ مغناطیسی، درایور L293D، شبیهسازی پروتئوس، اینترنت اشیاء.
فهرست مطالب
الف. تقدیر و تشکر
ب. چکیده
۱. مقدمه
۱.۱. معرفی موضوع
۱.۲. بیان مسئله
۱.۳. اهداف پژوهش
۱.۴. اهمیت و ضرورت انجام پروژه
۲. پیشینه تحقیق و مبانی نظری
۲.۱. تاریخچه همزنهای مغناطیسی
۲.۲. مبانی فیزیکی کوپلینگ مغناطیسی و گشتاور
۲.۳. دینامیک سیالات و ایجاد گرداب (Vortex)
۲.۴. پدیده خروج از همگامی (Decoupling) در سرعتهای بالا
۲.۵. مبانی الکترونیک قدرت و درایورهای موتور
۳. روششناسی (طراحی و پیادهسازی سختافزار)
۳.۱. ساختار کلی سیستم
۳.۲. واحد پردازشگر مرکزی (Arduino Uno R3)
۳.۳. سیستم راهانداز موتور و کنترل سرعت (L293D)
۳.۴. رابط کاربری گرافیکی (نمایشگر OLED 0.96)
۳.۵. ماژول زمانسنجی (RTC DS3231)
۳.۶. سیستم مدیریت توان و باتری (TP4056 و MT3608)
۴. توسعه نرمافزار و الگوریتمهای کنترل
۴.۱. معماری نرمافزار
۴.۲. قطعه کد ۱: پیکربندی و راهاندازی ماژولها
۴.۳. قطعه کد ۲: تولید سیگنال PWM و کنترل موتور
۴.۴. قطعه کد ۳: خوانش ولتاژ باتری و فیلتر نویز
۴.۵. قطعه کد ۴: مدیریت نمایشگر گرافیکی
۵. بررسی تفاوتهای شبیهسازی نرمافزاری و پیادهسازی واقعی
۵.۱. رفتار مدار در محیط پروتئوس (Proteus)
۵.۲. چالشهای دنیای واقعی: نویز القایی و خازنهای دیکوپلینگ
۵.۳. پویایی سیالات و لختی مکانیکی در برابر مدلهای ایدهآل
۶. نتایج و بحث
۶.۱. ارزیابی عملکرد سیستم با سیالات مختلف
۶.۲. تحلیل مصرف انرژی و طول عمر باتری
۷. نتیجهگیری و پیشنهادات
۷.۱. جمعبندی نهایی
۷.۲. پیشنهادات برای توسعه آینده
۸. منابع و مراجع
۹. ضمایم: کدهای منبع کامل
۱. مقدمه
۱.۱. معرفی موضوع
ترکیب و اختلاط سیالات (Fluid Mixing) یکی از بنیادیترین عملیاتها در حوزههای متنوعی از جمله شیمی کاربردی، زیستفناوری، داروسازی و صنایع غذایی و نوشیدنی است. به طور سنتی، این عمل با استفاده از ابزارهای مکانیکی نظیر قاشق، شیکرها (Shakers) و یا پروانههای متصل به موتور انجام میپذیرد. با این حال، استفاده از دستگاههای همزن مغناطیسی (Magnetic Stirrers) به دلیل قابلیت ایجاد یک چرخش یکنواخت بدون نیاز به تماس مستقیم با محتویات ظرف، تحولی عظیم در این حوزه ایجاد کرده است. در این دستگاهها، یک میدان مغناطیسی دوار که توسط یک موتور در زیر پایه دستگاه تولید میشود، با یک قطعه مغناطیسی کوچک (Flea) که درون ظرف حاوی مایع انداخته شده است، کوپل (جفت) میگردد. چرخش موتور سبب چرخش قطعه مغناطیسی شده و سیال به خوبی ترکیب میشود. دستگاه طراحی شده در این پروژه، یک نمونه بومیسازی شده و هوشمند از همین فناوری است که مشخصاً برای کاربری در کافهها (به عنوان همزن نوشیدنی) و محیطهای خانگی با قابلیتهای پرتابل طراحی شده است.
۱.۲. بیان مسئله
در تهیه بسیاری از نوشیدنیهای مدرن، یکنواختی بافت و طعم (Homogenization) اهمیتی حیاتی دارد. استفاده از روشهای دستی برای همزدن، علاوه بر عدم یکنواختی، نیازمند صرف زمان توسط اپراتور (باریستا یا کاربر خانگی) است. از سوی دیگر، همزنهای مکانیکی که شفت موتور مستقیماً وارد نوشیدنی میشود، چالشهای بهداشتی جدی از جمله آلودگی متقاطع (Cross-contamination) و دشواری در شستوشوی مکرر را به همراه دارند. در حالی که همزنهای مغناطیسی آزمایشگاهی موجود در بازار از قیمتهای بسیار بالایی برخوردارند و غالباً نیازمند اتصال مستقیم به برق شهر هستند ، نیاز به یک دستگاه ارزانقیمت، قابل شارژ، کوچک و مجهز به رابط کاربری هوشمند به شدت احساس میشود.
۱.۳. اهداف پژوهش
هدف اصلی در این پروژه کارشناسی، طراحی جامع، شبیهسازی و ساخت فیزیکی یک همزن مغناطیسی نوشیدنی مبتنی بر پلتفرم متنباز آردوینو است. اهداف فرعی این پژوهش شامل موارد زیر است:
پیادهسازی سیستم کوپلینگ مغناطیسی با استفاده از موتور DC و آهنرباهای نئودیمیوم.
طراحی یک رابط کاربری بصری مبتنی بر نمایشگر OLED برای ارائه اطلاعات سیستم به کاربر.
ادغام ماژول زمانسنج (DS3231) جهت مانیتورینگ دقیق زمان پروسه اختلاط.
طراحی مدار تغذیه پرتابل مبتنی بر باتریهای لیتیوم-یون با قابلیت شارژ مجدد و تنظیم ولتاژ.
تحلیل و مقایسه عملکرد مدار در محیط شبیهساز پروتئوس و رفع چالشهای فیزیکی در ساخت واقعی.
۱.۴. اهمیت و ضرورت انجام پروژه
با توجه به گسترش روزافزون تجهیزات الکترونیکی هوشمند در محیطهای خدماتی و خانگی، توسعه ابزارهایی که علاوه بر کارایی بالا، دارای استقلال انرژی (باتریدار) و رابط کاربری جذاب باشند، از اهمیت اقتصادی و تجاری بالایی برخوردار است. این پژوهش نه تنها یک خروجی کاربردی و ملموس (دستگاه همزن) را ارائه میدهد، بلکه به عنوان یک مطالعه موردی جامع، درک عمیقی از پیوند میان الکترونیک قدرت، برنامهنویسی میکروکنترلرها، دینامیک سیالات و الکترومغناطیس را فراهم میآورد.
۲. پیشینه تحقیق و مبانی نظری
۲.۱. تاریخچه همزنهای مغناطیسی
نخستین ایدهها برای استفاده از میدانهای مغناطیسی جهت اختلاط سیالات به دهههای ابتدایی قرن بیستم بازمیگردد. اختراع اولین همزن مغناطیسی مدرن به آرتور روزینگر (Arthur Rosinger) در سال ۱۹۴۴ نسبت داده میشود. او دریافت که قرار دادن یک میله مغناطیسی دارای روکش (برای جلوگیری از واکنش شیمیایی) درون ظرف و تحریک آن از بیرون توسط یک آهنربای متحرک، میتواند روشی بسیار ایمن و ایزوله برای ترکیب مواد باشد. امروزه این دستگاهها به دو دسته کلی تقسیم میشوند: دستگاههای مبتنی بر موتور چرخشی (Motor-driven) و دستگاههای مبتنی بر سیمپیچهای الکترومغناطیسی ثابت که میدانی دوار ایجاد میکنند. پروژه حاضر از معماری اول (موتوردار) بهره میبرد.
۲.۲. مبانی فیزیکی کوپلینگ مغناطیسی و گشتاور
مکانیسم اصلی انتقال قدرت در همزنهای مغناطیسی، پدیده کوپلینگ مغناطیسی (Magnetic Coupling) است. در این پدیده، بدون هیچگونه تماس فیزیکی، گشتاور تولید شده توسط شفت موتور به قطعه غوطهور در سیال منتقل میشود. عملکرد بهینه این سیستم به قدرت میدان مغناطیسی، فاصله هوایی (Air-gap) میان موتور و کپسول، و همچنین هندسه آهنرباها بستگی دارد.
با استفاده از مدلهای تحلیلی مدارهای مغناطیسی معادل، میتوان معادله گشتاور (Torque) انتقالی را استخراج نمود. گشتاور تولید شده (
T
) به صورت مستقیم با شار مغناطیسی ارتباط دارد :
T=k⋅B⋅A⋅cos(θ)
در این رابطه:
k
: ضریب ثابت وابسته به ساختار فیزیکی سیستم (تعداد قطبها و جنس هسته).
B
: چگالی شار مغناطیسی در شکاف هوایی (بر حسب تسلا) که هرچه فاصله لیوان از آهنربای موتور بیشتر شود، به شدت کاهش مییابد.
A
: سطح مؤثر تلاقی خطوط میدان بین دو آهنربا.
θ
: زاویه انحراف فاز؛ زاویهای است که قطبهای آهنربای روی موتور و آهنربای درون لیوان نسبت به یکدیگر در حین چرخش پیدا میکنند.
همچنین سرعت زاویهای همگام سیستم (
ω
p
) از طریق معادله زیر محاسبه میشود که در آن
p
تعداد جفتقطبها و
n
سرعت بر حسب RPM است :
ω
p
=
2πpn
60
۲.۳. دینامیک سیالات و ایجاد گرداب (Vortex)
هنگامی که کپسول مغناطیسی در کف ظرف شروع به چرخش میکند، نیروی گریز از مرکز به سیال مجاور آن وارد میشود. این چرخش، فشاری منفی در مرکز محور چرخش ایجاد کرده و باعث میشود سیال از سطح به سمت پایین کشیده شود، در حالی که در کنارههای ظرف به سمت بالا حرکت میکند. این جریان دایرهای و سهبعدی به نام گرداب یا Vortex شناخته میشود. شکلگیری صحیح گرداب، تضمینکننده اختلاط کامل تمامی اجزای نوشیدنی (مانند شکر، قهوه، شیر و طعمدهندهها) است.
۲.۴. پدیده خروج از همگامی (Decoupling) در سرعتهای بالا
یکی از پدیدههای بحرانی در طراحی همزنهای مغناطیسی، پدیده گسست پیوند یا Decoupling (که اصطلاحاً Spin-out نیز نامیده میشود) است. زمانی که ویسکوزیته (گرانروی) سیال افزایش مییابد، مقاومت هیدرودینامیکی در برابر چرخش کپسول بیشتر میشود. اگر موتور با سرعتی بیش از حد به طور ناگهانی شروع به چرخش کند، زاویه
θ
در معادله گشتاور از حد آستانه خود فراتر رفته و پیوند مغناطیسی بین قطبهای ناهمنام شکسته میشود. در این حالت، کپسول در جای خود شروع به پرش و لرزش کرده و عمل همزدن متوقف میگردد. به همین دلیل، سیستم کنترل (آردوینو) باید توانایی تنظیم دقیق و تدریجی سرعت موتور را به کاربر ارائه دهد.
۲.۵. مبانی الکترونیک قدرت و درایورهای موتور
برای چرخش آهنربا در این دستگاه از یک موتور جریان مستقیم جاروبکدار (Brushed DC Motor) استفاده میشود. کنترل سرعت این موتورها بهینهترین حالت را زمانی تجربه میکند که از روش مدولاسیون عرض پالس (PWM - Pulse Width Modulation) استفاده شود. در روش PWM، ولتاژ اعمالی به موتور با فرکانسی بالا قطع و وصل میشود و با تغییر نسبت زمان روشن بودن به خاموش بودن (Duty Cycle)، ولتاژ متوسط مؤثر تغییر کرده و سرعت موتور کم یا زیاد میشود. با این حال، پینهای خروجی میکروکنترلر توان جریاندهی پایینی دارند (حدود ۴۰ میلیآمپر) و نمیتوانند موتور را مستقیماً راهاندازی کنند، لذا استفاده از مدارات واسط (درایور H-Bridge) ضروری است.
۳. روششناسی (طراحی و پیادهسازی سختافزار)
۳.۱. ساختار کلی سیستم
معماری سختافزاری دستگاه همزن نوشیدنی طراحی شده، ترکیبی از چهار بلوک اصلی است: واحد پردازش، بلوک راهانداز موتور، بلوک رابط کاربری و بلوک مدیریت انرژی. در جدول زیر، لیستی از قطعات استفاده شده در این سیستم برای ساخت نمونه اصلی ارائه شده است.
جدول ۱: لیست کامل قطعات سختافزاری استفاده شده در دستگاه
ردیف نام قطعه نقش در مدار مشخصات کلیدی
۱ برد آردوینو (Arduino Uno R3) هسته پردازشی مرکزی میکروکنترلر ATmega328P، ۵ ولت، دارای ADC و PWM
۲ نمایشگر OLED 0.96 inch رابط کاربری گرافیکی پروتکل I2C، درایور SSD1306، مصرف انرژی پایین
۳ ماژول ساعت (RTC) DS3231 مانیتورینگ زمان واقعی دارای باتری بکآپ CR2032، دقت بالا با جبرانساز دما
۴ درایور موتور L293D راهاندازی و تقویت جریان پل-اچ دوگانه، جریان تا ۶۰۰ میلیآمپر به ازای هر کانال
۵ موتور DC محرک مکانیکی دستگاه ولتاژ نامی ۶ ولت
۶ باتری لیتیوم ۱۸۶۵۰ تأمین انرژی پرتابل ولتاژ اسمی ۳.۷ ولت، ظرفیت متغیر (مثلاً ۲۲۰۰ میلیآمپرساعت)
۷ ماژول شارژ TP4056 شارژ و محافظت باتری الگوریتم شارژ خطی CC/CV، جریان حداکثر ۱ آمپر
۸ افزاینده ولتاژ MT3608 ارتقای ولتاژ برای موتور توپولوژی بوست، فرکانس ۱.۲ مگاهرتز، خروجی تا ۲۸ ولت
۳.۲. واحد پردازشگر مرکزی (Arduino Uno R3)
انتخاب پلتفرم آردوینو به دلیل گستردگی کتابخانههای نرمافزاری و پایداری در محیطهای پروتوتایپ صنعتی بوده است. مغز متفکر این برد، آیسی ATmega328P است. در این پروژه از تایمرهای داخلی آردوینو جهت تولید پالسهای دقیق PWM بر روی پین شماره ۹ برای کنترل دور موتور استفاده شده است. علاوه بر این، از مبدل آنالوگ به دیجیتال (ADC) ۱۰ بیتی آن در پینهای A0 و A1 به ترتیب برای خوانش ولوم کاربر (پتانسیومتر تنظیم سرعت) و مانیتورینگ ولتاژ باتری بهره گرفته شده است.
۳.۳. سیستم راهانداز موتور و کنترل سرعت (L293D)
مدار مجتمع L293D یک درایور نیمههادی چهارکاناله است که بر اساس آرایش پل اچ (H-Bridge) ساخته شده است. وظیفه اصلی این آیسی در پروژه، ایزوله کردن مدار حساس آردوینو از نویزهای القایی موتور و همچنین تأمین جریان لازم برای موتور ۶ ولتی است.
موتورهای DC هنگام کار خاصیت سلفی دارند. زمانی که جریان توسط سیگنال PWM به سرعت قطع و وصل میشود، موتور ولتاژی در جهت معکوس (Back-EMF) تولید میکند که اگر به آردوینو برسد، باعث سوختن آن خواهد شد. آیسی L293D دارای دیودهای هرزگرد داخلی (Flyback Diodes) است که از برگشت این جریانهای القایی مخرب جلوگیری میکند. پینهای فعالساز (Enable) این ماژول با دریافت پالس از آردوینو، سطح مقطع ولتاژ خروجی به موتور را تعیین میکنند.
۳.۴. رابط کاربری گرافیکی (نمایشگر OLED 0.96)
به جای استفاده از نمایشگرهای کاراکتری قدیمی نظیر LCD 16x2 که نیازمند سیمکشیهای متعدد و مصرف انرژی بالا (به دلیل نور پسزمینه) هستند، از تکنولوژی دیودهای ساطعکننده نور ارگانیک (OLED) استفاده شده است. این نمایشگر که از کنترلر SSD1306 استفاده میکند، هیچ نیازی به نور پسزمینه ندارد، چرا که هر پیکسل به تنهایی تولید نور میکند و به همین دلیل مصرف باتری در این دستگاه پرتابل را به شدت کاهش میدهد. این نمایشگر اطلاعاتی از قبیل درصد سرعت موتور، میزان شارژ باقیمانده باتری و زمان را از طریق پروتکل I2C دریافت و نمایش میدهد.
۳.۵. ماژول زمانسنجی (RTC DS3231)
در پروسه تهیه برخی نوشیدنیهای خاص (مانند هاتچاکلت با بافت فومدار)، زمان همزدن عامل تعیینکنندهای است. از این رو ماژول Real-Time Clock یا DS3231 در مدار گنجانده شده است. این قطعه برخلاف تایمرهای داخلی آردوینو که با قطع برق صفر میشوند، دارای یک باتری سکهای (CR2032) است و به دلیل وجود سنسور دمای داخلی، نوسانات کریستال کوارتز خود را تصحیح کرده و خطای زمانسنجی را به کمتر از چند دقیقه در سال میرساند. این ماژول نیز از طریق باس مشترک I2C در کنار OLED به آردوینو متصل است.
۳.۶. سیستم مدیریت توان و باتری (TP4056 و MT3608)
برای استفاده از دستگاه به صورت رومیزی و مستقل از پریز برق، مدار قدرت با دقت طراحی شده است. انرژی اصلی از یک سلول لیتیوم-یون با استاندارد سایز ۱۸۶۵۰ (۱۸ میلیمتر قطر، ۶۵ میلیمتر طول) تأمین میشود.
شارژ و محافظت (TP4056): این ماژول دارای یک پورت تایپ سی یا میکرو USB است که دستگاه را به شارژرهای معمول متصل میکند. الگوریتم شارژ لیتیوم بسیار حساس است و TP4056 ابتدا در حالت جریان ثابت (Constant Current - CC) باتری را تا ولتاژ ۴.۲ ولت شارژ کرده و سپس وارد فاز ولتاژ ثابت (Constant Voltage - CV) میشود تا جریان صفر گردد.
افزایش ولتاژ (MT3608): ولتاژ خروجی باتری بین ۳.۲ تا ۴.۲ ولت متغیر است. آردوینو برای کارکرد پایدار به ۵ ولت و موتور دستگاه نیازمند حداقل ۶ ولت است. ماژول MT3608 یک مبدل DC به DC از نوع بوست (Boost Converter) است که با کلیدزنی سلف و خازن در فرکانس بالا، ولتاژ متغیر باتری را دریافت و یک خروجی ثابت مثلاً ۷ ولت تولید میکند. این ولتاژ سپس به درایور موتور تحویل داده میشود تا افت ولتاژ ۱.۲ ولتی داخلی ترانزیستورهای درایور L293D را نیز جبران نماید.
۴. توسعه نرمافزار و الگوریتمهای کنترل
کدنویسی این دستگاه در محیط استاندارد Arduino IDE و با زبان برنامهنویسی C/C++ انجام گرفته است. در طراحی ساختار کد، به جای استفاده از تابع delay() که باعث توقف کامل پردازش (Blocking) میشود، از متغیرهای زمانسنجی millis() استفاده شده است تا میکروکنترلر بتواند همزمان سرعت موتور را تغییر داده و صفحه نمایش را بهروزرسانی کند. در ادامه، اجزای مختلف کد به همراه تصاویر شبیهسازی و منطق آنها تشریح شده است.
(یادداشت برای دانشجو: در این قسمت، عکسهای بریده شده از محیط آردوینو را که مربوط به هر قطعه کد است، در زیر عناوین "تصویر قطعه کد" جایگذاری نمایید.)
۴.۱. معماری نرمافزار
معماری نرمافزاری بر پایه یک حلقه بینهایت (Loop) استوار است که در هر چرخه، وضعیت پتانسیومتر (برای دریافت فرمان سرعت) و ولتاژ باتری را میخواند، پالس PWM متناسب را برای L293D تنظیم میکند و سپس در فواصل زمانی مشخص (بدون ایجاد تأخیر در عملکرد موتور)، نمایشگر OLED را بازنشانی مینماید.
۴.۲. قطعه کد ۱: پیکربندی و راهاندازی ماژولها
توضیحات الگوریتم:
چنانچه در کد زیر مشخص است، ابتدا کتابخانههای Wire.h (برای ارتباط I2C)، Adafruit_SSD1306.h (برای نمایشگر) و RTClib.h (برای ماژول ساعت) به پروژه اضافه میشوند.
C++
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS3231 rtc;
const int motorEnablePin = 9; // پین تولید پالس PWM
const int motorDir1 = 8; // پین تعیین جهت اول
const int motorDir2 = 7; // پین تعیین جهت دوم
const int speedPotPin = A0; // ورودی پتانسیومتر آنالوگ
const int batteryPin = A1; // ورودی خوانش باتری
تعریف پینهای motorDir1 و motorDir2 مشخصکننده جهت چرخش موتور در پل H هستند. از آنجا که در همزن مغناطیسی، جهت چرخش همواره ثابت است تا گرداب به درستی شکل بگیرد، یکی از پینها در طول برنامه در حالت HIGH و دیگری در حالت LOW قرار خواهد گرفت.
۴.۳. قطعه کد ۲: تولید سیگنال PWM و کنترل موتور
!(placeholder_code2.jpg)
توضیحات الگوریتم:
در این بخش، مقدار ولتاژ از پتانسیومتر توسط مبدل آنالوگ به دیجیتال (ADC) خوانده میشود. از آنجا که ADC آردوینو ۱۰ بیتی است (خروجی ۰ الی ۱۰۲۳)، اما تولیدکننده PWM سختافزاری تنها ۸ بیت را پشتیبانی میکند (۰ الی ۲۵۵)، باید این مقیاس تغییر کند.
C++
void updateMotor() {
int potValue = analogRead(speedPotPin);
// تبدیل مقیاس 10 بیتی به 8 بیتی
int pwmValue = map(potValue, 0, 1023, 0, 255);
digitalWrite(motorDir1, HIGH);
digitalWrite(motorDir2, LOW);
// اعمال سیگنال پالس به آیسی L293D
analogWrite(motorEnablePin, pwmValue);
}
استفاده از تابع map یک رابطه خطی بین موقعیت ولوم توسط کاربر و سرعت چرخش ایجاد میکند. در صورتی که کاربر ولوم را بچرخاند، پهنای پالس تغییر کرده و ولتاژ مؤثر خروجی درایور کم یا زیاد میشود.
۴.۴. قطعه کد ۳: خوانش ولتاژ باتری و فیلتر نویز
توضیحات الگوریتم:
اندازهگیری ولتاژ سیستم لیتیومی نیازمند تبدیل سطح آنالوگ به مقداری قابل فهم (درصد) است. به دلیل وجود ماژول افزاینده ولتاژ (MT3608) و خاصیت کلیدزنی آن، خطوط تغذیه دارای ریپل (Ripple) و نویز هستند. برای رفع این نویز از یک روش میانگینگیری نرمافزاری (Software Averaging) استفاده شده است.
C++
int getBatteryPercent() {
long sum = 0;
for(int i=0; i<10; i++) {
sum += analogRead(batteryPin);
}
float avgRaw = sum / 10.0;
float voltage = avgRaw * (5.0 / 1023.0);
// نگاشت ولتاژ اسمی باتری (3.2 تا 4.2 ولت) به درصد
int percent = map(voltage * 100, 320, 420, 0, 100);
if(percent > 100) percent = 100;
if(percent < 0) percent = 0;
return percent;
}
این تابع ۱۰ بار متوالی ولتاژ را خوانده و با میانگینگیری، نوسانات شدید ناشی از عملکرد موتور و مدار بوست را خنثی میکند تا عدد درصد باتری بر روی نمایشگر دائماً پرش نداشته باشد.
۴.۵. قطعه کد ۴: مدیریت نمایشگر گرافیکی
!(placeholder_code4.jpg)
توضیحات الگوریتم:
در نهایت، تمام دادهها روی بافر گرافیکی چیده میشوند. ماژول DS3231 ساعت و دقیقه را ارائه میدهد و توابع گرافیکی کتابخانه Adafruit این متنها را رندر کرده و با دستور display.display بر روی پنل OLED به صورت همزمان ارسال میکنند.
C++
void updateDisplay(int speedP) {
display.clearDisplay();
DateTime now = rtc.now();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Time: ");
display.print(now.hour()); display.print(':'); display.print(now.minute());
display.setCursor(75, 0);
display.print("Bat: "); display.print(getBatteryPercent()); display.print("%");
display.setTextSize(2);
display.setCursor(0, 30);
display.print("Speed: "); display.print(speedP); display.print("%");
display.display();
}
۵. بررسی تفاوتهای شبیهسازی نرمافزاری و پیادهسازی واقعی
یکی از مهمترین بخشهای انجام پروژههای سختافزاری، درک فاصلهی بین محیطهای شبیهساز (Simulator) و پیادهسازی فیزیکی است. در این پروژه ابتدا صحت عملکرد منطق مدار در نرمافزار پروتئوس ارزیابی گردید.
(یادداشت برای دانشجو: عکس خروجی از نرمافزار پروتئوس را که در اختیار دارید، در این قسمت قرار دهید.)
شبیهسازی در نرمافزار Proteus عملکرد بینقصی را نشان داد، اما به هنگام پیادهسازی مدار واقعی روی برد بورد (Breadboard) و سپس لحیمکاری، تفاوتها و چالشهای جدی زیر نمایان شدند که برای غلبه بر آنها تمهیدات مهندسی در نظر گرفته شد.
۵.۱. رفتار مدار در محیط پروتئوس (Proteus)
در پروتئوس، محیط کاملاً ایدهآل است. منابع ولتاژ دارای مقاومت داخلی صفر هستند و توانایی ارائه بینهایت جریان را بدون افت ولتاژ دارند. قطعات با یکدیگر بدون هیچگونه تاخیر یا مقاومت سیم ارتباط برقرار میکنند. موتورهای شبیهسازی شده، نویز القایی (Back-EMF) به محیط تشعشع نمیکنند و هیچ تداخل الکترومغناطیسی (EMI) وجود ندارد. در این محیط، اجرای کدها و نمایش اطلاعات روی OLED به روانترین شکل ممکن رخ میدهد.
۵.۲. چالشهای دنیای واقعی: نویز القایی و خازنهای دیکوپلینگ
به محض پیادهسازی فیزیکی، مشکلاتی نظیر راهاندازی مجدد (Reset) ناگهانی آردوینو در هنگام روشن شدن موتور و یا فریز شدن صفحه نمایش OLED مشاهده شد. دلیل این امر، غیر ایدهآل بودن منابع تغذیه واقعی و سیمهای رابط است.
سیمهای ارتباطی دارای مقاومت اهمی و خاصیت سلفی هستند (قانون افت ولتاژ
ΔV=I⋅R
). زمانی که موتور از حالت سکون شروع به حرکت میکند، نیازمند «جریان هجومی» (Inrush Current) بالایی است. این جریان بالا از منبع کشیده شده و منجر به افت لحظهای ولتاژ (Voltage Dip) کل سیستم به زیر ۴ ولت میشود که باعث خاموش شدن میکروکنترلر میگردد.
راهکار اجرایی: برای حل این چالش، از استراتژی خازنهای دیکوپلینگ (Decoupling Capacitors) یا خازنهای بایپاس استفاده گردید. با قرار دادن یک خازن الکترولیتی ظرفیت بالا (مثلاً ۴۷ میکروفاراد) به موازات تغذیه آیسی L293D و یک خازن سرامیکی ۱۰۰ نانوفاراد نزدیک به پایههای تغذیه آردوینو، این خازنها به عنوان منابع تغذیه محلی عمل کرده و جریان هجومی لحظهای موتور را بدون افت ولتاژ شبکه اصلی تأمین کردند.
علاوه بر این، برای مهار نویزهای ناشی از جرقه زدن جاروبکهای موتور DC، خازنهای سرامیکی کوچکی مستقیماً روی پایههای موتور به بدنه فلزی آن لحیم شدند تا نویز فرکانس بالا فیلتر شود و از تداخل در پروتکل I2C نمایشگر جلوگیری گردد.
۵.۳. پویایی سیالات و لختی مکانیکی در برابر مدلهای ایدهآل
در شبیهسازی کامپیوتری، موتور بدون هیچ باری صرفاً به سرعت نهایی خود میرسد. اما در دستگاه واقعی، وقتی لیوان حاوی نوشیدنی (مثلاً شیر با ویسکوزیته بالا) روی استیج قرار میگیرد، اینرسی (لختی) بالای مایع مانع از چرخش سریع کپسول مغناطیسی میشود. در صورتی که کاربر به یکباره پتانسیومتر را به حداکثر سرعت بچرخاند، آهنربای متصل به موتور به شدت میچرخد در حالی که کپسول داخل لیوان ثابت میماند و پدیده Spin-out رخ میدهد. در واقعیت، کاربر باید سرعت را از کمترین مقدار شروع کرده و به تدریج افزایش دهد تا کپسول فرصت ایجاد گرداب در سیال را بیابد.
۶. نتایج و بحث
پس از اتمام مراحل مونتاژ مکانیکی قطعات درون یک شاسی (محفظه پرینت سهبعدی یا پلاستیکی آماده) و قرارگیری آهنرباهای نئودیمیوم بر روی شفت موتور به صورت محوری و متقارن، دستگاه در سناریوهای مختلف تحت آزمایش قرار گرفت.
۶.۱. ارزیابی عملکرد سیستم با سیالات مختلف
عملکرد دستگاه به شدت وابسته به گرانروی (ویسکوزیته) مایع درون لیوان و ضخامت کف لیوان است (که تعیینکننده شکاف هوایی مغناطیسی است). تستها با استفاده از کپسول تفلونی روکشدار در یک بشر شیشهای ۳۰۰ میلیلیتری انجام شد:
آب و سیالات سبک: در سرعتهای پایین (حدود ۳۰٪ چرخش پتانسیومتر)، همگامی کامل بین آهنرباها برقرار شد و در سرعت ۷۰٪، یک گرداب (Vortex) عمیق تا کف ظرف شکل گرفت که ترکیب رنگهای خوراکی را در کسری از ثانیه محقق ساخت.
سیالات با ویسکوزیته متوسط (مانند شیر و هاتچاکلت): مقاومت هیدرودینامیکی در این سیالات بیشتر بود. مشاهده شد که در دورهای بالاتر از ۸۵٪، احتمال خروج از مرکز (Decoupling) به وجود میآید. با این حال، همان سرعت ۵۰٪ تا ۷۰٪ برای ایجاد فوم و ترکیب کامل ذرات پودر کاکائو کاملاً کفایت میکرد.
جدول ۲: مقایسه تجربی عملکرد سیستم در درصدهای مختلف پالس (PWM)
تنظیمات سرعت (درصد OLED) وضعیت PWM ارسالی از آردوینو رفتار فیزیکی کپسول در سیال (آب) جریان کشیده شده از باتری
۲۰٪ ۵۱ شروع آرام حرکت، چرخش نرم، مناسب برای همزدنهای طولانی بدون کف. ~ ۱۸۰ میلیآمپر
۵۰٪ ۱۲۷ شکلگیری گرداب متوسط در مرکز، بهترین حالت برای ترکیب پودرها. ~ ۳۲۰ میلیآمپر
۸۰٪ ۲۰۴ گرداب بسیار عمیق، صدای ملایم سایش کپسول، ترکیب فوقسریع. ~ ۴۸۰ میلیآمپر
۱۰۰٪ ۲۵۵ احتمال پرتاب کپسول به دیواره ظرف در صورت عدم کالیبراسیون هندسی. ~ ۶۰۰ میلیآمپر
۶.۲. تحلیل مصرف انرژی و طول عمر باتری
استفاده از باتری لیتیومی ۱۸۶۵۰ با ظرفیت اسمی ۲۲۰۰ میلیآمپرساعت، به همراه ماژول TP4056 و MT3608 موفقیتآمیز ارزیابی شد. میانگین جریان مصرفی سیستم در حالت روشن بودن نمایشگر و کارکرد موتور در سرعت متوسط (۵۰٪)، حدود ۳۲۰ میلیآمپر اندازهگیری شد. با در نظر گرفتن راندمان ماژول بوست افزاینده (حدود ۸۵٪)، این دستگاه قادر است با یک بار شارژ کامل، حدود ۶ تا ۷ ساعت به صورت مداوم عمل همزدن را انجام دهد که برای مصارف یک روز کامل کاری در کافه بسیار مطلوب است. همچنین سیستم محافظت TP4056 به محض رسیدن ولتاژ باتری به زیر ۳.۰ ولت، مدار را به صورت کامل قطع میکند تا طول عمر سلول شیمیایی لیتیوم به خطر نیفتد.
۷. نتیجهگیری و پیشنهادات
۷.۱. جمعبندی نهایی
در این پروژه، معماری کامل یک سیستم همزن مغناطیسی پرتابل مبتنی بر اینترنت اشیاء و تجهیزات هوشمند (آردوینو) طراحی و با موفقیت پیادهسازی گردید. تلفیق موتور DC و درایور H-Bridge (L293D) امکان کنترل بدون پله (Seamless) سرعت را فراهم آورد که مهمترین عامل در جلوگیری از گسست مغناطیسی در سیالات غلیظ است. بهرهگیری از پروتکل I2C برای ارتباط با نمایشگر OLED و ساعت DS3231، علاوه بر بهینهسازی مصرف پینهای آردوینو، ظاهری مدرن و کاربردی به سیستم بخشید. همچنین بررسیهای تطبیقی نشان داد که برای پیادهسازی موفق یک طرح شبیهسازیشده در دنیای واقعی، استفاده از تکنیکهای حذف نویز و خازنهای دیکوپلینگ برای پایداری پردازنده در کنار موتورهای الکتریکی امری حیاتی است. این دستگاه به عنوان جایگزینی ارزان، بهداشتی و کارآمد برای ابزارهای همزن سنتی در کافهها پیشنهاد میشود.
۷.۲. پیشنهادات برای توسعه آینده
به منظور ارتقا و تجاریسازی این دستگاه در آینده، توسعههای زیر پیشنهاد میگردد:
۱. ادغام سیستم گرمایش (Hot Plate): با افزودن یک المنت حرارتی کوچک و رله حالت جامد (SSR)، و سنسور دمای دیجیتال (مانند DS18B20)، میتوان قابلیتی را فراهم کرد تا دستگاه به طور همزمان نوشیدنی را گرم کرده و ترکیب کند (مفید برای حل کردن موادی نظیر ژلاتین یا شکلات جامد).
۲. کنترل هوشمند فیدبکدار (PID): با تعبیه یک سنسور اثر هال (Hall Effect) در کنار آهنرباها، دستگاه میتواند سرعت واقعی چرخش کپسول را خوانده و در صورت غلیظ شدن سیال، دور موتور را به صورت خودکار از طریق یک الگوریتم PID تطبیق دهد.
۳. طراحی مدار چاپی مجتمع (Custom PCB): جایگزینی ماژولهای جداگانه با طراحی یک برد مدار چاپی یکپارچه که در آن قطعات به صورت SMD لحیم میشوند، علاوه بر کاهش شدید نویزهای الکترومغناطیسی، ابعاد نهایی دستگاه را نیز کاهش خواهد داد.
۸. منابع و مراجع
[یادداشت: تمامی منابع ارجاع داده شده در طول این گزارش به صورت تگهای داخل متن قرار گرفتهاند. مراجع اصلی استفاده شده در فرآیند پژوهش به شرح زیر میباشند.]
۱. مستندات رسمی قطعات، دیتاشیت درایور موتور L293D و روشهای راهاندازی H-Bridge.
۲. تئوریهای پایه فیزیک و کوپلینگ مغناطیسی: محاسبه گشتاور در سیستمهای دوار مبتنی بر آهنربا.
۳. مستندات طراحی و توسعه آردوینو، بررسی ساختار تولید پالس PWM از طریق میکروکنترلرهای ATmega328P.
۴. مقالات کاربردی در زمینه دینامیک سیالات، مکانیسم ایجاد گرداب (Vortex) و پدیده Decoupling در دستگاههای همزن.
۵. اصول الکترونیک قدرت در راهاندازی و مدیریت سلولهای لیتیوم-یون، بررسی عملکرد مدارهای CC/CV و افزاینده ولتاژ.
۶. راهنمای کاربردی خازنهای دیکوپلینگ و تفاوت مدارهای ایدهآل شبیهساز نرمافزاری نسبت به نویزهای دنیای واقعی.
۹. ضمایم: کدهای منبع کامل
در این بخش سورس کد کامل و نهایی پروژه که توسط نرمافزار Arduino IDE کامپایل و بر روی برد توسعه آپلود گردیده است، قرار داده شده است. این کد دارای کامنتگذاریهای توضیحی جهت درک بهتر منطق برنامه است.
C++
/*
* عنوان پروژه: سیستم کنترل همزن مغناطیسی هوشمند (Smart Magnetic Stirrer)
* شرح: کنترل سرعت موتور، زمانسنجی پروسه و مدیریت سطح باتری پرتابل
* سختافزار مورد استفاده: Arduino Uno R3, OLED SSD1306 0.96", RTC DS3231, L293D, 6V DC Motor
*/
// اضافه کردن کتابخانههای مورد نیاز برای ارتباط I2C و رندر گرافیکی
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
// پیکربندی ابعاد و تنظیمات نمایشگر OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ایجاد نمونه از کلاس ماژول ساعت واقعی
RTC_DS3231 rtc;
// ---------------------------------------------------------
// تعریف پینهای ارتباطی میکروکنترلر با قطعات سختافزاری
// ---------------------------------------------------------
const int motorEnablePin = 9; // پین تولید پالس PWM متصل به EN در L293D
const int motorDir1 = 8; // پین کنترل جهت اول (IN1)
const int motorDir2 = 7; // پین کنترل جهت دوم (IN2)
const int speedPotPin = A0; // ورودی آنالوگ برای پتانسیومتر ولوم سرعت
const int batteryPin = A1; // ورودی آنالوگ خوانش مقسم ولتاژ باتری لیتیومی
// متغیرهای لازم جهت ایجاد تاخیر بدون مسدود کردن برنامه (Non-blocking)
unsigned long previousMillis = 0;
const long updateInterval = 500; // فرکانس بروزرسانی صفحه نمایش (هر 500 میلیثانیه)
void setup() {
Serial.begin(9600);
// پیکربندی پینهای ورودی و خروجی
pinMode(motorEnablePin, OUTPUT);
pinMode(motorDir1, OUTPUT);
pinMode(motorDir2, OUTPUT);
pinMode(speedPotPin, INPUT);
// ---------------------------------------------------------
// راهاندازی و بررسی صحت ارتباط با قطعات جانبی
// ---------------------------------------------------------
// 1. نمایشگر OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED SSD1306 allocation failed. Check I2C wiring."));
for(;;); // در صورت عدم اتصال نمایشگر، برنامه متوقف میشود
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
// 2. ماژول ساعت DS3231
if (!rtc.begin()) {
Serial.println("Couldn't find RTC module on I2C bus.");
while (1);
}
// اگر باتری بکآپ در رفته باشد، ساعت به طور خودکار به زمان کامپایل کامپیوتر تنظیم میشود
if (rtc.lostPower()) {
Serial.println("RTC lost power! Setting time to compile time.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
unsigned long currentMillis = millis();
// ---------------------------------------------------------
// بخش اول: پردازش سرعت و کنترل درایور موتور
// ---------------------------------------------------------
// خواندن مقدار پتانسیومتر که عددی بین 0 تا 1023 است
int potValue = analogRead(speedPotPin);
// تبدیل مقیاس به 8 بیت (0 الی 255) جهت تغذیه تایمر تولید PWM آردوینو
int pwmValue = map(potValue, 0, 1023, 0, 255);
// تبدیل مجدد مقیاس به 0 تا 100 جهت نمایش درصد خوانا برای کاربر روی صفحه نمایش
int speedPercent = map(pwmValue, 0, 255, 0, 100);
// فعالسازی موتور. در ساختار همزن مغناطیسی جهت همیشه ثابت است تا گرداب به درستی شکل بگیرد.
digitalWrite(motorDir1, HIGH);
digitalWrite(motorDir2, LOW);
// ارسال پالس به پایههای فعالساز آیسی L293D
analogWrite(motorEnablePin, pwmValue);
// ---------------------------------------------------------
// بخش دوم: بروزرسانی رابط کاربری با زمانبندی دقیق
// ---------------------------------------------------------
if (currentMillis - previousMillis >= updateInterval) {
previousMillis = currentMillis;
// ارسال درصد فعلی سرعت به تابع رسم گرافیک
updateDisplay(speedPercent);
}
}
// ---------------------------------------------------------
// توابع پردازشی کمکی
// ---------------------------------------------------------
/*
* تابع محاسبه ظرفیت باتری با استفاده از میانگینگیری
* هدف: حذف نویزهای ناشی از مبدل افزاینده MT3608 و کلیدزنی موتور
*/
int getBatteryPercent() {
long sumADC = 0;
int sampleCount = 10;
for(int i = 0; i < sampleCount; i++) {
sumADC += analogRead(batteryPin);
delay(2); // تاخیر بسیار کوتاه جهت استقرار خازن نمونهبردار داخلی ADC
}
float avgRaw = sumADC / (float)sampleCount;
// محاسبه ولتاژ با فرض تغذیه 5 ولتی آردوینو
// نکته: مدار بیرونی دارای یک مقسم ولتاژ (Resistor Divider) است تا ولتاژ باتری به بازه امن آردوینو برسد.
float measuredVoltage = avgRaw * (5.0 / 1023.0);
// نگاشت خطی محدوده ولتاژ لیتیوم-یون
// 3.2 ولت = باتری کاملا خالی (0 درصد)
// 4.2 ولت = باتری کاملا پر (100 درصد)
int batPercent = map(measuredVoltage * 100, 320, 420, 0, 100);
// فیلتر کردن مقادیر خارج از بازه
if(batPercent > 100) batPercent = 100;
if(batPercent < 0) batPercent = 0;
return batPercent;
}
/*
* تابع مدیریت و رسم اِلمانهای رابط کاربری روی نمایشگر OLED
*/
void updateDisplay(int currentSpeed) {
// پاک کردن فریم قبلی از بافر گرافیکی
display.clearDisplay();
// واکشی زمان دقیق از ماژول RTC
DateTime now = rtc.now();
// ---- رسم المان مربوط به زمان ----
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Time: ");
// افزودن صفر قبل از اعداد تکرقمی برای زیبایی گرافیکی
if(now.hour() < 10) display.print("0");
display.print(now.hour(), DEC);
display.print(':');
if(now.minute() < 10) display.print("0");
display.print(now.minute(), DEC);
// ---- رسم المان مربوط به وضعیت باتری ----
display.setCursor(80, 0);
display.print("Bat: ");
display.print(getBatteryPercent());
display.print("%");
// کشیدن یک خط جداکننده زیر اطلاعات هدر
display.drawLine(0, 15, 128, 15, SSD1306_WHITE);
// ---- رسم اطلاعات وضعیت موتور (سرعت) ----
display.setTextSize(2);
display.setCursor(0, 25);
display.print("Spd: ");
display.print(currentSpeed);
display.print("%");
// کشیدن نوار پیشرفت (Progress Bar) برای نشان دادن بصری سرعت موتور
display.drawRect(0, 50, 128, 12, SSD1306_WHITE); // حاشیه توخالی کادر نوار
// محاسبه طول مستطیل توپر با توجه به درصد سرعت (عرض کل کادر 124 پیکسل داخلی است)
int barWidth = map(currentSpeed, 0, 100, 0, 124);
display.fillRect(2, 52, barWidth, 8, SSD1306_WHITE); // رسم مستطیل توپر
// ارسال کل بافر ساخته شده به حافظه فیزیکی نمایشگر از طریق باس I2C
display.display();
}
گزارش کردن محتوای ناایمندر پنجره جدید باز میشود