Daftar Isi:

Cara Membuat Robo-Pelayan: 3 Langkah
Cara Membuat Robo-Pelayan: 3 Langkah

Video: Cara Membuat Robo-Pelayan: 3 Langkah

Video: Cara Membuat Robo-Pelayan: 3 Langkah
Video: Siswa SMK Membuat Robot Untuk Membantu Difabel | HITAM PUTIH (13/02/20) Part 4 2024, November
Anonim

Oleh jeffreyfIkuti Lainnya oleh penulis:

Cara mengikuti kontes mini iRobot Create Scholarship
Cara mengikuti kontes mini iRobot Create Scholarship
Cara mengikuti kontes mini iRobot Create Scholarship
Cara mengikuti kontes mini iRobot Create Scholarship
Cara membuat LOLCats, Meme kucing, Cat macro, atau gambar kucing dengan caption lucu
Cara membuat LOLCats, Meme kucing, Cat macro, atau gambar kucing dengan caption lucu
Cara membuat LOLCats, Meme kucing, Cat macro, atau gambar kucing dengan caption lucu
Cara membuat LOLCats, Meme kucing, Cat macro, atau gambar kucing dengan caption lucu

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

Unduh Kode Sumber
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: