Proses manufaktur
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 10 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
|
Pengajuan Awal
Pengajuan awal saya ke kompetisi "Hackster Hentikan kompetisi" adalah untuk membuat robot yang mencari manusia tetapi tidak seperti yang ada di alam semesta terminator, robot itu tidak berkeliling membunuh orang, melainkan menggunakan kekuatannya untuk kebaikan.
Robot omni-directional ini akan menemukan Anda, mendeteksi Anda, menyambut Anda, dan memuji Anda!
Salah satu persyaratan yang saya tentukan sendiri adalah bahwa saya akan memastikan bahwa itu dapat dibuat tanpa harus membuat elektronik sendiri. Setiap bagian di dalam robot ini dapat dibeli dari eBay, disambungkan menggunakan tutorial yang tersedia secara gratis dan mereka akan berfungsi. Kasing kemudian akan dapat dicetak 3D sehingga Anda dapat mencetaknya sendiri atau membuatnya di Hub 3D. Saya pikir proyek ini memenuhi tujuan ini dan sekarang saya akan memandu Anda melalui langkah-langkah membangun Robot Pemburu Penyanjung Anda sendiri
Bagaimana semuanya bekerja!
Jadi mari kita mulai dengan diagram sistem yang menunjukkan semua bagian robot dan bagaimana mereka terhubung. Kami akan merujuk ini di seluruh build dan memeriksanya seiring berjalannya waktu.
Jangan terlalu gentar dengan diagram ini jika Anda belum pernah menggunakan motor sebelumnya. Ini pada dasarnya bermuara pada Empat bagian utama:
Empat bagian berikutnya akan mencerminkan daftar ini dan memandu Anda dalam menyiapkan setiap bagian.
Menangani Listrik
Jadi Anda punya baterai sendiri, apa selanjutnya?
Diagram di atas menunjukkan cara menghubungkan semua komponen untuk daya, jika Anda mengikuti pengkabelan dalam skema, ini adalah representasi kehidupan nyata.
Menghubungkan Arduino ke L298N
Saya bisa menjelaskan ini, tetapi lebih baik ikuti saja tutorial yang saya lakukan:http://www.instructables.com/id/Arduino-Modules-L298N-Dual-H-Bridge-Motor-Controll.
Jadi sekarang Anda telah memasang semuanya, Anda memiliki lampu biru yang berkedip di mana-mana dan tidak ada asap biru sehingga Anda siap untuk pergi. Mari kita mulai membuat bocah nakal ini berhasil.
3D Mencetak sendiri sebuah kasing
Ketika saya mendesain ini, saya memutuskan saya ingin dua hal terjadi, terlihat keren &memamerkan Ci20 sebaik mungkin. Maksud saya ini adalah inti dari kompetisi kan?
Saya merancang robot ini agar benar-benar dapat dicetak 3D dan semua desainnya tersedia di bawah ini. Pada dasarnya pada titik ini pergi dan cetak sendiri bagian atas, bawah &roda. Jika Anda tidak memiliki akses ke Printer 3D, Anda dapat mengunjungi www.3dhubs.com untuk meminta seseorang mencetaknya untuk Anda! Anda dapat melihat desain di bawah ini
Berikut ini render cantik yang saya lakukan untuk desain untuk memastikan bahwa ci20 akan pas dan sesuai dengan tempatnya
Setelah semuanya dicetak, Anda dapat merekatkan semua bagian seperti di atas (atau menggunakan selotip jika Anda tidak percaya diri. Anda memerlukan baut M4 untuk menahan motor.
Membuat CI20 melakukan keajaiban
CI20 adalah bos, otak operasi. Tanpa itu robot akan menggelepar. Jadi apa fungsinya?
ci20 akan menggunakan OpenCV untuk mendeteksi wajah Anda dan kemudian mengirim perintah yang sesuai melalui serial ke Arduino untuk mengarahkan motor ke arah yang benar.
Langkah 1:Instal OpenCV
Seperti yang telah saya katakan di sepanjang panduan ini, saya tidak mencoba untuk menemukan kembali kereta apel. Saya mencoba membangun sesuatu yang dapat Anda lakukan di rumah dan melanjutkan dengan relatif mudah. Jadi untuk menginstal OpenCV pergi dan ikuti tutorial ini:
Ini memberi tahu Anda langkah demi langkah untuk mengaktifkan dan menjalankan OpenCV.
Langkah 2:Jalankan kode
Kode Pelacakan Wajah perlu dikompilasi dan dijalankan, jalankan perintah ini pada file di Ci20.
g++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o binary main.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_stitching
File biner yang akan dibuat:FaceTracking:main.cpp> File sumber:FaceTracking.cpp
Mudah bukan?
Ci20 &Arduino Magic
Setelah mem-flash Arduino dengan kode di lampiran di bawah ini. Colokkan Arduino ke port USB pada CI20 dan jalankan FaceTracker yang baru saja Anda buat. Anda akan melihat umpan kamera muncul (Oh ya, colokkan webcam) dan jika Anda menempelkan wajah Anda di tengah, roda pada robot akan mulai membuatnya bergerak maju!
Pekerjaan Selesai?
Sekarang karena keterbatasan waktu saya tidak cukup bisa melakukan hal lain, jadi inilah tantangan bagi siapa saja yang telah sampai sejauh ini. Ada dua hal yang dapat Anda tambahkan untuk membuat bot ini luar biasa:
Tambahkan satu set speaker dan beberapa file suara sehingga ketika wajah cukup besar di layar, dia akan memutar file suara ke orang tersebut
// Motor 1int dir1PinA =3;int dir2PinA =2;int speedPinA =9; // Perlu pin PWM untuk dapat mengontrol kecepatan motor// Motor 2int dir1PinB =4;int dir2PinB =5;int speedPinB =8; // Perlu pin PWM untuk dapat mengontrol kecepatan motor// Motor 3int dir1PinC =6;int dir2PinC =7;int speedPinC =10; // Perlu pin PWM untuk dapat mengontrol kecepatan motorint x =0;int y =0;int dominanUltrasonic =0;bool moveMotor =false;int startTime =0;void setup() { Serial.begin(9600); pinMode(dir1PinA,OUTPUT); pinMode(dir2PinA,OUTPUT); pinMode (kecepatanPinA, OUTPUT); pinMode(dir1PinB,OUTPUT); pinMode(dir2PinB,OUTPUT); pinMode (kecepatanPinB, OUTPUT); pinMode(dir1PinC,OUTPUT); pinMode(dir2PinC,OUTPUT); pinMode(speedPinC,OUTPUT); startTime =milis();}String rpiString;void loop() { readDataFromRPi(); // Ini menguji apakah kita telah menerima nilai dari RPi dalam detik terakhir. // Ini secara efektif bertindak sebagai buffer sehingga tidak terus berhenti &mulai karena perintah move tidak kontinu // Ini juga memungkinkan penghentian jika tidak ada yang masuk dari RPi// int elapsedTime =millis() - startTime; // if (waktu berlalu> 1000)// {// x =0;// y =0;// dominanUltrasonic =0;// moveMotor =false;// startTime =milis();// // } // Kirim X &Y ke motor //if(moveMotor ==true &&(x !=0 &&y !=0)) //{ //Serial.println("MovingMotor"); // driveInDirection(x,y); //} //if(x ==0 &&y ==0) //{ //Serial.println("ZeroMMotor"); // driveInDirection(x,y); //} // Ini mungkin hanya tersisa dari ultrasonik - ragu-ragu untuk menghapus delay(30);}void readDataFromRPi(){ // Baca dari Rpi while (Serial.available()) { delay(3); //delay untuk mengizinkan buffer terisi if (Serial.available()>0) { char c =Serial.read(); //mendapat satu byte dari buffer serial rpiString +=c; //membuat string readString if(c =='n') { break; } } } // ENDWHILE // Jika sesuatu telah dibaca dari RPi maka masukkan ke x,y &domniantUltrasonic if (rpiString.length()>0) { Serial.println(rpiString); //melihat apa yang diterima String isRotate =getValue(rpiString, ' ',0); String xval =getValue(rpiString, ' ', 1); String yval =getValue(rpiString, ' ', 2); x =xval.toInt(); y =yval.toInt(); waktu mulai =mili(); if (isRotate =="r") { rotate(x); } else { driveInDirection(x,y); } rpiString=""; } //ENDIF} String getValue(Data string, pemisah karakter, indeks int){ int ditemukan =0; int strIndeks[] ={0, -1 }; int maxIndex =data.length()-1; for(int i=0; i<=maxIndex &&ditemukan<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ ditemukan++; strIndeks[0] =strIndeks[1]+1; strIndex[1] =(i ==maxIndex) ? saya+1 :saya; } } kembali ditemukan>indeks ? data.substring(strIndex[0], strIndex[1]) :"";}
/* * Kode kontrol motor * * Kelas ini akan menyertakan kode untuk membuat robot bergerak ke segala arah * dan berputar di sekitar titik tengah. */void driveInDirection(float newX, float newY){ delay(20); float x =baruX; mengapung y =baruY; float theta =atan2(y,x); float mag =kuadrat((x*x) + (y*y)); float vx =mag * cos(theta); float vy =mag * sin(theta); mengapung w1 =-vx; float w2 =0,5 * vx - kuadrat(3)/2 * vy; float w3 =0,5 * vx + kuadrat(3)/2 * vy; // Dapatkan nilai w terbesar float wSet[] ={w1, w2, w3}; float terbesarNilai =0,0; for (int i =0; i <3; i++) { if(abs(wSet[i])> terbesarValue) { terbesarValue =abs(wSet[i]); } } float speedCoef =(float)147.0 / nilai terbesar; w1 =w1 * kecepatanCoef; w2 =w2 * kecepatanCoef; w3 =w3 * kecepatanCoef; if (x ==0 &&y ==0) { w1 =0; w2 =0; w3 =0; } Serial.println(w1); Serial.println(w2); Serial.println(w3); w1 =kendala(w1, -150, 150); w2 =kendala(w2, -150, 150); w3 =kendala(w3, -150, 150); boolean w1_ccw =w1 <0 ? benar salah; boolean w2_ccw =w2 <0 ? benar salah; boolean w3_ccw =w3 <0 ? benar salah; byte w1_speed =(byte) peta(abs(w1), 0, 150, 0, 255); byte w2_speed =(byte) peta(abs(w2), 0, 150, 0, 255); byte w3_speed =(byte) peta(abs(w3), 0, 150, 0, 255); printMotorSpeed(w1_speed, 1); printMotorSpeed(w2_speed, 2); printMotorSpeed(w3_speed, 3); analogWrite(speedPinA, w1_speed);//Menyetel variabel kecepatan melalui PWM analogWrite(speedPinB, w2_speed); analogWrite(speedPinC, w3_speed);//Menyetel variabel kecepatan melalui PWM digitalWrite(dir1PinA, !w1_ccw); digitalWrite(dir2PinA, w1_ccw); digitalWrite(dir1PinB, !w2_ccw); digitalWrite(dir2PinB, w2_ccw); digitalWrite(dir1PinC, w3_ccw); digitalWrite(dir2PinC, !w3_ccw);}void rotate(float milidetik){ float w1 =255; mengapung w2 =255; mengapung w3 =255; boolean w1_ccw =w1 <0 ? benar salah; boolean w2_ccw =w2 <0 ? benar salah; boolean w3_ccw =w3 <0 ? benar salah; byte w1_speed =(byte) peta(abs(w1), 0, 150, 0, 255); byte w2_speed =(byte) peta(abs(w2), 0, 150, 0, 255); byte w3_speed =(byte) peta(abs(w3), 0, 150, 0, 255); printMotorSpeed(w1_speed, 1); printMotorSpeed(w2_speed, 2); printMotorSpeed(w3_speed, 3); analogWrite(speedPinA, w1_speed);//Menyetel variabel kecepatan melalui PWM analogWrite(speedPinB, w2_speed); analogWrite(speedPinC, w3_speed);//Menyetel variabel kecepatan melalui PWM digitalWrite(dir1PinA, !w1_ccw); digitalWrite(dir2PinA, w1_ccw); digitalWrite(dir1PinB, !w2_ccw); digitalWrite(dir2PinB, w2_ccw); digitalWrite(dir1PinC, w3_ccw); digitalWrite(dir2PinC, !w3_ccw); penundaan (milidetik); analogWrite(speedPinA, 0);//Menyetel variabel kecepatan melalui PWM analogWrite(speedPinB, 0); analogWrite(speedPinC, 0);//Menyetel variabel kecepatan melalui PWM }void printMotorSpeed(byte motorSpeed, int motor){ Serial.print("Motor"); Serial.print(motor); Serial.print(":"); Serial.println(Kecepatan motor); }
#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include#include menggunakan namespace std;menggunakan namespace cv;CascadeClassifier face_cascade, eyes_cascade;String window_name ="Face Detection";#include #include #include #include #include #include #include #include int sendSerial(char* message){int fd =open("/ dev/ttyUSB0", O_RDWR);if (fd ==-1){ perror("dev/ttyUSB0"); return 1;}struct termios tios;tcgetattr(fd, &tios);tios.c_iflag =IGNBRK | IGNPAR;tios.c_oflag =0;tios.c_lflag =0;cfsetspeed(&tios, B9600);tcsetattr(fd, TCSAFLUSH,&tios);usleep(1000);//char msg[] ="50 50";write(fd , message, strlen(message));return 0;}/** * Mendeteksi wajah dan menggambar elips di sekitarnya */void detectFaces(Mat frame) { std::vector wajah; Tikar bingkai_abu-abu; // Konversi ke skala abu-abu cvtColor(frame, frame_gray, COLOR_BGR2GRAY); // Equalize histogram equalizeHist(frame_gray, frame_gray); // Deteksi wajah face_cascade.detectMultiScale(frame_gray, face, 1.1, 3, 0|CASCADE_SCALE_IMAGE, Ukuran(30,30)); // Ulangi semua wajah untuk(size_t i =0; i ; // Mencoba mendeteksi mata, di dalam setiap wajah // eyes_cascade.detectMultiScale(face, eyes, 1.1, 2, // 0 |CASCADE_SCALE_IMAGE, Size(50, 50) ); // if(eyes.size()> 0) // Menggambar elips di sekitar wajah elips(bingkai, tengah, Ukuran(wajah[i].lebar/2, wajah[i].tinggi/2), 0, 0, 360 , Skalar( 255, 0, 255 ), 4, 8, 0 ); if(center.x> frame.cols/3 &¢er.x =0) // pause break; } kembalikan 0;}
Proses manufaktur
Komponen dan persediaan SparkFun Dual H-Bridge driver motor L298 × 1 Motor DC (generik) × 4 Arduino UNO × 1 LED (generik) × 8 Resistor 221 ohm × 8 Servo (Tower Pro MG996R) × 1 Sensor Ultrasonik - HC-SR04 (Generik) × 1 A
Komponen dan persediaan Arduino UNO × 1 Arduino Nano R3 × 1 Modul Bluetooth HC-05 × 2 SparkFun Triple Axis Accelerometer dan Gyro Breakout - MPU-6050 × 1 Motor DC, 12 V × 2 roda karet × 1 Driver motor H-Bridge Ganda Instrumen Texas
Komponen dan persediaan Arduino UNO × 1 PHPoC WiFi Shield untuk Arduino × 1 Robot Lengan 6DOF × 1 Tentang proyek ini Jika Anda pemula, saya sarankan membaca tutorial berikut: Arduino - Motor Arduino - Motor Servo Arduino - Wifi 1. Demonstrasi 2.
Komponen dan persediaan Arduino UNO × 1 Adafruit L293D Motor Shield Ini adalah perangkat berbiaya rendah, dan mudah digunakan. Ini biasanya tersedia pelindung motor yang tidak memerlukan keterampilan sebelumnya. Itu juga dapat diprogram dengan mudah menggunakan perpustakaan Adafruit.