Բովանդակություն:

Գաղտնի խցիկով դեմքի ճանաչման հայելի ՝ 15 քայլ (նկարներով)
Գաղտնի խցիկով դեմքի ճանաչման հայելի ՝ 15 քայլ (նկարներով)

Video: Գաղտնի խցիկով դեմքի ճանաչման հայելի ՝ 15 քայլ (նկարներով)

Video: Գաղտնի խցիկով դեմքի ճանաչման հայելի ՝ 15 քայլ (նկարներով)
Video: Летний Ламповый стрим. Отвечаем на вопросы. 2024, Նոյեմբեր
Anonim
Գաղտնի խցիկով դեմքի ճանաչման հայելի
Գաղտնի խցիկով դեմքի ճանաչման հայելի
Գաղտնի խցիկով դեմքի ճանաչման հայելի
Գաղտնի խցիկով դեմքի ճանաչման հայելի
Գաղտնի խցիկով դեմքի ճանաչման հայելի
Գաղտնի խցիկով դեմքի ճանաչման հայելի

Ինձ միշտ հետաքրքրել են մշտապես ստեղծվող գաղտնի կուպեները, որոնք օգտագործվում են պատմվածքներում, ֆիլմերում և այլն: Այսպիսով, երբ տեսա Գաղտնի կուպեի մրցույթը, որոշեցի ինքս փորձարկել այդ գաղափարը և պատրաստել սովորական հայելի, որը բացում է գաղտնի դարակը, երբ ճիշտ մարդը նայում է դրան:

Օգտվելով Raspberry Pi- ից, Python- ի ծրագրավորման որոշակի գիտելիքներից և 8-րդ դասարանի խանութների դասից, մենք կարող ենք ստեղծել այս կծու սարքը ՝ օբյեկտները թաքցնելու համար, որոնք հասանելի կլինեն միայն ճիշտ օգտագործողին:

Ուզում եմ հատուկ շնորհակալություն հայտնել այս մարդկանց/հարթակներին, որտեղից ես ստացել եմ նաև իմ տեղեկությունները և ռեսուրսները.

TeCoEd - Youtube ալիք

Էմմետ PiMyLifeUp- ից

MJRoBot- ը Hackster.io- ում (պրոֆիլ)

Gaven MacDonald - Youtube ալիք

Թաքեր Շենոնը Thingiverse- ում (պրոֆիլ)

Պարագաներ

Շրջանակի պարագաներ

  • Wood Plank (այս տախտակի չափսերն էին 42 "7,5" 5/16 ")
  • Մատիտի նկարի շրջանակ (ապակիով)
  • Spray Paint
  • Մեկ ճանապարհ ռեֆլեկտիվ սոսինձ
  • Ապակու մաքրիչ և լաթ
  • MDF փայտ

Դեմքի ճանաչման միջոցներ

  • Raspberry Pi (ես օգտագործել եմ Pi 3 B+ - ը, բայց կան այլ տարբերակներ)
  • Խցիկի մոդուլ
  • Stepper Motor

Գործիքներ:

  • Սեղանի սղոց
  • Igիգ Սղոց
  • Հղկաթուղթ Փայտ
  • Սոսինձ ժապավեն
  • Չափել
  • Մկրատ
  • Սփրեյ շիշ
  • 3D տպիչ
  • Սուպեր սոսինձ

Քայլ 1: Կտրումներ տուփի շրջանակի համար

Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար
Կտրումներ տուփի շրջանակի համար

Ես նկարի շրջանակ եմ գնել երկրորդ ձեռքի խանութից: Պարզապես նախազգուշացում, համոզվեք, որ շրջանակը կազմող տախտակները ունեն առնվազն 1 1/2 դյույմ լայնություն: Սա այն է, որ դրա վրա կարող եք սոսնձել փայտի այլ տախտակներ `բավականաչափ տարածք աշխատելու համար: Բացի այդ, համոզվեք, որ ապակին ներս է: Շրջանակը լիովին պարզ է: Ես պատահաբար գնել եմ ցրտահարված, այնուհետև ստիպված էի գնել մեկ այլ շրջանակ `միայն թափանցիկ ապակու համար: Քանի որ իմ շրջանակն օգտագործվում է, արկղի շրջանակի չափումները կարող են տարբեր լինել:

  • Շրջանակը դրեք դիմանկարային կողմնորոշման մեջ: Չափեք ապակու անցքի կողմի երկար կողմերը (LS) շրջանակի վրա `լրացուցիչ ½” չափով, ինչպես վերևում, այնպես էլ ներքևում: (այսինքն ՝ մի մատնաչափ ավելացրեք ապակու անցքի չափման երկար կողմին: Գրանցեք սա և նշեք LSM (Long Side Measurement):
  • Նմանապես, չափեք անցքի վերին կողմը և ավելացրեք լրացուցիչ 1 »: Գրանցեք սա և նշեք SSM (Short Side Measurement):
  • Ձեռք բերեք ձեր տախտակը և սեղանի սղոցով կտրեք երկու LSM x 2”և երկու SSM x 2”:
  • Վերցրեք LSM կտրվածքներից մեկը և չափեք 2”x1” ուղղանկյուն, որը ներքևից 1”է, իսկ ձախից և աջից ՝ ½” (ինչպես ցույց է տրված նկար 3 -ում):
  • Օգտագործեք ոլորահատ սղոց `փոսը կտրելու համար: Այնուհետեւ օգտագործեք հղկաթուղթ `եզրերը մանրացնելու համար:

Քայլ 2: Կտրվածքներ գզրոցի համար

Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար
Կրճատումներ գզրոցի համար

Այժմ մենք կսկսենք կառուցել գզրոցը (a.k.a Գաղտնի խցիկ):

  • Կտրեք երկու 4”x 1” կողմ, 3 ⅜”x 1” (հետևի եզր), 4 ¼”x 1 ¼” (առջևի եզր) և 4”x 3 ⅜” (հարթակ):
  • Սոսնձեցեք առաջին 4”x 1” կողմը հարթակի 4”կողմի երկայնքով: Պլատֆորմի կողքին մի քանի ծալված թուղթ դրեցի, որպեսզի այն մի փոքր բարձրացվեր, այսպիսով այն չէր քաշի այն անցքի վրա, որը ես կտրել էի LS տախտակի վրա: Տեղադրեք չորացման համար 30 րոպե:
  • Նմանապես, սոսնձեք 3 ⅜”x 1” հարթակի 3 ⅜”եզրով: Տեղադրեք չորացման համար 30 րոպե: Այնուհետեւ կպցրեք երկրորդ 4”x 1” կողմը առաջինի հակառակ կողմում: Տեղադրեք չորացման համար 30 րոպե:
  • Առայժմ մի կողմ դրեք առջևի եզրը: Դա կլինի վերջին բանը, որը կպցված է դարակի վրա:
  • Ավարտելուց հետո ստուգեք, արդյոք այն տեղավորվում է այն անցքի մեջ, որը դուք ոլորել եք LSM տախտակի մեջ: Եթե ոչ, ավազեցրեք անցքը, մինչև դարակը հեշտությամբ սահի ներս և դուրս, և քաշքշում չկա:

Քայլ 3: Շրջանակը միասին դնելը

Շրջանակը միասին դնելը
Շրջանակը միասին դնելը
Շրջանակը միասին դնելը
Շրջանակը միասին դնելը
Շրջանակը միասին դնելը
Շրջանակը միասին դնելը

Բոլոր մասերի ամբողջական ավարտով մենք կարող ենք սկսել հավաքել շրջանակի ամբողջականությունը:

  • Կպչեք LSM տախտակը, որը կենտրոնացած է ապակու անցքով, յուրաքանչյուր կողմում `½” նշումով: Համոզվեք, որ այն սոսնձված է ½”փոսից հեռու (ինչպես ցույց է տրված նկար 1 -ում): Տեղադրեք չորացման համար 30 րոպե:
  • Կպչեք առաջին SSM տախտակը, եզրը դիպչելով LSM տախտակի ներսին, որը պարզապես սոսնձված էր: (Օգտագործեք քանոն `համոզվելու համար, որ այն սոսնձված է ուղիղ): Տեղադրեք չորացման համար 30 րոպե:
  • Վերցրեք LSM- ի մյուս կողմը և սոսնձեք առաջինին նման: Համոզվեք, որ այն գտնվում է ½ »փոսից հեռու, և որ SSM- ն, որը հենց կցված էր, սոսնձված է տախտակի ներսում: Տեղադրեք չորացման համար 30 րոպե:
  • Կպցրեք վերջին SSM- ը վերին եզրին: Քանի որ դուք ունեք երկու LSM երկու կողմերում, կախված նրանից, թե որքան ուղիղ եք դրանք ամրացրել, գուցե անհրաժեշտ լինի SSM- ի կողմերը քսել ներքև ՝ համոզվելու համար, որ այն տեղավորվում է (իմ կտրումը երբեմն անջատված է): Տեղադրեք չորացման համար 30 րոպե:
  • Չափեք գզրոցի ներքևի և շրջանակի միջև եղած փոքր տարածությունը: Կտրեք MDF փայտի մի կտոր այս չափմամբ ՝ 4 դյույմ: Դուք ցանկանում եք այս կտորը դարձնել գզրոցին մոտ, բայց չեք դիպչում դրան: Այն նախատեսված է գզրոցը պահելու նվազագույն շփումով:
  • Երբ ամեն ինչ ավարտված է, ես լակի ներկեցի շրջանակը, այնպես որ բոլոր կտորները համընկնում էին:

Քայլ 4: Հայելիի համար

Հայելիի համար
Հայելիի համար
Հայելիի համար
Հայելիի համար
Հայելիի համար
Հայելիի համար
Հայելիի համար
Հայելիի համար

Ֆիլմի միակողմանի սոսինձը, որը ես գնել էի Amazon- ից, կազմում էր մոտ 10 դոլար: Կան ավելի որակյալներ, որոնք մի փոքր ավելի թանկ են, եթե ձեզ հետաքրքրում է: Իմ օգտագործածն արտացոլում է, բայց կարող եք ասել, որ դա սովորական հայելին չէ, որը դուք կտեսնեիք տանը: Ավելի թանկերը կստանան ձեզ այդ տեսքը:

  • Մաքրել ապակին երկու կողմից ապակե մաքրիչով:
  • Անջատեք միակողմանի սոսինձը և ապակին դրեք վերևում: Կտրեք սոսինձը, որպեսզի ապակու յուրաքանչյուր կողմում լինի առնվազն ½”ավելցուկ:
  • Ապակին մի կողմ դրեք և դրա մի կողմը թրջեք ջրով: Այնուհետև հեռացրեք պլաստիկ ծածկը միակողմանի սոսինձից և ջրով ցողեք նոր բացված կողմը:
  • Տեղադրեք ապակու թաց կողմը սոսինձի թաց կողմում: Թողեք նստեն 30 րոպե:
  • Շրջեք և բութ մատով սոսնձի և ապակու միջև փուչիկները հարթեցրեք: Այնուհետեւ կտրեք ավելցուկային սոսինձը եզրերի շուրջը:

Քայլ 5: Տեղադրեք Raspbian Stretch- ը

Առաջին անգամ լինելով Raspberry Pi միջավայրում, ես սկսեցի հրահանգներ փնտրել, թե ինչպես տեղադրել OS- ն: Ես, ի վերջո, գտա TeCoEd- ի Youtube- ի ուղիղ ձեռնարկը, որն անցավ SD քարտի վրա Stretch- ի տեղադրման գործընթացը (նաև բավականին գեղեցիկ ներածությամբ): Ահա այդ ձեռնարկի հղումը ՝

Ըստ էության, այն ամենը, ինչ ձեզ հարկավոր է անել.

  • Ձևաչափեք SD քարտը ՝ ընտրելով ձեր Drive >> Drive Tools >> Format: Ներբեռնեք Raspian Stretch- ի ZIP ֆայլը (գտեք այստեղ ՝
  • Օպերացիոն համակարգի պատկերը միացրեք SD քարտին: Սա ավարտելու համար TeCoEd- ն օգտագործեց Win32 Disk Imager- ը: Ես ավարտեցի balenaEtcher- ի տեղադրումը, որը մի փոքր ավելի պարզ թվաց: (Ահա balenaEtcher- ի ներբեռնման հղումը ՝
  • Մի անգամ balenaEtcher- ում ընտրեք «Ֆայլ ֆայլից» և ընտրեք նախկինում ներբեռնված ZIP ֆայլը: Հաջորդը, ընտրեք ցանկալի SD քարտը (եթե ինքնաբերաբար չի ընտրված): Այնուհետև սեղմեք հյութալի բռնկման կոճակը և սպասեք, որ կախարդանքը տեղի ունենա:

SD քարտի վրա տեղադրվելուց հետո այն կարող եք տեղադրել Raspberry Pi- ի մեջ և անցնել ընդհանուր Pi- ի կարգավորման գործընթաց:

Քայլ 6: Տեղադրեք OpenCV

Այժմ անցեք առավել Դեմքի-ճանաչման կողմնորոշված մասերին: Դեմքերը ճանաչելու համար մենք պետք է ներբեռնենք OpenCV գրադարանը, որը պարունակում է համակարգչային տեսողության հետ աշխատելու հսկայական գործիքներ:

OpenCV- ի տեղադրումն ինձ համար ծրագրային ապահովման ամենածանր մասն էր: Բայց բազմաթիվ հրահանգներ հետևելուց հետո ես վերջապես գտա Էմետի ձեռնարկը PiMyLifeUp- ից, որը կատարեց այստեղ գտած հնարքը ՝

Ես չեմ անցնի այս քայլերով, քանի որ ձեզ ավելի հարմար կլինի հետևել դրանք հղումից (տրված բացատրություններով և կայքից անմիջապես ավելի հեշտությամբ պատճենելու և տեղադրելու հնարավորությամբ):

Քայլ 7: Միացնել/ստուգել տեսախցիկը

Միացնել/ստուգել տեսախցիկը
Միացնել/ստուգել տեսախցիկը
Միացնել/ստուգել տեսախցիկը
Միացնել/ստուգել տեսախցիկը

OpenCV- ի տեղադրումից հետո իմ մնացած ճանապարհորդությունն ավարտվեց ՝ օգտագործելով MJRoBot- ի ձեռնարկը Hackster.io- ում, որը գտնվում է այստեղ ՝

Նախքան սկսելը ես կցանկանայի հիշեցնել ձեզ, որ ես այս սցենարների սկզբնական ստեղծողը չեմ, բայց ի վերջո փոփոխեցի դրանց մասերը:

Սկսելու համար մենք պետք է փորձարկենք տեսախցիկը `համոզվելու համար, որ կարող ենք տեսագրել էկրանին: Ես ծախսել եմ մոտ մեկ ժամ ՝ փորձելով գործարկել MJRoBot- ի 3 -րդ քայլում նշված սցենարը: Ինչպես ուզում էր կյանքը, մենք իրականում պետք է միացնենք Raspberry Pi- ի տեսախցիկը (պարզվում է, որ լավ գաղափար կլիներ կարդալ տրված հրահանգները… մմմ) Այսպիսով, տեսախցիկը դրա ճիշտ նավահանգստին միացնելուց հետո հետևեք հետևյալ քայլերին.

  • Բացեք հրամանի տերմինալը և մուտքագրեք sudo raspi-config
  • Ընտրեք «Միացնել տեսախցիկը» (սա կարող է գտնվել սարքերի տարբերակում)
  • Կտտացրեք «Մուտքագրեք»
  • Գնացեք «Ավարտել» և ձեզ կառաջարկվի վերագործարկել

Հետո հետևեք այս քայլերին.

  • Գնացեք Ազնվամորիի հիմնական ընտրացանկ (վերև ձախ)
  • Նախապատվություններ
  • Raspberry Pi կազմաձևում
  • Ինտերֆեյսեր
  • Այնուհետև Camera- ում ընտրեք «Միացված»
  • Հետո «Լավ»

Այժմ դուք պետք է կարողանաք հաջողությամբ գործարկել այս սցենարը MJRoBot- ի ձեռնարկից ՝ տեսախցիկը փորձարկելու համար (հիշեք, որ այս ամբողջ կոդը գումարած ավելի խորը նկարագրությունը գտնվում է MJRobot- ի ձեռնարկի վերևում տրված հղման մեջ):

ներմուծել numpy որպես np

ներմուծել cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Լայնություն cap.set (4, 480) # հավաքած Բարձրություն մինչ (Trueշմարիտ) ՝ ret, frame = cap.read () frame = cv2: մատով խփել (շրջանակ, -1) # Շրջել տեսախցիկը ուղղահայաց մոխրագույն = cv2.cvtColor (շրջանակ, cv2. COLOR_BGR2GRAY) cv2.imshow («շրջանակ», շրջանակ) cv2.imshow («մոխրագույն», մոխրագույն) k = cv2.waitKey (30) & 0xff, եթե k == 27: # սեղմեք «ESC» ՝ դադարեցնելու համար cap.release () cv2.destroyAllWindows ()

Նախորդ ծածկագիրը պետք է ցուցադրի երկու պատուհան `մեկը գունավոր, իսկ մյուսը` մոխրագույն: Եթե դուք հասցրել եք այսքան հեռու, ես կարծում եմ, որ դուք արժանի եք գեղեցիկ սենդվիչի:

Քայլ 8. Տվյալների հավաքում և վերապատրաստման տվյալներ

Տվյալների հավաքում և վերապատրաստման տվյալներ
Տվյալների հավաքում և վերապատրաստման տվյալներ
Տվյալների հավաքում և վերապատրաստման տվյալներ
Տվյալների հավաքում և վերապատրաստման տվյալներ
Տվյալների հավաքում և վերապատրաստման տվյալներ
Տվյալների հավաքում և վերապատրաստման տվյալներ

Տրամադրված ձեռնարկում հեղինակը շատ ավելի խորանում է շուտով տրամադրվող ծածկագրի գործընթացների մասին, բայց քանի որ դրանք հրահանգներ են այն մասին, թե ինչպես է ստեղծվել այս հայելին, ես չեմ խորանա պատմության և ոչ էլ բարդ մեխանիկայի մասին: Այնուամենայնիվ, ես խորհուրդ եմ տալիս մեկ ամիս ձեր կյանքից կարդալ այս երկու բաների մասին, քանի որ դրանք կարող են լավ ծառայել ձեր մտքին:

Մնացել է ևս երեք սցենար, որոնք պետք է գործարկվեն, մինչև մենք կարողանանք այս ամենը գործի դնել: Առաջինը տվյալների հավաքագրման համար է, երկրորդը `դրանք վերապատրաստելու, իսկ վերջինը` իրականում ճանաչման: Տվյալների հավաքագրման համար անհրաժեշտ է, որ դեմքի իրական նկարները վերցվեն և պահվեն վերապատրաստման որոշակի վայրում: Այս ծածկագրի ստեղծողը շատ պարզ դարձրեց այս ամենն անել, ուստի խորհուրդ եմ տալիս հետևել այս հրահանգներին `գլխացավից խուսափելու համար:

Բացեք հրամանի տող և ստեղծեք նոր գրացուցակ, որն այն կդարձնի զվարճալի (ես իմը կոչեցի FaceRec)

mkdir FaceRec

Այժմ, փոխեք գրացուցակը FaceRec- ի և ստեղծեք ենթաաղեկտոր ՝ համոզվելով, որ այն անվանում եք տվյալների հավաքածու:

cd FaceRec

mkdir տվյալների հավաքածու

Մինչ մենք դրանում ենք, մենք կարող ենք նաև պատրաստել այլ ենթադիտարան ՝ մարզիչ անունով:

mkdir մարզիչ

Այժմ կարող եք գործարկել և հետևել առաջին սցենարի ուղղություններին, որոնք կգրավեն օգտվողի նկարները: (Ուղղակի վերև, համոզվեք, որ մուտքագրեք օգտվողի ID- ն ՝ որպես 1, 2, 3 և այլն):

ներմուծել cv2import os cam = cv2. VideoCapture (0) cam.set (3, 640) # սահմանել տեսանյութի լայնություն cam.set (4, 480) # սահմանել տեսանյութի բարձրության face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Յուրաքանչյուրի համար անձ, մուտքագրիր մեկ թվային դեմքի ID face_id = մուտքագրում ('\ n մուտքագրել օգտվողի ID- ի վերջը սեղմել ==>') տպել ("\ n [INFO] Դեմքի ֆիքսման սկզբնավորումը: Նայեք տեսախցիկին և սպասեք …") # Նախաձևեք անհատական նմուշառման դեմքի հաշվարկ հաշվել = 0, մինչդեռ ()շմարիտ). (մոխրագույն, 1.3, 5) դեմքի համար (x, y, w, h): cv2. ուղղանկյուն (img, (x, y), (x+w, y+h), (255, 0, 0), 2) հաշվել + = 1 # Պահել նկարված պատկերը տվյալների հավաքածուներում cv2.imwrite («տվյալների հավաքածու/օգտվող»: + str (face_id) + '.' + Str (հաշվել) + ".jpg", մոխրագույն [y: y +h, x: x+w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Սեղմեք 'ESC' տեսահոլովակից դուրս գալու համար, եթե k == 27: ընդմիջում էլիֆի հաշվիչ> = 30: # Վերցրեք 30 դեմքի նմուշ և դադարեցրեք տեսանյութը k print ("\ n [INFO] Exitting Program and cleanup stuff") cam.release () cv2.destroyAllWindows ()

Այս պահին վստահ եղեք, որ բարձ եք տեղադրել Pi- ի վրա: Եթե ոչ, գործարկեք հրամանը

pip տեղադրել բարձ

Դրանից հետո դուք կարող եք գործարկել ուսուցման սցենարը (երկրորդ սցենարը), որն անթերի կտրամադրի ձեզ.yaml ֆայլ, որը կօգտագործվի վերջնական սցենարում:

ներմուծել cv2import numpy որպես np PIL- ից ներմուծել Image ներմուծում os # athանապարհ դեմքի պատկերի տվյալների բազայի ուղի = 'տվյալների' ճանաչիչ = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # գործառույթ ՝ պատկերներն ու պիտակի տվյալները ստանալու համար getImagesAndLabels (ուղի). ՝ PIL_img = Image.open (imagePath).convert ('L') # փոխակերպել այն մոխրագույնի պառակտում («.») [1]) դեմքեր = detector.detectMultiScale (img_numpy) համար (x, y, w, h) դեմքերի համար ՝ faceSamples.append (img_numpy [y: y+h, x: x+w]) ids.append (id) return face Նմուշներ, id- ների տպում ("\ n [INFO] Training სახეեր: Դա կտևի մի քանի վայրկյան: Սպասեք …") դեմքեր, ids = getImagesAndLabels (path) ճանաչող. վարժեցում (դեմքեր, np.array (id)) # Պահպանեք մոդելը trainer/trainer.yml ճանաչիչ.գրեք ('trainer/trainer.yml') # ճանաչիչ. պահեք () աշխատեց Mac- ում, բայց ոչ Pi # Տպեք մարզված դեմքերի թիվը և ավարտեք ծրագրի տպումը ("\ n [INFO] {0} վերապատրաստված դեմքեր: itingրագրից դուրս գալու".format (len (np.unique (id))))

Այս սցենարների գրավիչն այն է, որ համակարգում կարող են մուտքագրվել մի քանի դեմքեր, ինչը նշանակում է, որ ցանկության դեպքում բազմաթիվ անհատներ կարող են մուտք գործել հայելու ներս:

Ներքևում ես ունեմ Data Capture սցենար և ուսուցման սցենար, որոնք հասանելի են ներբեռնման համար:

Քայլ 9. Դեմքի ճանաչման ժամանակը

Դեմքի ճանաչման ժամանակը
Դեմքի ճանաչման ժամանակը
Դեմքի ճանաչման ժամանակը
Դեմքի ճանաչման ժամանակը

Վերջապես, մենք կարող ենք գործարկել ճանաչող սցենարը: Շարժիչային գործընթացը ֆունկցիոնալ դարձնելու համար այս սցենարին ավելացվել է ավելի շատ կոդ, այնպես որ ես այդ մասերը մի փոքր ավելի մանրամասն կբացատրեմ: Ես այն կբաժանեմ հատվածների, բայց ամբողջ սցենարը կդնեմ քայլի վերջում, եթե դա այն է, ինչին դու ձգտում ես:

Մենք կսկսենք ներմուծել մեզ անհրաժեշտ բոլոր մոդուլները, այնուհետև GPIO ռեժիմը սահմանել GPIO. BCM

ներմուծել numpy որպես np

ներմուծում os ներմուծման ժամանակ ներմուծում RPi. GPIO որպես GPIO GPIO.setwarnings (False) GPIO.setmode (GPIO. BCM)

Այս հաջորդ ցուցակը, որը կոչվում է ControlPin, մի շարք թվեր են, որոնք ներկայացնում են ելքային կապեր, որոնք կօգտագործվեն մեր քայլք շարժիչի համար:

ControlPin = [14, 15, 18, 23]

For-loop- ը սահմանում է այս կապումներն որպես Ելքեր և ապա համոզվում, որ դրանք անջատված են: Ես դեռ ինչ -որ կոդ ունեմ այստեղ, որպեսզի գզրոցը փակվի կոճակի սեղմումով, բայց փոխարենը որոշեցի օգտագործել ժամաչափ:

GPIO.setup (ControlPin , GPIO. OUT)

GPIO.output (ControlPin , 0) GPIO.setup (2, GPIO. IN, pull_up_down = GPIO. PUD_DOWN)

Հաջորդ երկու փոփոխականները հաջորդականություններ են, որոնք մենք կօգտագործենք շարժիչը վարելու համար: Ես իմացա այս տեղեկատվությունը Գավեն Մակդոնալդի հիանալի տեսանյութից, որը ես խորհուրդ եմ տալիս դիտել, քանի որ նա խորանում է ոչ միայն ծածկագրի, այլ իրական շարժիչի վրա (այստեղ ՝ https://www.youtube.com/embed/Dc16mKFA7Fo). Ըստ էության, յուրաքանչյուր հաջորդականություն կկրկնվի գալիք openComp և closeComp գործառույթներում ներկառուցված օղակների միջոցով: Եթե ուշադիր նայեք, seq2- ը seq1- ի ճիշտ հակառակն է: Այո, դուք կռահեցիք: Մեկը շարժիչը առաջ տանելու, իսկ մյուսը ՝ հետընթաց շարժման համար է:

հաջորդ 1 =

seq2 =

Սկսած մեր openComp գործառույթից ՝ մենք ստեղծում ենք for-loop, որը կկրկնվի 1024 անգամ: Ըստ MacDonald's- ի տեսանյութի ՝ 512 կրկնությունները կապահովեն շարժիչի ամբողջական պտույտ, և ես պարզեցի, որ մոտ երկու պտույտը լավ երկարություն ունեն, բայց դա կարող է ճշգրտվել ՝ կախված անհատի չափից: Հաջորդ օղակը բաղկացած է 8 կրկնումներից `հաջորդ 1 և 2 հատվածներում հայտնաբերված 8 զանգվածների հաշվառման համար: Եվ, վերջապես, վերջին օղակի կրկնությունը չորս անգամ կրկնվում է այն չորս տարրերի համար, որոնք հանդիպում են այս զանգվածներից յուրաքանչյուրում, ինչպես նաև 4 GPIO կապումներին, որոնց միացված ենք մեր շարժիչը: Այստեղ տողն ընտրում է GPIO- ի քորոցը, այնուհետև այն միացնում կամ անջատում է ՝ կախված նրանից, թե որ կրկնությունն է այն միացված: Հետո գիծը ապահովում է բուֆերային ժամանակ, որպեսզի մեր շարժիչը ընդհանրապես չշրջվի: Շարժիչը պտտվելուց հետո գզրոցը դուրս բերելու համար այն քնում է 5 վայրկյան առաջ շարժվելուց առաջ: Այս ժամանակը կարող է ճշգրտվել այստեղ կամ կարող եք միացնել մեկնաբանված կոդը, որը թույլ է տալիս օգտագործել կոճակը ՝ սցենարով առաջ անցնելու, այլ ոչ թե ժամանակաչափի:

համար միջակայքում (1024):

միջակայքում կես քայլի համար (8). միջակայքում (4). (2) == GPIO. LOW: ընդմիջում; "" time.sleep (5)

CloseComp գործառույթը գործում է նման ձևով: Շարժիչը հետ շարժվելուց հետո ես շարունակում եմ մեր վերջին GPIO կապումներն իջեցնել ցածր մակարդակին, որպեսզի համոզվեմ, որ էներգիա չենք վատնում, այնուհետև առաջ շարժվելուց ավելացնում եմ ևս երեք վայրկյան ժամանակ:

համար միջակայքում (1024):

միջակայքում կես քայլի համար (8). միջակայքում (4). (ControlPin [0], 0) GPIO.putput (ControlPin [3], 0) time.sleep (3)

Հաջորդ մասի հիմնական մասը օգտագործվում է տեսախցիկը տեղադրելու և դեմքի ճանաչումը սկսելու համար: Կրկին, MKRoBot- ի ցուցումները ավելի շատ մասերի մեջ են մտնում, բայց առայժմ ես պարզապես ցույց եմ տալիս հայելու համար օգտագործվող մասերը:

Սկզբում ես փոխեցի ցուցակների անունները այնպես, որ իմ անունը լինի այն ինդեքսում, որը ես հանձնարարել էի տվյալները հավաքելիս (իմ դեպքում 1): Եվ հետո մնացած արժեքները դրեցի None- ի վրա, քանի որ տվյալների բազայում այլևս դեմքեր չունեի:

անուններ = ['Ոչ մեկը', 'Դանիել', 'Ոչ մեկը', 'Ոչ մեկը', 'Ոչ մեկը', 'Ոչ մեկը']

Մեր վերջին մի քանի տողերը ծածկագրվում են thicc for-loop- ում: Ես ստեղծել եմ փոփոխական ՝ վստահությունը որպես ամբողջ թիվ պահելու համար (intConfidence), նախքան փոփոխական վստահությունը վերածվում է տողի: Այնուհետև ես օգտագործում եմ if- հայտարարություն ՝ ստուգելու համար, թե արդյոք վստահությունը 30-ից մեծ է, և արդյոք id- ն (այն մարդը, որին համակարգիչը հայտնաբերում է, այս դեպքում ՝ «Դանիել») հավասար է իմ անունին:Սա հաստատվելուց հետո կոչվում է openComp գործառույթը, որը (ինչպես բացատրվել է նախկինում) շարժում է շարժիչը, դուրս է մղվում 5 վայրկյանից հետո, այնուհետև շարունակում է փակել կոմպը, որը շարժիչը շարժում է հակառակ ուղղությամբ և մաքրում է նախքան thicc օղակը շարունակելը:

եթե intConfidence> 30 և id == 'Դանիել':

openComp () closeComp ()

Սխալ, որը ես գտա այստեղ, այն է, որ երբեմն closeComp- ի վերադարձից հետո ծածկագիրը շարունակվում է, բայց պայմանական if- հայտարարությունը կրկին ճշմարիտ է, կարծես թե կարդում է վիդեո հոսքը, որը դեռ բուֆերում է: Թեև դա տեղի չի ունենում ամեն անգամ, երբ ես դեռ պետք է միջոց գտնեմ, որպեսզի դա երբեք չպատահի, այնպես որ, եթե որևէ որևէ գաղափար ունի, թող ինձ տեղյակ պահի մեկնաբանություններում:

Ահա ամբողջ սցենարը բոլորը մեկ տեղում (և հենց ներքևում է սա ներբեռնվող).

ներմուծել cv2

ներմուծել numpy որպես np ներմուծում os ներմուծման ժամանակ ներմուծում (ControlPin , GPIO. OUT) GPIO.output (ControlPin , 0) GPIO.setup (2, GPIO. IN, pull_up_down = GPIO. PUD_DOWN) seq1 =

Քայլ 10: Pi- ի տեղադրում և շարժիչի միացում

Pi- ի տեղադրում և շարժիչի միացում
Pi- ի տեղադրում և շարժիչի միացում
Pi- ի տեղադրում և շարժիչի միացում
Pi- ի տեղադրում և շարժիչի միացում
Pi- ի տեղադրում և շարժիչի միացում
Pi- ի տեղադրում և շարժիչի միացում

Raspberry Pi- ի շրջանակին ամրացնելը բավականին պարզ էր: Ես նախագծեցի մի փոքր 90 աստիճանի արմունկ, որի մի երեսն անցք ուներ, իսկ մյուս կողմը ՝ ամբողջովին հարթ: Դրանցից երկուսը եռաչափ տպելուց հետո դրանք կարելի է պտուտակներով ամրացնել Raspberry Pi- ին դրա ամրացման անցքերի վրա (ես օգտագործել եմ GPIO- ի կապանքների յուրաքանչյուր կողմի երկու անցքը):

Այնուհետև ես շարունակեցի գերծանրքաշային սոսինձ օգտագործել 3D տպված արմունկների հակառակ երեսների վրա, որպեսզի Pi- ն սոսնձեմ դարակից վերև ՝ շրջանակի վրա: Սոսինձը չորացնելուց հետո ես կարողացա հեռացնել կամ փոխարինել Pi- ն դիրքում պարզապես և հարմար միայն երկու պտուտակով: Ես ունեմ ստորև բերված արմունկի.stl- ը:

Այժմ պարզապես միացրեք շարժիչի վարորդը PI- ին համապատասխանաբար ՝ IN1, IN2, IN3, IN4, GPIO 14, 15, 18, 23: Վերջապես, միացրեք վերահսկիչի տախտակի 5v և Ground կապերը Pi- ի 5v ելքի և Ground կապումներին:

Ահա Pi- ի Pinout- ի հղումը ՝ որոշ տեղեկությունների համար.

Քայլ 11: Տեսախցիկի տեղադրում

Տեսախցիկի տեղադրում
Տեսախցիկի տեղադրում
Տեսախցիկի տեղադրում
Տեսախցիկի տեղադրում
Տեսախցիկի տեղադրում
Տեսախցիկի տեղադրում

Տեսախցիկի տեղադրումը Pi- ից փոքր -ինչ ավելի ամուր էր, բայց մեթոդն ավարտեց աշխատանքը: Յուրաքանչյուր ծայրում 2 անցք ունեցող բարակ ճառագայթ նախագծելուց և տպելուց հետո ես այն ամրացրեցի Rasberry Pi- ին դրա ամրացման անցքով: Այնուհետեւ պարզապես ամրացրեք տեսախցիկը ճառագայթի հակառակ ծայրին մեկ այլ պտուտակով: Տա-դա! Այն բավականին թռչում է:

Քայլ 12. Գզրոց-շարժվող մեխանիզմի ստեղծում և տեղադրում

Գզրոց-շարժվող-մեխանիզմ ստեղծելը և ամրացնելը
Գզրոց-շարժվող-մեխանիզմ ստեղծելը և ամրացնելը
Գզրոց-շարժվող-մեխանիզմ ստեղծելը և ամրացնելը
Գզրոց-շարժվող-մեխանիզմ ստեղծելը և ամրացնելը
Գզրոց-շարժվող-մեխանիզմ ստեղծելը և ամրացնելը
Գզրոց-շարժվող-մեխանիզմ ստեղծելը և ամրացնելը

Այս քայլը հեշտությամբ կատարվեց ստեղծող համայնքի երբևէ բարեգործական նվերների շնորհիվ: Thingiverse- ում արագ որոնումից հետո ես կարողացա գտնել TucksProjects- ի ստեղծած գծային շարժիչ (գտել այստեղ ՝ https://www.thingiverse.com/thing:2987762): Մնում էր միայն ապտակել այն SD քարտին և թույլ տալ, որ տպիչը կատարի աշխատանքը:

Վերջացա, որ մտա Fusion 360 և խմբագրեցի խթանը, քանի որ շարժիչիս լիսեռը չափազանց մեծ էր TucksProjects- ի տրամադրածի համար: Ես դրա համար ունեմ.stl ստորև: Տպագրությունն ավարտվելուց հետո մենք պարզապես պետք է այն հավաքենք ՝ շարժիչը դնելով շարժիչի լիսեռի վրա, այնուհետև 2 պտուտակով ամրացնելով շարժիչը և պարիսպի կողմերը (համոզվեք, որ դարակը մեջտեղը դրել եք այն փակելուց առաջ): Ես ստիպված եղա դարակաշարից մի մատնաչափ կտրել, որպեսզի այն տեղավորվի դարակի և շրջանակի միջև:

Այժմ մնում է մեխանիզմը ամրացնել շրջանակին և գզրոցին: «ԳԻՏԵԼ, ԻՆՉՊԵ՞Ս ԵՆՔ ՏԻՀԻՍ»: դուք հարցնում եք … այո, ասեք ինձ հետ. Super Glue. Ինչպես ցույց է տրված վերը նկարներում, պարզապես տեղադրեք մեխանիզմը շրջանակի ներքևի մասում և այն վերև մղեք դեպի փայտի կտորը, որի վրա սահում է դարակը: Այստեղ կենսական նշանակություն ունի, որ դուք փորձեք դարակն/մեխանիզմը հնարավորինս զուգահեռ անել շրջանակին, որպեսզի մեխանիզմը շարժվելիս այն գցի դարակը ուղիղ և ոչ թե անկյան տակ: Սոսինձը չորացնելուց հետո դանակի եզրին մի քիչ սոսինձ տեղադրեք և գզրոցը տեղափոխեք իր դիրքը և թող չորանա: Ավարտելուց հետո մենք ունենք ամուր մեխանիզմ `մեր գաղտնի գզրոցը ներս և դուրս սահեցնելու համար:

Քայլ 13: Ստվարաթուղթ ավելացնել հայելու հետևում

Ստվարաթուղթ ավելացնել հայելու հետևում
Ստվարաթուղթ ավելացնել հայելու հետևում
Ստվարաթուղթ ավելացնել հայելու հետևում
Ստվարաթուղթ ավելացնել հայելու հետևում
Ստվարաթուղթ ավելացնել հայելու հետևում
Ստվարաթուղթ ավելացնել հայելու հետևում

Այս երկկողմանի ֆիլմն ավելի հայելու տեսք ունենալու համար ես գտա, որ մեր նպատակին լավ է ծառայում ապակու հետևում ստվարաթուղթ տեղադրելը: Օգտագործված ստվարաթուղթը այն է, որը գալիս է շրջանակի հետ, բայց տեղին կտրված ցանկացած կտոր կաշխատի: Սա նաև ապահովում է ոչ մի լույս տեսախցիկի LED- ից, շարժիչի վերահսկիչից կամ Pi- ի ցուցադրումից հայելու մյուս կողմում: Ամեն ինչ իր տեղում օգտագործեք մատիտով `նշելու, թե որտեղ է տեսախցիկը նստում ստվարաթղթի վրա: Այնուհետև ածելիով ուղղանկյուն կտրեք, որպեսզի տեսախցիկը կարողանա նայել, երբ այն տեղում է:

Քայլ 14: Վերջնական կտոր դնելը

Վերջնական կտորը դնելը
Վերջնական կտորը դնելը
Վերջնական կտորը դնելը
Վերջնական կտորը դնելը

Վերջին բանը, որ պետք է անել, դնել դարակի առջևի մասը, որը մի կողմ էր դրված: Շարժիչը շարժեք այնպես, որ դարակը դուրս գա: Այնուհետև սոսնձեք առջևի մասը այնպես, որ գզրոցի կտորը կենտրոնացած լինի (բոլոր կողմերից մի փոքր կախոց պետք է լինի: Հետո կարող եք պարզապես կախել պատից:

Քայլ 15: Եզրափակիչ

Եզրափակիչ
Եզրափակիչ
Եզրափակիչ
Եզրափակիչ

Ահա դուք ունեք այն: Կան մի քանի բարելավումներ, ինչպիսիք են ՝ սեղմել այդ կոճակը, գնել ավելի լավ երկկողմանի ֆիլմ և շտկել այդ սխալը ծածկագրում, բայց, ընդհանուր առմամբ, գործն ավարտված է. օգտագործողի դեմքը և այն բացում է այդ գեղեցիկ փոքրիկ դարակը: Ինչպես միշտ, ես կցանկանայի լսել ձեր մտքերը, հարցերն ու հուշերը ստորև բերված մեկնաբանություններում:

Ընդհանուր գնահատական ՝ 10/10

Մեկնաբանություններ.

Գաղտնի բաժնի մարտահրավեր
Գաղտնի բաժնի մարտահրավեր
Գաղտնի բաժնի մարտահրավեր
Գաղտնի բաժնի մարտահրավեր

Գլխավոր մրցանակ գաղտնի կուպեի մարտահրավերում

Խորհուրդ ենք տալիս: