فهرست مطالب:

نحوه ساخت Robo-Bellhop: 3 مرحله
نحوه ساخت Robo-Bellhop: 3 مرحله

تصویری: نحوه ساخت Robo-Bellhop: 3 مرحله

تصویری: نحوه ساخت Robo-Bellhop: 3 مرحله
تصویری: نحوه ساخت LEGO brick mini 3 transformer mech MOC - Monster Slayer 2024, نوامبر
Anonim

بیشتر توسط نویسنده دنبال کنید:

نحوه شرکت در مسابقه کوچک iRobot Create Scholarship
نحوه شرکت در مسابقه کوچک iRobot Create Scholarship
نحوه شرکت در مسابقه کوچک iRobot Create Scholarship
نحوه شرکت در مسابقه کوچک iRobot Create Scholarship
چگونه می توان LOLCats ، گربه های میم ، ماکروهای گربه یا عکس های گربه را با عنوان های خنده دار تهیه کرد
چگونه می توان LOLCats ، گربه های میم ، ماکروهای گربه یا عکس های گربه را با عنوان های خنده دار تهیه کرد
چگونه می توان LOLCats ، گربه های میم ، ماکروهای گربه یا عکس های گربه را با عنوان های خنده دار تهیه کرد
چگونه می توان LOLCats ، گربه های میم ، ماکروهای گربه یا عکس های گربه را با عنوان های خنده دار تهیه کرد

درباره: من دوست دارم چیزها را از هم جدا کنم و نحوه عملکرد آنها را بفهمم. عموماً بعد از آن علاقه ام را از دست می دهم. اطلاعات بیشتر درباره جفریف »

این دستورالعمل نحوه استفاده از iRobot Create را برای ایجاد یک bellhop متحرک نشان می دهد. این به طور کامل با اجازه دستورالعمل های carolDancer برداشته شد و من آن را به عنوان نمونه ای برای مسابقه خود قرار دادم. Robo-BellHop می تواند دستیار شخصی شما برای حمل کیف ، مواد غذایی ، لباسشویی و غیره باشد ، بنابراین شما ندارید به. Creat Basic دارای سطلی است که به قسمت بالا متصل شده است و از دو آشکارساز IR داخلی استفاده می کند تا از فرستنده IR صاحب خود پیروی کند. با کد نرم افزاری C بسیار ساده ، کاربر می تواند مواد غذایی سنگین ، مقدار زیادی لباس های شسته شده یا کیف یک شبه شما را در Robo -BellHop ایمن کند و از ربات بخواهد شما را در خیابان ، از مرکز خرید ، پایین سالن یا فرودگاه دنبال کند - - هر کجا که کاربر نیاز دارد برود. عملیات اصلی 1) دکمه Reset را فشار دهید تا ماژول فرمان روشن شود و حسگرها فعال هستند 1a) وقتی پخش کننده IR را می بیند چراغ پخش باید روشن شود 1b) LED پیشرفته باید روشن شود ربات در فاصله بسیار نزدیک است 2) دکمه نرم سیاه را فشار دهید تا روتین Robo-BellHop اجرا شود 3) فرستنده IR را به مچ پای خود وصل کرده و مطمئن شوید که روشن است. سپس سبد را بارگیری کرده و بروید! 4) منطق Robo-BellHop به شرح زیر است: 4a) هنگام راه رفتن ، اگر سیگنال IR تشخیص داده شود ، ربات با حداکثر سرعت حرکت می کند 4b) اگر سیگنال IR خارج شود برد (با زاویه بسیار زیاد یا بسیار تیز) ، در صورت دریافت مجدد سیگنال ، مسافت کوتاهی را با سرعت کم طی می کند 4c) اگر سیگنال IR تشخیص داده نشود ، ربات در یک چپ و راست می چرخد 4d) اگر سیگنال IR تشخیص داده شود اما روبات به مانعی برخورد کند ، ربات سعی می کند در اطراف مانع حرکت کند 4e) اگر ربات به سیگنال IR بسیار نزدیک شود ، ربات متوقف می شود تا از برخورد با آن جلوگیری کند. مچ پا مالک Hardware1 واحد دیوار مجازی iRobot - 301 دلار آشکارساز IR از RadioShack - 31 دلار اتصال DB -9 مردانه از Radio Shack - 44 دلار 6-32 دلار از Home Depot - 2.502 دلار باتری 3 ولت ، من از سبد لباسشویی D1 از Target استفاده کردم - 51 دلار چرخ اضافی به داخل پشت نوار ایجاد ربات ، سیم و لحیم

مرحله 1: پوشش سنسور IR

نوار برقی را بچسبانید تا همه شکاف سنسور IR را در جلوی ربات ایجاد کنید ، به جز یک شکاف کوچک. واحد دیوار مجازی را برچیده و برد مدار کوچک جلوی دستگاه را بیرون بیاورید. این کمی مشکل است زیرا پیچ های پنهان و پایه های پلاستیکی زیادی وجود دارد. فرستنده IR روی برد مدار است. برای جلوگیری از بازتاب IR ، فرستنده IR را با یک تکه کاغذ بافت بپوشانید. صفحه مدار را به یک بند یا نوار الاستیک وصل کنید که بتواند دور مچ پای شما بپیچد. باتری ها را به برد مدار وصل کنید تا بتوانید باتری ها را در مکانی راحت قرار دهید (من آن را طوری ساخته ام که بتوانم باتری ها را در جیبم بگذارم).

آشکارساز IR دوم را به اتصال DB-9 وصل کرده و در پین 3 (سیگنال) و پین 5 (زمین) وارد Cargo Bay ePort کنید. آشکارساز IR دوم را در بالای سنسور IR موجود در Create وصل کنید و روی آن را با چند لایه کاغذ دستمال کاغذی بپوشانید تا آشکارساز IR دوم در فاصله ای که می خواهید ربات Create متوقف شود آن را نبیند. از ضربه زدن به تو می توانید بعد از ضربه زدن به دکمه Reset این مورد را آزمایش کنید و در حالت ایستادن LED را مشاهده کنید تا روشن شود.

مرحله 2: سبد را وصل کنید

سبد را با استفاده از پیچ های 6 تا 32 وصل کنید. من فقط سبد را در بالای ربات Create نصب کردم. همچنین در چرخ عقب بکشید تا وزن را در پشت ربات Create قرار دهید.

نکات: - ربات می تواند مقدار زیادی بار ، حداقل 30 پوند را حمل کند. - به نظر می رسید اندازه کوچک سخت ترین قسمت برای حمل هرگونه چمدان باشد - IR بسیار خلق و خوی است. شاید استفاده از تصویربرداری بهتر باشد اما بسیار گرانتر است

مرحله 3: کد منبع را بارگیری کنید

کد منبع را بارگیری کنید
کد منبع را بارگیری کنید

کد منبع در زیر آمده و در یک فایل متنی ضمیمه شده است:

/********************************************** ******************** follow.c ** -------- ** بر روی Create Command Module ** اجرا می شود ** همه موارد را به جز کوچک در جلو پوشش می دهد سنسور IR ** ایجاد یک دیوار مجازی (یا هر IR ارسال کننده ** سیگنال میدان نیرو) را دنبال می کند و امیدوارم از موانع موجود در این فرآیند جلوگیری شود ****************** ************************************************** **/#include interrupt.h> #include io.h>#include#include "oi.h"#تعریف TRUE 1#define FALSE 0#define FullSpeed 0x7FFF#define SlowSpeed 0x0100#define SearchSpeed 0x0100#define ExtraAngle 10#تعریف SearchLeftAngle 125#تعریف SearchRightAngle (SearchLeftAngle - 1000)#تعریف ساحل 150#تعریف TraceDistance 250#تعریف TraceAngle 30#تعریف BackDistance 25#تعریف IRDetected (~ PINB & 0x01) // ایالات#تعریف آماده 0#تعریف زیر 1#تعریف WasFollowing 2 #تعریف جستجو در چپ 3#تعریف SearchingRight 4#تعریف TracingLeft 5#تعریف TracingRight 6#تعریف BackingTraceLeft 7#تعریف BackingTraceRight 8 // متغیرهای جهانی olatile uint16_t timer_cnt = 0 ؛ uint8_t timer_on = 0 ؛ سنسورهای فرار uint8_t = flagile = 0 ؛ uint8_t sensors_index = 0 ؛ uint8_t فرار سنسورها_ در [Sen6Size] ؛ فرار uint8_t سنسورها [فاصله = 0 = 16؛ volatile uint8_t inRange = 0؛ // Functionsvoid byteTx (مقدار uint8_t) ؛ void delayMs (uint16_t time_ms) ؛ void delayAndCheckIR (uint16_t time_ms) ؛ void delayAndUpdateSensors (unsigned int time_ms) ؛ void اولیه (void) void void (void) void؛ بار 0؛ // راه اندازی ایجاد و moduleinitialize ()؛ LEDBothOff؛ powerOnRobot ()؛ byteTx (CmdStart)؛ baud (Baud28800)؛ byteTx (CmdControl)؛ byteTx (CmdFull)؛ // تنظیم i/o برای سنسور دوم IRDDDRB & = x 0x01 ؛ // پین 3 باربری ePort را بارگذاری کنید PORTB | = 0x01؛ // set cargo ePort pin3 pullup enabled // program loop while (TRUE) {// فقط به عنوان یک احتیاط درایو (0 ، RadStraight) توقف کنید ؛ // تنظیم LEDsbyteTx (CmdLeds) ؛ byteTx ((((سنسورها [SenVWall])؟ LEDPlay: 0x00) | (inRange؟ LEDAdvance: 0x00))؛ byteTx (سنسورها [SenCharge1])؛ byteTx (64) ؛ IRDetected؟ LED2On: LED2Off؛ inRange؟ LED1On: LED1Off؛ // به دنبال دکمه کاربر ، بررسی oftendelayAndUpdateSensor (10) ؛ (10)؛ if (UserButtonPressed) {delayAndUpdateSensors (1000)؛ // فعال loop while (! (UserButtonPressed) && (! سنسورها [SenCliffL]) && (! سنسورها [SenCliffFL]) && (! سنسورها [SenCliffFR]) && (! سنسورها [SenCliffR])) {byteTx (CmdLeds) ؛ byteTx (((سنسورها [SenVWall])؟ LEDPlay: 0x00) | (inRange؟ LEDAdvance: 0x00))؛ byteTx (سنسورها [SenCharge1]) ؛ byteTx (255) ؛ IRDetected ؟ LED2On: LED2Off؛ inRange؟ LED1On: LED1Off؛ سوئیچ (حالت) {case Ready: if (سنسورها [SenVWall]) {// بررسی نزدیکی به Leaderif (inRange) {درایو (0 ، RadStraight) ؛} دیگری {// drive straightdrive (SlowSpeed، RadStraight)؛ state = Following؛}} else {// جستجو برای beamangle = 0؛ distance = 0؛ wait_counter = 0؛ found = FALSE؛ درایو (SearchSpeed، RadCCW)؛ state = SearchingLeft؛} break؛ case follow: if (sensors [SenBumpDrop] & BumpRight) {distance = 0؛ angle = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceLeft؛} else if (سنسورها [SenBumpDrop] & BumpLeft) {distance = 0؛ angle = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceRight؛} else if (سنسورها [SenVWall]) {// بررسی کنید مجاورت با leaderif (inRange) {درایو (0 ، RadStraight) ؛ state = Ready ؛} else {// drive straightdrive (FullSpeed، RadStraight) ؛ state = Following؛}} else {// فقط سیگنال را از دست داد ، یکی را به آرامی ادامه دهید cycledistance = 0؛ درایو (SlowSpeed، RadStraight)؛ state = WasFollowing؛} break؛ case WasFollowing: if (sensors [SenBumpDrop] & BumpRight) {distance = 0؛ angle = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceLeft ؛} else if (سنسورها [SenBumpDrop] & BumpLeft) {distance = 0؛ angle = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceRight؛} else if (سنسورها [SenVWall]) {// بررسی نزدیکی به Leaderif (inRange) {درایو (0 ، RadStraight) ؛ state = R eady؛} else {// drive straightdrive (FullSpeed، RadStraight)؛ state = Following؛}} else if (distance> = CoastDistance) {drive (0، RadStraight)؛ state = Ready؛} else {drive (SlowSpeed، RadStraight) ؛} break؛ case SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed، RadStraight)؛ state = Following؛} else {drive (SearchSpeed، RadCCW)؛}} else if (سنسورها [SenVWall]) {found = TRUE؛ angle = 0؛ if (inRange) {drive (0، RadStraight)؛ state = Ready؛} else {drive (SearchSpeed، RadCCW)؛}} else if (angle> = SearchLeftAngle) {درایو (SearchSpeed ، RadCW)؛ wait_counter = 0؛ state = SearchingRight؛} else {drive (SearchSpeed، RadCCW)؛} break؛ case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed، RadStraight)؛ state = دنبال؛} else {drive (SearchSpeed، RadCW)؛}} if if (سنسورها [SenVWall]) {found = TRUE؛ angle = 0؛ if (inRange) {drive (0، RadStraight)؛ state = Ready؛} else {drive (SearchSpeed، RadCCW)؛}} else if (wait_counter> 0) {wait_counter -= 20؛ drive (0، RadStraight)؛} else if (angle = Search RightAngle) {drive (0، RadStraight)؛ wait_counter = 5000؛ angle = 0؛} else {drive (SearchSpeed، RadCW)؛} break؛ case TracingLeft: if (سنسورها [SenBumpDrop] & BumpRight) {distance = 0؛ angle = 0؛ درایو (-SlowSpeed، RadStraight)؛ state = BackingTraceLeft؛} در غیر این صورت (سنسورها [SenBumpDrop] & BumpLeft) {درایو (0، RadStraight)؛ state = Ready؛} در غیر این صورت (حسگرها [SenVWall]) {// بررسی برای مجاورت با Leaderif (inRange) {درایو (0 ، RadStraight) ؛ state = Ready ؛} else {// drive straightdrive (SlowSpeed، RadStraight)؛ state = Following؛}} دیگری if (! (distance> = TraceDistance)) { درایو (SlowSpeed، RadStraight)؛} در غیر این صورت (! (-angle> = TraceAngle)) {drive (SearchSpeed، RadCW)؛} else {distance = 0؛ angle = 0؛ drive (SlowSpeed، RadStraight)؛ state = Ready؛ } break؛ case TracingRight: if (سنسورها [SenBumpDrop] & BumpRight) {drive (0، RadStraight)؛ state = Ready؛} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0؛ angle = 0؛ drive (- SlowSpeed، RadStraight)؛ state = BackingTraceRight؛} در غیر این صورت (سنسورها [SenVWall]) {// بررسی نزدیکی به Leaderif (inRang ه) {drive (0، RadStraight)؛ state = Ready؛} else {// drive straightdrive (SlowSpeed، RadStraight)؛ state = Following؛}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed، RadStraight)؛} else if (! (angle> = TraceAngle)) {drive (SearchSpeed، RadCCW)؛} else {distance = 0؛ angle = 0؛ drive (SlowSpeed، RadStraight)؛ state = Ready؛} break؛ case BackingTraceLeft: if (سنسورها [SenVWall] && inRange) {درایو (0 ، RadStraight) ؛ state = Ready ؛} دیگری if (angle> = TraceAngle) {distance = 0؛ angle = 0؛ drive (SlowSpeed، RadStraight)؛ state = TracingLeft ؛ } else if (-distance> = BackDistance) {drive (SearchSpeed، RadCCW)؛} else {drive (-SlowSpeed، RadStraight)؛} break؛ case BackingTraceRight: if (سنسورها [SenVWall] && inRange) {درایو (0 ، RadStraight)؛ state = Ready؛} else if (-angle> = TraceAngle) {distance = 0؛ angle = 0؛ drive (SlowSpeed، RadStraight)؛ state = TracingRight؛} else if (-distance> = BackDistance) {drive (SearchSpeed ، RadCW)؛} else {drive (-SlowSpeed، RadStraight)؛} break؛ default: // stopdrive (0، RadStraight)؛ state = Re ady؛ break؛} delayAndCheckIR (10)؛ delayAndUpdateSensors (10)؛} // صخره یا دکمه کاربر تشخیص داده می شود ، اجازه می دهد وضعیت تثبیت شود (به عنوان مثال ، دکمه آزاد می شود) درایو (0 ، RadStraight) ؛ delayAndUpdateSensors (2000) ؛}}} // وقفه دریافت سریال برای ذخیره مقادیر سنسور تاخیرهای زمانی در msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-؛ elsetimer_on = 0؛} // انتقال یک بایت از طریق بایت تیکس portvoid سریال (مقدار uint8_t) {در حالی که (! (UCSR0A & _BV) (UDRE0) UDR0 = ارزش ؛} // تاخیر در زمان مشخص در میلی ثانیه بدون به روزرسانی مقادیر سنسور اجتناب از تاخیرMs (uint16_t time_ms) {timer_on = 1؛ timer_cnt = time_ms؛ while (timer_on)؛} // تأخیر برای زمان مشخص شده در میلی ثانیه و ثانیه را بررسی کنید آشکارساز IR از تاخیر اجتناب می کند AndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0؛ inRange = 0؛ timer_on = 1؛ timer_cnt = time_ms؛ while (timer_on) {if (! (timer_val == timer_cnt)) {inRange + = IRDetected؛ timer_val = timer_cnt؛}} inRange = (inRange> = (time_ms >> 1))؛} // تأخیر برای زمان مشخص شده در ms و به روز رسانی مقادیر سنسور void delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp؛ timer_on = 1؛ timer_cnt = time_ms ؛ در حالی که (timer_on) {if (! sensors_flag) {برای (temp = 0؛ temp Sen6Size؛ temp ++) سنسورها [temp] = sensors_in [temp] ؛ // به روز رسانی کل فاصله و زاویه مسافت += (int) ((حسگرها [SenDist1] 8) | حسگرها [SenDist0]) ؛ زاویه += (int) ((حسگرها [SenAng1] 8) | سنسورها [SenAng0]) ؛ byteTx (CmdSensors) ؛ byteTx (6) ؛ sensors_index = 0 ؛ sensors_flag = 1؛}}} // اولیه سازی کنترل ذهن و راه اندازی اولیه میکروکنترلر ATmega168 (باطل) {cli ()؛ // پین های ورودی/خروجی را تنظیم کنید DDRB = 0x10 ؛ PORTB = 0xCF ؛ DDRC = 0x00 ؛ PORTC = 0xFF ؛ DDRD = 0xE6 ؛ PORTD = 0x7D ؛ // تایمر 1 را تنظیم کنید تا هر 1 msTCCR1A = 0x00 ؛ TCCR1B = (_BV (WGM12) | _BV (CS12)) ؛ OCR1A = 71 ؛ TIMSK1 = _BV (OCIE1A) ؛ // تنظیم پورت سریال با وقفه rxUBRR0 = 19؛ UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0 () ! RobotIsOn) {RobotPwrToggleLow ؛ delayMs (500) ؛ // تأخیر در این stateRobotPwrToggleHigh؛ // انتقال کم به زیاد به ضامن powerdelayMs (100) ؛ // تأخیر در این وضعیتRobotPwrToggleLow؛} delayMs (3500) ؛ // تأخیر در راه اندازی}} // تغییر نرخ baud در هر دو حالت ایجاد و modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud)؛ UCSR0A | = _BV (TXC0) ؛ byteTx (baud_code) ؛/ / منتظر بمانید تا انتقال کامل شود (! (UCSR0A & _BV (TXC0))) ؛ cli () ؛ // رجیستر نرخ baud را تغییر دهید (baud_code == Baud115200) UBRR0 = Ubrr115200 ؛ در غیر اینصورت اگر (baud_code == Baud57600) UBR5000 = Ubrr7 ؛ else if (baud_code == Baud38400) UBRR0 = Ubrr38400 ؛ در غیر این صورت (baud_code == Baud28800) UBRR0 = Ubrr28800 ؛ در غیر این صورت اگر (baud_code == Baud19200) UBRR0 = Ubrr19200 ؛ در غیر این صورت (baud_code = Ubrr1400 = Ubr1400 = = if (baud_code == Baud9600) UBRR0 = Ubrr9600 ؛ در غیر این صورت (baud_code == Baud4800) UBRR0 = Ubrr4800 ؛ در غیر این صورت اگر (baud_code == Baud2400) UBRR0 = Ubrr2400 ؛ در غیر این صورت (baud_code == Baud1200) else baud_code == Baud600) UBRR0 = Ubrr600 ؛ در غیر این صورت (baud_code == Baud300) UBRR0 = Ubrr300؛ sei ()؛ delayMs (100)؛}} // ارسال دستورات ایجاد درایو از نظر سرعت و درایو radiusvoid (int16_t سرعت ، int16_t radius) {byteTx (CmdDrive) ؛ byteTx ((uint 8_t) ((سرعت >> 8) & 0x00FF))؛ byteTx ((uint8_t) (سرعت & 0x00FF))؛ byteTx ((uint8_t) ((شعاع >> 8) & 0x00FF))؛ byteTx ((uint8_t) (شعاع & 0x00FF))؛}

توصیه شده: