Mündəricat:
Video: Robo-Bellhop Necə Hazırlanır: 3 Adım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:48
Müəllif tərəfindən daha çox:
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ə 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ə:
Bir LED Audio Spektr Analizatoru Necə Hazırlanır: 7 Adım (Şəkillərlə)
LED Audio Spektr Analizatoru necə hazırlanır: LED Audio Spektr Analizatoru musiqinin intensivliyinə görə gözəl işıqlandırma nümunəsi yaradır. Bazarda çox sayda DIY LED Musiqi Spektri dəsti mövcuddur, amma burada bir LED Audio Spektri hazırlayacağıq. NeoPixe istifadə edən analizator
Evdə Bahar Vibrasiya Sensoru Necə Hazırlanır ?: 5 Adım (Şəkillərlə)
Evdə Bahar Vibrasiya Sensorunu Necə Hazırlamaq olar ?: Mən "Yoxsulun" bahar Vibrasiya sensoru olan yeni bir layihə üzərində işləyirdim. akselerometr/hərəkət sensoru! Bu yay-vibrasiya açarları yüksək həssaslığa malik, istiqamətsiz titrəmə səbəb olan tətik açarlarıdır. İçəridə bir
Həqiqətən Ucuz Təzyiq Sensorları Necə Hazırlanır: 6 Adım (Şəkillərlə birlikdə)
Həqiqətən Ucuz Təzyiq Sensorları Necə Hazırlanır: Son vaxtlar adi məişət əşyalarından keçidlər hazırlayıram və ətrafımda yatan bir neçə süngərdən büdcə ilə öz təzyiq sensorumuzu hazırlamağa qərar verdim. Bunun büdcə təzyiq sensorlarının digər versiyalarından fərqli olmasının səbəbi
Mini CNC Maşını Necə Hazırlanır: 11 Adım (Şəkillərlə)
Mini CNC Maşını Necə Hazırlanır: Hamınıza salam, yaxşı işlər görürsünüz. Kompüterin bəzi qırıntıları/ işlənmiş hissələrindən istifadə edərək qura biləcəyiniz başqa çox gözəl bir layihə ilə burdayam. Bu Təlimat kitablarında, köhnə DVD Wri -dən evdə mini bir CNC Maşını necə edə biləcəyinizi sizə göstərəcəyəm
Excel -də makro necə hazırlanır və məlumatları asanlaşdırıcı şəkildə necə kopyalanır: 4 addım
Excel -də Makro Necə Hazırlanır və Məlumatları Asanlıqla Yoxlayırsınız? Salam, bu təlimat sizə nümunə olaraq göstəriləcək məlumatları kopyalayıb yapışdırmaq üçün makronu asan və daha yaxşı bir şəkildə necə yaratmağı öyrədəcək