Բովանդակություն:
Video: Ինչպես պատրաստել Robo-Bellhop: 3 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:52
Հետևեք հեղինակի ավելին ՝
Մասին. Ինձ դուր է գալիս բաները առանձնացնել և պարզել, թե ինչպես են դրանք գործում: Դրանից հետո ես ընդհանրապես կորցնում եմ հետաքրքրությունս: Ավելին 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));}
Խորհուրդ ենք տալիս:
Ինչպես պատրաստել անլար թիթեղյա հեռախոս: (Arduino Walkie Talkie). 7 քայլ (նկարներով)
Ինչպես պատրաստել անլար թիթեղյա հեռախոս: (Arduino Walkie Talkie). Օրերս ես մի շատ կարևոր հեռախոսազանգի մեջ էի, երբ իմ բանանի հեռախոսը դադարեց աշխատել: Ես այնքան հիասթափված էի: Դա վերջին անգամն է, որ բաց եմ թողնում զանգը այդ հիմար հեռախոսի պատճառով: (Հետահայաց, ես գուցե մի փոքր չափազանց բարկացա
Ինչպես պատրաստել LED խորանարդ - LED խորանարդ 4x4x4: 3 քայլ
Ինչպես պատրաստել LED խորանարդ | LED Cube 4x4x4. LED Cube- ը կարելի է համարել որպես LED էկրան, որում պարզ 5 մմ LED- ները կատարում են թվային պիքսելների դերը: LED խորանարդը թույլ է տալիս մեզ ստեղծել պատկերներ և նախշեր ՝ օգտագործելով օպտիկական երևույթի հայեցակարգը, որը հայտնի է որպես տեսողության կայունություն (POV): Այսպիսով
Ինչպես պատրաստել LED ձայնային սպեկտրի անալիզատոր. 7 քայլ (նկարներով)
Ինչպես պատրաստել LED աուդիո սպեկտրի անալիզատոր. NeoPixe- ի միջոցով անալիզատոր
DIY -- Ինչպես պատրաստել սարդ ռոբոտ, որը կարելի է կառավարել սմարթֆոնի միջոցով Arduino Uno- ի միջոցով. 6 քայլ
DIY || Ինչպես պատրաստել սարդ ռոբոտ, որը կարելի է կառավարել սմարթֆոնի միջոցով Arduino Uno- ի միջոցով. Spider ռոբոտ պատրաստելիս կարելի է շատ բան սովորել ռոբոտաշինության մասին: Ինչպես և ռոբոտներ պատրաստելն ինչպես ժամանցային է, այնպես էլ դժվար: Այս տեսանյութում մենք ձեզ ցույց կտանք, թե ինչպես պատրաստել Spider ռոբոտ, որը կարող ենք գործել մեր սմարթֆոնի միջոցով (Անդրոյ
Ինչպես պատրաստել տատիկ -պապիկների օրացույց & Գրանցամատյան (նույնիսկ եթե չգիտեք, թե ինչպես գրանցամատյան կազմել). 8 քայլ (նկարներով)
Ինչպես պատրաստել տատիկ -պապիկների օրացույց & Գրանցամատյան (նույնիսկ եթե չգիտեք, թե ինչպես գրանցամատյան կազմել) Այս տարի ես պատրաստել եմ 5 օրացույց ՝ յուրաքանչյուրը 7 դոլարից պակաս: Նյութեր. Ձեր երեխայի, երեխաների, զարմուհիների, եղբորորդիների, շների, կատուների կամ այլ հարազատների 12 հիանալի լուսանկարներ 12 տարբեր կտորներ