Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Omnidirectionele mensen volgen vriendelijke robot

Componenten en benodigdheden

L298N Dual Stepper Motor Driver Controller Board Module
Dual motor driver geschikt voor maximaal 2A om de motoren aan te drijven
× 2
LM2596 DC DC Switching Instelbare step-down spanningsregelaar
Om de 12V van de batterij naar een 5V-rail te verlagen
× 1
Ingebouwde Lipo Alarm Batterij Checker Laagspanningsdetector RC Vliegtuig Quadcopter
Wordt gebruikt om te klinken wanneer de spanning van de lipo laag wordt om te voorkomen dat deze tijdens gebruik kapot gaat.
× 1
24 RPM DC 12V 4 mm asreductiemotor
Drie voor drie wielen
× 3
Arduino Nano R3
Motorcontroller
× 1
Microsoft LifeCam HD-3000 Webcamera
Voor het detecteren van gezichten van mensen kun je een goedkopere camera gebruiken, maar dit is degene die ik op kantoor had .
× 1
Jumperdraden (algemeen)
Veel jumperdraden voor energiebeheer en signaalgebruik
× 10
Creator Ci20
Hoe kunnen we het brein van de operatie, de Ci20, vergeten!
× 1
11.1V 3Cell Lipo-batterij
Voorbeeld om op eBay te kopen bijgevoegd.
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)

Apps en online services

OpenCV

Over dit project

Eerste inzending

Mijn eerste onderwerping aan de wedstrijd "Hackster Terminate the competition" was om een ​​robot te maken die mensen opzocht, maar in tegenstelling tot die in het Terminator-universum ging hij niet rond met het doden van mensen, maar gebruikte hij zijn krachten voorgoed.

Deze omnidirectionele robot zal je vinden, detecteren, op je afkomen en je complimenten geven!

Een vereiste die ik aan mezelf heb gesteld, is dat ik ervoor zou zorgen dat het zou kunnen worden gemaakt zonder zelf de elektronica te hoeven bouwen. Elk onderdeel van deze robot kan worden gekocht bij eBay, aan elkaar worden gekoppeld met behulp van gratis beschikbare tutorials en ze zouden moeten werken. De case is dan 3D-printbaar, zodat je hem zelf kunt printen of op 3D Hubs kunt laten maken. Ik denk dat dit project dit doel bereikt en ik zal je nu begeleiden bij het bouwen van je eigen Hunter Flatterer Robot

Hoe het allemaal werkt!

Laten we dus beginnen met een systeemdiagram dat alle onderdelen van de robot laat zien en hoe ze in elkaar passen. We zullen hier tijdens het bouwen naar verwijzen en het afvinken terwijl we verder gaan.

Laat u niet te veel afschrikken door dit diagram als u nog nooit eerder motoren heeft gebruikt. Het komt in feite neer op vier hoofdonderdelen:

  • De linkerkant gaat over het nemen van de batterij en ervoor zorgen dat de spanningen correct zijn voor het systeem.
  • Het slimme is gedaan op de ci20
  • De Arduino wordt gebruikt om de motoren te vertellen wat ze moeten doen

De volgende vier secties weerspiegelen deze lijst en begeleiden u bij het instellen van elk onderdeel.

Omgaan met elektriciteit

Dus je hebt een batterij, wat nu?

Het bovenstaande diagram laat zien hoe u alle componenten voor stroom aansluit, als u de bedrading in het schema volgt, is dit de weergave in het echte leven.

De Arduino aansluiten op de L298N

Ik zou dit kunnen uitleggen, maar het is beter om gewoon de tutorial te volgen die ik heb gedaan:http://www.instructables.com/id/Arduino-Modules-L298N-Dual-H-Bridge-Motor-Controll.

Dus nu heb je alles aangesloten, je hebt overal blauwe lichten die knipperen en geen blauwe rook, dus je bent klaar om te gaan. Laten we deze stoute jongen laten werken.

3D Zelf een hoesje printen

Toen ik dit ontwierp, besloot ik dat ik twee dingen wilde laten gebeuren:het ziet er cool uit en het pronkt zo goed mogelijk met de Ci20. Ik bedoel, dit is het punt van de wedstrijd toch?

Ik heb deze robot ontworpen om volledig 3D-afdrukbaar te zijn en de ontwerpen zijn hieronder allemaal beschikbaar. In principe ga je op dit punt de bovenkant, onderkant en wielen afdrukken. Als u geen toegang heeft tot een 3D-printer, kunt u kijken op www.3dhubs.com om iemand te vragen deze voor u af te drukken! Je kunt de ontwerpen hieronder bekijken

Hier is een mooie weergave van het ontwerp om er zeker van te zijn dat de ci20 zou passen en op de eerste plaats zou komen

Als je alles hebt afgedrukt, kun je alle onderdelen vastlijmen zoals hierboven (of gebruik plakband als je je niet zeker voelt. Je hebt een M4-bout nodig om de motoren vast te houden.

De CI20 magisch maken

De CI20 is de baas, het brein van de operatie. Zonder dat zal de robot spartelen. Dus wat doet het?

Welnu, de ci20 gaat OpenCV gebruiken om je gezicht te detecteren en vervolgens de juiste commando's via serieel naar de Arduino te sturen om de motoren in de goede richting te krijgen.

Stap 1:Installeer OpenCV

Zoals ik in deze handleiding heb gezegd, probeerde ik niet de appelkar opnieuw uit te vinden. Ik probeer iets te bouwen dat je thuis kunt doen en relatief gemakkelijk kunt uitbreiden. Dus om OpenCV te installeren, volg deze tutorial:

Het helpt u stap voor stap om OpenCV aan de gang te krijgen.

Stap 2:Voer de code uit

De Face Tracking-code moet worden gecompileerd en uitgevoerd. Voer deze opdracht uit op het bestand op de 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 

Het aan te maken binaire bestand:FaceTracking:main.cpp> ​​Bronbestand:FaceTracking.cpp

Makkelijk toch?

Ci20 &Arduino Magie

Na het flashen van de Arduino met de code in de bijlagen hieronder. Sluit de Arduino aan op de USB-poort van de CI20 en voer uw recent gemaakte FaceTracker uit. Je zult een camerafeed zien verschijnen (Oh ja, sluit de webcam aan) en als je je gezicht in het midden steekt, zouden de wielen van de robot hem naar voren moeten laten rijden!

Klus gedaan?

Vanwege tijdgebrek heb ik het niet helemaal gekregen om iets anders te doen, dus hier is een uitdaging voor iedereen die zo ver is gekomen. Er zijn twee dingen die je kunt toevoegen om deze bot super geweldig te maken:

Voeg een set luidsprekers en enkele geluidsbestanden toe zodat wanneer het gezicht groot genoeg is op het scherm, het een geluidsbestand afspeelt voor de persoon

  • Als de robot binnen 1-2 minuten geen gezicht heeft gedetecteerd, laat hem dan ter plekke ronddraaien. Dit doe je door het commando "R XX" naar de Arduino te sturen. Vervang XX door de hoeveelheid tijd die u wilt omdraaien.

Code

  • Arduino Sketch - Hoofd
  • Arduino Sketch - MotorControl
  • FaceTracking C++ voor Ci20
Arduino Sketch - HoofdArduino
Deze Arduino-code ontvangt het aandrijfcommando van de Ci20 via serieel en zorgt ervoor dat de motoren op de juiste manier worden aangedreven om in de goede richting te gaan.

Ik schreef dit oorspronkelijk voor een Raspberry Pi, maar het werkt ook met de Ci20
// Motor 1int dir1PinA =3;int dir2PinA =2;int speedPinA =9; // Moet een PWM-pin zijn om de motorsnelheid te kunnen regelen // Motor 2int dir1PinB =4;int dir2PinB =5;int speedPinB =8; // Moet een PWM-pin zijn om de motorsnelheid te kunnen regelen // Motor 3int dir1PinC =6;int dir2PinC =7;int speedPinC =10; // Moet een PWM-pin zijn om de motorsnelheid te kunnen regelen x =0;int y =0;int dominantUltrasonic =0;bool moveMotor =false;int startTime =0;void setup() {Serial.begin(9600); pinMode (dir1PinA, UITGANG); pinMode (dir2PinA, UITGANG); pinMode (speedPinA, UITGANG); pinMode (dir1PinB, UITGANG); pinMode (dir2PinB, UITGANG); pinMode (speedPinB, UITGANG); pinMode (dir1PinC, UITGANG); pinMode (dir2PinC, UITGANG); pinMode (speedPinC, UITGANG); startTime =millis();}String rpiString;void loop() { readDataFromRPi(); // Hiermee wordt getest of we in de laatste seconde een waarde van de RPi hebben ontvangen. // Het fungeert in feite als buffer zodat het niet blijft stoppen en starten omdat het verplaatscommando niet continu is // Het staat ook onderbreking toe als er niets binnenkomt van de RPi// int elapsedTime =millis() - startTime; // if (elapsedTime> 1000)// {// x =0;// y =0;// dominantUltrasonic =0;// moveMotor =false;// startTime =millis();// //} // Stuur de X &Y naar de motoren //if(moveMotor ==true &&(x !=0 &&y !=0)) //{ //Serial.println("MovingMotor"); // driveInDirection(x,y); //} //if(x ==0 &&y ==0) //{ //Serial.println("ZeroMMotor"); // driveInDirection(x,y); //} // Dit kan gewoon overblijven van de ultrasone trillingen - aarzelend om delay(30) te verwijderen;}void readDataFromRPi(){ // Read from Rpi while (Serial.available()) { delay(3); // vertraging om buffer te vullen als (Serial.available()>0) { char c =Serial.read(); // haalt één byte uit seriële buffer rpiString +=c; // maakt de string readString if (c =='n') {break; } } } // ENDWHILE // Als er iets van de RPi is gelezen, plaats het dan in x,y &domniantUltrasonic if (rpiString.length()>0) { Serial.println(rpiString); // kijk wat er is ontvangen String isRotate =getValue (rpiString, ' ',0); String xval =getValue(rpiString, ' ', 1); String yval =getValue(rpiString, ' ', 2); x =xval.naarInt(); y =yval.toInt(); startTime =millis(); if (isRotate =="r") { roteren(x); } else { driveInDirection(x,y); } rpiString=""; } //ENDIF} String getValue (String-gegevens, tekenscheidingsteken, int-index) {int gevonden =0; int strIndex[] ={0, -1 }; int maxIndex =data.length()-1; for(int i=0; i<=maxIndex &&gevonden<=index; i++){ if(data.charAt(i)==scheidingsteken || i==maxIndex){ gevonden++; strIndex[0] =strIndex[1]+1; strIndex[1] =(i ==maxIndex) ? ik+1 :ik; } } return gevonden>index ? data.substring(strIndex[0], strIndex[1]) :"";}
Arduino Sketch - MotorControlArduino
Dit hoort bij het ino-hoofdbestand en moet in hetzelfde projectbestand worden opgenomen
/* * Motorbesturingscode * * Deze klasse bevat code om de robot in elke richting te laten gaan * en rond het middelpunt te laten draaien. */void driveInDirection(float newX, float newY){ delay(20); zweven x =nieuweX; zwevend y =nieuwY; float theta =atan2(y,x); float mag =sqrt((x*x) + (y*y)); float vx =mag * cos(theta); float vy =mag * sin(theta); zweven w1 =-vx; zweven w2 =0,5 * vx - sqrt (3)/2 * vy; zweven w3 =0,5 * vx + sqrt (3)/2 * vy; // Haal de grootste w-waarde op float wSet [] ={w1, w2, w3}; float grootsteWaarde =0,0; for (int i =0; i <3; i++) {if(abs(wSet[i])> grootsteWaarde) {grootsteWaarde =abs(wSet[i]); } } float speedCoef =(float)147.0 / grootste waarde; w1 =w1 * speedCoef; w2 =w2 * speedCoef; w3 =w3 * speedCoef; als (x ==0 &&y ==0) { w1 =0; w2 =0; w3 =0; } Serieel.println(w1); Serieel.println(w2); Serieel.println(w3); w1 =beperking(w1, -150, 150); w2 =beperking (w2, -150, 150); w3 =beperking (w3, -150, 150); boolean w1_ccw =w1 <0 ? waar onwaar; boolean w2_ccw =w2 <0 ? waar onwaar; booleaans w3_ccw =w3 <0 ? waar onwaar; byte w1_speed =(byte) map(abs(w1), 0, 150, 0, 255); byte w2_speed =(byte) map(abs(w2), 0, 150, 0, 255); byte w3_speed =(byte) map(abs(w3), 0, 150, 0, 255); printMotorSpeed(w1_speed, 1); printMotorSpeed(w2_speed, 2); printMotorSpeed(w3_speed, 3); analogWrite (speedPinA, w1_speed);// Stelt snelheidsvariabele in via PWM analogWrite (speedPinB, w2_speed); analogWrite (speedPinC, w3_speed);// Stelt snelheidsvariabele in via 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 roteren (float milliseconden){ float w1 =255; vlotter w2 =255; vlotter w3 =255; boolean w1_ccw =w1 <0 ? waar onwaar; boolean w2_ccw =w2 <0 ? waar onwaar; booleaans w3_ccw =w3 <0 ? waar onwaar; byte w1_speed =(byte) map(abs(w1), 0, 150, 0, 255); byte w2_speed =(byte) map(abs(w2), 0, 150, 0, 255); byte w3_speed =(byte) map(abs(w3), 0, 150, 0, 255); printMotorSpeed(w1_speed, 1); printMotorSpeed(w2_speed, 2); printMotorSpeed(w3_speed, 3); analogWrite (speedPinA, w1_speed);// Stelt snelheidsvariabele in via PWM analogWrite (speedPinB, w2_speed); analogWrite (speedPinC, w3_speed);// Stelt snelheidsvariabele in via 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); vertraging (milliseconden); analogWrite (speedPinA, 0);// Stelt snelheidsvariabele in via PWM analogWrite (speedPinB, 0); analogWrite (speedPinC, 0);//Stel de snelheidsvariabele in via PWM }void printMotorSpeed ​​(byte motorSpeed, int motor) {Serial.print ("Motor"); Seriële.afdruk (motor); Serieel.print(":"); Serial.println (motorSnelheid); }
FaceTracking C++ voor Ci20C/C++
Volg de gids in Story
#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include #include met namespace std;met namespace cv;CascadeClassifier face_cascade, eyes_cascade;String window_name ="Gezichtsdetectie";#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;}/** * Detecteert gezichten en tekent er een ellips omheen */void detectFaces(Mat frame) { std::vector faces; Mat frame_grijs; // Converteren naar grijsschaal cvtColor (frame, frame_gray, COLOR_BGR2GRAY); // Equalize histogram equalizeHist (frame_gray, frame_gray); // Detecteer gezichten face_cascade.detectMultiScale (frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size (30,30)); // Herhaal alle vlakken voor (size_t i =0; i  ogen; // Probeer ogen te detecteren, in elk gezicht // eyes_cascade.detectMultiScale (gezicht, ogen, 1.1, 2, // 0 | CASCADE_SCALE_IMAGE, Grootte (50, 50)); // if(eyes.size()> 0) // Teken ellips rond gezicht ellips (frame, center, Size(faces[i].width/2, faces[i].height/2), 0, 0, 360 , Scalair ( 255, 0, 255 ), 4, 8, 0 ); if(center.x> frame.cols/3 &¢er.x =0) // pauze pauze; } retourneer 0;}

Aangepaste onderdelen en behuizingen

Dit is de basis van de omnidirectionele robot, door mij ontworpen om alle onderdelen in te passen en een deksel te hebben. Dit is het deksel dat de Ci20 in al zijn glorie laat zien.
Omni-directionele wielen
Dit is het originele ontwerp van de omnidirectionele wielen. Ik gebruikte de helft hiervan met de velgen en bewerkte het vervolgens om het motoras-CAD-bestand op thingiverse.com op te nemen Een geremixt wiel van de thingiverse-link

Schema's

Zie een betere beschrijving in het verhaalgedeelte

Productieproces

  1. Raspberry Pi Ball-tracking
  2. Raspoulette-prototype
  3. Raspberry Pi CD Box Robot
  4. Rollende alarmrobot
  5. Open CV Robot
  6. ROS Robot
  7. Simple Pi Robot
  8. Robot voor supercoole indoornavigatie
  9. Wat is een lineaire motor?
  10. Wat is een drankrobot?
  11. Wat is een servomotor?