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

Robot Ramah Pelacakan Orang Omni-Directional

Komponen dan persediaan

Modul Papan Pengontrol Driver Motor Stepper Ganda L298N
Pengemudi motor ganda yang mampu menggerakkan motor hingga 2A
× 2
LM2596 DC Switching DC Regulator Tegangan Step Down yang Dapat Disesuaikan
Untuk menurunkan tegangan 12V dari baterai ke Rel 5V
× 1
Onboard Lipo Alarm Pemeriksa Baterai Detektor Tegangan Rendah Quadcopter Pesawat RC
Digunakan untuk bersuara ketika tegangan lipo semakin rendah untuk memastikan tidak pecah saat digunakan.
× 1
Motor Bergigi Poros 24RPM DC 12V 4mm
Tiga untuk tiga roda
× 3
Arduino Nano R3
Pengontrol motor
× 1
Kamera Web Microsoft LifeCam HD-3000
Untuk mendeteksi wajah orang, Anda dapat menggunakan kamera yang lebih murah tetapi ini yang saya miliki di kantor .
× 1
Kabel jumper (generik)
Banyak kabel jumper untuk manajemen daya dan penggunaan sinyal
× 10
Creator Ci20
Bagaimana kita bisa melupakan otak operasi, Ci20!
× 1
Baterai Lipo 3 Sel 11.1V
Contoh untuk membeli dari ebay terlampir.
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)
Besi solder (generik)

Aplikasi dan layanan online

OpenCV

Tentang proyek ini

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:

  • Sisi kiri menangani pengambilan baterai dan memastikan voltase yang benar untuk sistem.
  • Sedikit pintar dilakukan di ci20
  • Arduino digunakan untuk memberi tahu motor apa yang harus dilakukan

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

  • Jika robot tidak mendeteksi wajah dalam 1-2 menit, putar di tempat. Anda dapat melakukan ini dengan mengirimkan perintah "R XX" ke Arduino. Ganti XX dengan jumlah waktu yang ingin Anda putar.

Kode

  • Sketsa Arduino - Utama
  • Arduino Sketch - Kontrol Motor
  • C++ Pelacakan Wajah Untuk Ci20
Arduino Sketch - UtamaArduino
Kode Arduino ini menerima perintah drive dari Ci20 melalui serial dan memastikan bahwa motor digerakkan dengan cara yang benar untuk menuju ke arah yang benar.

Saya awalnya menulis ini untuk Raspberry Pi tetapi bekerja dengan Ci20 juga
// 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]) :"";}
Arduino Sketch - MotorControlArduino
Ini berlaku dengan file ino utama dan kebutuhan termasuk dalam file proyek yang sama
/* * 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); }
C++ Pelacakan Wajah Untuk Ci20C/C++
Ikuti panduan di Cerita
#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;}

Suku cadang dan penutup khusus

Ini adalah dasar dari robot omnidirectional, yang dirancang oleh saya untuk memuat semua bagian dan memiliki penutup yang terpasangIni adalah penutup yang memamerkan Ci20 dengan segala kemegahannya.
Roda Pengarah Omni
Ini adalah desain asli dari roda omni-directional. Saya menggunakan setengahnya dengan pelek dan kemudian mengeditnya untuk memasukkan file CAD poros motor di thingiverse.com Sebuah roda remix dari link thingiverse

Skema

Lihat deskripsi yang lebih baik di bagian cerita

Proses manufaktur

  1. Pelacakan Bola Raspberry Pi
  2. Prototipe Raspoulette
  3. Robot Kotak CD Raspberry Pi
  4. Robot Alarm Bergulir
  5. Buka CV Robot
  6. Robot ROS
  7. Robot Pi Sederhana
  8. Robot untuk navigasi dalam ruangan yang sangat keren
  9. Apa itu Motor Linier?
  10. Apa itu Robot Minuman?