جدول المحتويات:
فيديو: كيف تصنع Robo-Bellhop: 3 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:41
بقلم جيفريف
حول: أحب تفكيك الأشياء ومعرفة كيفية عملها. عموما أفقد الاهتمام بعد ذلك. المزيد عن جيفريف »
يوضح هذا Instructable كيفية استخدام iRobot Create لعمل متجر متحرك. تم رفع هذا تمامًا بإذن من تعليمات carolDancer ، وقمت بطرحه كنموذج إدخال لمسابقتنا. يمكن أن يكون Robo-BellHop مساعدك الشخصي لحمل حقائبك ، ومحلات البقالة ، وغسيل الملابس ، وما إلى ذلك ، لذلك ليس لديك إلى. يحتوي Create الأساسي على حاوية متصلة بالأعلى ويستخدم كاشفان للأشعة تحت الحمراء على متن الطائرة لتتبع جهاز إرسال الأشعة تحت الحمراء الخاص بمالكه. باستخدام رمز برنامج C الأساسي للغاية ، يمكن للمستخدم تأمين البقالة الثقيلة ، أو حمولة كبيرة من الغسيل ، أو حقيبتك الليلية على Robo-BellHop وجعل الروبوت يتبعك في الشارع ، عبر المركز التجاري ، أو أسفل القاعة أو عبر المطار - - أينما يحتاج المستخدم إلى الذهاب. العملية الأساسية 1) اضغط على زر إعادة الضبط لتشغيل وحدة الأوامر وتحقق من تشغيل المستشعرات الروبوت على مسافة قريبة جدًا 2) اضغط على الزر الأسود الناعم لتشغيل Robo-BellHop روتيني 3) قم بتوصيل جهاز إرسال الأشعة تحت الحمراء في الكاحل وتأكد من تشغيله. ثم قم بتحميل السلة وانطلق! 4) منطق Robo-BellHop هو كما يلي: 4 أ) أثناء تجولك ، إذا تم اكتشاف إشارة الأشعة تحت الحمراء ، فسوف يقود الروبوت بأقصى سرعة 4 ب) إذا خرجت إشارة الأشعة تحت الحمراء من النطاق (من خلال كونه بعيدًا جدًا أو حادًا جدًا بزاوية) ، سوف يجتاز الروبوت مسافة قصيرة بسرعة بطيئة في حالة التقاط الإشارة مرة أخرى. 4 د) إذا تم الكشف عن إشارة الأشعة تحت الحمراء ولكن الروبوت اصطدم بعقبة ، فسيحاول الروبوت القيادة حول العائق 4 هـ) إذا اقترب الروبوت بشدة من إشارة الأشعة تحت الحمراء ، فسيتوقف الروبوت لتجنب الاصطدام بالعقبة. كاحل المالك 1 وحدة حائط افتراضية iRobot - كاشف الأشعة تحت الحمراء 301 دولارًا من RadioShack - موصل ذكر DB-9 بقيمة 31 دولارًا من Radio Shack - 44 دولارًا براغي 6-32 من Home Depot - 2.502 دولارًا بطاريات 3 فولت ، استخدمت سلة غسيل D1 من الهدف - عجلة إضافية بقيمة 51 دولارًا إلى داخل الجزء الخلفي من إنشاء شريط كهربائي وسلك ولحام
الخطوة 1: تغطية مستشعر الأشعة تحت الحمراء
قم بتوصيل شريط كهربائي لتغطية الكل باستثناء فتحة صغيرة من مستشعر الأشعة تحت الحمراء في الجزء الأمامي من روبوت الإنشاء. تفكيك وحدة الحائط الافتراضية واستخراج لوحة الدوائر الصغيرة في مقدمة الوحدة. هذا صعب بعض الشيء لأن هناك الكثير من البراغي المخفية وحوامل البلاستيك. مرسل IR موجود على لوحة الدائرة. قم بتغطية جهاز إرسال الأشعة تحت الحمراء بقطعة من المناديل الورقية لتجنب انعكاسات الأشعة تحت الحمراء. قم بتوصيل لوحة الدائرة بحزام أو شريط مطاطي يمكن أن يلتف حول كاحلك. قم بتوصيل البطاريات بلوحة الدائرة بحيث يمكنك وضع البطاريات في مكان مريح (لقد صنعتها حتى أتمكن من وضع البطاريات في جيبي).
قم بتوصيل كاشف الأشعة تحت الحمراء الثاني بموصل DB-9 وأدخله في منفذ منفذ الشحن Cargo Bay ePort رقم 3 (إشارة) والدبوس 5 (أرضي). قم بتوصيل كاشف الأشعة تحت الحمراء الثاني بأعلى مستشعر الأشعة تحت الحمراء الموجود في إنشاء وقم بتغطيته بطبقتين من المناديل الورقية حتى لا يرى كاشف الأشعة تحت الحمراء الثاني الباعث على مسافة تريد أن يتوقف روبوت الإنشاء عن الاحتفاظ بها من ضربك. يمكنك اختبار هذا بعد الضغط على زر إعادة الضبط ومشاهدة Advance LED للاستمرار عندما تكون على مسافة التوقف.
الخطوة 2: إرفاق السلة
اربط السلة باستخدام البراغي 6-32. لقد قمت للتو بتثبيت السلة في الجزء العلوي من Create robot. قم أيضًا بالانزلاق في العجلة الخلفية بحيث تضع وزنك على الجزء الخلفي من Create robot.
ملاحظات: - يمكن للروبوت أن يحمل قدرًا كبيرًا من الحمولة ، على الأقل 30 رطلاً. - يبدو أن الحجم الصغير هو الجزء الأصعب في حملها على حمل أي أمتعة - فالأشعة تحت الحمراء مزاجية للغاية. ربما يكون استخدام التصوير أفضل ولكنه أغلى بكثير
الخطوة 3: قم بتنزيل شفرة المصدر
يتبع رمز المصدر ، ويتم إرفاقه في ملف نصي:
/ *************************************************** ******************** follow.c ** -------- ** يعمل على Create Command Module ** يغطي جميع الفتحات ما عدا الفتحات الصغيرة في المقدمة من مستشعر الأشعة تحت الحمراء ** سيتبع الإنشاء جدارًا افتراضيًا (أو أي IR يرسل ** إشارة مجال القوة) ونأمل أن يتجنب العقبات في العملية ***************** **************************************************** ** / # include interrupt. ابحث #define SearchingLeft 3 # حدد SearchingRight 4 # حدد TracingLeft 5 # حدد TracingRight 6 # حدد BackingTraceLeft 7 # حدد BackingTraceRight 8 // Global variablesv olatile uint16_t timer_cnt = 0 ؛ uint8_t timer_on = 0 ؛ متغير uint8_t sensors_flag = 0 ؛ uint8_t sensors_index = 0 ؛ uint8_t sensors_in [Sen6Size] ؛ مستشعرات uint8_t المتطايرة [Sen6Size] ؛ زاوية متقلبة int16_t int16 = 0 ؛ متقلب uint8_t inRange = 0 ؛ // Functionsvoid byteTx (uint8_t value) ؛ void delayMs (uint16_t time_ms) ؛ void delayAndCheckIR (uint16_t time_ms) ؛ باطل delayAndUpdateSensors (غير موقعة int time_ms) ؛ تهيئة باطل (باطل) ؛ باطل باطل باود (uint8_t baud_code) ؛ محرك باطل (سرعة int16_t ، int16_t radius) ؛ uint16_t randomAngle (باطل) ؛ تحديد الأغاني باطل (باطل) ؛ int main (void) {// state variableuint8_t state = جاهز ؛ تم العثور عليها = 0 ؛ int wait_counter = 0؛ // إعداد الإنشاء والوحدة النمطية ()؛ LEDBothOff؛ powerOnRobot ()؛ byteTx (CmdStart)؛ الباود (Baud28800)؛ byteTx (CmdControl)؛ byteTx (CmdFull)؛ // تعيين i / o لمستشعر الأشعة تحت الحمراء الثاني DDRB & = ~ 0x01 ؛ // قم بتعيين منفذ ePort لخليج البضائع 3 ليكون مدخلات منفذ | = 0x01 ؛ // set cargo ePort pin3 pullup enabled // program loop while (TRUE) {// Stop just as a precautiondrive (0، RadStraight)؛ // set LEDsbyteTx (CmdLeds)؛ byteTx (((المستشعرات [SenVWall])؟ LEDPlay: 0x00) | (inRange؟ LEDAdvance: 0x00)) ؛ byteTx (المستشعرات [SenCharge1]) ؛ byteTx (64) ؛ IRDetected؟ LED2On: LED2Off ؛ inRange؟ LED1On: LED1Off ؛ // البحث عن زر المستخدم ، التحقق من انتهاء التأخير والتحقق من المستشعرات (10) ؛ (10) ؛ إذا (UserButtonPressed) { أجهزة الاستشعار [SenCliffR])) {byteTx (CmdLeds) ؛ byteTx (((المستشعرات [SenVWall])؟ LEDPlay: 0x00) | (inRange؟ LEDAdvance: 0x00)) ؛ byteTx (المستشعرات [SenCharge1]) ؛ byteTx (255) ؛ تم اكتشاف IR ؟ LED2On: LED2Off؛ inRange؟ LED1On: LED1Off؛ switch (state) {case Ready: if (sensors [SenVWall]) {// check for قرب of leaderif (inRange) {drive (0، RadStraight)؛} else {// محرك أقراص مستقيمة (SlowSpeed ، RadStraight) ؛ state = متابعة ؛}} else {// ابحث عن إطار الشعاع = 0 ؛ مسافة = 0 ؛ wait_counter = 0؛ found = FALSE؛ drive (SearchSpeed، RadCCW)؛ state = SearchingLeft؛} كسر؛ الحالة التالية: if (المستشعرات [SenBumpDrop] & BumpRight) {مسافة = 0 ؛ زاوية = 0 ؛ محرك (-SlowSpeed ، RadStraight) ؛ state = BackingTraceLeft؛} else if (المستشعرات [SenBumpDrop] & BumpLeft) {Distance = 0؛ angle = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceRight؛} وإلا إذا (المستشعرات [SenVWall]) {// تحقق من القرب من Leaderif (inRange) {drive (0، RadStraight)؛ state = Ready؛} else {// drive straightdrive (FullSpeed، RadStraight)؛ state = Follow؛}} وإلا {// فقد الإشارة ، واصل السير ببطء واحد cycledistance = 0؛ drive (SlowSpeed، RadStraight)؛ state = WasFollowing؛} break؛ case WasFollowing: if (المستشعرات [SenBumpDrop] & BumpRight) {مسافة = 0؛ زاوية = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceLeft ؛} else if (المستشعرات [SenBumpDrop] & BumpLeft) {Distance = 0؛ angle = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceRight؛} وإلا إذا (المستشعرات [SenVWall]) {// تحقق من القرب من القائد (inRange) {drive (0، RadStraight)؛ state = R. eady؛} else {// drive straightdrive (FullSpeed، RadStraight)؛ state = Follow؛}} 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 = Follow؛} 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) {drive (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)؛}} else 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) {مسافة = 0 ؛ زاوية = 0؛ drive (-SlowSpeed، RadStraight)؛ state = BackingTraceLeft؛} وإلا إذا (المستشعرات [SenBumpDrop] & BumpLeft) {drive (0، RadStraight)؛ state = Ready؛} وإلا إذا (المستشعرات [SenVWall]) {// تحقق للقرب من الزعيم (inRange) {drive (0، RadStraight)؛ state = Ready؛} else {// drive Straightdrive (SlowSpeed، RadStraight)؛ state = Follow؛}} else if (! (Distance> = TraceDistance)) { drive (SlowSpeed، RadStraight)؛} وإلا إذا (! (- angle> = TraceAngle)) {drive (SearchSpeed، RadCW)؛} آخر {مسافة = 0؛ زاوية = 0؛ محرك (SlowSpeed، RadStraight)؛ state = جاهز؛ } break؛ case TracingRight: if (المستشعرات [SenBumpDrop] & BumpRight) {drive (0، RadStraight)؛ state = Ready؛} else if (المستشعرات [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 = Follow؛}} else if (! (Distance> = TraceDistance)) {drive (SlowSpeed، RadStraight))؛} else if (! (angle> = TraceAngle)) {drive (SearchSpeed، RadCCW)؛} آخر {مسافة = 0؛ زاوية = 0؛ محرك (SlowSpeed، RadStraight)؛ state = Ready؛} break؛ case BackingTraceLeft: إذا (المستشعرات [SenVWall] && inRange) {drive (0، RadStraight)؛ state = Ready؛} else 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) {drive (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)؛} فاصل؛ افتراضي: // stopdrive (0، RadStraight)؛ state = Re ady؛ break؛} delayAndCheckIR (10)؛ // مقاطعة استلام المسلسل لتخزين قيم المستشعر SIGNAL (SIG_USART_RECV) {uint8_t temp؛ temp = UDR0؛ if (sensors_flag) {sensors_in [sensors_index ++] = temp؛ if (sensors_index> = Sen6Size) sensors_flag = 0؛}} // Timer 1 interrupt إلى تأخير الوقت في msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt - ؛ elsetimer_on = 0 ؛} // إرسال بايت عبر المنفذ التسلسلي byteTx (قيمة uint8_t) {while (! (UCSR0A & _BV (UDRE0))) ؛ UDR0 = value؛} // تأخير للوقت المحدد بالمللي ثانية دون تحديث قيم المستشعرتفادي تأخير Ms (uint16_t time_ms) {timer_on = 1؛ timer_cnt = time_ms؛ while (timer_on)؛} // تأخير للوقت المحدد بالمللي ثانية والتحقق من الثانية كاشف الأشعة تحت الحمراء void delayAndCheckIR (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))؛} // تأخير للوقت المحدد بالمللي ثانية وتحديث قيم المستشعراتتجنب delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp؛ timer_on = 1 ؛ timer_cnt = time_ms ؛ while (timer_on) {if (! sensors_flag) {for (temp = 0؛ درجة الحرارة Sen6Size ؛ temp ++) المستشعرات [temp] = sensors_in [temp] ؛ // تحديث مجاميع التشغيل للمسافة والزاوية + = (int) ((المستشعرات [SenDist1] 8) | المستشعرات [SenDist0]) ؛ الزاوية + = (int) ((المستشعرات [SenAng1] 8) | المستشعرات [SenAng0])؛ byteTx (CmdSensors)؛ byteTx (6)؛ sensors_index = 0؛ sensors_flag = 1؛}} // تهيئة Mind Control & aposs ATmega168 microcontrollervoid (void) {cli () ؛ // تعيين دبابيس I / ODDRB = 0x10 ؛ PORTB = 0xCF ؛ DDRC = 0x00 ؛ PORTC = 0xFF ؛ DDRD = 0xE6 ؛ PORTD = 0x7D ؛ // إعداد المؤقت 1 لإنشاء مقاطعة كل 1 مللي ثانية TCCR1A = 0x00 ؛ TCCR1B = (_BV (WGM12) | _BV (CS12)) ؛ OCR1A = 71 ؛ TIMSK1 = _BV (OCIE1A) ؛ // إعداد المنفذ التسلسلي مع rx interruptUBRR0 = 19 ؛ UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0) (! RobotIsOn) {RobotPwrToggleLow؛ delayMs (500) ؛ // تأخير في هذه الحالة RobotPwrToggleHigh ؛ // الانتقال المنخفض إلى العالي لتبديل powerdelayMs (100) ؛ // تأخير في هذه الحالة RobotPwrToggleLow؛} delayMs (3500) ؛ // Delay for startup}} // تبديل معدل البث بالباود على كل من Create و modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud)؛ UCSR0A | = _BV (TXC0)؛ byteTx (baud_code)؛ / / انتظر حتى يكتمل الإرسال ، بينما (! (UCSR0A & _BV (TXC0))) ؛ cli () ؛ // تبديل سجل معدل البث بالباود (baud_code == Baud115200) UBRR0 = Ubrr115200 ؛ وإلا إذا (baud_code == Baud57600) UBRR0 = Ubrr57600 ؛ وإلا إذا (baud_code == Baud38400) UBRR0 = Ubrr38400 ؛ وإلا إذا (baud_code == Baud28800) UBRR0 = Ubrr28800 ؛ وإلا إذا (baud_code == Baud19200) UBRR0 = Ubrr19200 ؛ وإلا إذا (baud_code == Baud014400) UR400 إذا (baud_code == Baud9600) UBRR0 = Ubrr9600 ؛ وإلا إذا (baud_code == Baud4800) UBRR0 = Ubrr4800 ؛ وإلا إذا (baud_code == Baud2400) UBRR0 = Ubrr2400 ؛ وإلا إذا (baud_code == Baud1200) UBRR0 ؛ baud_code == Baud600) UBRR0 = Ubrr600 ؛ وإلا إذا (baud_code == Baud300) UBRR0 = Ubrr300؛ sei ()؛ نصف القطر) {byteTx (CmdDrive) ؛ byteTx ((uint 8_t) ((السرعة >> 8) & 0x00FF)) ؛ byteTx ((uint8_t) (السرعة & 0x00FF)) ؛ byteTx ((uint8_t) ((radius >> 8) & 0x00FF)) ؛ byteTx ((uint8_t) (نصف القطر & 0x00FF)) ؛}
موصى به:
كيف تصنع مشغل خطي: 3 خطوات
كيف تصنع مشغلًا خطيًا: المحركات الخطية هي آلات تحول الدوران أو أي حركة إلى حركة دفع أو سحب ، وهنا سأعلمك كيفية صنع مشغل خطي كهربائي باستخدام أشياء منزلية وهوايات ، وهي رخيصة جدًا
كيف تصنع مكعبات LED - مكعب LED 4x4x4: 3 خطوات
كيف تصنع مكعبات LED | مكعب LED 4x4x4: يمكن النظر إلى مكعب LED على أنه شاشة LED ، حيث يلعب LED 5 مم البسيط دور البكسل الرقمي. يسمح لنا مكعب LED بإنشاء صور وأنماط باستخدام مفهوم الظاهرة البصرية المعروفة باسم ثبات الرؤية (POV). وبالتالي،
كيف تصنع موالف جيتار اردوينو: 4 خطوات
كيف تصنع موالف جيتار اردوينو: هذه هي التعليمات لعمل موالف جيتار من Arduino وعدة مكونات أخرى. من خلال المعرفة الأساسية بالإلكترونيات والترميز ، ستتمكن من صنع موالف الجيتار هذا. أول الأشياء أولاً يجب أن تعرف ماهية المواد
كيف تصنع عداد خطوات؟: 3 خطوات (بالصور)
How to Make Step Counter؟: اعتدت أن أؤدي أداءً جيدًا في العديد من الرياضات: المشي والجري وركوب الدراجة ولعب كرة الريشة وما إلى ذلك ، أحب ركوب الخيل للسفر في وقت قريب. حسنًا ، انظر إلى بطني المنتفخ … حسنًا ، على أي حال ، قررت إعادة التمرين. ما هي المعدات التي يجب أن أحضرها؟
كيف تصنع أصغر روبوت تابع للخطوط في العالم (robo Rizeh): 7 خطوات (بالصور)
كيف تصنع أصغر روبوت تابع للخطوط في العالم (robo Rizeh): كيف تصنع أصغر روبوت تابع للخطوط في العالم (vibrobot) & quot؛ roboRizeh & quot؛ الوزن: 5 غرام الحجم: 19 × 16 × 10 مم بواسطة: ناغي ستوده كلمة & quot؛ ريزه & quot؛ هي كلمة فارسية تعني "صغيرة". ريزه هي عمودية صغيرة جدا تعتمد على الاهتزاز