یک ربات جاروبرقی خودران در یک خانهی هوشمند مجازی. دانشآموزان برنامهای مینویسند که ربات با حسگرهای فاصله، سپر (bumper)، حسگر رنگ و (در U19) GPS و IMU در خانه بگردد، به مبلها و حیوانات خانگی نخورد و در زمان محدود بیشترین سطح را تمیز کند؛ رودررو با ربات حریف. هیچ ربات فیزیکی ساخته نمیشود؛ موفقیت فقط به برنامه بستگی دارد.

خانه یک شبکه از کاشیهاست با اتاقهای مبله، فرش، گیاه، و یک گربه و یک سگ که بهعنوان مانع متحرک پرسه میزنند. ربات شما از یک گوشه و ربات حریف از گوشهی مقابل شروع میکند. هر کاشی که ربات از روی آن عبور کند به رنگ آن ربات درمیآید و یک امتیاز دارد؛ تمیز کردن دوبارهی کاشی خودتان امتیاز اضافه نمیدهد ولی میتوانید کاشیهای حریف را از آنِ خود کنید. در پایان زمان، رباتی که کاشیهای بیشتری در اختیار دارد برنده است.
برنامهی ربات ۱۰ بار در ثانیه از بالا تا پایین اجرا میشود: اول حسگرها را میخوانید، بعد سرعت دو چرخ را تعیین میکنید. همین. U14 حسگر رنگ، قطبنما و شمارهی اتاق دارد؛ U19 بهعلاوه GPS، IMU و باتری که باید در ایستگاه شارژ شود.
یک مسابقه نمونه در برنامهی Smart Home League با همان کد پایهای که در همین صفحه دانلود میکنید: دو ربات جاروبرقی در خانه حرکت میکنند و اتاقها را تمیز میکنند.
تصاویر از برنامهی رسمی لیگ (نسخهی ۲.۱.۰) گرفته شدهاند. نسخهی Windows یک فایل exe است که همان برنامه را در پنجرهی خودش باز میکند.






این بخش برای کسی نوشته شده که هنوز هیچچیز نصب نکرده. مرحلهها را به ترتیب بروید؛ در پایان یک مسابقه یا پرواز واقعی با کد خودتان دیدهاید.
یک رایانهی ویندوزی و یک ویرایشگر متن مثل VS Code یا Notepad++. Python لازم نیست نصب کنید؛ برنامه خودش کد شما را اجرا میکند. اگر نمیخواهید چیزی دانلود کنید، نسخهی تحت وب همین برنامه در smarthomeleague.ir/game در مرورگر باز میشود.
از بخش دانلود فایل SmartHomeLeague-Windows.exe (حدود ۱۰ مگابایت) را بگیرید و روی آن دوبار کلیک کنید. نصب ندارد. اگر ویندوز پنجرهی «Windows protected your PC» نشان داد، More info و بعد Run anyway را بزنید. بعد از این به اینترنت نیازی نیست.
در صفحهی اول روی کارت ردهی تیم خود بزنید: زیر ۱۴ سال یا زیر ۱۹ سال. خانه، حسگرها و قوانین با رده عوض میشود، پس همان ردهای را بزنید که در سایت ثبتنام کردهاید. زبان برنامه از منوی ☰ قابل تغییر است.
در برنامه روی دکمهی کد پایه بزنید. یک فایل Python کامل دانلود میشود که همهی حسگرها و متغیرها را با توضیح فارسی داخل خودش دارد. آن را در پوشهای مثل Documents\smarthome با نام تیم ذخیره کنید، مثلاً team.py. همین فایلها در SmartHome-BaseCode.zip سایت هم هست (base_u14.py و base_u19.py) بههمراه آموزش کامل از صفر.
روی حالت مسابقه بزنید. در کارت تیم ۱ نام تیم را بنویسید، رنگ را انتخاب کنید و روی بارگذاری ربات (.py) بزنید و فایل team.py را بدهید. برای تیم ۲ یکی از کدهای نمونهی خود برنامه را انتخاب کنید. شروع مسابقه را بزنید. بازی ۱۸۰ ثانیه است. از منوی ☰ گزینهی Sensors را روشن کنید تا عدد زندهی حسگرها و سرعت چرخها را ببینید.
فایل team.py را در VS Code باز کنید. همهی کد شما در همین یک فایل است و برنامه آن را ۱۰ بار در ثانیه از اول اجرا میکند: اول حسگرها را میخوانید، آخر سر دو متغیر wheelleft و wheelright را تنظیم میکنید. برای شروع فقط یک عدد را عوض کنید، مثلاً سرعت ۲۵ را ۲۰ کنید، ذخیره کنید، دوباره بارگذاری ربات و مسابقه. تغییر، ذخیره، بارگذاری، تماشا. همین.
در پایان مسابقه نمودار امتیاز، مسیر حرکت ربات و چند جمله میبینید که میگوید کجا وقت تلف شده. هر بازی ضبط میشود (REC) و میتوانید بازپخشش کنید. از همین گزارش بفهمید قدم بعدی چیست: مثلاً ربات در یک اتاق گیر میکند یا فرش را نمیشناسد.
فقط همان یک فایل .py را تحویل میدهید. نام فایل را نام تیم بگذارید. محل و مهلت تحویل در کانال کمیته فنی اعلام میشود. بعد از تحویل هیچ تغییری مجاز نیست، پس قبل از آن چند مسابقهی کامل با آن بدهید.
اگر زیر کارت تیم پیام قرمز آمد، یعنی کد خطا دارد؛ معمولاً اسم متغیری که وجود ندارد یا یک تورفتگی اشتباه. پنل Sensors شمارهی خطی را که در هر تیک اجرا شده نشان میدهد و خطا را پیدا میکند. یادتان باشد برنامه فقط بخشی از Python را میفهمد: عدد، if/elif/else، while، def و چهار عمل اصلی. لیست، رشته، for و import نداریم.
# این فایل ۱۰ بار در هر ثانیه اجرا میشود:
# اول سنسورها را میخوانی، بعد دو چرخ را تنظیم میکنی.
wheelleft = 25
wheelright = 25
if front < 60: # روبهرو بسته
wheelleft = 18
wheelright = -18 # چرخش درجا
elif frontleft < 50: # مانع سمت چپ
wheelleft = 25
wheelright = 8 # قوس به راست
elif frontright < 50: # مانع سمت راست
wheelleft = 8
wheelright = 25
if bumper == 1: # خوردم!
state = 2 # اول عقب…
timer = 5 # timer = 10 یعنی ۱ ثانیه
| نام | معنی | رده |
|---|---|---|
front, frontleft, frontright | فاصله به سانتیمتر؛ کوچکتر = نزدیکتر؛ بیشینه ۲۰۰ | همه |
bumper / bumperfront / bumperback | ۱ = تماس با دیوار، مبل، گربه، سگ یا حریف | همه |
color | رنگ کفِ جلو: white تمیزنشده، red/blue مال رباتها، green فرش بزرگ، purple فرش کوچک، black دیوار | U14، U19 |
heading | قطبنما، ۰ تا ۳۵۹ درجه | U14، U19 |
room, clean1..clean5 | شمارهی اتاق فعلی و درصد تمیزی هر اتاق | U14، U19 |
gps, imu, goto(x, y) | موقعیت، جهتگیری و حرکت به مختصات | U19 |
wheelleft, wheelright | خروجی: سرعت دو چرخ (تا اجرای بعدی میماند) | همه |
timer, state | حافظهی شما بین تیکها؛ برای مانورهای چندمرحلهای | همه |
RobotU14 / RobotU19 در بستهی smarthome_robot استفاده میکند (robot.left_motor = 8.0). API نهایی مسابقه را کمیته فنی با نسخهی شبیهساز رسمی اعلام میکند؛ کد را با همان نسخهی رسمی آزمایش کنید.همان «کد پایه»ای که داخل برنامه با دکمهی کد پایه دریافت میکنید؛ یک برنامهی کامل و قابل اجرا با توضیح فارسی و انگلیسی روی هر خط. در حالت مسابقه با «بارگذاری ربات (.py)» آن را بدهید و شروع کنید.
| فایل | رده | چه چیزی اضافه دارد |
|---|---|---|
base_fs.py | فرستاستپ | سه حسگر فاصله، سپر جلو/عقب، حرکتهای آسان (forward، backward، turnleft...) |
base_u14.py | U14 | حسگر رنگ، قطبنما، شمارهی اتاق و درصد تمیزی، movetime |
base_u19.py | U19 | GPS، goto(x, y)، باتری و ایستگاه شارژ |
بر پایهی «راهنمای برنامهنویسی دانشآموزی Smart Home، پیشنویس v0.2». هر جلسه حدود ۹۰ دقیقه با ریتم ثابت: گرمکردن، یک مفهوم، تمرین تیمی در برنامه، ارزیابی، تکلیف. جلسههای ۸ و ۹ برای U14 و U19 متفاوت است.
دانشآموز توضیح دهد مسابقه چطور برده میشود و اینکه برنامهاش در هر تیک (۱۰ بار در ثانیه) از نو اجرا میشود.
چه چیزی امتیاز میدهد؟ آیا تمیز کردن دوبارهی کاشی خودم امتیاز دارد؟ وقتی زمان تمام شود چه میشود؟
wheelleft و wheelright میگذارید تا تیک بعدی میماند.wheelleft = 25; wheelright = 25 # جلو
wheelleft = -25; wheelright = -25 # عقب
wheelleft = 18; wheelright = -18 # چرخش درجا
wheelleft = 25; wheelright = 8 # قوس به راست
timer).frontleft، front، frontright؛ عدد کوچکتر یعنی نزدیکتر.bumper == 1 یعنی تماس. سپر پشتیبان حسگر فاصله است، نه جایگزین آن.if timer > 0:
timer -= 1
wheelleft = -6; wheelright = -6 # عقب
elif bumper == 1:
timer = 5 # نیم ثانیه عقب
state و شمارندهی timer؛ هر فاز بازیابی بعد از تعداد مشخصی تیک تمام میشود تا ربات در گوشه گیر نکند.if timer > 0:
timer -= 1
if state == 2: # تکهی ۱: عقب
wheelleft = -25; wheelright = -25
if timer == 0:
state = 1; timer = 4
else: # تکهی ۲: چرخش
wheelleft = 18; wheelright = -18
elif bumper == 1 or front < 40:
state = 2; timer = 5
color رنگ کف جلوی ربات را میگوید: white کاشی تمیزنشده (برو بگیرش)، red/blue متعلق به رباتها، green فرش بزرگ (نصف سرعت، بیامتیاز)، purple فرش کوچک، black دیوار.room و clean1..clean5: «اگر در اتاق ۲ هستم و اتاق ۲ بیش از ۸۰٪ تمیز شده، برو اتاق بعدی».heading از ۰ تا ۳۵۹. حرکت «بچرخ تا درجهی مطلق»: آنقدر بچرخ تا heading برابر عدد هدف شود.gps موقعیت x, y, z در مختصات شبیهساز (نه کاشی)؛ imu roll, pitch, yaw. مبدأ و محورها را پیش از استفاده بررسی کنید.goto(x, y) مسیر گشت بین اتاقها بسازید و GPS/IMU را در طول مسیر ثبت کنید (چالش ۵).robot.py، README.md، tests/، notes.txt. Smart Home یک کنترلر تکرباتی است؛ ساختار ZIP چهاررباتی Chovgan را کپی نکنید.متن کامل را از بخش دانلود بگیرید. بندهایی که با «RELEASE GATE» علامت خوردهاند تا انتشار نسخهی رسمی شبیهساز توسط کمیته فنی قطعی نیستند.
نسخههای macOS و Linux و کد پایهی هر رده از داخل خود برنامه و کانال لیگ در دسترس است. بهروزترین نسخهی فایلها همیشه ابتدا در کانال کمیته فنی منتشر میشود.
خلاصهی همهفهم. جزئیات و اعداد دقیق در آموزش کامل داخل کد پایه (TUTORIAL-FA.md) است.
ربات یک جاروبرقی گرد با دو چرخ است. شما فقط سرعت چرخ چپ و راست را میدهید (از −۲۵ تا ۲۵؛ ۲۵ یعنی حدود یک متر بر ثانیه). برنامهی شما ۱۰ بار در ثانیه از بالا تا پایین اجرا میشود: اول حسگرها را میخوانید، بعد دو چرخ را تنظیم میکنید. همین.
همهی ردهها اینها را دارند:
frontleft، front، frontright) — تا مانعِ روبهرو چند سانتیمتر مانده؟ عدد کوچکتر = نزدیکتر، ۲۰۰ = چیزی نمیبیند.bumper، bumperfront، bumperback) — به چیزی خوردهام؟ از جلو یا از پشت؟color) — کفِ جلوی ربات چه رنگی است؟ سفید = کاشی آزاد، قرمز/آبی = مال رباتها، سبز = فرش بزرگِ کند، بنفش/نارنجی/فیروزهای = فرش نشانهی دمِ در، سیاه = دیوار.room، clean1 تا clean5) — الان در کدام اتاقم و هر اتاق چند درصد به رنگ من شده.mytiles، rivaltiles، timeleft).فرستاستپ (۸ تا ۱۱ سال) همینها را دارد و بس؛ خانه آرام است، گربه و سگ ندارد.
U14 بهعلاوهی قطبنما (heading، ۰ تا ۳۵۹ درجه: ۰ راست، ۹۰ بالا) — رو به کدام طرفم؟ و خانهی زنده با گربه و سگ که مانع متحرکاند.
U19 بهعلاوهی چهار چشمِ بغل و عقب، حسگر موقعیت (GPS) (x و y به سانتیمتر از گوشهی پایینچپ) با دستورهای goto، distto و angleto، و باتری (battery) با یک پد شارژ ثابت (dockx، docky). باتری صفر ربات را خاموش نمیکند، ولی با ۱۵٪ سرعت میخزد. روی کف چند لکهی آب هست که هر ورود ۱۰٪ باتری میگیرد.
از اینها چطور استفاده میکند؟ با سه چشم جلو قبل از دیوار میپیچد، با سپر از کنج فرار میکند، با حسگر رنگ دنبال کاشیهای سفید میرود و فرش سبز را دور میزند، با شمارهی اتاق اتاقِ تمامشده را ترک میکند؛ در U14 با قطبنما به جهت مشخص میرود و در U19 با GPS فاصله و زاویهی پد شارژ را با مثلث قائمالزاویه حساب میکند و بهموقع برمیگردد. همهی اینها با چند خط Python ساده نوشته میشود؛ کد پایه و آموزش مصور را از بخش دانلود بگیرید.
برای دریافت فایلها، اطلاعیهها و پرسیدن سؤال از کمیته فنی جوین شوید.