Mündəricat:

Robo-Bellhop Necə Hazırlanır: 3 Adım
Robo-Bellhop Necə Hazırlanır: 3 Adım

Video: Robo-Bellhop Necə Hazırlanır: 3 Adım

Video: Robo-Bellhop Necə Hazırlanır: 3 Adım
Video: English Conversation - Hotel and Catering 2024, Noyabr
Anonim

Müəllif tərəfindən daha çox:

İRobot Create Təqaüd mini müsabiqəsinə necə girmək olar
İRobot Create Təqaüd mini müsabiqəsinə necə girmək olar
İRobot Create Təqaüd mini müsabiqəsinə necə girmək olar
İRobot Create Təqaüd mini müsabiqəsinə necə girmək olar
LOLCats, Meme pişikləri, Pişik makroları və ya pişik şəkillərini məzəli başlıqlarla necə etmək olar
LOLCats, Meme pişikləri, Pişik makroları və ya pişik şəkillərini məzəli başlıqlarla necə etmək olar
LOLCats, Meme pişikləri, Pişik makroları və ya pişik şəkillərini məzəli başlıqlarla necə etmək olar
LOLCats, Meme pişikləri, Pişik makroları və ya pişik şəkillərini məzəli başlıqlarla necə etmək olar

Haqqında: Bir şeyi ayırıb necə işlədiyini öyrənməyi sevirəm. Ümumiyyətlə bundan sonra marağım azalır. Jeffreyf haqqında daha çox »

Bu Təlimat, hərəkət edən bir zəng etmək üçün iRobot Create -dən necə istifadə olunacağını göstərir. Bu, carolDancerin göstərişlərinin icazəsi ilə tamamilə qaldırıldı və mən bunu müsabiqəmiz üçün nümunə bir giriş olaraq qoydum. -ə Basic Create-in yuxarı hissəsində bir zibil qutusu var və sahibinin İQ ötürücüsünü izləmək üçün on-board iki IR detektorundan istifadə edir. Çox sadə C proqram kodu ilə, istifadəçi ağır baqqal məhsulları, böyük miqdarda camaşırxana və ya bir gecəlik çantanı Robo -BellHop -a yerləşdirə bilər və robotun küçədə, ticarət mərkəzində, koridorda və ya hava limanında sizi izləməsini təmin edə bilər - - İstifadəçinin getməli olduğu hər yerdə. Əsas Əməliyyat1) Komanda modulunu işə salmaq üçün Sıfırla düyməsini vurun və sensorların işə düşdüyünü yoxlayın robot çox yaxın məsafədədir2) Robo-BellHop işini yerinə yetirmək üçün qara yumşaq düyməni vurun3) İQ ötürücüsünü ayaq biləyinə qoşun və açıldığından əmin olun. Sonra səbəti yükləyin və gedin! 4) Robo-BellHop-un məntiqi belədir: 4a) Gəzərkən İQ siqnalı aşkar edilərsə, robot maksimum sürətlə hərəkət edəcək4b) İQ siqnalı sönərsə (çox uzaq və ya çox kəskin bucaqla), robot yenidən siqnal alacağı təqdirdə yavaş sürətlə qısa məsafəni qət edəcək Siqnalı yenidən tapmağa cəhd edin4d) İQ siqnalı aşkarlansa da robot bir maneəyə çatarsa, robot maneənin ətrafında hərəkət etməyə çalışacaq4e) Robot İQ siqnalına çox yaxınlaşarsa, robot dayanmamalıdır. sahibinin ayaq biləyiHardware1 iRobot virtual divar qurğusu - RadioShack -dan 301 dollarlıq IR detektoru - Radio Shack -dən 31 dollarlıq DB -9 kişi konnektoru - Home Depotdan 44 dollar 6-32 dollarlıq vintlər - 2.502 dollarlıq 3V batareyalar, Target -dən D1 paltaryuyan səbətindən istifadə etdim - 51 dollar əlavə təkər Robot yaradın arxası Elektrik lenti, tel və lehim

Addım 1: IR Sensorunu əhatə edin

Yarad robotunun qarşısındakı kiçik İQ sensoru istisna olmaqla hamısını örtmək üçün elektrik lenti bağlayın. Virtual divar blokunu sökün və cihazın ön hissəsindəki kiçik devre kartını çıxarın. Bu, çox çətindir, çünki çoxlu gizli vintlər və plastik dayaqlar var. İQ ötürücü dövrə lövhəsindədir. İQ əks olunmaması üçün İQ ötürücüsünü bir kağız parçası ilə örtün. Dövrə lövhəsini ayaq biləyinizə sara biləcək bir kəmər və ya elastik bantla bağlayın. Batareyaları rahat bir yerə yerləşdirə bilmək üçün batareyaları elektrik kartına bağlayın (batareyaları cibimə qoya biləcəyim üçün etdim).

2-ci IR detektorunu DB-9 konnektoruna bağlayın və Cargo Bay ePort pin 3 (siqnal) və pin 5 (yerə) daxil edin. 2 -ci İR detektoru, yaratma robotunun saxlamasını dayandırmaq istədiyiniz məsafədə emitenti görməyincə, 2 -ci İK detektorunu Yarat üzərindəki mövcud İK sensorunun üstünə yapışdırın və bir neçə təbəqə kağız ilə örtün. səni vurmaqdan. Sıfırlama düyməsini vurduqdan sonra bunu sınaya bilərsiniz və dayanma məsafəsində olduğunuzda Davam Etmə LEDinin davam etməsini izləyə bilərsiniz.

Addım 2: Səbəti bağlayın

Səbəti 6-32 vintlə bağlayın. Səbəti yarat robotunun üstünə qoymuşdum. Yarat robotunun arxasına ağırlıq yerləşdirmək üçün arxa təkərdə də sürüşün.

Qeydlər: - Robot olduqca az yük, ən az 30 lb daşıya bilir. - Kiçik ölçü hər hansı bir baqajı daşımağın ən çətin tərəfi kimi görünürdü - İR çox temperamentlidir. Bəlkə də görüntüdən istifadə etmək daha yaxşıdır, amma daha bahalıdır

Addım 3: Mənbə Kodunu Yükləyin

Mənbə Kodunu Yükləyin
Mənbə Kodunu Yükləyin

Mənbə kodu aşağıdakı kimi gəlir və mətn faylına əlavə olunur:

/*********************************************** ******************** follow.c ** -------- ** Yarat Komanda Modulu üzərində çalışır ** ön tərəfdəki kiçik açılışlardan başqa hamısını əhatə edir IR sensoru ** Yarat virtual divar (və ya hər hansı bir İQ ** qüvvə sahə siqnalını göndərəcək) izləyəcək və inşallah prosesdəki əngəllərin qarşısını alacaq ***************** ************************************************ **/#daxil interrupt.h>#io.h daxil et##daxil et "oi.h" daxil et#DOĞRU 1 təyin et#YALAN təyin et#TamSürəti təyin et 0x7FFF#SlowSpeed təyin et 0x0100#SearchSpeed təyin et 0x0100#ƏlavəAngle 10 təyin et SearchLeftAngle 125#SearchRightAngle təyin edin (SearchLeftAngle - 1000)#Sahil Məsafəsini təyin edin 150#TraceDistance 250 müəyyən edin#TraceAngle 30 təyin edin#Uzaq məsafəni təyin edin 25#IRDetected təyin edin (~ PINB & 0x01) // dövlətlər#hazır Ready 0#müəyyən edin 1#WasFollowing 2 #AxtarışSolunu 3 təyin et#AxtarışReytini təyin et 4#İzləməSolunu təyin et 5#İzləməHaqqını təyin et 6#BackingTraceLeftini təyin et#BackingTraceRight 8 -i təyin et // Qlobal dəyişənlər olatile uint16_t timer_cnt = 0; uçucu uint8_t timer_on = 0; uçucu uint8_t sensörler_flag = 0; uçucu uint8_t sensorlar_index = 0; uçucu uint8_t sensorlar_in [Sen6Size]; uçucu uint8_tensiz_ölçülü_ sensorlar [Sen6 0 = 0 uçucu uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t dəyəri); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void (void) baud (uint8_t baud_code); boş sürücü (int16_t sürət, int16_t yarıçapı); uint16_t təsadüfiAngle (boşluq); void defineSongs (void); int main (void) {// vəziyyət dəyişənuint8_t vəziyyət = Hazır; int tapıldı = 0; int wait_counter = 0; // Create və moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // ikinci IR sensoru üçün i/o qurunDDRB & = ~ 0x01; // yük yuvası ePort pin 3 -ü giriş olaraq təyin edinPORTB | = 0x01; // yük ePort pin3 çəkilməsini aktivləşdirin // proqram döngəsi olarkən (TRUE) {// Sadəcə bir ehtiyat sürücüsü olaraq dayandırın (0, RadStraight); // LEDsbyteTx (CmdLeds); byteTx (((sensorlar [SenVWall])? LEDPlay: 0x00) | (InRange? LEDAdvance: 0x00)); byteTx (sensorlar [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // istifadəçi düyməsini axtarırsınız, oftendelayAndUpdateAndors yoxlayın (10); (10); əgər (UserButtonPressed) {delayAndUpdateSensors (1000); // aktiv döngə (! (UserButtonPressed) && (! Sensorlar [SenCliffL]) && (! Sensorlar [SenCliffFL]) && (! Sensorlar [SenCliffFR]) && (! sensorlar [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensorlar [SenVWall])? LEDPlay: 0x00) | (InRange? LEDAdvance: 0x00)); byteTx (sensorlar [SenCharge1])); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensorlar [SenVWall]) {// Leader (inRange) {drive (0, RadStraight);} başqa {// drivedrive (SlowSpeed, RadStraight); vəziyyət = İzlənilir;}} başqa {// beamangle üçün axtarış = 0; məsafə = 0; wait_counter = 0; tapıldı = FALSE; sürücü (SearchSpeed, RadCCW); vəziyyət = SearchingLeft;} fasilə; hal Aşağıdakı: əgər (sensorlar [SenBumpDrop] & BumpRight) {məsafə = 0; bucaq = 0; sürücü (-SlowSpeed, RadStraight); state = BackingTraceLeft;} if if (sensorlar [SenBumpDrop] & BumpLeft) {məsafə = 0; bucaq = 0; sürücü (-SlowSpeed, RadStraight); state = BackingTraceRight;} başqa halda (sensorlar [SenVWall]) {// yoxlayın liderə yaxınlıq (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} başqa {// siqnalı itirmişik, yavaş -yavaş davam edin cycledistance = 0; sürücü (SlowSpeed, RadStraight); vəziyyət = WasFollowing;} fasilə; case WasFollowing: əgər (sensorlar [SenBumpDrop] & BumpRight) {məsafə = 0; bucaq = 0; sürücü (-SlowSpeed, RadStraight); vəziyyət = BackingTraceLeft;} başqa halda (sensorlar [SenBumpDrop] & BumpLeft) {məsafə = 0; bucaq = 0; sürücü (-SlowSpeed, RadStraight); vəziyyət = BackingTraceRight;} başqa halda (sensorlar [SenVWall]) {// liderin yaxınlığını yoxlayın (inRange) {sürücü (0, RadStraight); vəziyyət = R eady;} başqa {// sürücü düz sürücü (FullSpeed, RadStraight); vəziyyət = İzlənilir;}} başqa halda (məsafə = = Sahil Məsafəsi) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa {sürücü (SlowSpeed, RadStraight);} break; case SearchingLeft: əgər (tapılıbsa) {əgər (bucaq> = ExtraAngle) {sürücü (SlowSpeed, RadStraight); vəziyyət = İzlənilir;} başqa {sürücü (SearchSpeed, RadCCW);}} başqa halda (sensorlar [SenVWall]) {tapılan = TRUE; bucaq = 0; əgər (inRange) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa {sürücü (SearchSpeed, RadCCW);}} başqa halda (bucaq> = SearchLeftAngle) {sürücü (SearchSpeed), RadCW); wait_counter = 0; state = SearchingRight;} başqa {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); vəziyyət = İzlənir;} başqa {sürücü (SearchSpeed, RadCW);}} başqa halda (sensorlar [SenVWall]) {tapıldı = DOĞRU; bucaq = 0; əgər (inRange) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa {drive (SearchSpeed, RadCCW);}} if if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} if if (angle = Axtar RightAngle) {sürücü (0, RadStraight); wait_counter = 5000; bucaq = 0;} başqa {sürücü (SearchSpeed, RadCW);} qır; case TracingLeft: əgər (sensorlar [SenBumpDrop] & BumpRight) {məsafə = 0; bucaq = 0; sürücü (-SlowSpeed, RadStraight); vəziyyət = BackingTraceLeft;} başqa halda (sensorlar [SenBumpDrop] & BumpLeft) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa halda (sensorlar [SenVWall]) {// yoxlayın liderə (inRange) yaxınlıq üçün {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} else if (! (məsafə> = TraceDistance)) { sürücü (SlowSpeed, RadStraight);} başqa halda (! (-açı> = TraceAngle)) {sürücü (SearchSpeed, RadCW);} başqa {məsafə = 0; bucaq = 0; sürücü (SlowSpeed, RadStraight); vəziyyət = Hazır; } break; case TracingRight: if (sensorlar [SenBumpDrop] & BumpRight) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa halda (sensorlar [SenBumpDrop] & BumpLeft) {məsafə = 0; bucaq = 0; sürücü (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensorlar [SenVWall]) {// liderə (inRang) yaxınlığı yoxlayın e) {drive (0, RadStraight); state = Ready;} else {// drivedrive (SlowSpeed, RadStraight); state = izləyir;}} if if (! (məsafə> = TraceDistance)) {drive (SlowSpeed, RadStraight);} başqa halda (! (bucaq> = TraceAngle)) {sürücü (SearchSpeed, RadCCW);} başqa {məsafə = 0; bucaq = 0; sürücü (SlowSpeed, RadStraight); vəziyyət = Hazır;} fasilə; halda BackingTraceLeft: if (sensorlar [SenVWall] && inRange) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa halda (bucaq> = TraceAngle) {məsafə = 0; bucaq = 0; sürücü (SlowSpeed, RadStraight); vəziyyət = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensorlar [SenVWall] && inRange) {sürücü (0, RadStraight); vəziyyət = Hazır;} başqa halda (-angle> = TraceAngle) {məsafə = 0; bucaq = 0; sürücü (SlowSpeed, RadStraight); vəziyyət = TracingRight;} başqa halda (-distance> = BackDistance) {drive (SearchSpeed), RadCW);} başqa {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // uçurum və ya istifadəçi düyməsi aşkar edildi, vəziyyətin sabitləşməsinə icazə verin (məsələn, düyməni buraxmaq) sürücü (0, RadStraight); delayAndUpdateSensors (2000);}}} // Sensor dəyərlərinin saxlanması üçün seriya qəbulu fasiləsiSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; əgər (sensorlar_flag) {sensors_in [sensors_index ++] = temp; əgər (sensorlar_index> = Sen6Size) sensorlar_flag = 0;}} // Taymer 1 fasilə msSIGNAL (SIG_OUTPUT_COMPARE1A) gecikmələrinə {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Serial portvoid byteTx (uint8_t dəyəri) {while (! (UCSR0A & _BV) (UDRE0) üzərində bir bayt ötürün UDR0 = dəyər;} // Sensor dəyərlərini yeniləmədən ms -də göstərilən müddət üçün gecikmə 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 -də göstərilən vaxtın gecikməsi və sensor dəyərlərinin gecikdirilməsiAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; temp Sen6Size; temp ++) sensorlar [temp] = sensorlar_ [temp]; // Məsafə və bucaq məsafəsinin işləyən cəmlərini yeniləyin += (int) ((sensorlar [SenDist1] 8) | sensorlar [SenDist0]); açı += (int) ((sensorlar) [SenAng1] 8) | sensorlar [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}}} // Ağıl İdarəçiliyini işə salın və ATmega168 mikro idarəedicisini işə salın (boş) {cli (); // I/O pinlərini təyin edinDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Hər 1 ms -də bir fasilə yaratmaq üçün timer 1 qurun (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Serial portu rx interruptUBRR0 = 19 ilə qurun; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)));; ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Bu vəziyyətdə gecikməRobotPwrToggleHigh; // PowerdelayMs keçid üçün aşağıdan yuxarıya keçid (100); // Bu vəziyyətdə gecikməRobotPwrToggleLow;} delayMs (3500); // Başlanğıc üçün gecikmə}} // Həm yaradın, həm də modulevoid baud (uint8_t baud_code) üzrə keçid sürətini dəyişdirin {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Göndərmə tamamlanana qədər gözləyin (! (UCSR0A & _BV (TXC0)))); cli (); // Baud dərəcəsi registrini dəyişdirin (baud_code == Baud115200) UBRR0 = Ubrr115200; başqa halda (baud_code == Baud57600) UBRR0 = Ubr; else if (baud_code == Baud38400) UBRR0 = Ubrr38400; else if (baud_code == Baud28800) UBRR0 = Ubrr28800; else if (baud_code == Baud19200) UBRR0 = Ubrr19200; else if (baud_r44 == BaudRc400 == if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; else if (baud_code = URR120000) baud_code == Baud600) UBRR0 = Ubrr600; başqa halda (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}}} Göndərin Sürət və radiusvoid sürücü (int16_t sürət, int16_t baxımından sürücü əmrləri yaradın) radius) {byteTx (CmdDrive); byteTx ((uint 8_t) ((sürət >> 8) & 0x00FF)); byteTx ((uint8_t) (sürət və 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius) & 0x00FF));}

Tövsiyə: