Talaan ng mga Nilalaman:

Paano Gumawa ng Robo-Bellhop: 3 Hakbang
Paano Gumawa ng Robo-Bellhop: 3 Hakbang

Video: Paano Gumawa ng Robo-Bellhop: 3 Hakbang

Video: Paano Gumawa ng Robo-Bellhop: 3 Hakbang
Video: Paano po mag-solve ng Rubik's cube 3x3 2024, Nobyembre
Anonim

Sundin si jeffreyfMasunod Dagdag ng may-akda:

Paano ipasok ang mini-contest ng iRobot Lumikha ng Scholarship
Paano ipasok ang mini-contest ng iRobot Lumikha ng Scholarship
Paano ipasok ang mini-contest ng iRobot Lumikha ng Scholarship
Paano ipasok ang mini-contest ng iRobot Lumikha ng Scholarship
Paano gumawa ng LOLCats, Meme cats, Cat macros, o mga larawan ng pusa na may mga nakakatawang caption
Paano gumawa ng LOLCats, Meme cats, Cat macros, o mga larawan ng pusa na may mga nakakatawang caption
Paano gumawa ng LOLCats, Meme cats, Cat macros, o mga larawan ng pusa na may mga nakakatawang caption
Paano gumawa ng LOLCats, Meme cats, Cat macros, o mga larawan ng pusa na may mga nakakatawang caption

Tungkol sa: Gusto kong ihiwalay ang mga bagay at alamin kung paano gumagana ang mga ito. Sa pangkalahatan ay wala akong interes pagkatapos nito. Karagdagang Tungkol kay jeffreyf »

Ipinapakita ng Tagubilin na ito kung paano gamitin ang Lumikha ng iRobot upang makagawa ng isang gumagalaw na bellhop. Ito ay ganap na binuhat na may pahintulot mula sa mga tagubilin ng carolDancer, at inilagay ko ito bilang isang sample na entry para sa aming paligsahan. Ang Robo-BellHop ay maaaring maging iyong sariling personal na katulong upang dalhin ang iyong mga bag, groseri, labahan, atbp, kaya't wala kang sa Ang pangunahing Lumikha ay may isang bin na nakalakip sa tuktok at gumagamit ng dalawang on-board IR detector upang sundin ang IR transmitter ng may-ari nito. Sa napaka pangunahing code ng C software, maaaring ma-secure ng gumagamit ang mabibigat na mga pamilihan, isang malaking kargada ng paglalaba, o ang iyong magdamag na bag papunta sa Robo-BellHop at sundan ka ng robot sa kalye, sa pamamagitan ng mall, sa bulwagan o sa paliparan - - saanman kailangang pumunta ng gumagamit. Basic Operation1) Pindutin ang pindutan ng I-reset muli upang i-on ang module ng utos at suriin ang mga sensor na nakakaengganyo1) ang Play LED ay dapat na magpatuloy kapag nakita nito ang IR transmitter na sundin ka1b) ang Advance LED ay dapat na magpatuloy kapag ang Ang robot ay nasa malapit na saklaw2) Pindutin ang itim na malambot na pindutan upang patakbuhin ang gawain ng Robo-BellHop3) Ikabit ang IR transmitter sa bukung-bukong at tiyaking naka-on ito. Pagkatapos i-load ang basket at pumunta! 4) Ang lohika ng Robo-BellHop ay ang mga sumusunod: 4a) Habang naglalakad ka, kung ang IR signal ay napansin, ang robot ay magdadala sa max speed4b) Kung ang signal ng IR ay nawala sa saklaw (sa pamamagitan ng pagiging napakalayo o masyadong matalim ng isang anggulo), ang robot ay tatawid ng isang maliit na distansya sa mabagal na bilis kung sakaling ang signal ay nakuha muli4c) Kung ang signal ng IR ay hindi napansin, ang robot ay liliko pakaliwa at pakanan sa isang subukang hanapin muli ang signal4d) Kung ang signal ng IR ay napansin ngunit ang robot ay tumama sa isang balakid, susubukan ng robot na himukin ang balakid4e) Kung ang robot ay malapit na malapit sa signal ng IR, titigil ang robot upang maiwasan ang pagpindot sa ankles ng anklesHardware1 iRobot virtual wall unit - $ 301 IR detector mula sa RadioShack - $ 31 DB-9 male connector mula sa Radio Shack - $ 44 6-32 na mga tornilyo mula sa Home Depot - $ 2.502 3V na baterya, ginamit ko ang D1 na basket ng paglalaba mula sa Target - $ 51 dagdag na gulong papunta sa likod ng Lumikha ng robotElectrical tape, wire at panghinang

Hakbang 1: Saklaw ang IR Sensor

Maglakip ng electrical tape upang takpan ang lahat maliban sa isang maliit na slit ng IR sensor sa harap ng robot na Lumikha. Alisin ang virtual wall unit at kunin ang maliit na circuit board sa harap ng unit. Ito ay medyo nakakalito dahil maraming mga nakatagong mga turnilyo at mga plastik na pag-mount. Ang IR transmitter ay nasa circuit board. Takpan ang IR transmitter ng isang piraso ng tissue paper upang maiwasan ang mga pagsasalamin sa IR. Ikabit ang circuit board sa isang strap o nababanat na banda na maaaring ibalot sa iyong bukung-bukong. I-wire ang mga baterya sa circuit board upang maaari mong makuha ang mga baterya sa isang komportableng lugar (ginawa ko ito upang mailagay ko ang mga baterya sa aking bulsa).

Wire up ang 2nd IR detector sa konektor ng DB-9 at ipasok sa Cargo Bay ePort pin 3 (signal) at pin 5 (ground). Ikabit ang 2nd IR detector sa tuktok ng mayroon nang IR sensor sa Lumikha at takpan ito ng isang pares ng mga layer ng tissue paper hanggang hindi makita ng 2nd IR detector ang emitter sa isang distansya na nais mong ihinto ng Lumikha ng robot upang mapanatili mula sa pagpindot sa iyo. Maaari mo itong subukan pagkatapos mong ma-hit ang pindutang I-reset at panoorin ang Advance LED upang magpatuloy kapag nasa distansya ng paghinto.

Hakbang 2: Ikabit ang Basket

Ikabit ang basket gamit ang 6-32 na mga tornilyo. Inilagay ko lang ang basket sa tuktok ng Lumikha ng robot. Mag-slide din sa likod ng gulong upang mailagay mo ang timbang sa likod ng Lumikha ng robot.

Mga Tala: - Ang robot ay maaaring magdala ng kaunting pagkarga, hindi bababa sa 30 lbs. - Ang maliit na sukat ay tila ang pinakamahirap na bahagi tungkol sa pagkuha nito upang magdala ng anumang maleta - Napakahinahon ng IR. Marahil ang paggamit ng imaging ay mas mahusay ngunit mas mahal ito

Hakbang 3: I-download ang Source Code

I-download ang Source Code
I-download ang Source Code

Sumusunod ang source code, at nakakabit sa isang text file:

/ ***** Ang ****./ ng IR sensor ** Lumikha ay susundan ng isang virtual na pader (o anumang IR na nagpapadala ng ** lakas-patlang na signal) at inaasahan na maiwasan ang mga hadlang sa proseso ***** ** / # isama ang abala.h> # isama ito.h> # isama ang # isama ang "oi.h" #define TRUE 1 # tukuyin ang MALI 0 # tukuyin ang FullSpeed 0x7FFF # tukuyin ang SlowSpeed 0x0100 # tukuyin ang SearchSpeed 0x0100 # tukuyin ang ExtraAngle 10 # tukuyin SearchLeftAngle 125 # tukuyin ang SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150 # tukuyin ang TraceDistance 250 # tukuyin ang TraceAngle 30 # tukuyin ang BackDistance 25 # tukuyin ang IRDetected (~ PINB & 0x01) // na isinasaad # tukuyin ang Handa 0 # tukuyin Sinusundan ang 1 # tukuyin ang WasFollowing 2 # tukuyin ang Paghahanap ng Kaliwa 3 # tukuyin ang Paghahanap sa Karapatang 4 # tukuyin ang TracingLeft 5 # tukuyin ang TracingRight 6 # tukuyin ang BackingTraceLeft 7 # tukuyin ang BackingTraceRight 8 // Global variablesv pabagu-bago ng isip uint16_t timer_cnt = 0; pabagu-bago ng isip uint8_t timer_on = 0; pabagu-bago ng isip uint8_t sensors_flag = 0; pabagu-bago ng isip uint8_t sensors_index = 0; pabagu-bago ng isip uint8_t sensors_in [Sen6Size]; pabagu-bago ng isip 0 = pabagu-bago ng distansya = 0; pabagu-bago ng uint8_t inRange = 0; // Functionvoid byteTx (uint8_t halaga); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void initialize (voidnob; void power 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; // Set up Lumikha at moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // set i / o para sa pangalawang IR sensorDDRB & = ~ 0x01; // set cargo bay ePort pin 3 upang maging isang inputPORTB | = 0x01; // set cargo ePort pin3 pullup pinagana // program looparily (TRUE) {// Itigil lamang bilang isang pag-iingat (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((sensor [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensor [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // naghahanap ng pindutan ng gumagamit, suriin ang madalasendayayAndUpdateSensors (10ck) (10); kung (User ButtonPressed) {delayAndUpdateSensors (1000); // aktibong loop habang (! (User ButtonPressed) && (! Sensor [SenCliffL]) && (! Sensor [SenCliffFL]) && (! Sensor [SenCliffFR]) && (! sensor [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensor [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensor [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensor [SenVWall]) {// suriin para sa kalapitan sa leaderif (inRange) {drive (0, RadStraight);} iba pa {// drive straightdrive (SlowSpeed, RadStraight); state = Sumusunod;}} iba pa {// search for the beamangle = 0; distance = 0; wait_counter = 0; found = FALSE; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Kasunod: kung (sensor [SenBumpDrop] & BumpRight) {distansya = 0; anggulo = 0; drive (-SlowSpeed, RadStraight); estado = BackingTraceLeft;} iba pa kung (sensor [SenBumpDrop] & BumpLeft) {distansya = 0; anggulo = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} iba pa kung (sensor [SenVWall]) {// suriin kung kalapitan sa leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Sumusunod;}} iba pa {// nawala lang ang signal, patuloy na dahan-dahan ang isa cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensors [SenBumpDrop] & BumpRight) {distansya = 0; anggulo = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} iba pa kung (sensor [SenBumpDrop] & BumpLeft) {distansya = 0; anggulo = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} iba pa kung (sensors [SenVWall]) {// suriin ang kalapitan sa leaderif (inRange) {drive (0, RadStraight); state = R eady;} iba pa {// drive straightdrive (FullSpeed, RadStraight); state = Sumusunod;}} iba pa kung (distansya> = CoastDistance) {drive (0, RadStraight); state = Ready;} iba pa {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (found) {if (anggulo> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Sumusunod;} iba pa {drive (SearchSpeed, RadCCW);}} iba pa kung (sensors [SenVWall]) {found = TRUE; anggulo = 0; kung (inRange) {drive (0, RadStraight); state = Ready;} iba pa {drive (SearchSpeed, RadCCW);}} iba pa kung (anggulo> = SearchLeftAngle) {drive (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} iba pa {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Sumusunod;} iba pa {drive (SearchSpeed, RadCW);}} iba pa kung (sensor [SenVWall]) {nahanap = TRUE; anggulo = 0; kung (inRange) {drive (0, RadStraight); state = Ready;} iba pa {drive (SearchSpeed, RadCCW);}} iba pa kung (wait_counter> 0) {wait_counter - = 20; drive (0, RadStraight);} iba pa kung (anggulo = Paghahanap RightAngle) {drive (0, RadStraight); wait_counter = 5000; anggulo = 0;} iba pa {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensors [SenBumpDrop] & BumpRight) {distansya = 0; anggulo = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} iba pa kung (sensor [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} iba pa kung (sensors [SenVWall]) {// check para sa kalapitan sa leaderif (inRange) {drive (0, RadStraight); state = Ready;} iba pa {// drive straightdrive (SlowSpeed, RadStraight); state = Sumusunod;}} iba pa kung (! (distansya> = TraceDistance)) { drive (SlowSpeed, RadStraight);} iba pa kung (! (- anggulo> = TraceAngle)) {drive (SearchSpeed, RadCW);} iba pa {distansya = 0; anggulo = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} iba pa kung (sensors [SenBumpDrop] & BumpLeft) {distansya = 0; anggulo = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} iba pa kung (sensors [SenVWall]) {// suriin ang kalapitan sa leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Sumusunod;}} iba pa kung (! (distansya> = TraceDistance)) {drive (SlowSpeed, RadStraight);} iba kung (! (anggulo> = TraceAngle)) {drive (SearchSpeed, RadCCW);} iba pa {distansya = 0; anggulo = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: kung (sensor [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} iba pa kung (anggulo> = TraceAngle) {distansya = 0; anggulo = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } iba pa kung (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} iba pa {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensors [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} iba pa kung (-angle> = TraceAngle) {distansya = 0; anggulo = 0; drive (SlowSpeed, RadStraight); state = TracingRight;} iba pa kung (-distansya> = BackDistance) {drive (SearchSpeed, RadCW);} iba pa {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // napansin ang cliff o userbutton, payagan ang kondisyon na patatagin (hal, ang pindutan na ilalabas) drive (0, RadStraight); delayAndUpdateSensors (2000);}}} // Serial makatanggap ng makagambala upang mag-imbak ng mga halaga ng sensorSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; kung (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Timer 1 interrupt mga pagkaantala sa oras sa msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt -; elsetimer_on = 0;} // Magpadala ng isang byte sa serial portvoid byteTx (uint8_t halaga) {habang (! (UCSR0A & _BV (UDRE0))); UDR0 = halaga;} // Pag-antala para sa tinukoy na oras sa ms nang hindi ina-update ang mga halaga ng sensor maiiwasan ang mga delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; habang (timer_on);} // Pag-antala para sa tinukoy na oras sa ms at suriin ang pangalawa IR detectorvoid delayAndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0; inRange = 0; timer_on = 1; timer_cnt = time_ms; habang (timer_on) {if (! (Timer_val == timer_cnt)) {inRange + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Pag-antala para sa tinukoy na oras sa ms at i-update ang mga halaga ng sensor na iwasan ang pagka-antalaAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; habang (timer_on) {kung (! sensors_flag) {para sa (temp = 0; temp Sen6Size; temp ++) sensors [temp] = sensors_in [temp]; // I-update ang tumatakbo na kabuuan ng distansya at angledistance + = (int) ((sensor [SenDist1] 8) | sensor [SenDist0]); anggulo + = (int) ((sensor [SenAng1] 8) | sensor [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Pinasimulan ang Mind Control & aposs ATmega168 microcontrollervoid na nagpasimula (walang bisa) {idit (); // Set I / O pinsDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Set up timer 1 upang makabuo ng isang nakakagambala bawat 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // I-set up ang serial port na may rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // I-on ang interruptssei ();} void powerOnRobot (void) {// Kung ang kapangyarihan ng Lumikha at mag-aposs ay naka-off, i-on ito (! RobotIsOn) {habang (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Delay sa estado na itoRobotPwrToggleHigh; // Mababa hanggang sa mataas na paglipat sa pag-toggle ng powerdelayMs (100); // Delay sa estado na itoRobotPwrToggleLow;} delayMs (3500); // Delay for startup}} // Palitan ang rate ng baud sa parehong Lumikha at modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code); / / Maghintay hanggang makumpleto ang pagpapadala (! (UCSR0A & _BV (TXC0))); kli (); // Palitan ang baud rate registerif (baud_code == Baud115200) UBRR0 = Ubrr115200; iba pa kung (baud_code == Baud57600) UBRR0 = Ubrr57600 kung hindi man kung (baud_code == Baud38400) UBRR0 = Ubrr38400; iba pa kung (baud_code == Baud28800) UBRR0 = Ubrr28800; iba pa kung (baud_code == Baud19200) UBRR0 = Ubrr19200; iba pa kung (baud_code == Baud14400) UBRR0 = UrRR = kung (baud_code == Baud9600) UBRR0 = Ubrr9600; iba pa kung (baud_code == Baud4800) UBRR0 = Ubrr4800; iba pa kung (baud_code == Baud2400) UBRR0 = Ubrr2400; iba pa kung (baud_code == Baud1200) UBRR0 = iba pa kung baud_code == Baud600) UBRR0 = Ubrr600; iba pa kung (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Magpadala Lumikha ng mga utos ng drive sa mga tuntunin ng tulin at radiusvoid drive (int16_t tulin, int16_t radius) {byteTx (CmdDrive); byteTx ((uint 8_t) ((bilis >> 8) & 0x00FF)); byteTx ((uint8_t) (bilis at 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Inirerekumendang: