Բովանդակություն:

Ինչպես պատրաստել Robo-Bellhop: 3 քայլ
Ինչպես պատրաստել Robo-Bellhop: 3 քայլ

Video: Ինչպես պատրաստել Robo-Bellhop: 3 քայլ

Video: Ինչպես պատրաստել Robo-Bellhop: 3 քայլ
Video: Տոնածառի խաղալիք է տոնածառ - Ամանորյա դավաճանությունը հանգեցնում է սեփական ձեռքերով 2024, Նոյեմբեր
Anonim

Հետևեք հեղինակի ավելին ՝

Ինչպես մասնակցել iRobot Create Scholarship մինի մրցույթին
Ինչպես մասնակցել iRobot Create Scholarship մինի մրցույթին
Ինչպես մասնակցել iRobot Create Scholarship մինի մրցույթին
Ինչպես մասնակցել iRobot Create Scholarship մինի մրցույթին
Ինչպես պատրաստել LOLCats, Meme կատուներ, Cat մակրոներ կամ կատվի նկարներ զվարճալի վերնագրերով
Ինչպես պատրաստել LOLCats, Meme կատուներ, Cat մակրոներ կամ կատվի նկարներ զվարճալի վերնագրերով
Ինչպես պատրաստել LOLCats, Meme կատուներ, Cat մակրոներ կամ կատվի նկարներ զվարճալի վերնագրերով
Ինչպես պատրաստել LOLCats, Meme կատուներ, Cat մակրոներ կամ կատվի նկարներ զվարճալի վերնագրերով

Մասին. Ինձ դուր է գալիս բաները առանձնացնել և պարզել, թե ինչպես են դրանք գործում: Դրանից հետո ես ընդհանրապես կորցնում եմ հետաքրքրությունս: Ավելին jeեֆրիֆի մասին »

Այս հրահանգը ցույց է տալիս, թե ինչպես օգտագործել iRobot Ստեղծել շարժական զանգակատուն պատրաստելու համար: Սա ամբողջությամբ հանվեց carolDancer- ի ցուցումներից թույլտվությամբ, և ես այն դրեցի որպես օրինակ մեր մրցույթի համար: Robo-BellHop- ը կարող է լինել ձեր անձնական օգնականը ՝ ձեր պայուսակները, մթերքները, լվացքները և այլն կրելու համար, այնպես որ դուք չունեք դեպի. Հիմնական Ստեղծումն ունի աղբարկղ, որը ամրացված է վերևում և օգտագործում է երկու ներթափանցիկ IR դետեկտորներ ՝ սեփականատիրոջ IR հաղորդիչին հետևելու համար: Շատ հիմնական C ծրագրային կոդով օգտվողը կարող է ապահովել ծանր մթերքներ, լվացքի մեծ բեռ կամ ձեր գիշերակաց պայուսակը Robo -BellHop- ի վրա և թույլ տալ, որ ռոբոտը ձեզ հետևի փողոցով, առևտրի կենտրոնով, սրահով կամ օդանավակայանով. - ամենուր, որտեղ օգտվողը պետք է գնա: Հիմնական գործողություն 1) Հրամանի մոդուլը միացնելու և սենսորները ներգրավելու համար սեղմեք Վերակայման կոճակը 1 ա) Play LED- ը պետք է շարունակվի, երբ տեսնում է, որ IR հաղորդիչը հետևում է ձեզ ռոբոտը գտնվում է շատ մոտ հեռավորության վրա 2) Հպեք սև փափուկ կոճակին ՝ Robo-BellHop ռեժիմը գործարկելու համար 3) Կցեք IR հաղորդիչը կոճին և համոզվեք, որ այն միացված է: Հետո բեռնեք զամբյուղը և գնացեք: 4) Robo-BellHop- ի տրամաբանությունը հետևյալն է. 4 ա) Շրջելիս, եթե IR ազդանշանը հայտնաբերվում է, ռոբոտը կշարժվի առավելագույն արագությամբ 4 բ) Եթե IR ազդանշանը դուրս գա միջակայքը (չափազանց հեռու կամ չափազանց կտրուկ անկյան տակ), ռոբոտը փոքր արագություն կանցնի դանդաղ արագությամբ, եթե ազդանշանը նորից վերցվի փորձեք նորից գտնել ազդանշանը 4 դ) Եթե IR ազդանշանը հայտնաբերվի, բայց ռոբոտը խոչընդոտի, ռոբոտը կփորձի շրջել խոչընդոտի շուրջը 4e) Եթե ռոբոտը շատ մոտենա IR ազդանշանին, ապա ռոբոտը կդադարի խուսափել սեփականատեր Ստեղծել ռոբոտի էլեկտրական ժապավեն, մետաղալար և զոդ

Քայլ 1: IR սենսորի ծածկում

Կցեք էլեկտրական ժապավեն, որը ծածկում է IR սենսորի բոլոր ճեղքերը, բացի Ստեղծեք ռոբոտի առջևի մասից: Ապամոնտաժեք վիրտուալ պատի միավորը և հանեք միավորի առջևի փոքր տպատախտակը: Սա մի փոքր բարդ է, քանի որ կան բազմաթիվ թաքնված պտուտակներ և պլաստմասե ամրակներ: IR հաղորդիչը գտնվում է տպատախտակին: Transածկեք IR հաղորդիչը հյուսվածքային թղթի կտորով `IR արտացոլումներից խուսափելու համար: Կցեք տպատախտակը մի ժապավենի կամ առաձգական խմբի, որը կարող է փաթաթվել ձեր կոճին: Մարտկոցները միացրեք տպատախտակին, որպեսզի կարողանաք ունենալ մարտկոցները հարմարավետ տեղում (ես այն պատրաստել եմ այնպես, որ մարտկոցները դնեմ գրպանս):

Միացրեք 2-րդ IR դետեկտորը DB-9 միակցիչին և տեղադրեք Cargo Bay ePort կապում 3 (ազդանշան) և կապի 5 (հիմք): Կցեք 2 -րդ IR դետեկտորը գոյություն ունեցող IR սենսորի վերևին և ծածկեք այն հյուսվածքի թղթի մի քանի շերտերով, մինչև 2 -րդ IR դետեկտորը չտեսնի այն թողարկիչը այն հեռավորության վրա, որը ցանկանում եք, որ Ստեղծել ռոբոտը կանգ առնի: քեզ հարվածելուց: Դուք կարող եք դա ստուգել «Վերականգնել» կոճակը սեղմելուց հետո և դիտել «Advance LED» - ը, որը կշարունակվի, երբ կանգառի հեռավորության վրա եք:

Քայլ 2: Կցեք զամբյուղը

Կցեք զամբյուղը ՝ օգտագործելով 6-32 պտուտակներ: Ես պարզապես զամբյուղը տեղադրեցի Ստեղծել ռոբոտի վերևում: Նաև սահեցրեք հետևի անիվի մեջ, որպեսզի քաշ տեղադրեք Ստեղծեք ռոբոտի հետևի մասում:

Նշումներ. - Ռոբոտը կարող է կրել բավականին մեծ բեռ, առնվազն 30 ֆունտ: - Փոքր չափսը թվում էր, որ ամենադժվարն է այն տեղափոխել ցանկացած ուղեբեռ տեղափոխելու համար: IR- ն շատ խառնվածքային է: Թերևս պատկերների օգտագործումը ավելի լավ է, բայց դա շատ ավելի թանկ է

Քայլ 3: Ներբեռնեք աղբյուրի կոդը:

Ներբեռնեք աղբյուրի կոդը
Ներբեռնեք աղբյուրի կոդը

Աղբյուրը հետևյալն է և կցված է տեքստային ֆայլում.

/********************************************** ** IR սենսորի ** Ստեղծումը կհետևի վիրտուալ պատին (կամ ցանկացած IR), որն ուղարկում է ** ուժային դաշտի ազդանշան) և հուսով եմ, որ կխուսափի այդ գործընթացում խոչընդոտներից ****************** *********************************************** **/#include interrupt.h> #include io.h>#include#include "oi.h"#սահմանել ճշմարիտ 1#սահմանել ԿԱAL 0#սահմանել FullSpeed 0x7FFF#սահմանել SlowSpeed 0x0100#սահմանել SearchSpeed 0x0100#սահմանել ExtraAngle 10#սահմանել SearchLeftAngle 125#սահմանել SearchRightAngle (SearchLeftAngle - 1000)#սահմանել CoastDistance 150#սահմանել TraceDistance 250#սահմանել TraceAngle 30#սահմանել BackDistance 25#սահմանել IRDetected (~ PINB & 0x01) // վիճակներ#սահմանել Ready 0#սահմանել հետևել 1#սահմանել WasFollowing 2 #սահմանել SearchingLeft 3#սահմանել SearchingRight 4#սահմանել TracingLeft 5#սահմանել TracingRight 6#սահմանել BackingTraceLeft 7#սահմանել BackingTraceRight 8 // Global variablesv olatile uint16_t timer_cnt = 0; volatile uint8_t timer_on = 0; volatile uint8_t sensors_flag = 0; volatile uint8_t sensors_index = 0; volatile uint8_t senssors_in [Sen6Size]; volatile uint8_t sensors [sen16S = = 16 = = 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 baud (uint8_t baud_code); անվավեր սկավառակ (int16_t արագություն, int16_t շառավիղ); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int wait_counter = 0; // Կարգավորել Ստեղծել և մոդուլացնել (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // սահմանել i/o երկրորդ IR սենսորի համար DDDRB & = ~ 0x01; // սահմանել cargo bay ePort- ի 3 -րդ կապը մուտքի համար PORTB | = 0x01; // միացնել բեռի ePort pin3 քաշքշումը միացված է // ծրագիր loop while (TRUE) {// կանգնիր այնպես, ինչպես նախազգուշացում (0, RadStraight); // սահմանիր LEDsbyteTx (CmdLeds); byteTx ((((տվիչներ [SenVWall]))? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (տվիչներ [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // որոնում օգտվողի կոճակ, ստուգեք oftendelayAndUpdateSensors (10); (10); եթե (UserButtonPressed) {delayAndUpdateSensors (1000); // ակտիվ հանգույց (! (UserButtonPressed) && (! Սենսորներ [SenCliffL]) && (! Սենսորներ [SenCliffFL]) && (! Սենսորներ [SenCliffFR]) && (! տվիչներ [SenCliffR])) {byteTx (CmdLeds); byteTx (((տվիչներ [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (տվիչներ [SenCharge1]); բայթTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; անջատիչ (վիճակ) {դեպք Պատրաստ է. drive straightdrive (SlowSpeed, RadStraight); վիճակ = Հետևում;}} else {// որոնել ճառագայթը = 0; հեռավորությունը = 0; wait_counter = 0; գտնված = ԿԱAL; սկավառակ (SearchSpeed, RadCCW); վիճակ = SearchingLeft;} ընդմիջում; դեպք հետևյալ դեպքում. վիճակ = BackingTraceLeft;} այլ դեպքում (սենսորներ [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (տվիչներ [SenVWall]) {// ստուգեք մոտակայքը Leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Հետևում;}} else {// պարզապես ազդանշանը կորցրած, մեկ դանդաղ շարունակիր cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (տվիչներ [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]) {// ստուգեք առաջնորդի մոտիկությունը (inRange) {drive (0, RadStraight); վիճակ = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} ընդմիջում; դեպք 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);}} այլ դեպքում (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} այլ դեպքում, եթե (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; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} այլ դեպքում, եթե (տվիչներ [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (տվիչներ [SenVWall]) {{ստուգել Leaderif- ի (inRange) մոտիկության համար {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else 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 (տվիչներ [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);} այլ դեպքում (! 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;} այլ դեպքում ((անկյուն> = TraceAngle) {հեռավորություն = 0; անկյուն = 0; սկավառակակիր (SlowSpeed, RadStraight); վիճակ = TracingRight;} այլ դեպքում, եթե (-distance> = BackDistance) {drive (SearchSpeed, RadCW);} else {drive (-SlowSpeed, RadStraight);} ընդմիջում; կանխադրված. // stopdrive (0, RadStraight); վիճակ = Re ady; ընդմիջում;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // հայտնաբերվել է ժայռ կամ օգտվողի կոճակ, թույլ է տալիս վիճակի կայունացում (օրինակ ՝ կոճակը ազատվելու է) սկավառակակիր (0, RadStraight); delayAndUpdateSensors (2000);}}} // Սերիայի ստացման ընդհատում սենսորային արժեքների պահպանման համար ժամանակային ձգձգումներ msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // փոխանցել բայթ սերիական portvoid byteTx (uint8_t արժեք) {while (! (UCSR0A & _BV) (UDRE0) UDR0 = արժեք;} // Նշված ժամանակի համար ms- ում ուշացում առանց սենսորային արժեքների թարմացման խուսափեք ուշացումից IR դետեկտորը խուսափում է ուշացումիցԱնդCheckIR (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 (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;}}} // Initialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Սահմանել I/O կապում 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); // Կարգավորել սերիական նավահանգիստը rx ընդհատումով UBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0) () ! RobotIsOn) {RobotPwrToggleLow; հետաձգում (500); // Հետաձգում այս վիճակումRobotPwrToggleHigh; // toածրից բարձր անցում դեպի 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) UBRR0 = Ubrr700 = Ubrr7; հակառակ դեպքում (baud_code == Baud38400) UBRR0 = Ubrr38400; հակառակ դեպքում, եթե (baud_code == Baud28800) UBRR0 = Ubrr28800; այլապես եթե (baud_code == Baud19200) UBRR0 = Ubrr19200; հակառակ դեպքում եթե (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);}} // Ուղարկել Ստեղծեք սկավառակի հրամաններ արագության և ճառագայթման (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));}

Խորհուրդ ենք տալիս: