Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

WALTER - Serangga Photovore Arduino

Komponen dan persediaan

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Sensor Ultrasonik - HC-SR04 (Generik)
× 3
Photodiode
× 4
Resistor 100k ohm
× 4
MG90S Metal Geared Micro Servo
× 5
Paket Daya Portabel untuk Ponsel Cerdas (2 Saluran:1A, dan 2.1 A)
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Pistol lem panas (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

[Maafkan bahasa Inggris saya]

Saya sangat menyukai pengaturan populer 2 servos arduino serangga di Youtube. Ketika saya melihatnya, saya selalu ingat apa yang dilakukan orang-orang robot BEAM jauh sebelum pengaturan itu menjadi favorit. Orang-orang yang fanatik dengan robot analog ini tampil lebih baik dalam gaya berjalan karena sudut yang lebih baik antara kedua motor (microcore / bicore walker , dll).

Namun, menurut saya, tidak satu pun dari yang disebutkan sebelumnya terlihat lebih hidup daripada VBug1.5 (juga dikenal sebagai Walkman) yang dibuat oleh pendiri beam robotic, Mark Tilden. Ini menggunakan 5 motor, sehingga memiliki lebih banyak kemampuan manuver.

Membuat robot BEAM sederhana tidaklah sulit, tetapi membuat sesuatu yang rumit seperti VBug1.5 bisa menyulitkan bagi pemula elektronik seperti saya. Jadi, ketika saya memutuskan untuk membuat sesuatu seperti bug Tilden, saya harus memilih platform arduino, pilihan termudah untuk non-insinyur (atau dalam kasus saya, yang memalukan, calon insinyur).

Hasilnya, saya membuat Walter , robot arduino berkaki 4 dengan 5 servo. Anda mungkin bertanya-tanya, jika saya ingin membuat robot serangga yang terlihat hidup, mengapa saya tidak menggunakan 8 atau 12 servo sebagai gantinya. Yah, saya sedang memikirkan sesuatu yang paling sederhana yang bisa saya lakukan untuk mendapatkan kemampuan manuver yang paling saya miliki. Saya berbicara tentang menggunakan banyak lem daripada membuat bingkai.

PERILAKU

Seperti banyak robot arduino lainnya, Walter dapat menghindari rintangan menggunakan sensor ultrasonik HC-SR04. Untuk menambahkan karakter sebagai bug, Walter juga seorang photovore, artinya dia tertarik pada cahaya. Fotodioda digunakan untuk mendeteksi cahaya. Ada nilai acak yang dihasilkan dalam sketsa arduino untuk membuat Walter memutuskan kapan dia ingin berhenti untuk beristirahat, dan juga untuk mengubah kecepatan kiprahnya secara acak (3 kecepatan).

Ketika saya mulai, saya bermaksud memiliki tombol bijaksana di bawah masing-masing kaki Walter sehingga dia akan memiliki sensor permukaan. Tetapi baterai (bank daya portabel untuk ponsel cerdas) membebani servos dengan banyak bobot. Saya tahu tombol bijaksana hampir tidak ada yang perlu dikhawatirkan untuk menambah berat, tapi ironisnya berat robot tidak cukup untuk bisa menekan tombol terbalik.

Saya berencana membuat Walter versi 2 dengan servo yang lebih besar dan kemudian menyertakan tombol ini sebagai sensor permukaan.

detail selengkapnya

Kode

  • WALTER.ino
WALTER.inoArduino
/*WALTER - THE 4 LEGGED PHOTOVORESketsa Arduino ini adalah upaya saya untuk membuat robot 5 servo berkaki (4 berkaki) bernama "WALTER". Untuk menggunakan sketsa ini, Anda mungkin perlu mengubah beberapa nilai untuk kenyamanan Anda atau untuk menyesuaikan dengan pengaturan perangkat keras Anda sendiri. Temukan (Ctrl + F) tanda-tanda ini untuk dengan mudah mencari nilai mana yang mungkin perlu diubah:- **** :Tanda ini berarti mereka adalah posisi tengah servos dan harus dikalibrasi (robot Anda posisi kaki saat idle). - *** :Tanda ini berarti penunjukan pin arduino (koneksi sensor &servo ke arduino). Lihat ini saat Anda membuat robot. - ** :Tanda ini berarti bahwa nilai opsional dapat diubah sesuai selera Anda (lebar langkah kaki, berapa banyak untuk berbelok saat merasakan cahaya/hambatan, dll). Biarkan saja apa adanya jika Anda tidak tahu apa yang Anda lakukan. Anda dapat menggunakan sketsa ini dengan risiko Anda sendiri.. dan, ini disediakan apa adanya dan.. uh..Apa saja hal-hal tentang hak cipta yang digunakan orang untuk tulis di source code yang sudah dipublish??Intinya saya tidak mau bertanggung jawab jika terjadi hal buruk saat anda menggunakan kode ini.Selamat bersenang-senang!Yohanes Martedi - 2015*/#include // ** **Kalibrasi sudut tengah servos (dalam mikrodetik karena kita akan menggunakan perintah "xx.writeMicroseconds();"). Mulai dengan 1500.const int ANGLE_mid_Shaft =1520;const int ANGLE_mid_FLeft =1550;const int ANGLE_mid_FRight =1570;const int ANGLE_mid_BLeft =1450;const int ANGLE_mid_BRright =1450;const int ANGLE_sweep; // **Tetapkan nilai ini (dalam mikrodetik) untuk menentukan seberapa lebar servos akan menyapu (lebar langkah kaki). Nilai yang lebih besar berarti sudut sapuan yang lebih lebar.const int ANGLE_res =10; // **Setel resolusi gerakan servo (dalam mikrodetik) setidaknya pada lebar pita mati default minimum servo (resolusi tertinggi) atau lebih (resolusi lebih kecil). Contoh:lebar pita mati servo SG90 adalah 10 microseconds.int sweepSPEED; // variabel untuk menentukan seberapa cepat servos akan menyapu.int sweepSPEED_Rand[3] ={4, 6, 8}; // **Kecepatan servo (kecepatan berjalan) akan berubah secara acak dalam 3 mode. Atur kecepatan (dalam milidetik) untuk setiap mode. Nilai yang lebih kecil berarti lebih cepat.const int ANGLE_turnMAX =ANGLE_sweep * 1.5; // **Tetapkan nilai ini untuk menentukan seberapa maksimal bot akan berbelok ke arah cahaya. Nilai lebih besar berarti lebih besar turn.const int ANGLE_turnNARROW =ANGLE_sweep * 0.25; // **Tetapkan nilai ini untuk menentukan seberapa maksimal bot akan berbelok menghindari objek di sisinya dalam ruang sempit. Nilai yang lebih besar berarti lebih besar turn.const int SONAR_sum =3; // Jumlah sonar yang digunakan.const int PHOTO_sum =4; // Jumlah fotodioda yang digunakan.int PIN_trig[SONAR_sum] ={13, 11, 8}; // ***Atur pin arduino yang terhubung ke pin pemicu sensor ultrasonik; {depan, kiri, kanan}.int PIN_ec[SONAR_sum] ={12, 10, 7}; // ***Atur pin arduino yang terhubung ke pin gema sensor ultrasonik; {depan, kiri, kanan}.int PIN_PHOTO[PHOTO_sum] ={2, 3, 1, 0}; // ***Menyetel pin input analog arduino yang terhubung ke fotodioda; {kiri depan, kanan depan, kiri belakang, kanan belakang}.const int distRotate =25; // **Konfigurasikan jarak minimum (dalam cm) antara robot dan rintangan sebelum robot menghindarinya dengan memutar.const int distRetreat =10; // **Konfigurasikan jarak minimum (dalam cm) antara robot dan rintangan sebelum robot menghindarinya dengan mundur.const int distTurn =20; // **Konfigurasikan jarak minimum (dalam cm) antara robot dan rintangan sebelum robot menghindarinya dengan memutar.const int counter_gait_max =8; // **Konfigurasikan berapa banyak langkah yang akan diambil robot untuk menghindari rintangan (saat berputar atau mundur).// **Konfigurasikan berapa lama bot beristirahat &berjalan (dalam milidetik).const int RUN_time =25000;const int REST_time =3000;// ID untuk sonar:int SONAR_id;const int FRONT =0;const int LEFT =1;const int RIGHT =2;// ID untuk fotodioda:const int FRONT_LEFT =0;const int FRONT_RIGHT =1;const int BACK_LEFT =2;const int BACK_RIGHT =3;// Variabel untuk pembacaan fotodioda:int PHOTO_Front_Left;int PHOTO_Front_Right;int PHOTO_Back_Left;int PHOTO_Back_Right;const int SONAR_TrigSig =10; // Durasi (dalam S) sinyal pemicu yang dibutuhkan sensor untuk menghasilkan suara ultrasonik (sudah ditentukan oleh produk, jangan ubah nilai ini).const unsigned long SONAR_MaxEc =50000; // Durasi maksimum (dalam S) dari sinyal gema yang diberikan oleh sensor (sudah ditentukan oleh produk, jangan ubah nilai ini).const float SOUND_speed =0,034; // Kecepatan suara di udara dalam S/cm (sudah ditentukan oleh sciene, avatar Aang diperlukan untuk melakukan air bending jika nilai ini ingin diubah).int distance[SONAR_sum]; // Hasil perhitungan jarak.// Deklarasi servo:Servo SERVO_shaft;Servo SERVO_front_left;Servo SERVO_front_right;Servo SERVO_back_left;Servo SERVO_back_right;// Variabel untuk masing-masing sudut servo:int ANGLE_shaft =ANGLE_mid_Shaft_kiri =FLANG_Shaft;int ANGLE_front_right =ANGLE_mid_FRight;int ANGLE_back_left =ANGLE_mid_BLeft;int ANGLE_back_right =ANGLE_mid_BRight;// Manipulasi sudut untuk servo tengah (poros).const int ANGLE_max_Shaft =ANGLE_mid_Shaft + ANGLE_Sweep_sweep; sudut setiap servos:int ANGLE_shaft_record;int ANGLE_front_left_record;int ANGLE_front_right_record;int ANGLE_back_left_record;int ANGLE_back_right_record;// Variabel untuk koreksi sudut servos menurut deteksi cahaya:int LIGHT_left;int LIGHT_right;// sudut deteksi:Variabel int SONAR_left;int SONAR_right;// Itu hal seperti bendera, penghitung, catatan yang saya selalu tidak yakin bagaimana menjelaskannya. :(int ANGLE_prev;int flag_shaft_reverse;int flag_transition_rotate;int flag_transition_start =1;int flag_rest =0;int flag_RUN_time =0;int rotate_random;int counter_gait;void setup() { // Serial.begin(9600); // Serial. . Anda tahu, memeriksa &men-debug.. SERVO_shaft.attach(2); // ***Mengatur pin sinyal servo horizontal (poros) pada arduino.SERVO_front_left.attach(4); // ***Menyetel kiri-depan pin sinyal servo di arduino.SERVO_front_right.attach(3); // ***Setel pin sinyal servo depan-kanan di arduino.SERVO_back_left.attach(6); // ***Setel pin sinyal servo kiri-belakang aktif arduino.SERVO_back_right.attach(5); // ***Setel pin sinyal servo kanan belakang pada arduino. // Siapkan servo di sudut tengahnya.SERVO_shaft.writeMicroseconds(ANGLE_mid_Shaft); SERVO_front_left.writeMicroseconds(ANGLE_mid_FLeft); SERVO_front_right.writeMicroseconds(ANGLE_mid_FRight); SERVO_back_left.writeMicroseconds(ANGLE_mid_BLeft); SERVO_back_right.writeMicroseconds(ANGLE_mid_BRright); // Menyetel pin s untuk sonar, baik pinMode maupun nilai. for(SONAR_id =0; SONAR_id  distRotate) { flag_RUN_time =0; while(flag_RUN_time ==0) { MAJU(); } } while(jarak[FRONT]> distRetreat &&jarak[FRONT] <=distRotate) { while(jarak[KIRI]> jarak[KANAN]) { ROTATE_LEFT_AVOID(); merusak; } while(jarak[KIRI] =ANGLE_max_Shaft) { ANGLE_prev =ANGLE_shaft; ANGLE_shaft -=ANGLE_res; } else if(ANGLE_prev> ANGLE_shaft &&ANGLE_shaft> ANGLE_min_Shaft) { ANGLE_prev =ANGLE_shaft; ANGLE_shaft -=ANGLE_res; } else if(ANGLE_shaft <=ANGLE_min_Shaft) { ANGLE_prev =ANGLE_shaft; ANGLE_shaft +=ANGLE_res; } SERVO_shaft.writeMicroseconds(ANGLE_shaft);}void SHAFT_REVERSE() { if(ANGLE_prev  ANGLE_shaft) { ANGLE_prev =ANGLE_shaft - 1; }}/*================================GERAKAN SHAFT AKHIR ================================*//*=====================================TRANSISI ======================================*/void TRANSITION_GAIT() { ANGLE_front_left_record =ANGLE_front_left; ANGLE_front_right_record =ANGLE_front_right; ANGLE_back_left_record =ANGLE_back_left; ANGLE_back_right_record =ANGLE_back_right; ANGLE_shaft_record =ANGLE_shaft; int bendera =TINGGI; int penghitung =0; while(bendera ==TINGGI) { SHAFT(); LIGHT_kiri =0; CAHAYA_kanan =0; penghitung++; ANGLE_front_left =peta(penghitung, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_left_record, ANGLE_mid_FLeft); ANGLE_front_right =peta(penghitung, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_right_record, ANGLE_mid_FRright); ANGLE_back_left =peta(penghitung, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_left_record, ANGLE_mid_BLeft); ANGLE_back_right =peta(penghitung, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_right_record, ANGLE_mid_BRright); SERVO_shaft.writeMicroseconds(ANGLE_shaft); SERVO_front_left.writeMicroseconds(ANGLE_front_left); SERVO_front_right.writeMicroseconds(ANGLE_front_right); SERVO_back_left.writeMicroseconds(ANGLE_back_left); SERVO_back_right.writeMicroseconds(ANGLE_back_right); if(counter ==((ANGLE_sweep * 2) / ANGLE_res)) { flag =RENDAH; MULAILAH(); flag_transition_rotate =0; } }}void TRANSITION_START() { if(ANGLE_shaft ==ANGLE_mid_Shaft || (ANGLE_shaft> ANGLE_mid_Shaft &&ANGLE_shaft> ANGLE_prev) || (ANGLE_shaft =ANGLE_mid_Shaft &&ANGLE_prev =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) { ANGLE_front_left =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, ((ANGLE_mid_FLeft + ANGLE_kiri)); ANGLE_front_right =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRright, ((ANGLE_mid_FRright + ANGLE_sweep_val) + LIGHT_kanan + SONAR_kanan)); ANGLE_back_left =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left)); ANGLE_back_right =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRkanan, ((ANGLE_mid_BRkanan - ANGLE_sweep_val) - LIGHT_kanan - SONAR_kanan)); } else if(ANGLE_shaft  ANGLE_shaft) { ANGLE_front_left =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FLeft + ANGLE_sweep_val) - FLANGLE_mid_left - LIGHT_kiri); ANGLE_front_right =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FRright + ANGLE_sweep_val) + LIGHT_kanan + SONAR_kanan), ANGLE_mid_FRright); ANGLE_back_left =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BLkiri - ANGLE_sweep_val) + LIGHT_kiri + SONAR_kiri), ANGLE_mid_BLeft); ANGLE_back_right =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BRkanan - ANGLE_sweep_val) - LIGHT_kanan - SONAR_kanan), ANGLE_mid_BRright); } else if(ANGLE_shaft =ANGLE_mid_Shaft &&ANGLE_prev =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) { ANGLE_front_left =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, (ANGLE_mid_FLeft - ANGLE_val)_sweep ANGLE_front_right =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRright, (ANGLE_mid_FRright + ANGLE_sweep_val)); ANGLE_back_left =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, (ANGLE_mid_BLeft + ANGLE_sweep_val)); ANGLE_back_right =peta(ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRkanan, (ANGLE_mid_BRkanan - ANGLE_sweep_val)); } else if(ANGLE_shaft  ANGLE_shaft) { ANGLE_front_left =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FLeft - ANGLE_sweep_val), ANGLE_mid_FLeft); ANGLE_front_right =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_Fright + ANGLE_sweep_val), ANGLE_mid_FRright); ANGLE_back_left =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BLeft + ANGLE_sweep_val), ANGLE_mid_BLeft); ANGLE_back_right =peta(ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BRkanan - ANGLE_sweep_val), ANGLE_mid_BRright); } else if(ANGLE_shaft  0.0) { SONAR_distance =SONAR_EcInterval * (SOUND_speed / 2.0); merusak; } while(SONAR_EcInterval ==0.0) { SONAR_distance =501.0; merusak; } mengembalikan SONAR_distance;}/*==============================AKHIR PEMBACAAN ULTRASONIK ==============================*//*=====================================DETEKSI CAHAYA ===================================*/void LIGHT_COMPARE_EXECUTE() { //PHOTO_FLeft_RAW =analogRead(PIN_PHOTO[FRONT_LEFT]); //PHOTO_FRight_RAW =analogRead(PIN_PHOTO[FRONT_RIGHT]); PHOTO_Front_Left =analogBaca(PIN_PHOTO[FRONT_LEFT]); PHOTO_Front_Right =analogBaca(PIN_PHOTO[FRONT_RIGHT]); PHOTO_Back_Left =analogRead(PIN_PHOTO[BACK_LEFT]); PHOTO_Back_Right =analogRead(PIN_PHOTO[BACK_RIGHT]); if((PHOTO_Front_Left + PHOTO_Front_Right)>=(PHOTO_Back_Left + PHOTO_Back_Right)) { int LIGHT_Sensitivity =50; if(LIGHT_COMPARE()> LIGHT_Sensitivity) { LIGHT_left =LIGHT_COMPARE(); CAHAYA_kanan =0; } else if(LIGHT_COMPARE() <-LIGHT_Sensitivity) { LIGHT_left =0; LIGHT_kanan =LIGHT_COMPARE(); } else { CAHAYA_kiri =0; CAHAYA_kanan =0; } } else { if(PHOTO_Back_Left> PHOTO_Back_Right) { LIGHT_right =0; LIGHT_kiri =ANGLE_turnMAX; } else if(PHOTO_Back_Left  PHOTO_Front_Right) { LIGHT_rate =PHOTO_Front_Left; } else if(PHOTO_Front_Right> PHOTO_Front_Left) { LIGHT_rate =PHOTO_Front_Right; } else { // pilih untuk menggunakan salah satu dan komentari variabel lainnya di bawah // LIGHT_rate =PHOTO_Front_Left; LIGHT_rate =PHOTO_Front_Right; } int LIGHT_compareRAW =PHOTO_Front_Left - PHOTO_Front_Right; LIGHT_compareRAW =peta(LIGHT_compareRAW, -LIGHT_rate, LIGHT_rate, -ANGLE_turnMAX, ANGLE_turnMAX);; return LIGHT_compareRAW;}/*==================================END OF LIGHT DETECT =================================*//*=====================================PERILAKU ========================================*/void RETREAT_AVOID() { counter_gait =0; while(counter_gait <=counter_gait_max) { RETREAT(); }}void ROTATE_LEFT_AVOID() { counter_gait =0; putar_acak =2; while(counter_gait <=counter_gait_max) { ROTATE_LEFT(); }}void ROTATE_RIGHT_AVOID() { counter_gait =0; putar_acak =2; while(counter_gait <=counter_gait_max) { ROTATE_RIGHT(); }}void ROTATE_RANDOM_AVOID() { rotate_random =ROTATE_RANDOM(); while(rotate_random ==0) { ROTATE_LEFT_AVOID(); } while(rotate_random ==1) { ROTATE_RIGHT_AVOID(); }}void SIDE_AVOID() { if(distance[LEFT] <=distTurn &&distance[KANAN]> distTurn) { LIGHT_left =0; CAHAYA_kanan =0; SONAR_kiri =0; SONAR_kanan =-(peta(jarak[KIRI], 0, distTurn, ANGLE_turnMAX, 0)); } else if(jarak[KANAN] <=distTurn &&jarak[KIRI]> distTurn) { LIGHT_left =0; CAHAYA_kanan =0; SONAR_kanan =0; SONAR_kiri =peta(jarak[KANAN], 0, distTurn, ANGLE_turnMAX, 0); } else if(jarak[KIRI] <=distTurn &&jarak[KANAN] <=distTurn) { LIGHT_left =0; CAHAYA_kanan =0; if(jarak[KIRI]   

Skema


Proses manufaktur

  1. Arduino Digital Dice
  2. Iron Man
  3. Temukan Saya
  4. Arduino 3D-Printed Robotic Arm
  5. Cara Mengukur Massa Bumi Menggunakan Arduino
  6. Kontrol Humidifier Arduino
  7. NeoMatrix Arduino Pong
  8. Arduino Joystick
  9. Penerima Radio FM Arduino TEA5767
  10. Health Band - Asisten Cerdas untuk Lansia