สารบัญ:

วิธีทำ Robo-Bellhop: 3 ขั้นตอน
วิธีทำ Robo-Bellhop: 3 ขั้นตอน

วีดีโอ: วิธีทำ Robo-Bellhop: 3 ขั้นตอน

วีดีโอ: วิธีทำ Robo-Bellhop: 3 ขั้นตอน
วีดีโอ: วิธีพิชิตรูบิค 3x3 อย่างรวดเร็ว | ขั้นตอนที่ง่ายที่สุด 2024, พฤศจิกายน
Anonim

By jeffreyfFollow เพิ่มเติมโดยผู้เขียน:

วิธีเข้าร่วมการประกวดมินิ iRobot Create Scholarship
วิธีเข้าร่วมการประกวดมินิ iRobot Create Scholarship
วิธีเข้าร่วมการประกวดมินิ iRobot Create Scholarship
วิธีเข้าร่วมการประกวดมินิ iRobot Create Scholarship
วิธีทำ LOLCats, Meme cats, Cat macros หรือภาพแมวพร้อมคำบรรยายตลก
วิธีทำ LOLCats, Meme cats, Cat macros หรือภาพแมวพร้อมคำบรรยายตลก
วิธีทำ LOLCats, Meme cats, Cat macros หรือภาพแมวพร้อมคำบรรยายตลก
วิธีทำ LOLCats, Meme cats, Cat macros หรือภาพแมวพร้อมคำบรรยายตลก
วิธีเข้าสู่การประกวด Etsy และคำแนะนำที่เป็นประโยชน์
วิธีเข้าสู่การประกวด Etsy และคำแนะนำที่เป็นประโยชน์
วิธีเข้าสู่การประกวด Etsy และคำแนะนำที่เป็นประโยชน์
วิธีเข้าสู่การประกวด Etsy และคำแนะนำที่เป็นประโยชน์

เกี่ยวกับ: ฉันชอบแยกสิ่งต่าง ๆ และค้นหาวิธีการทำงาน ฉันมักจะหมดดอกเบี้ยหลังจากนั้น ข้อมูลเพิ่มเติมเกี่ยวกับเจฟฟรีฟ »

คำแนะนำนี้แสดงวิธีใช้ iRobot Create เพื่อสร้างเบลล์ฮอปที่เคลื่อนไหว สิ่งนี้ถูกยกขึ้นโดยได้รับอนุญาตจากคำแนะนำของ carolDancer และฉันได้รวบรวมไว้เป็นตัวอย่างสำหรับการประกวดของเรา Robo-BellHop สามารถเป็นผู้ช่วยส่วนตัวของคุณในการขนกระเป๋า ของชำ ซักรีด ฯลฯ ดังนั้นคุณจึงไม่มี ถึง. Create พื้นฐานมีถังติดอยู่ที่ด้านบนและใช้เครื่องตรวจจับ IR ในตัวสองตัวเพื่อติดตามเครื่องส่งสัญญาณ IR ของเจ้าของ ด้วยรหัสซอฟต์แวร์ C พื้นฐาน ผู้ใช้สามารถรักษาความปลอดภัยของของชำหนัก ซักรีดจำนวนมาก หรือกระเป๋าค้างคืนของคุณบน Robo-BellHop และให้หุ่นยนต์ติดตามคุณไปตามถนน ผ่านห้างสรรพสินค้า ลงห้องโถง หรือผ่านสนามบิน - - ทุกที่ที่ผู้ใช้ต้องการไป การทำงานพื้นฐาน1) กดปุ่มรีเซ็ตเพื่อเปิดโมดูลคำสั่งและตรวจสอบว่าเซ็นเซอร์ทำงานอยู่1a) ไฟ LED เล่นควรสว่างเมื่อเห็นเครื่องส่งสัญญาณ IR ติดตามคุณ1b) ไฟ LED ขั้นสูงจะติดเมื่อ หุ่นยนต์อยู่ในระยะใกล้มาก2) กดปุ่มซอฟท์สีดำเพื่อเรียกใช้กิจวัตร Robo-BellHop3) ติดเครื่องส่งสัญญาณ IR ที่ข้อเท้าและตรวจดูให้แน่ใจว่าได้เปิดเครื่องแล้ว โหลดตะกร้าแล้วไปกันเลย!4) ตรรกะของ Robo-BellHop มีดังนี้:4a) ในขณะที่คุณเดินไปมา หากตรวจพบสัญญาณ IR หุ่นยนต์จะขับด้วยความเร็วสูงสุด4b) หากสัญญาณ IR ดับลง ช่วง (โดยการทำมุมที่ไกลเกินไปหรือคมเกินไป) หุ่นยนต์จะเคลื่อนที่เป็นระยะทางสั้น ๆ ด้วยความเร็วต่ำในกรณีที่สัญญาณถูกหยิบขึ้นมาอีกครั้ง4c) หากตรวจไม่พบสัญญาณ IR หุ่นยนต์จะเลี้ยวซ้ายและขวาใน พยายามหาสัญญาณอีกครั้ง4d) หากตรวจพบสัญญาณ IR แต่หุ่นยนต์ชนสิ่งกีดขวาง หุ่นยนต์จะพยายามขับรถไปรอบๆ สิ่งกีดขวาง4e) หากหุ่นยนต์เข้าใกล้สัญญาณ IR มาก หุ่นยนต์จะหยุดเพื่อหลีกเลี่ยงการกระแทก ข้อเท้าของเจ้าของฮาร์ดแวร์1 หน่วยผนังเสมือน iRobot - เครื่องตรวจจับ IR มูลค่า 301 เหรียญจาก RadioShack - ขั้วต่อตัวผู้ DB-9 มูลค่า 31 เหรียญจาก Radio Shack - 44 เหรียญสหรัฐฯ 6-32 สกรูจาก Home Depot - แบตเตอรี่ 2.502 เหรียญสหรัฐฯ 3V ฉันใช้ตะกร้าซักผ้า D1 จาก Target - 51 ดอลลาร์ล้อพิเศษเพื่อเข้าสู่ ด้านหลังของ Create robotเทปพันสายไฟ ลวด และบัดกรี

ขั้นตอนที่ 1: ปิดเซ็นเซอร์ IR

ติดเทปพันสายไฟเพื่อให้ครอบคลุมทั้งหมด ยกเว้นรอยผ่าเล็กๆ ของเซ็นเซอร์ IR ที่ด้านหน้าของหุ่นยนต์ Create รื้อยูนิตผนังเสมือนและดึงแผงวงจรขนาดเล็กที่ด้านหน้ายูนิต ค่อนข้างยุ่งยากเพราะมีสกรูและที่ยึดพลาสติกซ่อนอยู่มากมาย เครื่องส่งสัญญาณ IR อยู่บนแผงวงจร ปิดเครื่องส่งสัญญาณ IR ด้วยกระดาษทิชชู่ชิ้นหนึ่งเพื่อหลีกเลี่ยงการสะท้อน IR ติดแผงวงจรเข้ากับสายรัดหรือแถบยางยืดที่สามารถพันรอบข้อเท้าของคุณได้ ต่อแบตเตอรี่เข้ากับแผงวงจรเพื่อให้คุณสามารถใส่แบตเตอรี่ไว้ในที่ที่สะดวกสบาย (ฉันทำขึ้นเพื่อใส่แบตเตอรี่ในกระเป๋าของฉัน)

ต่อสายตรวจจับ IR ตัวที่ 2 เข้ากับตัวเชื่อมต่อ DB-9 และเสียบเข้ากับขา 3 ของ Cargo Bay ePort (สัญญาณ) และพิน 5 (กราวด์) ติดตัวตรวจจับ IR ตัวที่ 2 ที่ด้านบนของเซ็นเซอร์ IR ที่มีอยู่บน Create และคลุมด้วยกระดาษทิชชู่สองสามชั้นจนกระทั่งเครื่องตรวจจับ IR ตัวที่ 2 ไม่เห็นตัวปล่อยในระยะทางที่คุณต้องการให้หุ่นยนต์ Create หยุด จากการตีคุณ คุณสามารถทดสอบสิ่งนี้ได้หลังจากคุณกดปุ่มรีเซ็ตแล้วดู LED ขั้นสูงให้ทำงานต่อไปเมื่อคุณอยู่ในระยะหยุด

ขั้นตอนที่ 2: แนบตะกร้า

ติดตะกร้าโดยใช้สกรู 6-32 ฉันเพิ่งติดตั้งตะกร้าไว้ที่ด้านบนของหุ่นยนต์ Create เลื่อนล้อหลังด้วย เพื่อให้คุณวางน้ำหนักไว้ที่ด้านหลังของหุ่นยนต์ Create

หมายเหตุ: - หุ่นยนต์สามารถบรรทุกของได้ไม่น้อย อย่างน้อย 30 ปอนด์ - ขนาดที่เล็กดูเหมือนจะเป็นส่วนที่ยากที่สุดในการพกพากระเป๋าเดินทาง - IR นั้นเจ้าอารมณ์มาก บางทีการใช้ภาพอาจจะดีกว่าแต่ราคาแพงกว่ามาก

ขั้นตอนที่ 3: ดาวน์โหลดซอร์สโค้ด

ดาวน์โหลดซอร์สโค้ด
ดาวน์โหลดซอร์สโค้ด

รหัสที่มาดังต่อไปนี้และแนบมาในไฟล์ข้อความ:

/****************************************************** ******************** follow.c ** -------- ** รันบน Create Command Module ** ครอบคลุมทั้งหมด ยกเว้นช่องเล็กๆ ที่ด้านหน้า ของเซ็นเซอร์ IR ** Create จะเป็นไปตามกำแพงเสมือน (หรือ IR ใด ๆ ที่ส่งสัญญาณ ** สนามแรง) และหวังว่าจะหลีกเลี่ยงอุปสรรคในกระบวนการ ***************** ******************************************************** **/#include interrupt.h>#include io.h>#include#include "oi.h"#define TRUE 1#define FALSE 0#define FullSpeed 0x7FFF#define SlowSpeed 0x0100#define SearchSpeed 0x0100#define ExtraAngle 10#define ค้นหาLeftAngle 125#define ค้นหามุมขวา (SearchLeftAngle - 1000)#define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#define IRDetected (~PINB & 0x01)//states#define Ready 0#define Following 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8/ ตัวแปรโกลบอล 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_6 มุม; เซ็นเซอร์วัดมุม ความผันผวน uint8_t inRange = 0; // Functionsvoid byteTx (ค่า uint8_t); เป็นโมฆะ delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); เป็นโมฆะ delayAndUpdateSensors (ไม่ได้ลงนาม int time_ms); เป็นโมฆะเริ่มต้น (เป็นโมฆะ); เป็นโมฆะ powerOnRobot (เป็นโมฆะ); เป็นโมฆะ baud(uint8_t baud_code);void drive(int16_t velocity, int16_t radius);uint16_t randomAngle(void);void defineSongs(void);int main (void){//state variableuint8_t state = Ready;int found = 0;int wait_counter = 0; // ตั้งค่า Create และ moduleinitialize();LEDBothOff;powerOnRobot();byteTx(CmdStart);baud(Baud28800);byteTx(CmdControl);byteTx(CmdFull);// set i/o for second IR sensorDDRB &= ~0x01; //ตั้งค่า cargo bay ePort pin 3 เป็น inputPORTB |= 0x01; // ตั้งค่า cargo ePort pin3 pullup ที่เปิดใช้งาน // โปรแกรมวนรอบ (TRUE){// หยุดเพียงเพื่อเป็นการป้องกันไว้ก่อนไดรฟ์(0, RadStraight);// set LEDsbyteTx(CmdLeds);byteTx(((sensors[SenVWall]))?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(64);IRDetected?LED2On:LED2Off;inRange?LED1On:LED1Off;//กำลังมองหาปุ่มผู้ใช้ ตรวจสอบมักจะdelayAndUpdateSensors(10);delayAndCheckIR (10);if(UserButtonPressed) {delayAndUpdateSensors(1000);//active loopwhile(!(UserButtonPressed)&&(!sensors[SenCliffL])&&(!sensors[SenCliffFL])&&(!sensors[SenCliffFR])&&(! เซนเซอร์[SenCliffR])) {byteTx(CmdLeds);byteTx(((เซนเซอร์[SenVWall]))?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(เซนเซอร์[SenCharge1]);byteTx(255);IRDetected ?LED2On:LED2Off;inRange?LED1On:LED1Off;switch(state) {case Ready:if(sensors[SenVWall]) {//check for proximity to leaderif(inRange) {drive(0, RadStraight);} else {// ไดรฟ์ตรง (SlowSpeed, RadStraight);state = กำลังติดตาม;}} อื่น {//ค้นหา beamangle = 0;distance = 0;wait_counter = 0;found = FALSE;drive(SearchSpeed, RadCCW);state = SearchingLeft;}break;case Following:if (เซ็นเซอร์ [SenBumpDrop] & BumpRight) {ระยะทาง = 0;angle = 0;drive (-SlowSpeed, RadStraight); state=BackingTraceLeft;} else if (เซ็นเซอร์ [SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive (-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (เซ็นเซอร์ [SenVWall]) {// ตรวจสอบ ความใกล้ชิดกับผู้นำ (inRange) {ไดรฟ์ (0, RadStraight);state = Ready;} else {//drive straightdrive (FullSpeed, RadStraight);state = กำลังติดตาม;}} อื่น ๆ {// เพิ่งสูญเสียสัญญาณ ให้ไปช้าๆ หนึ่ง cycledistance = 0; ไดรฟ์ (ความเร็วช้า, RadStraight); รัฐ = WasFollowing;} แตก; กรณี WasFollowing: ถ้า (เซ็นเซอร์ [SenBumpDrop] & BumpRight) {ระยะทาง = 0; มุม = 0; ไดรฟ์ (- ความเร็วช้า, RadStraight);state = BackingTraceLeft;} else if(เซ็นเซอร์[SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (เซ็นเซอร์ [SenVWall]) {// ตรวจสอบความใกล้ชิดกับผู้นำหาก (ในช่วง) {ไดรฟ์(0, RadStraight);state = R eady;} อื่น {// ขับตรง (FullSpeed, RadStraight);state = กำลังติดตาม;}} else if (ระยะทาง >= CoastDistance) {ขับ (0, RadStraight);state = พร้อมแล้ว;} อื่น ๆ {drive (ความเร็วช้า, 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) {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 = ค้นหา RightAngle) {drive(0, RadStraight);wait_counter = 5000;angle = 0;} else {drive(SearchSpeed, RadCW);}break;case TracingLeft:if(sensors[SenBumpDrop] & BumpRight) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {drive(0, RadStraight);state=Ready;} else if (เซ็นเซอร์ [SenVWall]) {//check สำหรับความใกล้ชิดกับผู้นำ (inRange) {ไดรฟ์ (0, RadStraight);state = Ready;} else {//drive straightdrive (ความเร็วช้า, RadStraight);state = กำลังติดตาม;}} else if (!(ระยะทาง >= TraceDistance)) { drive(SlowSpeed, RadStraight);} else if (!(-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 (เซ็นเซอร์ [SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive (- SlowSpeed, RadStraight);state=BackingTraceRight;} else if (เซ็นเซอร์ [SenVWall]) {// ตรวจสอบความใกล้ชิดกับผู้นำหาก (inRang) e) {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) {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);}break;default://stopdrive(0, RadStraight);state = Re ady;break;}delayAndCheckIR(10);delayAndUpdateSensors(10);}//cliff หรือ userbutton ตรวจพบ อนุญาตให้เงื่อนไขเสถียร (เช่น ปุ่มที่จะปล่อย)ไดรฟ์(0, RadStraight);delayAndUpdateSensors(2000);}}} // อนุกรมรับการขัดจังหวะเพื่อเก็บค่าเซ็นเซอร์SIGNAL(SIG_USART_RECV){uint8_t temp;temp = UDR0;if(sensors_flag){sensors_in[sensors_index++] = temp;if(sensors_index >= Sen6Size)sensors_flag = 0;}}// ตัวจับเวลา 1 ขัดจังหวะ เวลาล่าช้าใน msSIGNAL(SIG_OUTPUT_COMPARE1A){if(timer_cnt)timer_cnt--;elsetimer_on = 0;}// ส่งไบต์ผ่านพอร์ตอนุกรม byteTx(uint8_t value){while(!(UCSR0A & _BV;(UDRE0))) UDR0 = value;}// หน่วงเวลาตามเวลาที่ระบุในหน่วย ms โดยไม่อัปเดตค่าของเซ็นเซอร์void delayMs(uint16_t time_ms){timer_on = 1;timer_cnt = time_ms;while(timer_on);}// หน่วงเวลาสำหรับเวลาที่ระบุในหน่วย ms และตรวจสอบวินาที IR detectorvoid 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));}// หน่วงเวลาสำหรับเวลาที่ระบุในหน่วย ms และอัปเดตค่าของเซ็นเซอร์void 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++)sensors[temp] = sensors_in[temp];// Update Running Totals of Distance and angledistance += (int)((sensors[SenDist1] 8) | sensors[SenDist0]);angle += (int)((เซ็นเซอร์) [SenAng1] 8) | เซ็นเซอร์[SenAng0]);byteTx(CmdSensors);byteTx(6);sensors_index = 0;sensors_flag = 1;}}}// เริ่มต้นการควบคุมจิตใจ ATmega168 microcontrollervoid initialize(void){cli(); // ตั้งค่าพิน I/ODDRB = 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);// ตั้งค่าพอร์ตอนุกรมด้วย rx interruptUBRR0 = 19;UCSR0B = (_BV(RXCIE0) | _BV(TXEN0) | _BV(RXEN0)));UCSR0C = (_BV(UCSZ00) | _BV(UCSZ01));// เปิด interruptssei();}เป็นโมฆะ powerOnRobot(เป็นโมฆะ){// ถ้า Create&aposs ปิดอยู่ ให้เปิดขึ้นถ้า (!RobotIsOn){while(!RobotIsOn){RobotPwrToggleLow;delayMs(500); // หน่วงเวลาในสถานะนี้ RobotPwrToggleHigh; // การเปลี่ยนจากต่ำไปสูงเพื่อสลับ powerdelayMs(100); // หน่วงเวลาในสถานะ RobotPwrToggleLow;}delayMs(3500); // Delay for startup}}// เปลี่ยนอัตรา baud ทั้ง 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;else if(baud_code == Baud57600)UBRR0 = Ubrr57600;else if(baud_code == Baud38400)UBRR0 = Ubrr38400;else if(baud_code == Baud28800)UBRR0 = Ubrr28800;else if(baud_code == Baud19200)UBRR0 = Ubrr19200;else if(baud_code == Baud14400)UBRR0;elsebrr14 if(baud_code == Baud9600)UBRR0 = Ubrr9600;else if(baud_code == Baud4800)UBRR0 = Ubrr4800;else if(baud_code == Baud2400)UBRR0 = Ubrr2400;else if(baud_code == Baud1200)UBRR0 = Ubrr1200;ถ้า baud_code == Baud600)UBRR0 = Ubrr600;else if(baud_code == Baud300)UBRR0 = Ubrr300;sei();delayMs(100);}}// ส่งสร้างคำสั่งไดรฟ์ในแง่ของความเร็วและรัศมีไดรฟ์ (int16_t ความเร็ว, int16_t รัศมี){byteTx(CmdDrive);byteTx((uint 8_t)((ความเร็ว >> 8) & 0x00FF));byteTx((uint8_t)(ความเร็ว & 0x00FF));byteTx((uint8_t)((รัศมี >> 8) & 0x00FF));byteTx((uint8_t)(รัศมี & 0x00FF));}

แนะนำ: