Isi kandungan:

Cara Membuat Robo-Bellhop: 3 Langkah
Cara Membuat Robo-Bellhop: 3 Langkah

Video: Cara Membuat Robo-Bellhop: 3 Langkah

Video: Cara Membuat Robo-Bellhop: 3 Langkah
Video: CARA MENYELESAIKAN RUBIK 3X3 - TUTORIAL RUBIK BAHASA INDONESIA 2024, November
Anonim

Oleh jeffreyf Ikuti Lagi oleh pengarang:

Cara memasuki pertandingan mini Biasiswa Buat iRobot
Cara memasuki pertandingan mini Biasiswa Buat iRobot
Cara memasuki peraduan mini iRobot Create Scholarship
Cara memasuki peraduan mini iRobot Create Scholarship
Cara membuat LOLCats, kucing Mim, makro kucing, atau gambar kucing dengan kapsyen lucu
Cara membuat LOLCats, kucing Mim, makro kucing, atau gambar kucing dengan kapsyen lucu
Cara membuat LOLCats, kucing Mim, makro kucing, atau gambar kucing dengan kapsyen lucu
Cara membuat LOLCats, kucing Mim, makro kucing, atau gambar kucing dengan kapsyen lucu

Tentang: Saya suka membezakan dan memikirkan bagaimana ia berfungsi. Saya biasanya kehilangan minat selepas itu. Lebih Lanjut Mengenai jeffreyf »

Instructable ini menunjukkan cara menggunakan Buat iRobot untuk membuat bellhop bergerak. Ini ditarik sepenuhnya dengan izin dari carolDancer, dan saya meletakkannya sebagai contoh entri untuk peraduan kami. Robo-BellHop boleh menjadi pembantu peribadi anda sendiri untuk membawa beg, barang runcit, dobi, dan lain-lain, jadi anda tidak mempunyai ke. Buat asas mempunyai tong sampah yang terpasang di bahagian atas dan menggunakan dua pengesan IR on-board untuk mengikuti pemancar IR pemiliknya. Dengan kod perisian C yang sangat asas, pengguna boleh mendapatkan barang runcit berat, banyak cucian, atau beg semalaman anda ke Robo-BellHop dan meminta robot mengikuti anda di jalan, melalui pusat membeli-belah, di lorong atau melalui lapangan terbang - - ke mana sahaja pengguna perlu pergi. Operasi Asas1) Tekan butang Reset untuk menghidupkan modul arahan dan periksa sensor yang terlibat1a) LED Main harus menyala apabila melihat pemancar IR mengikuti anda1b) LED Maju harus menyala ketika robot berada pada jarak yang sangat dekat2) Tekan butang lembut hitam untuk menjalankan rutin Robo-BellHop3) Pasang pemancar IR ke pergelangan kaki dan pastikan ia dihidupkan. Kemudian muatkan keranjang dan pergi! 4) Logik Robo-BellHop adalah seperti berikut: 4a) Semasa anda berjalan-jalan, jika isyarat IR dikesan, robot akan memandu pada kelajuan maksimum4b) Sekiranya isyarat IR keluar dari jarak (dengan sudut yang terlalu jauh atau terlalu tajam), robot akan melintasi jarak pendek dengan kelajuan perlahan sekiranya isyarat diambil kembali4c) Sekiranya isyarat IR tidak dikesan, robot akan membelok kiri dan kanan dalam cubaan untuk mencari isyarat lagi pergelangan tangan pemilikHardware1 unit dinding maya iRobot - $ 301 IR detector dari RadioShack - $ 31 DB-9 penyambung lelaki dari Radio Shack - $ 44 6-32 skru dari Home Depot - $ 2,502 3V bateri, saya menggunakan bakul dobi D1 dari Target - roda tambahan $ 51 ke belakang robot Buat pita elektrik, wayar dan pateri

Langkah 1: Meliputi Sensor IR

Pasang pita elektrik untuk menutup semua kecuali celah kecil sensor IR di bahagian depan robot Buat. Membongkar unit dinding maya dan mengeluarkan papan litar kecil di bahagian depan unit. Ini agak sukar kerana terdapat banyak skru tersembunyi dan pelekap plastik. Pemancar IR berada di papan litar. Tutup pemancar IR dengan sehelai kertas tisu untuk mengelakkan pantulan IR. Pasang papan litar ke tali atau tali elastik yang boleh melilit pergelangan kaki anda. Pasangkan bateri ke papan litar supaya bateri berada di tempat yang selesa (saya membuatnya sehingga saya boleh memasukkan bateri ke dalam poket saya).

Kabelkan pengesan IR ke-2 ke penyambung DB-9 dan masukkan ke pin Cargo Bay ePort 3 (isyarat) dan pin 5 (ground). Pasang pengesan IR ke-2 ke bahagian atas sensor IR yang ada di Buat dan tutupinya dengan beberapa lapisan kertas tisu sehingga pengesan IR ke-2 tidak melihat pemancar pada jarak yang anda mahu robot Buat berhenti dari memukul anda. Anda boleh mengujinya setelah anda menekan butang Reset dan menonton LED Advance menyala ketika anda berada di jarak berhenti.

Langkah 2: Pasang Bakul

Pasang bakul menggunakan skru 6-32. Saya baru sahaja memasang bakul ke bahagian atas robot Buat. Turunkan juga roda belakang supaya anda meletakkan berat di bahagian belakang robot Buat.

Catatan: - Robot dapat membawa muatan yang cukup banyak, sekurang-kurangnya 30 lbs. - Saiz kecil sepertinya adalah yang paling sukar untuk membawanya membawa barang - IR sangat temperamental. Mungkin menggunakan pengimejan lebih baik tetapi jauh lebih mahal

Langkah 3: Muat turun Kod Sumber

Muat turun Kod Sumber
Muat turun Kod Sumber

Kod sumber mengikuti, dan dilampirkan dalam fail teks:

/ ************************************************* ******************** follow.c ** -------- ** berjalan pada Buat Modul Perintah ** menutup semua tetapi bukaan kecil di bahagian depan sensor IR ** Buat akan mengikuti dinding maya (atau mana-mana IR yang menghantar isyarat kekuatan-medan **) dan diharapkan dapat mengelakkan halangan dalam proses ***************** ************************************************** ** / # include interrupt.h> #include io.h> # include # include "oi.h" #define TRUE 1 # define FALSE 0 # define FullSpeed 0x7FFF # define SlowSpeed 0x0100 # define SearchSpeed 0x0100 #efinisikan ExtraAngle 10 # define SearchLeftAngle 125 #efinisikan SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150 # define TraceDistance 250 # define TraceAngle 30 # define BackDistance 25 # define IRDetected (~ PINB & 0x01) // state # define Ready 0 #efinisikan Mengikuti 1 # menentukan WasFollowing 2 #define SearchingLeft 3 # define SearchingRight 4 # define TracingLeft 5 # define TracingRight 6 # define BackingTraceLeft 7 #efinisikan BackingTraceRight 8 // Pemboleh ubah globalv 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 sensors_in [Sen6Size]; volatile uint8_t sensors_tile = intile = intile tidak stabil uint8_t inRange = 0; // Functionsvoid byteTx (nilai uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void inisial (void) void (void) baud (uint8_t baud_code); pemacu void (kelajuan int16_t, jejari int16_t); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int waiting_counter = 0; // Sediakan Buat dan modulinisialisasi (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // tetapkan i / o untuk sensor IR keduaDDRB & = ~ 0x01; // tetapkan cargo bay ePort pin 3 menjadi inputPORTB | = 0x01; // set cargo ePort pin3 pullup enabled // program loop while (TRUE) {// Berhenti sama seperti drive pencegahan (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((sensor [SenVWall])? LEDPlay: 0x00) | (dalam Range? LEDAdvance: 0x00)); byteTx (sensor [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // mencari butang pengguna, periksatendelayAndUpdateSensors (10); delayAndeck (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // loop aktif sementara (! (UserButtonPressed) && (! 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]) {// periksa kedekatan dengan leaderif (inRange) {drive (0, RadStraight);} lain-lain {// drive straightdrive (SlowSpeed, RadStraight); keadaan = Mengikuti;}} lain {// cari beamangle = 0; jarak = 0; tunggu_counter = 0; found = FALSE; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Follow: if (sensor [SenBumpDrop] & BumpRight) {jarak = 0; sudut = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} lain jika (sensor [SenBumpDrop] & BumpLeft) {jarak = 0; sudut = 0; pemacu (-SlowSpeed, RadStraight); state = BackingTraceRight;} lain jika (sensor [SenVWall]) {// periksa kedekatan dengan leaderif (inRange) {drive (0, RadStraight); state = Ready;} other {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} lain {// baru sahaja kehilangan isyarat, terus perlahan-lahan satu jarak kitar = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensor [SenBumpDrop] & BumpRight) {jarak = 0; sudut = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} lain jika (sensor [SenBumpDrop] & BumpLeft) {jarak = 0; sudut = 0; pemacu (-SlowSpeed, RadStraight); state = BackingTraceRight;} lain jika (sensor [SenVWall]) {// periksa kedekatan dengan pemimpin (inRange) {drive (0, RadStraight); keadaan = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} lain jika (jarak> = CoastDistance) {drive (0, RadStraight); state = Ready;} lain {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Follow;} lain {drive (SearchSpeed, RadCCW);}} lain jika (sensor [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} lain {drive (SearchSpeed, RadCCW);}} lain jika (angle> = SearchLeftAngle) {drive (SearchSpeed, RadCW); waiting_counter = 0; state = SearchingRight;} else {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); nyatakan = Mengikuti;} lain {drive (SearchSpeed, RadCW);}} lain jika (sensor [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} lain {drive (SearchSpeed, RadCCW);}} lain jika (wait_counter> 0) {waiting_counter - = 20; drive (0, RadStraight);} lain jika (angle = Search RightAngle) {drive (0, RadStraight); waiting_counter = 5000; angle = 0;} other {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensor [SenBumpDrop] & BumpRight) {jarak = 0; sudut = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} lain jika (sensor [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} lain jika (sensor [SenVWall]) {// periksa untuk jarak ke leaderif (inRange) {drive (0, RadStraight); state = Ready;} other {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} lain jika (! (jarak> = TraceDistance)) { drive (SlowSpeed, RadStraight);} lain jika (! (- angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} lain {jarak = 0; sudut = 0; pemacu (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (sensor [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} lain jika (sensor [SenBumpDrop] & BumpLeft) {jarak = 0; sudut = 0; pemacu (- SlowSpeed, RadStraight); state = BackingTraceRight;} lain jika (sensor [SenVWall]) {// periksa kedekatan dengan leaderif (inRang e) {drive (0, RadStraight); state = Ready;} other {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} lain jika (! (jarak> = TraceDistance)) {drive (SlowSpeed, RadStraight);} lain jika (! (angle> = TraceAngle)) {drive (SearchSpeed, RadCCW);} lain {jarak = 0; sudut = 0; pemacu (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (sensor [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} yang lain jika (angle> = TraceAngle) {jarak = 0; angle = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } lain jika (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} lain {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensor [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} lain jika (-angle> = TraceAngle) {jarak = 0; angle = 0; drive (SlowSpeed, RadStraight); state = TracingRight;} lain jika (-distance> = BackDistance) {drive (SearchSpeed, RadCW);} lain {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // tebing atau userbutton dikesan, membenarkan keadaan menjadi stabil (mis. butang untuk dilepaskan) pemacu (0, RadStraight); delayAndUpdateSensors (2000);}}} // Serial menerima gangguan untuk menyimpan nilai sensorSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Pemasa 1 mengganggu ke kelewatan masa dalam msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt -; elsetimer_on = 0;} // Hantar bait ke atas byteTx portvoid bersiri (nilai uint8_t) {sementara (! (UCSR0A & _BV) (UDRE0) UDR0 = nilai;} // Kelewatan untuk waktu yang ditentukan dalam ms tanpa mengemas kini nilai sensor, jangan lengahkan tundaMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Kelewatan untuk waktu yang ditentukan dalam ms dan periksa detik Detector IRvoid 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)) {dalamRentang + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Kelewatan untuk masa yang ditentukan dalam ms dan kemas kini nilai sensorvoid delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {untuk (temp = 0; temp Sen6Size; sensor suhu ++ [SenAng1] 8) | sensor [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Inisialisasi Mind Control & miliki ATmega168 mikrokontrolervoid memulakan (void) {cli (); // Tetapkan pin I / ODDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Sediakan pemasa 1 untuk menghasilkan gangguan setiap 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Sediakan port bersiri dengan rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = {_BV (UCSZ00) ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Kelewatan dalam keadaan iniRobotPwrToggleHigh; // Peralihan rendah ke tinggi untuk menukar powerdelayMs (100); // Kelewatan dalam keadaan iniRobotPwrToggleLow;} delayMs (3500); // Kelewatan untuk memulakan}} // Tukar kadar baud pada kedua Buat dan modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code); / / Tunggu sehingga penghantaran selesai sementara (! (UCSR0A & _BV (TXC0))); cli (); // Tukar register rate baud (baud_code == Baud115200) UBRR0 = Ubrr115200; lain jika (baud_code == Baud57600) UBRR00 = Ubrr5; lain jika (baud_code == Baud38400) UBRR0 = Ubrr38400; lain jika (baud_code == Baud28800) UBRR0 = Ubrr28800; lain jika (baud_code == Baud19200) UBRR0 = Ubrr19200; lain jika (baud_code == Baud14400) jika (baud_code == Baud9600) UBRR0 = Ubrr9600; yang lain jika (baud_code == Baud4800) UBRR0 = Ubrr4800; yang lain jika (baud_code == Baud2400) UBRR0 = Ubrr2400; jika tidak (baud_code == Baud1200) UBRR0 = jika baud_code == Baud600) UBRR0 = Ubrr600; lain jika (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Kirim Buat arahan pemacu dari segi halaju dan pemacu radiusvoid (kecepatan int16_t, int16_t jejari) {byteTx (CmdDrive); byteTx ((uint 8_t) ((halaju >> 8) & 0x00FF)); byteTx ((uint8_t) (halaju & 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Disyorkan: