Turinys:
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Ankstesnėje instrukcijoje aš pasidalinau, kaip galite bendrauti tarp „Arduino“ir „Python“naudodami „pyserial“modulį ir valdyti šviesos diodą. Jei nematėte, patikrinkite čia: KOMUNIKACIJA TARP ARDUINO & PYTHON!
Ir kaip jūs galite aptikti objekto spalvą ir sekti ją ekrane, patikrinkite čia: SPALVŲ ATSISAKYMAS NAUDOJANT OPENCV IR PYTHON.
Šioje instrukcijoje parodysiu, kaip stebėti veidus naudojant „Arduino“ir „Python“ir priversti fotoaparatą sekti veidą. Tai gali atrodyti sunku, bet patikėkite, kad ne, viskas, ko jums reikia, yra pagrindinės žinios apie „Arduino“ir „Python“.
Taigi pradėkime…
1 žingsnis: reikalingi dalykai:
Reikalavimai minimalūs. Čia aš pateikiau dalių sąrašą visko, ko jums reikia:
Techninės įrangos reikalavimas:
- „Arduino UNO“(„Amazon“JAV / „Amazon“ES)
- Žiniatinklio kamera („Amazon“JAV / „Amazon“ES)
- Servos x 2 („Amazon“JAV / „Amazon EU“)
- Duonos lenta („Amazon“JAV / „Amazon EU“)
- „Servo Pan Tilt Kit“(„Amazon“JAV / „Amazon EU“)
Programinės įrangos reikalavimas:
- „Python 2.7“(turėtų būti įdiegta, „Linux“OS paprastai turi būti iš anksto įdiegta)
- „OpenCV“(galite jį atsisiųsti atskirai arba įdiegti naudodami „pip install“, paaiškinta toliau)
- „pyserial“(gali būti montuojamas kartu su vamzdžiu)
- varginantis.
- „Haarcascade“.
Surinkę viską, galime pereiti prie diegimo žingsnio …
2 veiksmas: „Python“aplinkos nustatymas:
Python diegimas:
Taigi pirmiausia mums reikia „Python 2.7“. Norėdami tai padaryti, pirmiausia atsisiųskite ir įdiekite python 2.7.14. Norėdami patikrinti, ar jis tinkamai įdiegtas, eikite: „Windows“paieška >> Įveskite „IDLE“>> Paspauskite „Enter“. Turėtų pasirodyti „Python Shell“.
ARBA
Ieškodami įveskite „CMD“ir paspauskite „Enter“, kad atidarytumėte komandų eilutę. CMD tipo >> python ir paspauskite Enter, turėtų būti rodoma „Python“sąsaja.
Jei CMD matote klaidą, nepanikuokite, tikriausiai turite nustatyti aplinkos kintamąjį. Norėdami nustatyti aplinkos kintamąjį, galite vadovautis čia.
Įdiekite „pyserial“, „OpenCV“ir „numpy“į „python“:
Norėdami įdiegti šiuos modulius, naudosime pip install, Pirmiausia atidarykite CMD ir įveskite šiuos kodus:-
„pip install serial“
pip install opencv-python> pip install numpy
šios komandos įdiegs reikiamus modulius. Dabar galime pereiti prie kodavimo dalies …
3 žingsnis: „Python“scenarijus:
Prieš pradedant rašyti kodą, pirmiausia reikia sukurti naują aplanką, nes visas kodas turi būti saugomas tame pačiame aplanke. Taigi sukurkite naują aplanką, pavadinkite jį viskuo, ko norite. ir atsisiųskite „Haarcascade“iš apačios ir įklijuokite į aplanką.
Dabar atidarykite užrašų knygelę ir parašykite žemiau pateiktą scenarijų. Išsaugokite jį kaip „face.py“tame pačiame aplanke kaip „haarcascade“. (Mano pateiktą kodą galite atsisiųsti žemiau esančiame faile):
#importuokite visus reikalingus modulius
importuoti numpy kaip np importuoti serijinį importo laiką importuoti sys importuoti cv2 #Setup „Arduino“ryšio kelias (vietoj „COM5“įveskite prievadą, prie kurio prijungtas jūsų arduino) arduino = serial. Serial („COM5“, 9600) time.sleep (2) print ("Prisijungta prie arduino …") #importing Haarcascade veido aptikimui face_cascade = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') #Norėdami užfiksuoti vaizdo įrašo srautą iš internetinės kameros. cap = cv2. VideoCapture (0) #Skaitykite užfiksuotą vaizdą, paverskite jį pilku vaizdu ir raskite veidus, o 1: ret, img = cap.read () cv2.resizeWindow ('img', 500, 500) cv2.line (img, (500, 250), (0, 250), (0, 255, 0), 1) cv2.line (img, (250, 0), (250, 500), (0, 255, 0), 1) cv2.circle (img, (250, 250), 5, (255, 255, 255), -1) pilka = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) veidai = face_cascade.detectMultiScale (pilka, 1.3) # aptikti veidą ir padaryti aplink jį stačiakampį. (x, y, w, h) veiduose: cv2. stačiakampis (img, (x, y), (x+w, y+h), (0, 255, 0), 5) roi_gray = pilka [y: y+h, x: x+w] roi_color = img [y: y+h, x: x+w] arr = {y: y+h, x: x+w} print (arr) print ('X: '+str (x)) spausdinti (' Y: '+str (y)) spausdinti (' x+w: '+str (x+w)) spausdinti (' y+h: '+str (y+h))) # Roi centras (stačiakampis) xx = int (x+(x+h))/2 yy = int (y+(y+w))/2 print (xx) print (yy) centre = (xx, yy) # duomenų siuntimas į „arduino print“(„Stačiakampio centras yra:“, centras) data = "X {0: d} Y {1: d} Z".formatas (xx, yy) print ("output = '" +data + "" ") arduino.write (duomenys) #Rodyti srautą. cv2.imshow ('img', img) #Paspauskite 'Esc', kad nutrauktumėte vykdymą k = cv2.waitKey (30) & 0xff, jei k == 27: pertrauka
Kai tai bus padaryta, rašykite arduino kodą …
4 žingsnis: „Arduino“kodas:
Kai „Python“scenarijus yra paruoštas, mums reikia „arduino“eskizo, kad galėtume valdyti servo. Peržiūrėkite žemiau esantį kodą, įklijuokite jį į „Arduino IDE“ir išsaugokite kaip „servo.ino“tame pačiame aplanke kaip „face.py“ir „haarcascade“. įkelkite kodą ir pereikite prie kito žingsnio, kad užmegztumėte ryšį.
(Atsisiunčiamas failas pateiktas žemiau)
#įtraukti
Servo servoVer; // Vertikali servo servo servoHor; // Horizontali servo int x; int y; int prevX; int prevY; void setup () {Serial.begin (9600); servoVer.attach (5); // Pritvirtinkite vertikalią servo prie 5 kaiščio servoHor.attach (6); // Pritvirtinkite horizontalią servo prie 6 kaiščio servoVer.write (90); servoHor.write (90); } void Pos () {if (prevX! = x || prevY! = y) {int servoX = žemėlapis (x, 600, 0, 70, 179); int servoY = žemėlapis (y, 450, 0, 179, 95); servoX = min (servoX, 179); servoX = max (servoX, 70); servoY = min (servoY, 179); servoY = max (servoY, 95); servoHor.write (servoX); servoVer.write (servoY); }} void loop () {if (Serial.available ()> 0) {if (Serial.read () == 'X') {x = Serial.parseInt (); if (Serial.read () == 'Y') {y = Serial.parseInt (); Pos (); }} while (Serial.available ()> 0) {Serial.read (); }}}
5 žingsnis: „Pan-Tilt“mechanizmas:-
„Pan-Tilt“naudoju lengvai prieinamą rinkinį. Jei norite, galite tai padaryti patys naudodami medieną/plastiką ar net 3D spausdinimą.
Tas, kurį naudojau, yra gana pigus ir labai lengvai surenkamas. Tačiau jei norite instrukcijų, kaip tai padaryti, tai galite rasti čia.
6 veiksmas: jungčių užmezgimas:
Grandinė yra gana paprasta. Tiesiog prijunkite du servo prie arduino.
- Vertikaliai iki 5 kaiščio
- Horizontalus iki 6 kaiščio
- Maitinimas iki +5V
- Žemė iki GND
Patikrinkite grandinės schemą.
7 žingsnis: BANDYMAS:
- Kai viskas bus padaryta, paskutinis dalykas, kurį reikia padaryti, yra patikrinti, ar jis veikia. Norėdami išbandyti, pirmiausia įsitikinkite, kad servos yra tinkamai prijungtos prie arduino ir eskizas įkeliamas.
- Įkėlus eskizą, būtinai uždarykite IDE, kad prievadas galėtų laisvai prisijungti prie „python“.
- Dabar atidarykite „face.py“naudodami „Python IDLE“ir paspauskite „F5“, kad paleistumėte kodą. Prireiks kelių sekundžių prisijungti prie „arduino“, tada turėtumėte pamatyti langą, transliuojantį žiniatinklio kamerą. Dabar kodas aptiks jūsų veidą ir servos stebės, kaip jis seka.
- Servo turėtų judėti, kai jūs perkeliate objektą. Dabar tiesiog pritvirtinkite fotoaparatą prie servo, kad jis judėtų kartu su servo sistemomis.
Ačiū.