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

Կարագի ռոբոտը. Arduino ռոբոտը `գոյություն ունեցող ճգնաժամով. 6 քայլ (նկարներով)
Կարագի ռոբոտը. Arduino ռոբոտը `գոյություն ունեցող ճգնաժամով. 6 քայլ (նկարներով)

Video: Կարագի ռոբոտը. Arduino ռոբոտը `գոյություն ունեցող ճգնաժամով. 6 քայլ (նկարներով)

Video: Կարագի ռոբոտը. Arduino ռոբոտը `գոյություն ունեցող ճգնաժամով. 6 քայլ (նկարներով)
Video: robot, pasa la mantequilla #shorts #rickandmorty #rickymorty 2024, Հուլիսի
Anonim
Image
Image

Այս նախագիծը հիմնված է «Ռիկ և Մորտի» անիմացիոն շարքի վրա: Դրվագներից մեկում Ռիկը պատրաստում է ռոբոտ, որի միակ նպատակը կարագ բերելն է: Որպես Bruface- ի (Բրյուսելի ճարտարագիտական ֆակուլտետ) ուսանողներ մենք ունենք մեխատրոնիկայի նախագծի առաջադրանք, որն է ռոբոտ կառուցել առաջարկվող թեմայի հիման վրա: Այս նախագծի առաջադրանքն է. Պատրաստել ռոբոտ, որը միայն կարագ է մատուցում: Այն կարող է ունենալ էքզիստենցիալ ճգնաժամ: Իհարկե, Ռիկի և Մորտիի դրվագում ռոբոտը բավականին բարդ ռոբոտ է, և որոշ պարզեցումներ պետք է արվեն.

Քանի որ դրա միակ նպատակը կարագ բերելն է, կան ավելի պարզ այլընտրանքներ: Ռոբոտին նայելու և բռնելու կարագը, նախքան այն ճիշտ մարդուն հասցնելը, ռոբոտը կարող է անընդհատ կրել կարագը: Հիմնական գաղափարն, այսպիսով, կարագ պատրաստելն է, որը կարագը տեղափոխում է այնտեղ, որտեղ այն պետք է լինի:

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

Նշենք, որ ռոբոտը պետք է կատարի հետևյալ պահանջները.

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

Քայլ 1: Հիմնական հայեցակարգ

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

Իր պարտականությունը կատարելու համար ռոբոտը պետք է շարժվի մինչև նպատակակետը հասնելը: Հաշվի առնելով ռոբոտի կիրառումը ՝ պարզ է, որ «քայլող» շարժման փոխարեն անիվներ օգտագործելն ավելի լավ է այն շարժել: Քանի որ սեղանը հարթ մակերես է, և ռոբոտը չի հասնի շատ մեծ արագությունների, երկու շարժվող անիվ և մեկ պտուտակավոր գնդակը ամենապարզ և ամենահեշտ վերահսկվող լուծումն է: Գործարկված անիվները պետք է աշխատեն երկու շարժիչով: Շարժիչները պետք է ունենան մեծ ոլորող մոմենտ, սակայն դրանք մեծ արագության հասնելու կարիք չունեն, այդ իսկ պատճառով կօգտագործվեն շարունակական servo շարժիչներ: Servo շարժիչների մեկ այլ առավելություն է Arduino- ի հետ օգտագործման պարզությունը:

Խոչընդոտների հայտնաբերումը կարող է իրականացվել ուլտրաձայնային տվիչի միջոցով, որը չափում է հեռավորությունը `կցված սերվո շարժիչին` չափման ուղղությունը ընտրելու համար: Theայրերը կարող են հայտնաբերվել LDR սենսորների միջոցով: LDR տվիչների օգտագործումը կպահանջի սարքի կառուցում, որը պարունակում է ինչպես լուսադիոդային լույս, այնպես էլ LDR սենսոր: LDR սենսորը չափում է անդրադարձվող լույսը և կարող է դիտվել որպես հեռավորության սենսոր: Նույն սկզբունքը գոյություն ունի ինֆրակարմիր լույսի դեպքում: Գոյություն ունեն ինֆրակարմիր հարևանության որոշ տվիչներ, որոնք ունեն թվային ելք ՝ փակ կամ ոչ փակ: Սա հենց այն է, ինչ անհրաժեշտ է ռոբոտին եզրերը հայտնաբերելու համար: Միացնելով երկու եզրային սենսորներ, որոնք տեղադրված են երկու միջատների ալեհավաքների և մեկ գործածված ուլտրաձայնային տվիչի նման, ռոբոտը պետք է կարողանա խուսափել խոչընդոտներից և եզրերից:

Կոճակների հայտնաբերումը կարող է իրականացվել նաև IR տվիչների և լուսադիոդների միջոցով: IR- ի առավելությունն այն է, որ այն անտեսանելի է, ինչը օգտագործումը դարձնում է անհանգստացնող սեղանի մարդկանց համար: Կարող էին օգտագործվել նաև լազերներ, բայց այդ դեպքում լույսը տեսանելի և նաև վտանգավոր կլիներ, երբ ինչ -որ մեկը լազերը մատնում էր ուրիշի աչքին: Բացի այդ, օգտագործողը պետք է ռոբոտի սենսորները թիրախավորի միայն բարակ լազերային ճառագայթով, ինչը բավականին նյարդայնացնող կլինի: Ռոբոտին հագեցնելով երկու IR սենսորներով և կոճակը կառուցելով IR լապտերով, ռոբոտը գիտի, թե որ ուղղությամբ պետք է գնալ ՝ հետևելով IR լույսի ինտենսիվությանը: Երբ կոճակ չկա, ռոբոտը կարող է շրջվել, մինչև լուսադիոդներից մեկը որսա ազդանշանը կոճակներից մեկից:

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

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

Րագրի հիմնական դժվարությունները հիմնված են կոդավորման վրա, քանի որ մեխանիկական մասը բավականին պարզ է: Շատ դեպքեր պետք է հաշվի առնել, որպեսզի ռոբոտը խրված կամ անցանկալի բան չանի: Հիմնական խնդիրները, որոնք մենք պետք է լուծենք, խոչընդոտի պատճառով IR ազդանշանի կորուստն են և կոճակին հասնելուն պես կանգ առնելը:

Քայլ 2: Նյութեր

Մեխանիկական մասեր

  • 3D տպիչ և լազերային կտրող մեքենա

    • PLA- ն կօգտագործվի 3D տպագրության համար, բայց կարող եք նաև օգտագործել ABS
    • 3 մմ կեչու նրբատախտակից պատրաստված ափսեը կօգտագործվի լազերային կտրման համար, քանի որ այն հնարավորություն է տալիս հետագայում հեշտությամբ փոփոխություններ կատարել, պլեքսիգլասը նույնպես կարող է օգտագործվել, բայց ավելի դժվար է այն փոփոխել լազերային կտրումից հետո ՝ առանց քանդելու այն:
  • Հեղույսներ, ընկույզներ, լվացարաններ

    Բաղադրիչների մեծ մասը միասին պահվում են ՝ օգտագործելով M3 կոճակի պտուտակներ, լվացարաններ և ընկույզներ, սակայն դրանցից ոմանք պահանջում են M2 կամ M4 պտուտակների հավաքածու: Հեղույսների երկարությունը 8-12 մմ միջակայքում է:

  • PCB spacers ՝ 25 մմ և 15 մմ
  • 2 Servo շարժիչներ համատեղելի անիվներով
  • Որոշ հաստ մետաղական մետաղալարեր ՝ 1-2 մմ տրամագծով

Էլեկտրոնային մասեր

  • Միկրոկոնտրոլեր

    1 arduino UNO տախտակ

  • Սերվո շարժիչներ

    • 2 Խոշոր սերվո շարժիչներ. Feetech շարունակական 6 կգ 360 աստիճան
    • 2 միկրո servo շարժիչ ՝ Feetech FS90
  • Սենսորներ

    • 1 Ուլտրաձայնային տվիչ
    • 2 IR հարևանության տվիչներ
    • 2 IR լուսոդիոդներ
  • Մարտկոցներ

    • 1 9V մարտկոցի կրիչ + մարտկոց
    • 1 4AA մարտկոցի կրիչ + մարտկոցներ
    • 1 9V մարտկոցի տուփ + մարտկոց
  • Լրացուցիչ բաղադրիչներ

    • Որոշ ցատկող լարեր, լարեր և զոդման թիթեղներ
    • Որոշ դիմադրիչներ
    • 1 IR LED
    • 3 անջատիչ
    • 1 զնգոց
    • 1 կոճակ
    • 1 Arduino- ից 9V մարտկոցի միակցիչ

Քայլ 3: Էլեկտրոնիկայի փորձարկում

Էլեկտրոնիկայի փորձարկում
Էլեկտրոնիկայի փորձարկում
Էլեկտրոնիկայի փորձարկում
Էլեկտրոնիկայի փորձարկում

Կոճակի ստեղծում.

Կոճակն ուղղակի պատրաստված է անջատիչի, ինֆրակարմիր LED- ի և 220 Օմ -ի դիմադրության միջոցով, որը սնուցվում է 9 Վ մարտկոցից: Այն տեղադրված է 9 Վ մարտկոցի տուփի մեջ `կոմպակտ և մաքուր դիզայնի համար:

Ինֆրակարմիր ստացողի մոդուլների ստեղծում

Այս մոդուլները պատրաստված են անցքերի միջոցով զոդման տախտակներով, որոնք հետագայում պտուտակներով կցվելու են ռոբոտին: Այս մոդուլների սխեմաները պատկերված են ընդհանուր սխեմաներում: Սկզբունքը կայանում է ինֆրակարմիր լույսի ինտենսիվության չափման մեջ: Չափումները բարելավելու համար կոլիմատորները (պատրաստված են նեղացող խողովակներով) կարող են օգտագործվել հետաքրքրության որոշակի ուղղության վրա կենտրոնանալու համար:

Էլեկտրոնային սարքերի միջոցով անհրաժեշտ է կատարել նախագծի տարբեր պահանջներ: Սարքերի քանակը պետք է սահմանափակվի `համեմատաբար ցածր բարդությունը պահպանելու համար: Այս քայլը պարունակում է էլեկտրագծերի սխեմաներ և յուրաքանչյուր ծածկագիր ՝ բոլոր մասերը առանձին փորձարկելու համար.

  • Շարունակական Servo շարժիչներ;
  • Ուլտրաձայնային տվիչ;
  • Ոչ շարունակական Servo շարժիչներ;
  • Buzzer;
  • IR կոճակի ուղղության հայտնաբերում;
  • Geայրերի հայտնաբերում հարևանության տվիչների միջոցով;

Այս կոդերը կարող են օգնել սկզբում հասկանալ բաղադրիչները, բայց դա նաև շատ օգտակար է հետագա փուլերում կարգաբերման համար: Եթե որոշակի խնդիր է առաջանում, սխալը կարող է ավելի հեշտությամբ հայտնաբերվել ՝ բոլոր բաղադրիչներն առանձին փորձարկելով:

Քայլ 4. 3D տպագիր և լազերային կտրված կտորների ձևավորում

3D տպագիր և լազերային կտրված կտորների ձևավորում
3D տպագիր և լազերային կտրված կտորների ձևավորում
3D տպագիր և լազերային կտրված կտորների ձևավորում
3D տպագիր և լազերային կտրված կտորների ձևավորում
3D տպագիր և լազերային կտրված կտորների ձևավորում
3D տպագիր և լազերային կտրված կտորների ձևավորում

Լազերային կտրված կտորներ

Մոնտաժը կազմված է երեք հիմնական հորիզոնական թիթեղներից, որոնք միացված են PCB- ի անջատիչներով `բաց դիզայն ստանալու համար, անհրաժեշտության դեպքում ապահովելով էլեկտրոնիկայի հեշտ մուտք:

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

Փոքր կտորները կտրված են մեծ սերվոյի չափսերին `դրանք հավաքման վրա ամրացնելու համար:

3D տպագիր կտորներ

Լազերային կտրումից բացի, որոշ կտորներ պետք է 3D տպվեն.

  • Ուլտրաձայնային տվիչի աջակցությունը, որն այն կապում է մեկ միկրո սերվո շարժիչի թևի հետ
  • Կաստորի անիվի և երկու IR եզրերի տվիչների աջակցությունը: IR սենսորների կտորի տուփի ծայրերի որոշակի դիզայնը գործում է որպես էկրան `խուսափելու համար IR ազդանշան կոճակի և IR սենսորների միջև միջամտություններից, որոնք պետք է կենտրոնանան միայն գետնի վրա կատարվող իրադարձությունների վրա:
  • Կափարիչը բացող միկրո servo շարժիչի աջակցությունը
  • Եվ վերջապես, կափարիչն ինքնին, պատրաստված է երկու կտորից, ավելի մեծ աշխատանքային անկյուն ունենալու համար `խուսափելով կափարիչը բացող միկրո սերվո շարժիչի հետ բախումից:

    • Ներքևը, որը ամրագրված կլինի վերին ափսեի վրա
    • Իսկ վերևը, որը ներքևի մասով կապված է ծխնու միջոցով և գործարկվում է սերվոյի միջոցով ՝ օգտագործելով հաստ մետաղական մետաղալար: Մենք որոշեցինք ռոբոտին մի փոքր անհատականություն հաղորդել ՝ նրան գլուխ տալով:

Երբ բոլոր կտորները նախագծվեն և ֆայլերը արտահանվեն ճիշտ ձևաչափով օգտագործվող մեքենաների համար, կտորներն իրականում կարող են պատրաստվել: Տեղյակ եղեք, որ 3D տպագրությունը շատ ժամանակ է պահանջում, հատկապես կափարիչի վերին հատվածի չափսերով: Ձեզ կարող է անհրաժեշտ լինել մեկ կամ երկու օր ՝ բոլոր կտորները տպելու համար: Լազերային կտրումը, սակայն, ընդամենը րոպեների հարց է:

Բոլոր SOLIDWORKS- ֆայլերը կարելի է գտնել սեղմված թղթապանակում:

Քայլ 5: Հավաքում և էլեկտրագծերի տեղադրում

Image
Image
Մոնտաժում և էլեկտրամոնտաժ
Մոնտաժում և էլեկտրամոնտաժ
Մոնտաժում և էլեկտրամոնտաժ
Մոնտաժում և էլեկտրամոնտաժ
Մոնտաժում և էլեկտրամոնտաժ
Մոնտաժում և էլեկտրամոնտաժ

Մոնտաժը լինելու է էլեկտրագծերի և բաղադրիչների պտուտակման խառնուրդ ՝ սկսած ներքևից վերև:

Ստորին ափսե

Ներքևի ափսեը հավաքված է 4AA մարտկոցի տուփով, servo շարժիչներով, տպագրված մասով (ափսեի տակ ամրացնելով գնդակը), երկու եզրային տվիչներով և 6 արական-իգական անջատիչներով:

Միջին ափսե

Հաջորդը, միջին ափսեը կարող է տեղադրվել ՝ սեղմելով երկու սալերի միջև ընկած սերվո շարժիչները: Այս ափսեն այնուհետև կարող է ամրացվել ՝ դրա վերևում տեղադրելով մեկ այլ անջատիչ: Որոշ մալուխներ կարող են անցնել կենտրոնական անցքով:

Ուլտրաձայնային մոդուլը կարող է կցվել ոչ շարունակական servo- ին, որն ամրացված է միջին ափսեի վրա Arduino- ով, 9 Վ մարտկոցով (աշխատում է arduino- ով) և երկու ինֆրակարմիր ստացողի մոդուլներով `ռոբոտի առջևի մասում: Այս մոդուլները պատրաստվում են անցքերի միջոցով զոդման տախտակներով և ամրացվում պտուտակներով ափսեի վրա: Այս մոդուլների սխեմաները պատկերված են ընդհանուր սխեմաներում:

Վերին ափսե

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

Երբ այս ամենը հասնի, վերին ափսեը կարելի է ամրացնել բացատներով: Վերջին անջատիչները, որոնք երկու անջատիչներն են `կոճակը, սերվոն, ազդանշանը և կափարիչի համակարգը կարող են վերջնականապես ամրացվել վերին ափսեին` հավաքումն ավարտելու համար:

Վերջին բանը, որը պետք է ստուգել և ուղղել, կափարիչը ճիշտ բացելու servo- ի անկյունն է:

Theայրային տվիչների շեմը պետք է հարմարեցվի ներառված պոտենցիոմետրով (հարթ պտուտակահան օգտագործելով) սեղանի տարբեր մակերեսների համար: Սպիտակ սեղանը պետք է ունենա ավելի ցածր շեմ, քան շագանակագույն սեղանը, օրինակ: Սենսորների բարձրությունը նույնպես կազդի անհրաժեշտ շեմի վրա:

Այս քայլի վերջում հավաքն ավարտված է, և վերջին մնացած մասը բաց թողնված կոդերն են:

Քայլ 6: Կոդավորում. Ամեն ինչ միասին դնել

Ռոբոտին աշխատեցնելու համար անհրաժեշտ բոլոր ծածկագրերը գտնվում են սեղմված ֆայլում, որը կարելի է ներբեռնել: Ամենակարևորը «հիմնական» կոդն է, որը ներառում է ռոբոտի կարգավորումը և գործառական օղակը: Մնացած գործառույթների մեծ մասը գրված է ենթաֆայլերում (նաև սեղմված թղթապանակում): Այս ենթաֆայլերը պետք է պահվեն նույն թղթապանակում (որը կոչվում է «հիմնական»), որպես հիմնական սցենար ՝ նախքան Arduino- ում բեռնելը

Սկզբում ռոբոտի ընդհանուր արագությունը որոշվում է «հիշեցում» փոփոխականի հետ միասին: Այս «հիշեցումը» արժեք է, որը հիշում է, թե որ ուղղությամբ էր շրջվում ռոբոտը: Եթե «հիշեցրեք = 1», ռոբոտը թեքվում էր/թեքվում էր ձախ, եթե «հիշեցնում = 2» ՝ ռոբոտը թեքվում էր/թեքվում էր աջ:

int արագություն = 9; // Ռոբոտի ընդհանուր արագությունը

int հիշեցում = 1; // Սկզբնական ուղղություն

Ռոբոտի տեղադրման ընթացքում նախաստորագրվում են ծրագրի տարբեր ենթաֆայլեր: Այս ենթաֆայլերում գրված են շարժիչների, սենսորների և … կառավարման հիմնական գործառույթները: Տեղադրելով դրանք տեղադրման մեջ, այս ֆայլերից յուրաքանչյուրում նկարագրված գործառույթները կարող են օգտագործվել հիմնական հանգույցում: r2D2 () գործառույթը ակտիվացնելով ՝ ռոբոտը աղմուկ կբարձրացնի, ինչպես R2D2 ռոբոտը ՝ «Աստղային պատերազմներ» ֆիլմի արտոնությունից, երբ այն սկսվում է: Այստեղ r2D2 () ֆունկցիան անջատված է, որպեսզի ազդանշանը թույլ չտա շատ հոսանք քաշել:

// Կարգավորում @ վերականգնում // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int հիշեցում = 1; // նախնական ուղղություն Starter (հիշեցում); }

Սկսնակ (հիշեցում) գործառույթը առաջինը կանչվում է տեղադրման ընթացքում: Այս գործառույթը ստիպում է ռոբոտին շրջվել և փնտրել կոճակներից մեկի IR ազդանշանը: Կոճակը գտնելուց հետո ծրագիրը դուրս կգա Starter գործառույթից ՝ փոփոխելով «cond» փոփոխականը կեղծի: Ռոբոտի պտույտի ընթացքում այն պետք է տեղյակ լինի իր միջավայրի մասին. Այն պետք է հայտնաբերի եզրեր և խոչընդոտներ: Սա ստուգվում է ամեն անգամ, մինչև այն շարունակվի շրջվել: Երբ ռոբոտը հայտնաբերի խոչընդոտ կամ եզր, այդ խոչընդոտներից կամ եզրերից խուսափելու արձանագրությունը կկատարվի: Այս արձանագրությունները հետագայում կբացատրվեն այս քայլին: Starter գործառույթն ունի մեկ փոփոխական, որը հիշեցման փոփոխականն է, որը նախկինում քննարկվել էր: Սկսնակ գործառույթին հիշեցման արժեքը տալով ՝ ռոբոտը գիտի, թե որ ուղղությամբ պետք է շրջվի, որպեսզի փնտրի կոճակը:

// Սկսնակ հանգույց. Շրջվեք և որոնեք կոճակը // ---------------------------------------- ----------------

void Starter (int հիշեցում) {if (isedgeleft () || isedgeright ()) {// Հայտնաբերել եզրերի եզրը Հայտնաբերված (հիշեցում); } else {bool cond = true; while (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (հիշեցում == 1) {// Մենք թեքվում էինք ձախ, եթե (isobstacleleft ()) {stoppeed (); խուսափել_խոչընդոտից (հիշեցնել); } else if (isedgeleft () || isedgeright ()) {// Բացահայտեք եզրերի եզրը Հայտնաբերված (հիշեցում); } else {շրջադարձ (արագություն); }} else if (հիշեցում == 2) {if (isobstacleright ()) {stoppeed (); խուսափել_խոչընդոտից (հիշեցնել); } else if (isedgeleft () || isedgeright ()) {// Բացահայտեք եզրերի եզրը Հայտնաբերված (հիշեցում); } else {turnright (արագություն); }}}}}}

Եթե ռոբոտը գտնի կոճակը, ապա առաջին Starter օղակը դուրս է գալիս և սկսվում է ռոբոտի հիմնական, գործառական օղակը: Այս հիմնական հանգույցը բավականին բարդ է, քանի որ ամեն անգամ ռոբոտը պետք է որոշի ՝ առջևում կա՞ խոչընդոտ կամ եզր: Հիմնական գաղափարն այն է, որ ռոբոտը հետևում է կոճակին ՝ գտնելով այն և ամեն անգամ կորցնելով այն: Երկու IR սենսորների օգտագործմամբ մենք կարող ենք տարբերակել երեք իրավիճակ.

  • Ձախ և աջ սենսորով հայտնաբերված IR լույսի միջև տարբերությունը ավելի մեծ է, քան որոշակի շեմը, և կա կոճակ:
  • IR լույսի տարբերությունը շեմից փոքր է, և ռոբոտի դիմաց կա կոճակ:
  • IR լույսի տարբերությունը շեմից փոքր է, և ռոբոտի դիմաց ՉԿԱ կոճակ:

Հետագծման ռեժիմն աշխատում է հետևյալ կերպ. Երբ կոճակը հայտնաբերվում է, ռոբոտը շարժվում է դեպի կոճակը ՝ պտտվելով նույն ուղղությամբ, որը պտտվում էր (հիշեցման փոփոխականի միջոցով) և միևնույն ժամանակ մի փոքր առաջ շարժվելով: Եթե ռոբոտը շատ հեռու թեքվի, կոճակը նորից կորած կլինի, և այս պահին ռոբոտը հիշում է, որ պետք է շրջվի այլ ուղղությամբ: Սա արվում է նաև մի փոքր առաջ շարժվելիս: Դրանով ռոբոտը անընդհատ թեքվում է ձախ և թեքվում աջ, բայց այդ ընթացքում դեռ առաջ է շարժվում դեպի կոճակը: Ամեն անգամ, երբ ռոբոտը գտնում է կոճակը, այն շարունակում է պտտվել մինչև այն կորցնելը, որի դեպքում սկսում է շարժվել այլ ուղղությամբ: Ուշադրություն դարձրեք գործառույթների տարբերությանը, որոնք օգտագործվում են Starter և հիմնական հանգույցում. «turnleft ()» կամ «turnright ()», մինչդեռ հիմնական հանգույցում օգտագործվում է «moveleft ()» և «moveright ()»: Տեղափոխման ձախ/աջ գործառույթները ոչ միայն ստիպում են ռոբոտին շրջվել, այլև ստիպել նրան առաջ շարժվել միաժամանակ:

/ * Ֆունկցիոնալ հանգույց ---------------------------- Այստեղ կա միայն երթուղու ռեժիմ */

int կորած = 0; // Եթե կորել է = 0 կոճակը գտնվել է, եթե կորել է = 1 կոճակը կորել է void loop () {if (isedgeleft () || isedgeright ()) {

եթե (! isobstacle ()) {

առաջ շարժվել (արագություն); ուշացում (5); } else {խուսափել խոչընդոտներից (հիշեցնել); } else {if (հիշեցում == 1 && կորած == 1) {// Մենք թեքում էինք ձախ կանգառի արագությունը (); եթե (! isobstacleright ()) {շարժունակություն (արագություն); // Շրջվեք ՝ կոճակը գտնելու համար} else {else_ խուսափել_խոչընդոտ (հիշեցնել); } հիշեցնել = 2; } else if (հիշեցնել == 2 && կորցրել == 1) {stoppeed (); եթե (! isobstacleleft ()) {moveleft (արագություն); // Մենք թեքվում էինք աջ} այլապես {խուսափել_խոչընդոտից (հիշեցնել); } հիշեցնել = 1; } else if (կորել է == 0) {եթե (հիշեցնել == 1) {// Մենք թեքվում էինք ձախ, եթե (! isobstacleleft ()) {moveleft (արագություն); // Մենք թեքվում էինք աջ} else {stoppeed (); խուսափել_խոչընդոտից (հիշեցնել); } //} այլ դեպքում (հիշեցում == 2) {եթե (! isobstacleright ()) {շարժունակություն (արագություն); // Շրջվեք, որպեսզի գտնեք կոճակը} else {stoppeed (); խուսափել_խոչընդոտից (հիշեցնել); }}} ուշացում (10); կորած = 0; }} //}}

Այժմ տրվում է երկու ամենաբարդ առօրյայի մի փոքր բացատրություն.

Խուսափեք եզրերից

Եզրերից խուսափելու արձանագրությունը սահմանվում է «edgeDetection ()» կոչվող գործառույթում, որը գրված է «շարժում» ենթաֆայլում: Այս արձանագրությունը հիմնված է այն փաստի վրա, որ ռոբոտը պետք է բախվի միայն եզրին, երբ այն հասնի իր նպատակակետին ՝ կոճակին: Երբ ռոբոտը եզր է հայտնաբերում, առաջին բանը, որ անում է, մի փոքր հետ գնալն է ՝ եզրից անվտանգ հեռավորության վրա գտնվելու համար: Երբ դա արվի, ռոբոտը սպասում է 2 վայրկյան: Եթե ինչ -որ մեկը այդ երկու վայրկյանում սեղմում է ռոբոտի առջևի կոճակը, ռոբոտը գիտի, որ այն հասել է կարագ ցանկացողին, բացում է կարագի հատվածը և ներկայացնում կարագը:Այս պահին ինչ -որ մեկը կարող է կարագ վերցնել ռոբոտից: Մի քանի վայրկյան անց ռոբոտը կհոգնի սպասելուց և պարզապես կփակի կարագի կափարիչը: Կափարիչը փակվելուց հետո ռոբոտը կկատարի Starter օղակը ՝ մեկ այլ կոճակ փնտրելու համար: Եթե պատահի, որ ռոբոտը բախվի եզրին նախքան իր նպատակակետին հասնելը և ռոբոտի առջևի կոճակը չսեղմվի, ապա ռոբոտը չի բացի կարագի կափարիչը և անմիջապես կկատարի Starter օղակը:

Խուսափեք խոչընդոտներից

Evv_obstacle () գործառույթը նույնպես տեղակայված է «շարժում» ենթաֆայլում: Խոչընդոտներից խուսափելու ամենադժվարը այն փաստն է, որ ռոբոտը բավականին մեծ կույր տարածք ունի: Ուլտրաձայնային տվիչը տեղադրված է ռոբոտի առջևում, ինչը նշանակում է, որ այն կարող է խոչընդոտներ հայտնաբերել, սակայն չգիտի, թե երբ է այն փոխանցվում դրան: Դա լուծելու համար օգտագործվում է հետևյալ սկզբունքը. Երբ ռոբոտը հանդիպում է որևէ խոչընդոտի, այն օգտագործում է ռեմինգ փոփոխականը `այլ ուղղությամբ շրջվելու համար: Այս կերպ ռոբոտը խուսափում է խոչընդոտին հարվածելուց: Ռոբոտը շարունակում է պտտվել, մինչև ուլտրաձայնային տվիչը այլևս չբացահայտի խոչընդոտը: Այն ժամանակ, երբ ռոբոտը պտտվում է, հաշվիչը մեծանում է այնքան ժամանակ, մինչև խոչընդոտը այլևս չի հայտնաբերվում: Այս հաշվիչը տալիս է խոչընդոտի երկարության մոտավոր հաշվարկ: Այնուհետև առաջ շարժվելով և միևնույն ժամանակ հաշվիչը նվազեցնելով, խոչընդոտը կարող է խուսափել: Երբ հաշվիչը հասնում է 0 -ի, Starter գործառույթը կարող է կրկին օգտագործվել կոճակը տեղափոխելու համար: Իհարկե, ռոբոտը կատարում է Starter գործառույթը ՝ շրջվելով այն ուղղությամբ, որը նա հիշում էր, որ գնում էր մինչև խոչընդոտի հանդիպելը (կրկին օգտագործելով հիշեցման փոփոխականը):

Այժմ, երբ դուք լիովին հասկանում եք ծածկագիրը, կարող եք սկսել օգտագործել այն:

Համոզվեք, որ շեմերը հարմարեցրեք ձեր միջավայրին (IR արտացոլումն ավելի բարձր է, օրինակ, սպիտակ սեղանների վրա) և տարբեր պարամետրերը հարմարեցրեք ձեր կարիքներին: Բացի այդ, մեծ ուշադրություն պետք է դարձնել տարբեր մոդուլների հզորացմանը: Հիմնական կարևորությունն այն է, որ servo շարժիչները սնուցված չլինեն Arduino 5V պորտով, քանի որ դրանք շատ հոսանք են ընդունում (դա կարող է վնասել միկրոկոնտրոլերը): Եթե սենսորների համար օգտագործվում է էլեկտրաէներգիայի նույն աղբյուրը, ինչպիսին է սերվերը, ապա որոշ չափման խնդիրներ կարող են առաջանալ:

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