Агуулгын хүснэгт:

Robo-Bellhop хэрхэн хийх вэ: 3 алхам
Robo-Bellhop хэрхэн хийх вэ: 3 алхам

Видео: Robo-Bellhop хэрхэн хийх вэ: 3 алхам

Видео: Robo-Bellhop хэрхэн хийх вэ: 3 алхам
Видео: Robot Bellhop for Hotels 2024, Арваннэгдүгээр
Anonim

JeffreyfFollow Зохиогчийн дэлгэрэнгүй:

IRobot Create Scholarship мини уралдаанд хэрхэн оролцох вэ
IRobot Create Scholarship мини уралдаанд хэрхэн оролцох вэ
IRobot Create Scholarship мини уралдаанд хэрхэн оролцох вэ
IRobot Create Scholarship мини уралдаанд хэрхэн оролцох вэ
Хөгжилтэй тайлбартай LOLCats, Meme муур, муурны макро, муурны зургийг хэрхэн яаж хийх вэ
Хөгжилтэй тайлбартай LOLCats, Meme муур, муурны макро, муурны зургийг хэрхэн яаж хийх вэ
Хөгжилтэй тайлбартай LOLCats, Meme муур, муурны макро, муурны зургийг хэрхэн яаж хийх вэ
Хөгжилтэй тайлбартай LOLCats, Meme муур, муурны макро, муурны зургийг хэрхэн яаж хийх вэ

Тухайн талаар: Би аливаа зүйлийг салгаж, хэрхэн ажилладагийг олж мэдэх дуртай. Үүний дараа ерөнхийдөө миний сонирхол алга болсон. Жефрейфийн тухай дэлгэрэнгүй »

Энэхүү зааварчилгаа нь iRobot Create -ийг ашиглан хэрхэн хөдөлгөөнт хонх хийх талаар харуулав. Үүнийг carolDancer-ийн зааврын дагуу бүхэлд нь цуцалсан бөгөөд би үүнийг уралдааныхаа дээж болгон оруулсан болно. руу. Үндсэн Create нь дээд талдаа бэхэлсэн хогийн савтай бөгөөд хоёр IR IR мэдрэгчийг ашиглан эзэмшигчийнхээ IR дамжуулагчийг дагадаг. С програм хангамжийн маш энгийн кодын тусламжтайгаар хэрэглэгч хүнд хоол хүнс, их хэмжээний угаалга, эсвэл шөнийн цүнхээ Robo -BellHop дээр хадгалж, робот таныг гудамжинд, худалдааны төв, үүдний танхим эсвэл нисэх онгоцны буудлаар дагаж явахыг хүсч болно. - Хэрэглэгч хаашаа ч явах ёстой. Үндсэн ажиллагаа1) Дахин тохируулах товчлуур дээр дарж командын модулийг асааж, мэдрэгчүүд идэвхжсэн эсэхийг шалгаарай1a) Тоглуулах LED нь IR дамжуулагч таныг дагаж байгааг харвал асах ёстой1b) Урьдчилгаа LED асах ёстой. робот маш ойрхон байна2) Robo-BellHop горимыг ажиллуулахын тулд хар зөөлөн товчлуур дээр дарна уу 3) IR дамжуулагчийг шагайнд холбож асаалттай эсэхийг шалгаарай. 4) Robo-BellHop-ийн логик дараах байдалтай байна. хүрээ (хэт хол эсвэл хэт хурц өнцгөөр), робот дохио дахин авах тохиолдолд богино зайг удаан хурдаар туулах болно4c) Хэрэв IR дохиог илрүүлээгүй бол робот зүүн болон баруун тийш эргэх болно. Дахин дохио олох оролдлого4d) Хэрэв IR дохиог илрүүлж байгаа боловч робот саад тотгорыг мөргөвөл робот саадыг тойрох гэж оролдох болно4e) Хэрэв робот IR дохио руу маш ойртох юм бол роботыг цохихгүйн тулд зогсох болно. эзэмшигчийн шагайHardware1 iRobot виртуал хананы нэгж - RadioShack -аас 301 долларын IR мэдрэгч - Radio Shack -аас $ 31 DB -9 эрэгтэй холбогч - Home Depot -оос 44 долларын 6-32 долларын боолт - 2.502 долларын 3В батерей, би Target -аас D1 угаалгын сагсыг ашигласан - $ 51 нэмэлт дугуй Create роботын ар талд Цахилгаан соронзон хальс, утас, гагнуур

Алхам 1: IR мэдрэгчийг бүрхэх

Create роботын урд талын хэт улаан туяаны мэдрэгчийн жижигхэн хэсгийг эс тооцвол цахилгаан соронзон хальсыг холбоно уу. Виртуал хананы нэгжийг задалж, төхөөрөмжийн урд талын жижиг хэлхээний самбарыг гаргаж аваарай. Маш олон далд эрэг, хуванцар бэхэлгээ байдаг тул энэ нь арай төвөгтэй юм. IR дамжуулагч нь хэлхээний самбар дээр байна. IR туяа тусахгүйн тулд IR дамжуулагчийг салфетка цаасаар хучих. Хэлхээний самбарыг шагайгаа ороож болох оосор эсвэл уян харимхай хамтлагт холбоно уу. Батерейг тав тухтай газар байрлуулахын тулд батерейг утсан дээр залгаарай (би батерейгаа халаасандаа хийх боломжтой болгосон).

2-р IR мэдрэгчийг DB-9 холбогчтой холбож Cargo Bay ePort pin 3 (дохио) ба 5 зүү (газардуулга) руу оруулна уу. 2 -р IR мэдрэгчийг Create дээрх одоо байгаа IR мэдрэгчийн дээд хэсэгт холбож, 2 -р IR детектор ялгаруулагчийг таны зогсоолгүй байлгахыг хүссэн зайд харахгүй болтол нь хоёр давхар даавуугаар хучна. чамайг цохихоос. Та Reset товчлуурыг дарсны дараа үүнийг туршиж үзэх боломжтой бөгөөд зогсох зайнд байх үед Advance LED асах болно.

Алхам 2: Сагсыг хавсаргана уу

6-32 боолтыг ашиглан сагсыг бэхлээрэй. Би дөнгөж сая сагсыг Create роботын дээд талд суулгалаа. Мөн арын дугуйнд гулсуулаарай, ингэснээр та Create роботын ар талд жин тавина.

Тэмдэглэл: - Робот нь бага зэрэг ачаа үүрэх боломжтой, дор хаяж 30 фунт. - Жижиг хэмжээтэй байх нь ямар ч ачаа тээш авч явах хамгийн хэцүү зүйл мэт санагдсан - IR нь маш ааштай. Дүрслэлийг ашиглах нь илүү дээр байж магадгүй ч хамаагүй үнэтэй байдаг

Алхам 3: Эх кодыг татаж авах

Эх кодыг татаж авах
Эх кодыг татаж авах

Эх кодыг дараах байдлаар бичвэр файлд хавсаргасан болно.

/*********************************************** ******************** follow.c ** -------- ** Create Command Module дээр ажилладаг ** урд талын жижиг нээлхийг эс тооцвол бүгдийг хамарна. IR мэдрэгчийг ** үүсгэх нь виртуал ханыг дагана (эсвэл ямар ч IR нь ** хүчний талбарын дохиог илгээдэг) ба үйл явц дахь саад бэрхшээлээс зайлсхийх болно гэж найдаж байна ***************** ************************************************ **/#interrupt.h оруулах SearchLeftAngle 125#тодорхойлох SearchRightAngle (SearchLeftAngle - 1000)#CoastDistance 150#тодорхойлох TraceDistance 250#тодорхойлох TraceAngle 30#тодорхойлох BackDistance 25#тодорхойлох IRDetected (~ PINB & 0x01) // мужууд#тодорхойлох бэлэн 0#тодорхойлох дараах 1#тодорхойлох WasFollowing 2 #SearchingLeft 3 -ийг тодорхойлох#SearchingRight -ийг тодорхойлох 4#TracingLeft -ийг тодорхойлох 5#TracingRight -ийг тодорхойлох 6#BackingTraceLeft -ийг тодорхойлох 7#BackingTraceRight 8 -ийг тодорхойлох // Глобал хувьсагчидv 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 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 inoid (void) baud (uint8_t baud_code); хоосон хөтөч (int16_t хурд, int16_t радиус); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// төлөвийн хувьсагч8_t төлөв = Бэлэн; int found = 0; int wait_counter = 0; // Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // хоёр дахь IR мэдрэгчийн хувьд i/o -ийг тохируулахDDRB & = ~ 0x01; // ачааны булангийн ePort pin 3 -ийг оролт болгон тохируулна ууPORTB | = 0x01; // ачааны ePort pin3 татах боломжийг идэвхжүүлсэн // програмын давталт хийх үед (ҮНЭН) {// Урьдчилан сэргийлэх зорилгоор зогсоох (0, RadStraight); // LEDsbyteTx (CmdLeds) тохируулах; byteTx (((мэдрэгч [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensors [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // user button хайж, oftendelayAndUpdateAndors (10) шалгах; (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // идэвхтэй давталтын үед (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! мэдрэгч [SenCliffR])) {byteTx (CmdLeds); byteTx ((((SenVWall) ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensors [SenVWall]) {// Leader (inRange) {drive (0, RadStraight);} өөр {// drivedrive (SlowSpeed, RadStraight); state = Дагаж байна;}} өөр {// beamangle хайх = 0; зай = 0; хүлээх_ тоолуур = 0; олдсон = ХУДАЛ; хөтөч (SearchSpeed, RadCCW); төлөв = SearchingLeft;} завсарлага; дараах тохиолдолд: хэрэв (мэдрэгч [SenBumpDrop] & BumpRight) {зай = 0; өнцөг = 0; хөтөч (-SlowSpeed, RadStraight); state = BackingTraceLeft;} if if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} if if (sensors [SenVWall]) {// шалгах Leader -ийн ойролцоо байдал (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (мэдрэгч [SenBumpDrop] & BumpRight) {зай = 0; өнцөг = 0; хөтөч (-SlowSpeed, RadStraight); төлөв = BackingTraceLeft;} өөр бол (мэдрэгч [SenBumpDrop] & BumpLeft) {зай = 0; өнцөг = 0; хөтөч (-SlowSpeed, RadStraight); төлөв = BackingTraceRight;} өөр тохиолдолд (мэдрэгч [SenVWall]) {// удирдагчтай ойр байгаа эсэхийг шалгана уу (inRange) {хөтөч (0, RadStraight); төлөв = R eady;} өөр {// шууд хөтөч жолоодох (FullSpeed, RadStraight); төлөв = Дагаж байна;}} өөр бол (зай> = CoastDistance) {хөтөч (0, RadStraight); төлөв = Бэлэн;} өөр {хөтөч (SlowSpeed, RadStraight);} break; case SearchingLeft: хэрэв (олдвол) {if (өнцөг> = ExtraAngle) {хөтөч (SlowSpeed, RadStraight); төлөв = Дагаж байна;} өөр {хөтөч (SearchSpeed, RadCCW);}} өөр бол (мэдрэгч [SenVWall]) {олдсон = ҮНЭН; өнцөг = 0; хэрэв (inRange) {хөтөч (0, RadStraight); төлөв = Бэлэн;} өөр {хөтөч (SearchSpeed, RadCCW);}} өөр бол (өнцөг> = SearchLeftAngle) {хөтөч (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} өөр {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); төлөв = Дагаж байна;} өөр {хөтөч (SearchSpeed, RadCW);}} өөр бол (мэдрэгч [SenVWall]) {олдсон = ҮНЭН; өнцөг = 0; хэрэв (inRange) {хөтөч (0, RadStraight); төлөв = Бэлэн;} өөр {drive (SearchSpeed, RadCCW);}} if if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} if if (angle = Search RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensors [SenBumpDrop] & BumpRight) {зай = 0; өнцөг = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} if if (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} if if (sensors [SenVWall]) {// шалгах Leader (inRange) -тай ойр байхын тулд {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} if if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} if if (! (-өнцөг> = TraceAngle)) {хөтөч (SearchSpeed, RadCW);} өөр {зай = 0; өнцөг = 0; хөтөч (SlowSpeed, RadStraight); төлөв = Бэлэн; } break; case TracingRight: if (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} if if (sensors [SenBumpDrop] & BumpLeft) {зай = 0; өнцөг = 0; хөтөч (- SlowSpeed, RadStraight); state = BackingTraceRight;} if if (sensors [SenVWall]) {// Leader (inRang) -тай ойр байгаа эсэхийг шалгана уу e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} if if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight));} өөр if (! (өнцөг> = TraceAngle)) {хөтөч (SearchSpeed, RadCCW);} өөр {зай = 0; өнцөг = 0; хөтөч (SlowSpeed, RadStraight); төлөв = Бэлэн;} завсарлага; кейс BackingTraceLeft: if (sensors [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} if if (өнцөг> = TraceAngle) {зай = 0; өнцөг = 0; хөтөч (SlowSpeed, RadStraight); төлөв = TracingLeft; } if if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensors [SenVWall] && inRange) {drive (0, RadStraight); төлөв = Бэлэн;} өөр бол (-angle> = TraceAngle) {зай = 0; өнцөг = 0; хөтөч (SlowSpeed, RadStraight); төлөв = TracingRight;} өөр тохиолдолд (-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);}}} // Цуваа нь мэдрэгчийн утгыг хадгалахын тулд тасалдал хүлээн авдаг msSIGNAL (SIG_OUTPUT_COMPARE1A) {цаг (timer_cnt) timer_cnt-; elsetimer_on = 0;} цаг хоцрох хүртэл // byteTx (uint8_t утга) цуваа портвойд дээгүүр дамжуулах UDR0 = утга;} // Мэдрэгчийн утгыг шинэчлэхгүйгээр ms -д заасан хугацааг хойшлуулах хойшлуулах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 -д заасан хугацааг хойшлуулах, мэдрэгчийн утгыг шинэчлэхгүй delayAndUpdateSensors -аас зайлсхий 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 -ийг эхлүүлэх // I/O pin -ийг тохируулна ууDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // 1 мс тутамд тасалдал үүсгэхийн тулд таймер 1 -ийг тохируулна (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0))); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // interruptssei ();} void powerOnRobot (void) {// асаах ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Энэ төлөвт сааталRobotPwrToggleHigh; // PowerdelayMs -ийг сэлгэхийн тулд бага ба өндөр шилжилт (100); // Энэ төлөвт сааталRobotPwrToggleLow;} delayMs (3500); // Эхлэх хугацааг хойшлуулах}} // Create ба modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code); / Дамжуулалтыг дуустал хүлээнэ үү!; if if (baud_code == Baud38400) UBRR0 = Ubrr38400; if if (baud_code == Baud28800) UBRR0 = Ubrr28800; else if (baud_code == Baud19200) UBRR0 = Ubrr19200; else if (baudRr400 == BaudRc400 = if (baud_code == Baud9600) UBRR0 = Ubrr9600; if if (baud_code == Baud4800) UBRR0 = Ubrr4800; if if (baud_code == Baud2400) UBRR0 = Ubrr2400; else if (baud_code = URR120000) baud_code == Baud600) UBRR0 = Ubrr600; өөр тохиолдолд (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Send Drive командуудыг хурд болон радиусвойд хөтчийн хувьд (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));}

Зөвлөмж болгож буй: