متر غلتکی هوشمند با آردوینو
تا حالا پیش اومده بخوای دور یک بطری، یک سطح منحنی یا حتی یک مسیر طولانی رو اندازه بگیری اما مترهای نواری و فلزی جوابگو نباشن؟ تو این آموزش از آیسیمدار، میخوایم یک ابزار اندازهگیری فوقالعاده جذاب و کاربردی بسازیم: یک متر غلتکی (ادومتر) دیجیتال و جیبی! این گجت کوچیک با هزینه خیلی کم ساخته میشه و میتونه هر سطح صاف یا منحنی رو با دقت بالا برات اندازه بگیره.
ایده این پروژه ترکیب طراحی سهبعدی هوشمندانه با الکترونیک سادهست. ما از یک میکروکنترلر نقلی مثل Seeeduino XIAO، یک نمایشگر OLED برای نشون دادن اعداد و یک انکودر چرخشی (Rotary Encoder) به عنوان سنسور حرکت استفاده میکنیم. نکته جالب طراحیش اینه که اصلا نیازی به پیچ و مهره نداری و تمام قطعات قاب با پرینتر سهبعدی ساخته میشن و به صورت فشاری (Snap-Fit) تو هم چفت میشن.
چه برای کارهای مهندسی بخوای، چه خیاطی یا حتی پروژههای نجاری، این متر دیجیتال جیبی حسابی به کارت میاد. پس اگر تو هم عاشق ساختن ابزارهای خاص و کاربردی هستی، دستگاه لحیمکاری و پرینتر سهبعدی رو آماده کن تا این ادومتر جذاب رو قدمبهقدم با هم بسازیم!
قطعات موردنیاز
- نرمافزار طراحی سهبعدی Autodesk Fusion
- فیلامنت PLA (یا هر متریال مناسب دیگه برای پرینت سهبعدی)
- کش لاستیکی کوچک، اورینگ (O-ring) یا نوار اصطکاکی برای دور چرخ
- برد میکروکنترلر Seeeduino XIAO (یا بردهای مشابه آردوینو با ابعاد کوچک)
- ماژول روتاری انکودر EC11
- ماژول نمایشگر OLED سایز 0.96 اینچ (مدل 4 پین 128x64)
- سیم مفتولی تکرشتهای
- برد سوراخدار (اختیاری)
- 2 عدد باتری نیمقلمی (AAA)
- پرینتر سهبعدی
- هویه و لوازم لحیمکاری
- کامپیوتر برای برنامهنویسی میکروکنترلر
اصول طراحی سهبعدی و تنظیمات پارامتریک
برای اینکه این پروژه کاملا یکپارچه باشه و راحت بشه تغییرش داد، از روش طراحی "بالا به پایین" (Top-Down) استفاده کردیم. تو این روش اول یک بدنه اصلی طراحی میشه و بعد اون رو به قطعات مختلف تقسیم میکنیم تا مطمئن بشیم از لحاظ مکانیکی همهچیز دقیقا با هم تراز درمیاد.
- ویژگیهای مشترک: هر شکل هندسی که روی چند قطعه تاثیر میذاره (مثل انحنای کلی دستگاه) تو بدنه اصلی (Master Body) اعمال میشه.
- ویژگیهای مجزا: جزئیاتی که فقط مربوط به یک قطعه هستن (مثل جایگاه نمایشگر) رو بعد از جدا کردن و فعال کردن اون قطعه طراحی میکنیم.
کنترل کامل با پارامترها
برای اینکه بتونی ابعاد رو راحت تغییر بدی، قبل از کشیدن حتی یک خط، تمام ابعاد مهم رو تو بخش Parameters نرمافزار تعریف کردیم. یعنی تو هم میتونی فایل فیوژن رو باز کنی، پارامترها رو تغییر بدی و دقیقا سایزی که دوست داری رو بسازی.
یک ترفند جالب: میتونی از هوش مصنوعی داخل نرمافزار Autodesk کمک بگیری و کدهای زیر رو کپی کنی تا این پارامترها رو خودش برات بسازه!
overallwidth = 55 mm
coverdepth = 10 mm
chamberdepth = 20 mm
screenwidth = 26 mm
screenheight = 28 mm
screendepth = 8 mm
screenconnecterwidth = 10.31 mm
screenconnectorheight = 4 mm
flextolerance = 0.4 mm
flexwidth = 25 mm
encodershaftdiameter = 6 mm
flexdepth = 0.2 mm
screenholediameter = 2.7 mm
screenholetopoffset = 2 mm
chamberthickness = 1.5 mm
encoderthreadthickness = 7.2 mm
lidthickness = 1 mm
encodershaftandthreadslength = 19.7 mm
encoderbasetoflat = 10.25 mm
nutdiameter = 10.9 mm
flatorigin = 4.45 mm
screenholesideoffset = 3 mm
LCDwidth = 24.7 mm
LCDheight = 13.2 mm
حالا که پارامترها رو تنظیم کردیم، بریم سراغ طراحی اصلی.
- رسم اسکچ (Sketch): فرم کلی و بیرونی دستگاه رو با استفاده از ابعاد پارامتریک روی صفحه رسم کن.
- حجمدهی (Extrude): اسکچ رو به اندازه عمق کل دستگاه برجسته کن.
- گرد کردن لبهها (Fillet): لبههای بیرونی رو گرد کن تا فرم ارگونومیک به خودش بگیره و تو جیب راحت جا بشه.
- ایجاد صفحه برشی (Offset Plane): صفحات برشی رو در نقاط اتصال درب پشتی، محفظه میانی و قاب جلویی ایجاد کن.
- برش بدنه (Split Body): با استفاده از اون صفحات، بدنه اصلی رو به سه بخش مجزا و توپر تقسیم کن.
- تبدیل به قطعه (Create Components): هر کدوم از این سه بدنه رو به یک قطعه مستقل تبدیل کن و روی اونها اسم بذار (مثل Cover، Chamber و Lid).
طراحی قاب جلویی و دکمه مخفی یکپارچه
بریم سراغ مدلسازی دقیقتر و قاب جلویی (Cover) رو فعال (Activate) کنیم. هدف ما اینه که نمایشگر دقیقا تو مرکز قرار بگیره و ظاهر مینیمال و متقارنی داشته باشیم.
خفنترین ویژگی مهندسی این قاب، "دکمه یکپارچه مخفی" اونه! به جای اینکه یک دکمه پلاستیکی لق روی دستگاه بذاریم، یک لایه نازک و انعطافپذیر از پلاستیک رو مستقیما روی پنل جلویی پرینت میکنیم که با فشار دادن انگشت خم میشه و روتاری انکودر رو کلیک میکنه.
- رسم اسکچ: روی سطح جلویی، یک مستطیل برای بریدگی نمایشگر OLED و یک شیار برای پینهای هدر اون دقیقا تو مرکز رسم کن.
- برش اولیه (Extrude - Cut): این مستطیل رو به داخل کات کن تا یک پنجره فرورفته برای نمایشگر ایجاد بشه.
- برش دوم (Extrude - Cut): یک برش دیگه بزن تا مسیر پینها و سیمهای نمایشگر به داخل بدنه باز بشه.
- صفحه مرجع (Offset Plane): یک صفحه دقیقا به اندازه ضخامت یک لایه پرینت (حدود 0.2 میلیمتر) پایینتر از سطح جلویی ایجاد کن.
- رسم مرز دکمه: روی سطح جلویی، یک خط دایرهای بکش تا محدوده خم شدن پوسته پلاستیکی دکمه مشخص بشه.
- بریدگی انکودر: روی سطح داخلی قاب، یک دایره بزرگتر بکش تا شفت انکودر توش آزادانه بچرخه.
- ابزار لافت (Loft): حالا این دوتا اسکچ رو با ابزار لافت به هم وصل کن. این کار یک شیب نرم ایجاد میکنه. حواست باشه تنظیمات Continuity رو طوری دستکاری کنی که شیب نرم باشه و موقع پرینت سهبعدی نیازی به ساپورت (Support) نداشته باشه!
طراحی محفظه اصلی و جایگاه چرخ
حالا قطعه محفظه میانی (Chamber) رو فعال کن. این بخش مثل شاسی اصلی عمل میکنه و تمام مدارها و محور چرخ اندازهگیری رو تو خودش نگه میداره. وقتی داخلش رو خالی کردیم، یک سر به قاب جلویی برمیگردیم تا سیستم دکمه مخفیمون رو تکمیل کنیم.
- رسم اسکچ: روی سطحی که به قاب جلویی میچسبه، سه تا دایره بکش: یکی برای قطر چرخ اندازهگیری، یکی برای لقی دور چرخ و یکی هم برای سوراخ نصب انکودر.
- برش بیرونی (Extrude - Cut): دیواره بیرونی رو برش بزن تا محفظه چرخ باز بشه و چرخ بتونه با بیرون تماس داشته باشه.
- توخالی کردن (Shell): با استفاده از ابزار Shell و انتخاب سطح جلویی، داخل محفظه رو با ضخامت دیواره حدود 1.5 میلیمتر توخالی کن. نکته مهم: تو این مرحله سطح پشتی رو انتخاب نکن تا نرمافزار برای محاسبه لبههای گرد دچار ارور نشه.
- حذف دیواره پشتی (Extrude - Cut): حالا با یک کات ساده، کل دیواره پشتی رو حذف کن تا محفظه کاملا باز و تمیز بشه.
- سوراخ انکودر: سوراخ نصب انکودر (که تو مرحله 1 کشیدی) رو تا انتها و دیواره پشتی امتداد بده.
- بازگشت به بدنه اصلی: بدنه اصلی (Top-level) رو فعال کن تا هر دو قطعه رو ببینی. روی صفحه ZY یک نیمدایره کوچیک دقیقا پشت همون لایه نازک دکمه بکش تا نقش برجستگی دکمه رو بازی کنه. فاصلهش رو طوری تنظیم کن که مماس با دکمه روی انکودر باشه.
- تکمیل دکمه: دوباره به قاب جلویی (Cover) برگرد و با ابزار Revolve، این نیمدایره رو تبدیل به یک برآمدگی سهبعدی کن که دقیقا به پشت پوسته نازک متصل میشه. حالا یک دکمه مکانیکی و کلیکی بینقص داری!
طراحی اتصالات چفتشونده (Snap-Fit)
مکانیسم چفتشونده (Snap-Fit) یکی از حیاتیترین بخشهای این پروژهست که هم ظاهر رو تمیز نگه میدارد و هم باعث میشه بدون نیاز به پیچ و ابزار خاصی دستگاه رو به راحتی باز و بسته کنی و تو جیبت از هم نپاشه.
علاوه بر این، طراحی باید طوری باشه که موقع پرینت سهبعدی نیازی به ساپورت (Support) نداشته باشی تا لبهها تمیز دربیان و گیرهها عالی کار کنن.
خبر خوب اینه که اگر این طراحی رو خوب یاد بگیری و تلرانس پرینترت دستت بیاد، میتونی دقیقا همین پروفیل چفتی رو تو تمام پروژههای بعدیت هم تکرار کنی!
- رسم پروفیل اتصال: به سطح بالاتر (بدنه اصلی) برگرد و روی صفحه مبدا ZY، سطح مقطع یک لبه چفتشونده (نر و ماده) رو بکش. زوایای عکسها رو دنبال کن و حتما از ابعاد پارامتریک استفاده کن تا بعدا راحت قابل تغییر باشه.
- قرینه کردن (Mirror): وقتی یک سمت دیواره رو کشیدی، با ابزار Mirror اون رو به سمت دیگه دستگاه (دیواره روبرویی) هم کپی کن.
- مسیردهی (Sweep): حالا باید 4 تا عملیات Sweep جداگانه انجام بدی تا این پروفیلها دورتادور لبهها و مسیرهای داخلی شکل بگیرن:
- جاروب 1: ساخت لبه نری روی قاب جلویی.
- جاروب 2: ساخت لبه نری روی درب پشتی.
- جاروب 3 و 4: ساخت شیارهای مادگی داخل دو طرف محفظه میانی. (استفاده از مسیر پیرامونی محفظه باعث میشه لبهها به نرمی دور انحنای چرخ هم کشیده بشن).
- آنالیز سطح مقطع: از منوی Inspect گزینه Section Analysis رو فعال کن تا مطمئن بشی لبهها به هم نمیچسبن و یک فاصله (Tolerance) ظریف برای چفت شدن بینشون هست.
- ایجاد شکاف ناخن: با ابزار Fillet یا Chamfer یک پخ کوچیک رو لبههای بیرونی محفظه و دربها ایجاد کن تا بعدا بتونی با ناخن به راحتی قاب رو باز کنی.
طراحی چرخ اندازهگیری ادومتر
چرخ اندازهگیری قطعه نسبتا سادهای هست، اما ابعادش خیلی مهمه و به اورینگ لاستیکی یا کشی که قراره دورش بندازی بستگی داره تا بهترین اصطکاک رو ایجاد کنه و روی سطوح لیز نخوره.
- حجمدهی اصلی (Extrude): دایره بیرونی چرخ رو که تو همون اسکچ اول کشیده بودی انتخاب کن و اون رو برجسته کن تا فرم استوانهای چرخ شکل بگیره.
- ایجاد صفحه مرجع (Offset Plane): یک صفحه مرجع با کمی فاصله به سمت داخل محفظه ایجاد کن. این فاصله برای اینه که فضای کافی وجود داشته باشه و مهره نگهدارنده انکودر به پشت چرخ در حال چرخش ساییده نشه.
- بریدگی برای مهره: روی این صفحه جدید یک دایره کمی بزرگتر از مهره انکودر بکش و اون رو به داخل چرخ Extrude-Cut کن تا فضای خالی برای مهره و رزوه انکودر ایجاد بشه.
- شیار اورینگ (Revolve - Cut): روی صفحه مبدا ZY یک مقطع نیمدایره یا مستطیل کوچیک (بسته به شکل اورینگت) روی لبه بیرونی چرخ بکش. بعد با ابزار Revolve این شکل رو حول محور مرکزی بچرخون تا یک شیار دورتادور چرخ کنده بشه.
- نشانگرهای چرخش: برای اینکه چرخیدن دستگاه از بیرون مشخص باشه، چندتا خط یا علامت روی سطح بیرونی چرخ بکشی و یکم به داخل Cut کن تا حک بشن.
- قرینهسازی (Midplane & Mirror): برای حفظ تقارن، یک صفحه در مرکز چرخ (Midplane) بساز و نشانگرهایی که تو مرحله قبل ساختی رو به سمت دیگه چرخ هم Mirror کن.
طراحی فریم و نگهدارنده نمایشگر
فریم نمایشگر یک قطعه کوچیک و کاربردیه که وظیفه داره ماژول OLED رو بدون نیاز به چسب یا پیچ، محکم سر جاش نگه داره. برای این قطعه هم از همون ترفند اتصالات چفتشونده (Snap-Fit) استفاده میکنیم.
- ایجاد فضای خالی: قاب جلویی رو فعال کن. روی سطح داخلی، ابعاد محفظه نمایشگر رو حدود 1 میلیمتر به بیرون گسترش بده تا گیرههای چفتی جا برای حرکت داشته باشن و جلوی قرار گرفتن نمایشگر رو نگیرن. تو همین اسکچ، یک مستطیل هماندازه با بخش فعال نمایشگر OLED بکش تا پنجره دید رو مشخص کنه.
- برش فضای اضافی (Extrude - Cut): این فضای اضافه رو خالی کن. عمق برش رو با گزینه To Object تنظیم کن و سطح پشتی نمایشگر رو انتخاب کن و یک آفست 2.1 میلیمتری اعمال کن تا نمایشگر کاملا کیپ بشه.
- ساخت قطعه جدید: از منوی Create گزینه New Component رو بزن، اسمش رو فریم (Frame) بذار و فعالش کن.
- حجمدهی فریم: همون اسکچی که برای مرز فریم کشیدی رو انتخاب کن و حدود 1.7 میلیمتر به داخل حجم بده تا بدنه اصلی فریم شکل بگیره.
- پروفیل اتصال: روی صفحه XY، سطح مقطع گیره چفتی فریم رو بکش. میتونی از همون ابعاد قبلی ایده بگیری.
- جاروب نری (Sweep): با ابزار Sweep لبه نری رو دورتادور فریم ایجاد کن.
- جاروب مادگی (Sweep): یک جاروب دیگه انجام بده تا شیار مادگی روی دیواره داخلی قاب کنده بشه.
- قرینهسازی: گیرههای ساخته شده تو مراحل 6 و 7 رو با استفاده از ابزار Mirror و صفحه ZY قرینه کن تا سمت مقابل هم چفت داشته باشه.
- ایجاد لقی و تلرانس: برای اینکه پرینت سهبعدی بیش از حد سفت نشه و فریم راحت جا بره، یک اسکچ روی لبههای بیرونی فریم بکش و کسر بسیار کوچیکی رو Cut کن تا یکم لقی استاندارد داشته باشه.
طراحی درب پشتی و درگاه USB
درب پشتی به خاطر مراحل قبلی الان فرم کلی و اتصالات خودش رو داره. فقط کافیه یک سوراخ برای کابل USB-C و یک فرورفتگی کوچیک برای محکم نگه داشتن برد میکروکنترلر Seeeduino XIAO بهش اضافه کنیم.
- شیار تراز میکروکنترلر: قاب جلویی رو فعال کن. روی دیواره داخلی پشتی اون، یک مستطیل به ابعاد لبه جلویی برد XIAO بکش.
- برش شیار (Extrude - Cut): این مستطیل رو کمی به داخل کات کن تا یک فرورفتگی کمعمق ایجاد بشه و از لق زدن میکروکنترلر جلوگیری کنه.
- طرح پورت USB: حالا درب پشتی (Lid) رو فعال کن. روی یکی از سطوح صاف اون اسکچ بساز و با ابزار Project (کلید P) مختصات شیاری که تو مرحله اول ساختی رو روی این صفحه کپی کن. ابعاد رو کمی تغییر بده تا فقط اندازه سوکت کابل USB-C باشه، نه کل برد.
- سوراخکاری پورت (Extrude - Cut): این اسکچ پورت رو انتخاب کن و با Extrude تا انتها کات کن تا سوراخ کابل روی درب پشتی ایجاد بشه و بتونی دستگاهت رو راحت پروگرام کنی!
طراحی جایگاه باتری و اتصال سیمها
طراحی این جاباتری اولش فقط یک ایده آزمایشی بود تا ببینم جواب میده یا نه، اما اونقدر خوب و محکم سر جاش فیکس شد که تبدیل شد به قطعه نهایی پروژه!
این طراحی خیلی ساده و هوشمندانهست؛ باتری نیمقلمی (AAA) کاملا محکم سر جاش میشینه و برای اتصال قطبها، نیازی به فنر و ورقههای فلزی آماده نداری! فقط کافیه سیم لخت شده رو از شیارها رد کنی تا همون سیم به عنوان ترمینال عمل کنه.
- اول از منوی Change Parameters ابعاد مربوط به باتری و ضخامت دیوارهها رو تعریف کردم:
BatteryHeight = 44.3 mm
BatteryDiameter = 10.3 mm
WidthThickness = 1.5 mm
HeightThickness = 2 mm
WireGauge = 0.6 mm
DepthThickness = 2 mm
- حجم اصلی: روی صفحه XY یک مستطیل (با توجه به طول و عرض باتری و ضخامت دیوارهها) بکش و اون رو حدود 6 میلیمتر برجسته کن تا بلوک اصلی شکل بگیره.
- رسم مقطع باتری: روی صفحه عمودی XZ یک دایره بکش که قطرش کمی از باتری بزرگتر باشه (حدود 0.4 میلیمتر برای لقی). دایره رو طوری تنظیم کن که نیمه پایینیش با بلوک مستطیلی تداخل داشته باشه.
- ایجاد گودی باتری (Extrude - Cut): این نیمدایره رو انتخاب کن و به صورت دوطرفه (Symmetric) کات کن تا گودی جاباتری دربیاد. حواست باشه که برش رو تا ته نبری و دیوارههای نگهدارنده انتهایی سالم بمونن.
- دیوارههای جانبی: سطوح بالایی دو طرف گودی رو انتخاب کن و حدود 3 میلیمتر به بالا Extrude کن تا باتری رو سفت نگه دارن و بیرون نپره.
- شیارهای عبور سیم: روی یکی از دیوارههای انتهایی، یک شیار (Slot) کمی بزرگتر از قطر سیمت بکش. زیر این شیار هم یک خطچین کمکی (Centerline) رسم کن.
- برش شیارها: این شیار رو انتخاب کن و کل بلوک رو با تنظیمات Extent Type روی All سوراخ کن تا هر دو طرف جاباتری به طور همزمان سوراخ بشه.
- ایجاد صفحه کمکی (Offset Plane): یک صفحه موازی با صفحه XY بساز و اون رو دقیقا روی خطچینی که تو مرحله قبل کشیدی تنظیم کن.
- قرینهسازی شیار دوم: با ابزار Mirror و انتخاب این صفحه کمکی، شیار بالایی رو به پایین هم کپی کن. حالا روی دیوارهها دوتا شیار داری که میتونی سیم رو به صورت حلقهای ازشون رد کنی تا یک ترمینال باتری بینقص ساخته بشه!
مونتاژ قطعات سختافزاری قاب
بعد از اینکه پرینت قطعات تموم شد، مونتاژ سختافزاری قاب خیلی راحته. به لطف طراحی مکانیسمهای چفتشونده، همه قطعات ساختاری با یک فشار ملایم تو هم چفت میشن و نیازی به هیچ ابزاری نداری. فقط یادت باشه که چرخ اندازهگیری رو باید حتما بعد از نصب و محکم کردن انکودر، روی شفت اون سوار کنی.
مونتاژ و سیمکشی الکترونیکی
به خاطر فضای خیلی کم داخل محفظه، سیمکشی و لحیمکاری باید خیلی تمیز، برنامهریزی شده و ظریف انجام بشه. دقت تو این مرحله رمز کارکرد درست دستگاهه.
بررسی مسیرها و معماری الکترونیکی
قبل از اینکه هویه رو دست بگیری، بهتره بدونی جریان و دیتا چطور تو مدار حرکت میکنن:
- تأمین برق: دوتا باتری نیمقلمی (AAA) که با هم سری شدن، حدود 3 ولت برق بهمون میدن. این ولتاژ مستقیما به پینهای 3V3 و GND برد XIAO وصل میشه. نمایشگر OLED هم به صورت موازی از همین مدار برق میگیره.
- نمایشگر OLED (ارتباط I2C): نمایشگر با پروتکل استاندارد I2C کار میکنه. پین SCK رو به A5 و پین SDA رو به A4 میکروکنترلر وصل کن.
- روتاری انکودر: انکودر کلا 5 تا پین داره. دوتا پین گراند (GND) که یکی برای دکمه و یکی برای چرخش هست رو به هم لحیم کن. سه تا پین سیگنال باقیمونده رو به ترتیب به پینهای A8، A9 و A10 متصل کن تا از قابلیتهای وقفه سختافزاری (Hardware Interrupt) برد استفاده کنیم.
- آمادهسازی میکروکنترلر (اختیاری): میتونی برای راحتی کار، روی برد XIAO پینهدر لحیم کنی.
- آمادهسازی ترمینالهای باتری: حدود 5 سانتیمتر از سیم مفتولی رو لخت کن و یکی دو بار از شیارهای جاباتری که طراحی کردی رد کن (گره بزن). باتری رو جا بزن تا از محکم بودنش مطمئن بشی. ضخامت سیم باعث میشه باتری کاملا کیپ بشه و اتصال عالی برقرار بشه. میتونی از عکسها ایده بگیری.
- سیمکشی انکودر: سیمها رو به پینهای انکودر لحیم کن. برای اینکه فضای داخل قاب شلوغ نشه، دوتا پین GND انکودر رو همونجا به هم وصل کن تا فقط یک سیم مشترک منفی به برد اصلی بره.
- سیمکشی نمایشگر: سیمها رو به 4 تا پین هدر نمایشگر لحیم کن.
- تنظیم طول سیمها: قبل از لحیمکاری نهایی به برد، همه قطعات رو موقتا تو قاب جا بزن. سیمها رو طوری کوتاه کن که موقع بستن قاب روی هم تلمبار نشن، اما اونقدر هم کوتاه نباشن که موقع لحیمکاری اذیت بشی.
- یکپارچهسازی مدار: طبق دیاگرام، اتصالات رو کامل کن. برای بهینهسازی فضا، میتونی مسیر منفی (GND) رو از باتری به صورت زنجیرهای به نمایشگر و بعد به انکودر وصل کنی و در نهایت فقط یک سیم رو به میکروکنترلر ببری.
⚠️ هشدار خطر: تداخل منابع تغذیه! به هیچوجه زمانی که باتریها وصل هستن، کابل USB رو همزمان به کامپیوتر متصل نکن! این کار باعث برگشت ولتاژ (Backfeeding) میشه و ممکنه میکروکنترلر یا پورت USB کامپیوترت رو برای همیشه بسوزونه.
- اگر خواستی دستگاه رو از طریق USB پروگرام کنی، حتما اول باتریها رو کلا دربیار.
- اگر خواستی با باتری کار کنی، مطمئن شو که کابل USB وصل نباشه.
برنامهنویسی و کدهای آردوینو
حالا نرمافزار Arduino IDE رو باز کن و کدهای زیر رو توش کپی کن. احتمالا لازم باشه پکیج بردهای Seeeduino رو تو نرمافزار نصب کنی و کتابخونههای وابستهای که تو کد ذکر شده رو هم دانلود کنی.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoLowPower.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int pinCLK = 8;
const int pinDT = 9;
const int pinSW = 10;
const float WHEEL_DIAMETER_MM = 19.50;
const float WHEEL_DIAMETER_CM = WHEEL_DIAMETER_MM / 10.0;
const float RUBBER_BAND_FACTOR = -1.15;
const float PULSES_PER_REV = 20.0;
const float WHEEL_CIRCUMFERENCE_CM = WHEEL_DIAMETER_CM * PI;
const float CM_PER_PULSE = WHEEL_CIRCUMFERENCE_CM / PULSES_PER_REV;
volatile long rotationValue = 0;
volatile bool updateDisplayFlag = true;
volatile unsigned long lastInteractionTime = 0;
volatile bool pendingSingleClick = false;
volatile unsigned long lastClickTime = 0;
const unsigned long debounceDelay = 50;
const unsigned long doubleClickWindow = 500;
bool showInches = false; // false = Centimeters, true = Inches
const unsigned long sleepTimeout = 15000;
void handleEncoder() {
if (digitalRead(pinDT) == HIGH) {
rotationValue++;
} else {
rotationValue--;
}
lastInteractionTime = millis();
updateDisplayFlag = true;
}
void handleButton() {
unsigned long currentTime = millis();
if (currentTime - lastClickTime < debounceDelay) {
return;
}
if (pendingSingleClick && (currentTime - lastClickTime <= doubleClickWindow)) {
rotationValue = 0;
pendingSingleClick = false;
updateDisplayFlag = true;
lastClickTime = 0;
} else {
pendingSingleClick = true;
lastClickTime = currentTime;
}
lastInteractionTime = currentTime;
}
void setup() {
pinMode(pinCLK, INPUT_PULLUP);
pinMode(pinDT, INPUT_PULLUP);
pinMode(pinSW, INPUT_PULLUP);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for(;;);
}
display.setTextColor(SSD1306_WHITE);
display.setTextWrap(false);
LowPower.attachInterruptWakeup(pinCLK, handleEncoder, FALLING);
LowPower.attachInterruptWakeup(pinSW, handleButton, FALLING);
lastInteractionTime = millis();
}
void loop() {
unsigned long currentMillis = millis();
if (pendingSingleClick && (currentMillis - lastClickTime > doubleClickWindow)) {
pendingSingleClick = false;
showInches = !showInches; // Toggle between Centimeters and Inches
updateDisplayFlag = true;
lastInteractionTime = currentMillis;
}
if (updateDisplayFlag) {
updateDisplayFlag = false;
float distanceCM = rotationValue * CM_PER_PULSE;
float displayDistance = showInches ? (distanceCM / 2.54) : distanceCM;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 4);
display.print("POCKET ODOMETER");
display.drawFastHLine(0, 16, SCREEN_WIDTH, SSD1306_WHITE);
display.setTextSize(2);
display.setCursor(0, 28);
if (showInches) {
display.print(displayDistance * RUBBER_BAND_FACTOR, 2);
display.print(" in"); // Appends text right after the number
} else {
display.print(displayDistance* RUBBER_BAND_FACTOR, 2);
display.print(" cm");
}
display.display();
}
if (!pendingSingleClick && (millis() - lastInteractionTime > sleepTimeout)) {
display.ssd1306_command(SSD1306_DISPLAYOFF);
// The program execution will completely pause exactly on this line
LowPower.deepSleep();
//WAKES UP HERE
display.ssd1306_command(SSD1306_DISPLAYON);
lastInteractionTime = millis();
updateDisplayFlag = true;
}
}
اگر ابعاد چرخ یا قطعاتت با نمونه ما فرق داره، حتما تو چند خط اول کد، متغیرهای مربوط به شعاع چرخ و تعداد پالسهای انکودر رو مطابق با دستگاه خودت تغییر بده:
const int pinCLK = 8;
const int pinDT = 9;
const int pinSW = 10;
const float WHEEL_DIAMETER_MM = 19.50;
const float WHEEL_DIAMETER_CM = WHEEL_DIAMETER_MM / 10.0;
const float RUBBER_BAND_FACTOR = -1.15;
const float PULSES_PER_REV = 20.0;
const unsigned long debounceDelay = 50;
const unsigned long doubleClickWindow = 500;
const unsigned long sleepTimeout = 15000;
تست اول: دقت در خط مستقیم
وقتی ادومتر جیبیت آماده شد و کدها رو آپلود کردی، وقتشه بریم سراغ تست عملکرد! اولین تست، اندازهگیری یک مسیر مستقیمه. کافیه دستگاه رو روی یک سطح صاف (مثل سرامیک کف) کنار یک خطکش بکشی.
تست دوم: اندازهگیری سطوح منحنی و دور کمر
حالا که خیالمون از بابت اندازهگیری خطوط مستقیم راحت شد، بیایم ببینیم روی سطوح منحنی چطور عمل میکنه؛ یعنی دقیقا همون جایی که خطکشهای معمولی به دردمون نمیخورن و باید بریم سراغ مترهای خیاطی انعطافپذیر.
یکی از کاربردیترین موارد، اندازهگیری دور کمره. همونطور که تو ویدیوی بالا میبینی، این ادومتر دیجیتال عملکردی دقیقا مشابه با یک متر منعطف داره و اعدادش کاملا قابل اعتماده.
تست سوم: تکرارپذیری و اندازهگیری محیط
بیا یک کار سختتر بهش بسپریم: اگر بخوایم محیط، قطر یا شعاع یک بطری آب رو اندازه بگیریم چی؟ در حالت عادی باید از یک کولیس خیلی بزرگ استفاده کنیم یا با یک نخ دور بطری رو بگیریم و بعد نخ رو روی خطکش بذاریم که هم زمانبره و هم خطای زیادی داره.
اما با این متر غلتکی، فقط کافیه چرخ رو دورتادور بطری بچرخونی! ویدیوهای بالا تکرارپذیری و ثبات فوقالعاده این دستگاه رو نشون میدن و با هر بار چرخش دور بطری، همون نتیجه قبلی رو به دست میاری.
اختلاف خیلی جزئی که تو اندازهها میبینی، فقط به خاطر یک پالس جابهجایی انکودره که ناشی از خطای لرزش دست انسان موقع چرخشه، نه خطای خود دستگاه.
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!