Մենք աշխատում ենք Lego Mindstorms EV3-ի հետ .NET-ից: Երկու կամ ավելի EV3 աղյուսների միացում Միացում Wi-Fi-ի միջոցով

USB միացում

LEGO Mindstorms EV3-ը կարող է միանալ համակարգչին կամ այլ EV3-ին USB կապի միջոցով: Կապի արագությունն ու կայունությունն այս դեպքում ավելի լավն են, քան ցանկացած այլ եղանակով, ներառյալ Bluetooth-ը:

LEGO Mindstorms EV3-ն ունի երկու USB պորտ:

Հաղորդակցություն LEGO EV3-ի և այլ LEGO EV3 բլոկների միջև Daisy Chain ռեժիմում:

Daisy շղթայի ռեժիմն օգտագործվում է երկու կամ ավելի LEGO EV3 բլոկների միացման համար:

Այս ռեժիմը.

  • նախատեսված է մեկից ավելի LEGO Mindstorms EV3 միացնելու համար;
  • ծառայում է ավելի շատ սենսորների, շարժիչների և այլ սարքերի միացմանը.
  • թույլ է տալիս հաղորդակցվել մի քանի LEGO Mindstorms EV3 (մինչև 4) միջև, որը մեզ տալիս է մինչև 16 արտաքին և նույնքան ներքին պորտեր;
  • հնարավորություն է տալիս վերահսկել ամբողջ շղթան հիմնական LEGO Mindstorms EV3-ից;
  • չի կարող գործել, երբ Wi-Fi-ը կամ Bluetooth-ը ակտիվ են:

Daisy շղթայի միացման ռեժիմը միացնելու համար գնացեք նախագծի կարգավորումների պատուհանը և նշեք վանդակը:

Երբ ընտրված է այս ռեժիմը, ապա ցանկացած շարժիչի համար մենք կարող ենք ընտրել EV3 բլոկը, որը կօգտագործվի և անհրաժեշտ սենսորները:

Աղյուսակը ցույց է տալիս EV3 բլոկների օգտագործման տարբերակները.

Գործողություն

Միջին շարժիչ

Մեծ շարժիչ

ղեկ

Անկախ կառավարում

Գիրոսկոպիկ

Ինֆրակարմիր

Ուլտրաձայնային

Շարժիչի ռոտացիա

Ջերմաստիճաններ

Էներգիայի հաշվիչ

Ձայն

Միացում Bluetooth-ի միջոցով

Bluetooth-ը թույլ է տալիս LEGO Mindstorms EV3-ին միանալ համակարգչին, այլ LEGO Mindstorms EV3-ին, սմարթֆոններին և այլ Bluetooth սարքերին: Bluetooth-ի միջոցով հաղորդակցության տիրույթը մինչև 25 մ է:

Դուք կարող եք միացնել մինչև 7 բլոկ մեկ LEGO Mindstorms EV3-ին: EV3 Master Brick-ը թույլ է տալիս ուղարկել և ստանալ հաղորդագրություններ յուրաքանչյուր EV3 Slave-ին: EV3 Slaves-ը կարող է հաղորդագրություններ ուղարկել միայն EV3 Master Brick-ին, ոչ թե միմյանց:

EV3 միացման հաջորդականությունը Bluetooth-ի միջոցով

Երկու կամ ավելի EV3 բլոկներ Bluetooth-ի միջոցով միմյանց միացնելու համար անհրաժեշտ է կատարել հետևյալ քայլերը.

1. Բացեք ներդիր Կարգավորումներ.

2. Ընտրեք Bluetoothև սեղմեք կենտրոնական կոճակը:

3. Մենք դնում ենք Նշավանդակ տեսանելիությունը Bluetooth.

4. Ստուգեք, որ Bluetooth նշանը ("<") виден на верхней левой стороне.

5. Կատարեք վերը նշված ընթացակարգը անհրաժեշտ քանակությամբ EV3 Աղյուսների համար:

6. Գնացեք «Միացում» ներդիր.

7. Սեղմեք Search կոճակը.

8. Ընտրեք EV3-ը, որին ցանկանում եք միանալ (կամ որին ցանկանում եք միանալ) և սեղմեք կենտրոնական կոճակը:

9. Մենք կապում ենք առաջին և երկրորդ բլոկները մուտքի ստեղնով:

Եթե ​​ամեն ինչ ճիշտ եք անում, ապա վերին ձախ անկյունում կհայտնվի «» պատկերակը<>«, նույն կերպ միացրեք մյուս EV3 բլոկները, եթե դրանք երկուսից ավելի են։

Եթե ​​անջատեք LEGO EV3-ը, կապը կկորչի, և դուք պետք է կրկնեք բոլոր քայլերը:

Կարևոր է. յուրաքանչյուր բլոկի պետք է գրված լինի իր ծրագիրը:

Օրինակ ծրագիր.

Առաջին բլոկ. Երբ հպման սենսորը սեղմված է, առաջին EV3 Block-ը տեքստը փոխանցում է երկրորդ Բլոկին 3 վայրկյան ուշացումով (հիմնական բլոկ):

Ծրագրի օրինակ 2-րդ բլոկի համար.

Երկրորդ բլոկը սպասում է առաջին բլոկի տեքստը ստանալուն, և այն ստանալուց հետո այն կցուցադրի բառ (մեր օրինակում՝ «Բարև» բառը) 10 վայրկյան (ստրկատիրական բլոկ):

Միացեք Wi-Fi-ի միջոցով

Ավելի մեծ հեռավորության վրա հաղորդակցությունը հնարավոր է Wi-Fi Dongle-ը միացնելով EV3-ի USB պորտին:

Wi-Fi-ից օգտվելու համար հարկավոր է հատուկ մոդուլ տեղադրել EV3 բլոկի վրա՝ օգտագործելով USB միակցիչ (Wi-Fi ադապտեր (Netgear N150 Wireless Adapter (WNA1100), կամ կարող եք միացնել Wi-Fi Dongle:

Ընտրեք էկրանի ռեժիմը

Ռեժիմի ընտրություն
Արգելափակել տեքստային դաշտը
Մուտքագրումներ
Նախադիտման կոճակ

Ընտրեք տեքստի կամ գրաֆիկայի տեսակը, որը ցանկանում եք տեսնել՝ օգտագործելով ռեժիմի ընտրիչը: Ռեժիմն ընտրելուց հետո կարող եք ընտրել մուտքագրման արժեքները: Հասանելի մուտքերը տարբեր կլինեն՝ կախված ռեժիմից: Ռեժիմները և մուտքերը նկարագրված են ստորև:

Կարող եք սեղմել Preview կոճակը՝ նախադիտելու համար, թե ինչ կցուցադրի Display բլոկը EV3 էկրանին: Դուք կարող եք բաց թողնել տեսարանը՝ բլոկի համար մուտքային արժեքներ ընտրելիս:

Էկրանի կոորդինատները

Էկրանի արգելափակման ռեժիմներից շատերը օգտագործում են X և Y կոորդինատներ՝ տարրի գտնվելու վայրը որոշելու համար: Կոորդինատները որոշում են պիքսելների դիրքը EV3 Brick էկրանի վրա: Դիրքը (0, 0) գտնվում է էկրանի վերին ձախ անկյունում, ինչպես ցույց է տրված ստորև նկարում:

Էկրանի չափսերը՝ 178 պիքսել լայնություն և 128 պիքսել բարձրություն։ X կոորդինատների արժեքների միջակայքը ձախից էկրանին 0-ից մինչև աջ կողմում 177 է: Y կոորդինատների արժեքների միջակայքը վերևում 0-ից մինչև ներքևում 127 է:

Խորհուրդներ եւ հնարքներ

Դուք կարող եք օգտագործել Էկրանի բլոկի վերին ձախ անկյունում գտնվող «Նախադիտում» կոճակը՝ օգնելու գտնել էկրանի ճիշտ կոորդինատները:

Տեքստ - պիքսելներ

Տեքստ - Pixels ռեժիմը թույլ է տալիս ցուցադրել տեքստը EV3 Brick էկրանի ցանկացած վայրում:

Վերականգնել պատուհանը

Վերականգնել պատուհանի ռեժիմը վերադարձնում է EV3 Brick էկրանը ստանդարտ տեղեկատվական էկրանին, որը ցուցադրվում է ծրագրի գործարկման ընթացքում: Այս էկրանը ցույց է տալիս ծրագրի անվանումը և հետադարձ կապի այլ տեղեկություններ: Երբ դուք ծրագիր եք գործարկում EV3 Brick-ի վրա, այս էկրանը հայտնվում է ծրագրի առաջին Էկրանի բլոկի գործարկումից առաջ:

Ցուցադրվող տարրերի տեսանելիության ապահովում

Երբ EV3 ծրագիրն ավարտվում է, EV3 Brick էկրանը մաքրվում է և վերադառնում EV3 Brick մենյուի էկրան: Ծրագրի կողմից ցուցադրվող ցանկացած տեքստ կամ գրաֆիկա կջնջվի: Եթե, օրինակ, ձեր ծրագիրն ունի մեկ «Էկրան» բլոկ և ուրիշ ոչինչ, ապա ծրագրի ավարտից անմիջապես հետո էկրանն այնքան արագ կջնջվի, որ «Էկրանի» բլոկի արդյունքները չեք տեսնի։

Եթե ​​ցանկանում եք, որ էկրանը տեսանելի մնա ծրագրի ավարտից հետո, դուք պետք է ծրագրի ավարտին բլոկ ավելացնեք, որպեսզի ծրագիրը անմիջապես չավարտվի, ինչպես ցույց է տրված հետևյալ օրինակներում:

Ցուցադրվում են բազմաթիվ տարրեր

Եթե ​​ցանկանում եք էկրանին միաժամանակ ցուցադրել մի քանի տեքստ կամ գրաֆիկական տարրեր, կարևոր է չմաքրել EV3 Brick էկրանը տարրերի միջև: Էկրանի բլոկի յուրաքանչյուր ռեժիմ ունի Clear Screen մուտքագրում: Եթե ​​Clear Screen-ը ճշմարիտ է, ամբողջ էկրանը կջնջվի մինչև տարրի ցուցադրումը: Սա նշանակում է, որ մի քանի տարրեր ցուցադրելու համար պետք է Clear Screen-ը սահմանել False-ի յուրաքանչյուր Էկրանի բլոկի համար, բացառությամբ առաջինի:

Ցուցադրվում են թվեր

Ձեր ծրագրում թվային արժեք ցուցադրելու համար միացրեք տվյալների ավտոբուսը Text Display բլոկի Text մուտքագրմանը: Թվային տվյալների ավտոբուսը ավտոմատ կերպով կվերածվի տեքստի՝ օգտագործելով տվյալների ավտոբուսի տիպի փոխարկումը (տես բաժինը

Դիզայների միկրոհամակարգիչը Beaglebone-ով կամ այլով փոխարինելու գաղափարը նոր չէ: Բայց EV3-ի թողարկմամբ հնարավոր եղավ ոչ միայն ստանալ 100% անալոգային, այլև բարձրացնել ձեր լեգորոբոտի արդյունավետությունը:

Նախագծի վիդեո ներկայացում.

E VB-ն լիովին աջակցում է Lego Mindstorms Ev3 համակարգը ինչպես ապարատային, այնպես էլ ծրագրային մակարդակներում, 100% համատեղելի է բոլոր Lego սենսորների և շարժիչների հետ: Բլոկն աշխատում է նույնը, ինչ Lego Mindstorms EV3 բլոկը.

BeagleBone Սեւ— մեկ տախտակով Linux համակարգիչ:Այն Raspberry Pi-ի մրցակիցն է։ Ունի հզոր պրոցեսոր AM335x 720MHz ARM® պրոցեսոր, մեծ մուտքերի/ելքերի քանակը, հնարավորությունները կարող են ընդլայնվել լրացուցիչ տախտակներով:

Lego Mindstorms EV3-ն ունի ARM9 (TI Sitara AM180x) 300 ՄՀց պրոցեսոր, ուստի տեղափոխվում է ARM Cortex-A8 (TI Sitara AM335x) 1 ԳՀց BeagleBone Black պրոցեսոր: բարձրացնում է արտադրողականությունը, գումարած, հնարավոր է դառնում միացնել լրացուցիչ ընդլայնման քարտեր:

Ամենակարևորն այն է, որ Lego Mindstorms EV3-ն ունի բոլոր ծրագրերի և սարքավորումների բաց նկարագրությունը:

Օրինակ՝ հավաքվել և ցուցադրվել է հայտնի Ռուբիկի խորանարդը լուծող ռոբոտը։ Միայն EV3-ի փոխարեն տեղադրեցին մշակված EVB-ն։ Հրավիրում ենք դիտելու տեսանյութը.

Նախագծի հեղինակներն արդեն արտադրում և վաճառում են EVB: Նրանք նախատեսում են զգալիորեն ընդլայնել արտադրությունը մինչև 2015 թվականի ապրիլի վերջը: Բացի այդ, նրանք մշակել և արտադրում են մի քանի համատեղելի սենսորներ:

Ավանդաբար, ռոբոտները կառուցված են հարթակի վրա Lego Mindstorms EV3, ծրագրավորված են LabVIEW գրաֆիկական միջավայրի միջոցով: Այս դեպքում ծրագրերն աշխատում են EV3 կարգավորիչի վրա, և ռոբոտը գործում է ինքնուրույն: Այստեղ ես կխոսեմ ռոբոտին կառավարելու այլընտրանքային եղանակի մասին՝ օգտագործելով համակարգչի վրա աշխատող .NET հարթակը:

Բայց նախքան ծրագրավորման մեջ մտնելը, եկեք նայենք մի քանի դեպքերի, երբ դա կարող է օգտակար լինել.

  • Պահանջում է ռոբոտի հեռակառավարումը նոութբուքից (օրինակ՝ կոճակները սեղմելով)
  • Պահանջվում է տվյալներ հավաքել EV3 կարգավորիչից և մշակել դրանք արտաքին համակարգում (օրինակ՝ IoT համակարգերի համար)
  • Ցանկացած այլ իրավիճակ, երբ ցանկանում եք գրել կառավարման ալգորիթմ .NET-ում և գործարկել այն EV3 կարգավորիչին միացված համակարգչից:

LEGO MINDSTORMS EV3 API .NET-ի համար

EV3 կարգավորիչը կառավարվում է արտաքին համակարգից՝ հրամաններ ուղարկելով սերիական պորտին: Հրամանի ձևաչափն ինքնին նկարագրված է Communication Developer Kit-ում:

Բայց այս արձանագրությունը ձեռքով իրականացնելը ձանձրալի է: Հետևաբար, կարող եք օգտագործել պատրաստի .NET փաթաթան, որը Բրայան Փիկն ուշադիր գրել է։ Այս գրադարանի սկզբնական կոդը տեղակայված է Github-ում, իսկ օգտագործման համար պատրաստ փաթեթը կարելի է գտնել Nuget-ում:

Միացում EV3 վերահսկիչին

Brick դասը օգտագործվում է EV3 կարգավորիչի հետ հաղորդակցվելու համար: Այս օբյեկտը ստեղծելիս դուք պետք է կոնստրուկտորին փոխանցեք ICCommunication ինտերֆեյսի իրականացումը. օբյեկտ, որը նկարագրում է, թե ինչպես միանալ EV3 կարգավորիչին: Հասանելի են UsbCommunication, BluetoothCommunication և NetworkCommunication (WiFi կապ):

Միացման ամենատարածված մեթոդը Bluetooth-ի միջոցով է: Եկեք ավելի սերտ նայենք այս կապի մեթոդին:

Նախքան մենք կարողանանք ծրագրային կերպով միանալ կարգավորիչին Bluetooth-ի միջոցով, կարգավորիչը պետք է միացված լինի համակարգչին՝ օգտագործելով օպերացիոն համակարգի կարգավորումները:

Կարգավորիչը միացնելուց հետո անցեք Bluetooth կարգավորումներ և ընտրեք COM պորտերի ներդիրը: Մենք գտնում ենք մեր վերահսկիչը, մեզ պետք է արտագնանավահանգիստ. Մենք դա կնշենք BluetoothCommunication օբյեկտը ստեղծելիս:

Կարգավորիչին միանալու ծածկագիրը կունենա հետևյալ տեսքը.

Հանրային համաժամեցված Task Connect (ICCommunication հաղորդակցություն) ( var communication = նոր BluetoothCommunication ("COM9"); var brick = _brick = new Brick(communication); await _brick.ConnectAsync(); )

Ընտրովի, դուք կարող եք նշել կարգավորիչին միացման ժամկետի ավարտը.

Սպասեք _brick.ConnectAsync(TimeSpan.FromSeconds(5));

USB-ի կամ WiFi-ի միջոցով միավորին միացումը կատարվում է նույն կերպ, բացառությամբ, որ օգտագործվում են UsbCommunication և NetworkCommunication օբյեկտները:

Կարգավորիչի վրա կատարված բոլոր հետագա գործողությունները կատարվում են Brick օբյեկտի միջոցով:

Եկեք պտտենք շարժիչները

EV3 կարգավորիչի վրա հրամաններ կատարելու համար մենք մուտք ենք գործում Brick օբյեկտի DirectCommand հատկությունը: Նախ, եկեք փորձենք գործարկել շարժիչները:

Ենթադրենք, որ մեր շարժիչը միացված է կարգավորիչի A պորտին, ապա այս շարժիչը 50% հզորությամբ աշխատելը կունենա հետևյալ տեսքը.

Սպասեք _brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50);

Շարժիչը կառավարելու այլ մեթոդներ կան. Օրինակ, դուք կարող եք պտտել շարժիչը որոշակի անկյան տակ՝ օգտագործելով StepMotorAtPowerAsync() և StepMotorAtSpeedAsync() մեթոդները: Առկա են մի քանի մեթոդներ, որոնք տատանումներ են շարժիչների միացման ռեժիմների վրա՝ ըստ ժամանակի, արագության, հզորության և այլն:

Հարկադիր կանգառն իրականացվում է StopMotorAsync() մեթոդով.

Սպասեք _brick.DirectCommand.StopMotorAsync(OutputPort.A, true);

Երկրորդ պարամետրը ցույց է տալիս արգելակի օգտագործումը: Եթե ​​դուք դրեք այն false-ի վրա, շարժիչը կկանգնեցվի:

Սենսորներից արժեքների ընթերցում

EV3 կարգավորիչն ունի չորս պորտ՝ սենսորների միացման համար։ Բացի սրանից, շարժիչներն ունեն նաև ներկառուցված կոդավորիչներ, որոնք թույլ են տալիս դրանք օգտագործել որպես սենսորներ։ Արդյունքում մենք ունենք 8 պորտ, որոնցից կարելի է կարդալ արժեքները։

Արժեքները կարդալու պորտերին կարելի է մուտք գործել Brick օբյեկտի Ports հատկության միջոցով: Ports-ը նավահանգիստների հավաքածու է, որոնք հասանելի են վերահսկիչի վրա: Հետեւաբար, կոնկրետ նավահանգստի հետ աշխատելու համար անհրաժեշտ է ընտրել այն: InputPort.One ... InputPort.Four-ը սենսորային պորտերն են, իսկ InputPort.A ... InputPort.D-ն շարժիչի կոդավորիչներն են:

Var port1 = _brick.Ports;

EV3-ի սենսորները կարող են աշխատել տարբեր ռեժիմներով: Օրինակ, EV3 Color Sensor-ը կարող է օգտագործվել շրջակա միջավայրի լույսը չափելու, արտացոլված լույսը չափելու կամ գույնը հայտնաբերելու համար: Հետևաբար, սենսորին «պատմելու» համար, թե ինչպես ենք մենք ցանկանում օգտագործել այն, մենք պետք է սահմանենք դրա ռեժիմը.

Brick.Ports.SetMode(ColorMode.Reflective);

Այժմ, երբ սենսորը միացված է, և դրա գործառնական ռեժիմը միացված է, դուք կարող եք կարդալ դրանից տվյալները: Դուք կարող եք ստանալ «հում» տվյալներ, մշակված արժեք և տոկոսային արժեք:

Float si = _brick.Ports.SIValue; int raw = _brick.Ports.RawValue; բայթ տոկոս = _brick.Ports.PercentValue;

SIValue հատկությունը վերադարձնում է մշակված տվյալները: Ամեն ինչ կախված է նրանից, թե որ սենսորն է օգտագործվում և ինչ ռեժիմում: Օրինակ, արտացոլված լույսը չափելիս մենք կստանանք արժեքներ 0-ից մինչև 100՝ կախված արտացոլված լույսի ինտենսիվությունից (սև/սպիտակ):

RawValue հատկությունը վերադարձնում է ADC-ից ստացված չմշակված արժեքը: Երբեմն ավելի հարմար է այն օգտագործել հետագա մշակման և օգտագործման համար: Ի դեպ, EV3 մշակման միջավայրում հնարավոր է նաև ստանալ «հում» արժեքներ. դրա համար անհրաժեշտ է օգտագործել կապույտ վահանակի բլոկը:

Եթե ​​ձեր օգտագործած սենսորը ակնկալում է արժեքներ ստանալ տոկոսներով, ապա կարող եք նաև օգտագործել PercentValue հատկությունը:

Հրամանների կատարում խմբաքանակով

Ենթադրենք, մենք ունենք երկու անիվներով ռոբոտի սայլ և ցանկանում ենք այն տեղակայել տեղում: Այս դեպքում երկու անիվները պետք է պտտվեն հակառակ ուղղությամբ: Եթե ​​մենք օգտագործում ենք DirectCommand և հաջորդաբար երկու հրաման ենք ուղարկում վերահսկիչին, դրանց կատարման միջև կարող է որոշ ժամանակ անցնել.

Սպասեք _brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50); await _brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.B, -50);

Այս օրինակում մենք հրաման ենք ուղարկում A շարժիչը պտտել 50 արագությամբ, այս հրամանը հաջողությամբ ուղարկելուց հետո նույնը կրկնում ենք B պորտին միացված շարժիչի հետ: Խնդիրն այն է, որ հրամաններ ուղարկելը անմիջապես չի կատարվում, ուստի շարժիչները կարող է սկսել պտտվել տարբեր ժամանակներում, երբ հրամանը փոխանցվում է B պորտի, A շարժիչի համար արդենկսկսի պտտվել:

Եթե ​​մեզ համար կարևոր է, որ շարժիչները միաժամանակ պտտվեն, մենք կարող ենք հրամաններ ուղարկել վերահսկիչին «փաթեթով»: Այս դեպքում դուք պետք է օգտագործեք BatchCommand հատկությունը DirectCommand-ի փոխարեն.

Brick.BatchCommand.TurnMotorAtPower(OutputPort.A, 50); _brick.BatchCommand.TurnMotorAtPower(OutputPort.B, -50); սպասում _brick.BatchCommand.SendCommandAsync();

Այժմ պատրաստվում են միանգամից երկու հրաման, որից հետո դրանք ուղարկվում են վերահսկիչին մեկ փաթեթով։ Կարգավորիչը, ստանալով այս հրամանները, կսկսի միաժամանակ պտտել շարժիչները:

Էլ ի՞նչ կարող ես անել

Բացի պտտվող շարժիչներից և սենսորների արժեքները կարդալուց, դուք կարող եք կատարել մի շարք այլ գործողություններ EV3 կարգավորիչի վրա: Ես չեմ մանրամասնի դրանցից յուրաքանչյուրի մասին, ես միայն կթվարկեմ ցանկը, թե ինչ կարելի է անել.

  • CleanUIAsync(), DrawTextAsync(), DrawLineAsync() և այլն - EV3 կարգավորիչի ներկառուցված էկրանի մանիպուլյացիա
  • PlayToneAsync() և PlaySoundAsync() - օգտագործեք ներկառուցված բարձրախոսը հնչյուններ նվագարկելու համար
  • WriteFileAsync() , CopyFileAsync() , DeleteFileAsync() (SystemCommand-ից) - աշխատել ֆայլերի հետ

Եզրակացություն

Mindstorms EV3 ռոբոտները կառավարելու համար .NET-ի օգտագործումը լավ ցույց է տալիս, թե ինչպես կարող են համագործակցել «տարբեր աշխարհների» տեխնոլոգիաները: .NET-ի համար EV3 API-ի ուսումնասիրության արդյունքում ստեղծվել է մի փոքրիկ հավելված, որը թույլ է տալիս համակարգչից կառավարել EV3 ռոբոտը։ Ցավոք, նմանատիպ հավելվածներ կան NXT-ի համար, սակայն EV3-ը շրջանցել է դրանք։ Միևնույն ժամանակ, դրանք օգտակար են կառավարվող ռոբոտների մրցումներում, ինչպիսին է ռոբոտների ֆուտբոլը:

Հավելվածը կարելի է ներբեռնել և տեղադրել այս հղումից.