Daftar Isi:
Video: Cara Membuat Robo-Pelayan: 3 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:58
Oleh jeffreyfIkuti Lainnya oleh penulis:
Tentang: Saya suka membongkar sesuatu dan mencari tahu cara kerjanya. Saya biasanya kehilangan minat setelah itu. Selengkapnya Tentang jeffreyf »
Instruksi ini menunjukkan cara menggunakan iRobot Create untuk membuat bellhop bergerak. Ini diangkat sepenuhnya dengan izin dari instruksi carolDancer, dan saya memasukkannya sebagai sampel entri untuk kontes kami. Robo-BellHop dapat menjadi asisten pribadi Anda sendiri untuk membawa tas, bahan makanan, binatu, dll., sehingga Anda tidak perlu ke. Buat dasar memiliki nampan yang terpasang di bagian atas dan menggunakan dua detektor IR terpasang untuk mengikuti pemancar IR pemiliknya. Dengan kode perangkat lunak C yang sangat dasar, pengguna dapat mengamankan bahan makanan berat, banyak cucian, atau tas semalam Anda ke Robo-BellHop dan membuat robot mengikuti Anda di jalan, melalui mal, menyusuri lorong atau melalui bandara - - ke mana pun pengguna harus pergi. Pengoperasian Dasar1) Tekan tombol Atur Ulang untuk mengaktifkan modul perintah dan periksa apakah sensor aktif1a) LED Putar harus menyala saat melihat pemancar IR mengikuti Anda1b) LED Lanjutan harus menyala saat robot berada pada jarak yang sangat dekat2) Tekan tombol lunak hitam untuk menjalankan rutinitas Robo-BellHop3) Pasang pemancar IR ke pergelangan kaki dan pastikan sudah dihidupkan. Kemudian muat keranjang dan pergi!4) Logika Robo-BellHop adalah sebagai berikut:4a) Saat Anda berjalan-jalan, jika sinyal IR terdeteksi, robot akan melaju dengan kecepatan maksimal4b) Jika sinyal IR padam jangkauan (dengan sudut terlalu jauh atau terlalu tajam), robot akan melintasi jarak pendek dengan kecepatan lambat jika sinyal diambil lagi4c) Jika sinyal IR tidak terdeteksi, robot akan berbelok ke kiri dan kanan dalam mencoba mencari sinyal lagi4d) Jika sinyal IR terdeteksi tetapi robot menabrak rintangan, robot akan mencoba untuk melewati rintangan4e) Jika robot sangat dekat dengan sinyal IR, robot akan berhenti untuk menghindari menabrak pergelangan kaki pemilikHardware1 iRobot unit dinding virtual - $301 detektor IR dari RadioShack - $31 DB-9 konektor laki-laki dari Radio Shack - $44 6-32 sekrup dari Home Depot - $2,502 baterai 3V, saya menggunakan keranjang cucian D1 dari Target - $51 roda ekstra ke bagian belakang Buat robot Pita listrik, kawat dan solder
Langkah 1: Menutupi Sensor IR
Pasang pita listrik untuk menutupi semua kecuali celah kecil dari sensor IR di bagian depan robot Create. Bongkar unit dinding virtual dan ekstrak papan sirkuit kecil di bagian depan unit. Ini agak rumit karena ada banyak sekrup tersembunyi dan dudukan plastik. Pemancar IR ada di papan sirkuit. Tutupi pemancar IR dengan selembar kertas tisu untuk menghindari pantulan IR. Pasang papan sirkuit ke tali atau karet gelang yang bisa membungkus pergelangan kaki Anda. Hubungkan baterai ke papan sirkuit sehingga Anda dapat meletakkan baterai di tempat yang nyaman (saya membuatnya agar baterai dapat dimasukkan ke dalam saku).
Pasang detektor IR ke-2 ke konektor DB-9 dan masukkan ke dalam Cargo Bay ePort pin 3 (sinyal) dan pin 5 (arde). Pasang detektor IR ke-2 ke bagian atas sensor IR yang ada pada Buat dan tutupi dengan beberapa lapis kertas tisu sampai detektor IR ke-2 tidak melihat emitor pada jarak yang Anda inginkan agar robot Buat berhenti untuk menjaga dari memukul Anda. Anda dapat menguji ini setelah Anda menekan tombol Reset dan melihat LED Advance menyala saat Anda berada di jarak berhenti.
Langkah 2: Pasang Keranjang
Pasang keranjang menggunakan sekrup 6-32. Saya baru saja memasang keranjang ke bagian atas robot Buat. Juga geser di roda belakang sehingga Anda menempatkan beban di bagian belakang robot Buat.
Catatan: - Robot dapat membawa cukup banyak beban, setidaknya 30 lbs. - Ukurannya yang kecil tampaknya menjadi bagian tersulit dalam membawanya untuk membawa barang bawaan apa pun - IR sangat temperamental. Mungkin menggunakan pencitraan lebih baik tetapi jauh lebih mahal
Langkah 3: Unduh Kode Sumber
Kode sumber berikut, dan dilampirkan dalam file teks:
/************************************************ ******************** follow.c ** -------- ** berjalan di Create Command Module ** menutupi semua kecuali lubang kecil di bagian depan dari sensor IR ** Buat akan mengikuti dinding virtual (atau IR apa pun yang mengirimkan ** sinyal medan gaya) dan semoga menghindari rintangan 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#define ExtraAngle 10#define SearchLeftAngle 125#mendefinisikan SearchRightAngle (SearchLeftAngle - 1000)#menentukan CoastDistance 150#menentukan TraceDistance 250#mendefinisikan TraceAngle 30#menentukan BackDistance 25#menentukan IRDTerdeteksi (~PINB & 0x01)//status#mendefinisikan Siap 0#menentukan Mengikuti 1#menentukan 2 Mendefinisikan #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8// Variabel globalv volatil uint16_t timer_cnt = 0; volatil uint8_t timer_on = 0; volatil uint8_t sensor_flag = 0; volatil uint8_t sensor_index = 0; volatil uint8_t sensor_in[Ukuran Sen6];sensor uint8_t volatil[Ukuran Sen6];jarak int16_volatil = 0_sudut int16_volatil volatile uint8_t inRange = 0;// Functionsvoid byteTx(uint8_t value);void delayMs(uint16_t time_ms);void delayAndCheckIR(uint16_t time_ms);void delayAndUpdateSensors(unsigned int time_ms);void initialize(void);void powerOnRobot(void int time_ms); 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 = Siap;int ditemukan = 0;int wait_counter = 0;// Atur Create dan moduleinitialize();LEDBothOff;powerOnRobot();byteTx(CmdStart);baud(Baud28800);byteTx(CmdControl);byteTx(CmdFull);// set i/o untuk sensor IR keduaDDRB &= ~0x01; //set pin 3 ePort ruang kargo menjadi inputPORTB |= 0x01; //set kargo ePort pin3 pullup diaktifkan// program loopwhile(TRUE){// Berhenti hanya sebagai tindakan pencegahan(0, RadStraight);// set LEDsbyteTx(CmdLeds);byteTx(((sensors[SenVWall])?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(64);IRDetected?LED2On:LED2Off;inRange?LED1On:LED1Off;//mencari tombol pengguna, periksa seringdelayAndUpdateSensors(10);delayAndCheckIR (10);if(UserButtonPressed) {delayAndUpdateSensors(1000);//active loopwhile(!(UserButtonPressed)&&(!sensors[SenCliffL])&&(!sensors[SenCliffFL])&&(!sensors[SenCliffFR])&&(! sensor[SenCliffR])) {byteTx(CmdLeds);byteTx(((sensors[SenVWall])?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(255);IRDetected ?LED2On:LED2Off;inRange?LED1On:LED1Off;switch(state) {case Ready:if(sensors[SenVWall]) {//periksa kedekatan dengan leaderif(inRange) {drive(0, RadStraight);} else {// drive straightdrive(SlowSpeed, RadStraight);state = following;}} else {//search for the beamangle = 0;distance = 0;wait_counter = 0;ditemukan = FALSE;drive(SearchSpeed, RadCCW);state = SearchingLeft;}break;case Mengikuti:if(sensors[SenBumpDrop] & BumpRight) {jarak = 0;angle = 0;drive(-SlowSpeed, RadStraight); state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {jarak = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if(sensors[SenVWall]) {//periksa kedekatan dengan leaderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(FullSpeed, RadStraight);state = Mengikuti;}} else {// baru saja kehilangan sinyal, terus berjalan perlahan satu cycledistance = 0;drive(SlowSpeed, RadStraight);state = WasFollowing;}break;case WasFollowing:if(sensors[SenBumpDrop] & BumpRight) {jarak = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {jarak = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensor[SenVWall]) {//periksa kedekatan dengan leaderif (inRange) {drive(0, RadStraight);status = R eady;} else {//drive straightdrive(FullSpeed, RadStraight);state = Mengikuti;}} else if (jarak >= CoastDistance) {drive(0, RadStraight);state = Ready;} else {drive(SlowSpeed, RadStraight);}break;case SearchingLeft:if(ditemukan) {if (angle >= ExtraAngle) {drive(SlowSpeed, RadStraight);state = Mengikuti;} else {drive(SearchSpeed, RadCCW);}} else if (sensor[SenVWall]) {ditemukan = 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(ditemukan) {if (-angle >= ExtraAngle) {drive(SlowSpeed, RadStraight);status = Mengikuti;} else {drive(SearchSpeed, RadCW);}} else if (sensors[SenVWall]) {ditemukan = TRUE;angle = 0;if (inRange) {drive(0, RadStraight);state = Ready;} else {drive(SearchSpeed, RadCCW);}} else if(wait_counter > 0) {wait_counter -= 20;drive(0, RadStraight);} else if (angle = Cari RightAngle) {drive(0, RadStraight);wait_counter = 5000;angle = 0;} else {drive(SearchSpeed, RadCW);}break;case TracingLeft:if(sensors[SenBumpDrop] & BumpRight) {jarak = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {drive(0, RadStraight);state=Ready;} else if (sensor[SenVWall]) {//centang untuk kedekatan dengan leaderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = Mengikuti;}} else if (!(jarak >= TraceDistance)) { drive(SlowSpeed, RadStraight);} else if (!(-angle >= TraceAngle)) {drive(SearchSpeed, RadCW);} else {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);status = Siap; }break;case TracingRight:if(sensors[SenBumpDrop] & BumpRight) {drive(0, RadStraight);state=Ready;} else if(sensors[SenBumpDrop] & BumpLeft) {jarak = 0;angle = 0;drive(- SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {//periksa kedekatannya dengan leaderif(inRang e) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = Mengikuti;}} else if (!(jarak >= TraceDistance)) {drive(SlowSpeed, RadStraight);} else if (!(angle >= TraceAngle)) {drive(SearchSpeed, RadCCW);} else {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = Ready;}break;case BackingTraceLeft: if (sensor[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 (sensors[SenVWall] && inRange) {drive(0, RadStraight);state = Ready;} else if (-angle >=TraceAngle) {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = TracingRight;} else if (-distance >= BackDistance) {drive (SearchSpeed, RadCW);} else {drive(-SlowSpeed, RadStraight);}break;default://stopdrive(0, RadStraight);status = Re ady;break;}delayAndCheckIR(10);delayAndUpdateSensors(10);}//cliff atau tombol pengguna terdeteksi, biarkan kondisi stabil (mis., tombol dilepas)drive(0, RadStraight);delayAndUpdateSensors(2000);}}} // Serial menerima interupsi 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;}}// Timer 1 interupsi untuk waktu tunda dalam msSIGNAL(SIG_OUTPUT_COMPARE1A){if(timer_cnt)timer_cnt--;elsetimer_on = 0;}// Mengirimkan satu byte melalui portvoid serial byteTx(nilai uint8_t){ while(!(UCSR0A & _BV(UDRE0))); UDR0 = value;}// Delay untuk waktu yang ditentukan dalam ms tanpa memperbarui nilai sensorvoid delayMs(uint16_t time_ms){timer_on = 1;timer_cnt = time_ms; while(timer_on);}// Delay untuk waktu yang ditentukan dalam ms dan periksa detik Detektor IRvoid delayAndCheckIR(uint16_t time_ms){uint8_t timer_val = 0;inRange = 0;timer_on = 1;timer_cnt = time_ms;sementara(timer_on) {if(!(timer_val == timer_cnt)) {inRange + = IRDetected;timer_val = timer_cnt;}}inRange = (inRange>=(time_ms>>1));}// Delay untuk waktu yang ditentukan dalam ms dan perbarui nilai sensorvoid delayAndUpdateSensors(uint16_t time_ms){uint8_t temp;timer_on = 1; timer_cnt = time_ms;sementara(timer_on){if(!sensors_flag){untuk(temp = 0; temp Sen6Ukuran; temp++)sensors[temp] = sensor_in[temp];// Perbarui total jarak dan jarak sudut += (int)((sensors[SenDist1] 8) | sensor[SenDist0]);angle += (int)((sensors) [SenAng1] 8) | sensor[SenAng0]);byteTx(CmdSensors);byteTx(6);sensors_index = 0;sensors_flag = 1;}}}// Inisialisasi Mind Control&aposs mikrokontroler ATmega168void initialize(void){cli(); // Atur pin I/ODDRB = 0x10;PORTB = 0xCF;DDRC = 0x00;PORTC = 0xFF;DDRD = 0xE6;PORTD = 0x7D;// Atur timer 1 untuk menghasilkan interupsi setiap 1 msTCCR1A = 0x00;TCCR1B = (_BV (WGM12) | _BV(CS12));OCR1A = 71;TIMSK1 = _BV(OCIE1A);// Siapkan port serial dengan rx interruptUBRR0 = 19;UCSR0B = (_BV(RXCIE0) | _BV(TXEN0) | _BV(RXEN0));UCSR0C = (_BV(UCSZ00) | _BV(UCSZ01));// Nyalakan interruptssei();}void powerOnRobot(void){// Jika daya Create mati, hidupkan onif(!RobotIsOn){ while(!RobotIsOn){RobotPwrToggleLow;delayMs(500); // Penundaan dalam keadaan iniRobotPwrToggleHigh; // Transisi rendah ke tinggi untuk beralih powerdelayMs(100); // Delay dalam keadaan iniRobotPwrToggleLow;}delayMs(3500); // Delay for startup}}// Mengaktifkan baud rate pada Create dan modulevoid baud(uint8_t baud_code){if(baud_code = 11){byteTx(CmdBaud);UCSR0A |= _BV(TXC0);byteTx(baud_code);/ / Tunggu sampai pengiriman selesai while(!(UCSR0A & _BV(TXC0)));cli();// Ganti baud rate registerif(baud_code == Baud115200)UBRR0 = Ubrr115200;else if(baud_code == Baud57600)UBRR0 = Ubrr57600;else if(baud_code == Baud38400)UBRR0 = Ubrr38400;else if(baud_code == Baud28800)UBRR0 = Ubrr28800;else if(baud_code == Baud19200)UBRR0 = Ubrr19200;else if(baud_code == Baud14400)UB4000;el if(baud_code == Baud9600)UBRR0 = Ubrr9600;else if(baud_code == Baud4800)UBRR0 = Ubrr4800;else if(baud_code == Baud2400)UBRR0 = Ubrr2400;else if(baud_code == Baud1200)UBRR0 = Ubrr1200;else if(baud_code == Baud600)UBRR0 = Ubrr600;else if(baud_code == Baud300)UBRR0 = Ubrr300;sei();delayMs(100);}}// Kirim Buat perintah drive dalam hal kecepatan dan radiusvoid drive(kecepatan int16_t, int16_t radius){byteTx(CmdDrive);byteTx((uint 8_t)((kecepatan >> 8) & 0x00FF));byteTx((uint8_t)(kecepatan & 0x00FF));byteTx((uint8_t)((jari-jari >> 8) & 0x00FF));byteTx((uint8_t)(jari-jari & 0x00FF));}
Direkomendasikan:
Cara Membuat Drone Menggunakan Arduino UNO - Membuat Quadcopter Menggunakan Mikrokontroler: 8 Langkah (dengan Gambar)
Cara Membuat Drone Menggunakan Arduino UNO | Membuat Quadcopter Menggunakan Mikrokontroler: PendahuluanKunjungi Saluran Youtube Saya Drone adalah gadget (produk) yang sangat mahal untuk dibeli. Pada postingan kali ini saya akan membahas, bagaimana cara membuatnya dengan harga murah?? Dan Bagaimana Anda bisa membuat sendiri seperti ini dengan harga murah … Nah di India semua bahan (motor, ESC
Cara Membuat Robot Line Follower Terkecil di Dunia (robo Rizeh): 7 Langkah (dengan Gambar)
Cara Membuat Robot Line Follower Terkecil di Dunia (robo Rizeh): Cara membuat robot line follower (vibrobot) terkecil di dunia "roboRizeh" berat : 5gr ukuran : 19x16x10 mm by : Naghi Sotoudeh Kata "Rizeh" adalah kata Persia yang berarti "kecil". Rizeh adalah ro
Cara Membuat Trafo SMPS - Rumah Membuat 12V 10A Switching Power Supply: 6 Langkah
Cara Membuat Trafo SMPS | Rumah Membuat 12V 10A Switching Power Supply: Dengan trafo dari PSU komputer lama. Saya mencoba membuat 12V 10A (SMPS) di rumah. Saya menggunakan SprintLayout untuk membuat PCB dan metode besi untuk membuat papan PCB. Di video ini kalian bisa melihat saya menggulung trafo SMPSUntuk mudah membuat PCB kalian bisa mendownload
Music Reactive Light--Cara Membuat Lampu Reaktif Musik Super Sederhana untuk Membuat Desktop Menakjubkan.: 5 Langkah (dengan Gambar)
Music Reactive Light||Cara Membuat Lampu Reaktif Musik Super Sederhana untuk Membuat Desktop Mengagumkan.: Hai apa kabar, Hari ini kita akan membuat proyek yang sangat menarik. Hari ini kita akan membuat lampu reaktif musik. LED akan berubah kecerahannya sesuai dengan bass yang sebenarnya adalah sinyal audio frekuensi rendah. Pembuatannya sangat mudah. Kami akan
Cara Membuat Kalender Kakek & Scrapbook (Bahkan Jika Anda Tidak Tahu Cara Membuat Scrapbook): 8 Langkah (dengan Gambar)
Cara Membuat Kalender Kakek & Scrapbook (bahkan Jika Anda Tidak Tahu Cara Membuat Scrapbook): Ini adalah hadiah liburan yang sangat ekonomis (dan sangat dihargai!) untuk kakek-nenek. Saya membuat 5 kalender tahun ini dengan harga masing-masing kurang dari $7. Bahan: 12 foto bagus anak Anda, anak-anak, keponakan, anjing, kucing, atau kerabat lainnya12 bagian berbeda