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

Arduino GPS անտառահատ `3 քայլ
Arduino GPS անտառահատ `3 քայլ

Video: Arduino GPS անտառահատ `3 քայլ

Video: Arduino GPS անտառահատ `3 քայլ
Video: GPS приемник GY-NEO6MV2, обзор и подключение 2024, Նոյեմբեր
Anonim
Arduino GPS անտառահատ
Arduino GPS անտառահատ
Arduino GPS անտառահատ
Arduino GPS անտառահատ

Ողջույն տղաներ, Ինձ շատ են հուզում փոքր նախագծերի համար, որոնք թույլ են տալիս մարդկանց իրականում ավելի շատ հասկանալ այն տեխնոլոգիան, որը մենք ունենք ամեն օր:

Այս նախագիծը GPS- ի ճեղքման և SD- ի գրանցման մասին է: Ես շատ բան եմ սովորել հենց այս իրերը կառուցելիս:

Կան բազմաթիվ հասկացություններ, որոնք դուք ձեռք կբերեք այս ձեռնարկից հետո, և շատ ավելին ՝ իմ տրամադրած հղումից հետո ՝ թեմաներին ավելի խորանալու համար:

Այսպիսով, ինչ է դա: Պարզ. GPS հետևող է, որը գրանցում է microSD- ի դիրքերը (բարձրության վրա նույնպես), արագությունը և ամսաթիվը/ժամը:

Այն, ինչ ձեզ հարկավոր կլինի.

- Arduino Nano (էսքիզը ստեղծելու համար ես իրականում օգտագործել եմ ՄԱԿ-ը, բայց դրանք նույնն են) a 5x7 սմ)- լարեր

Բոլոր այդ բաղադրիչները բավականին էժան են, բացառությամբ GPS մոդուլի: Դա մոտ 30-40 դոլար է և ամենաթանկ մասն է: Նույնիսկ եռակցման արդուկի նոր հավաքածուն կարող է ավելի քիչ արժենալ:

Գոյություն ունի նաև Adafruit վահան ՝ GPS և SD քարտի մոդուլներով միասին: Եթե ցանկանում եք օգտագործել այն, հիշեք, որ այն պատրաստված է Arduino UNO- ի համար, հետևաբար ձեզ հարկավոր կլինի UNO և ոչ Nano: Էսքիզի մեջ, այնուամենայնիվ, տարբերություն չկա:

Եկեք ավելի հեռուն գնանք…

Քայլ 1: Բաղադրիչների միացում

Բաղադրիչների միացում
Բաղադրիչների միացում
Բաղադրիչների միացում
Բաղադրիչների միացում
Բաղադրիչների միացում
Բաղադրիչների միացում
Բաղադրիչների միացում
Բաղադրիչների միացում

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

MicroSD բեկում

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (եթե դուք օգտագործում եք վահանը, այն կառուցված է D10- ում)

GPS ճեղքում

Vin -> 5VGnn -> GnnRx -> D2Tx -> D3

Փոքրիկ նշումներ այդ մոդուլի մասին. Այդ երկու փոքրիկ տղաները տարբեր ուղիներով շփվում են Arduino- ի հետ: GPS- ն օգտագործում է TTL սերիալ, նույնը, ինչ մենք օգտագործում ենք Arduino- ի հետ սերիական մոնիտորի միջոցով, այդ իսկ պատճառով մենք պետք է գրադարանի միջոցով հայտարարենք նոր սերիա (Tx և Rx), քանի որ GPS- ը լռելյայն ցանկանում է օգտագործել 9600 -ը, և մենք կամ էլ ուզում է օգտագործել: GPS մոդուլը միշտ և անընդհատ հոսում է տվյալներ, եթե դրանք միացված են: Սա բարդ հարց է, որովհետև եթե մենք կարդում ենք նախադասությունը և տպում այն, կարող ենք կորցնել հաջորդը, որը նույնպես անհրաժեշտ է: Մենք պետք է դա նկատի ունենանք կոդավորելիս:

MicroSD- ը հաղորդակցվում է SPI- ի (Serial Peripheral Interface) միջոցով, տախտակի հետ հաղորդակցվելու մեկ այլ միջոց: Նման մոդուլը միշտ օգտագործում է CLK- ը D13- ում, DO- ն D12- ում և DI- ը D11- ում: Երբեմն այդ կապերն ունեն տարբեր անուններ, ինչպիսիք են CLK = SCK կամ SCLK (Սերիական ժամացույց), DO = DOUT, SIMO, SDO, SO, MTSR (բոլորը ցույց են տալիս Master Output) և DI = SOMI, SDI, MISO, MRST (Master Input): Վերջապես մենք ունենք CS կամ SS, որը ցույց է տալիս այն քորոցը, որտեղ մենք ուղարկում ենք այն, ինչ ցանկանում ենք գրել MicroSD- ում: Եթե ցանկանում եք օգտագործել երկու տարբեր SPI մոդուլներ, ապա դրանք երկուսն օգտագործելու համար պարզապես պետք է տարբերակել այս քորոցը: Օրինակ ՝ LCD էկրան ԵՎ MicroSd, ինչպիսին մենք օգտագործում ենք: Այն պետք է աշխատի նաև երկու տարբեր LCD- ների միջոցով, որոնք կապված են տարբեր CS- ների հետ:

Այս մասերը միասին կպցրեք գրատախտակին, և դուք պատրաստ եք վերբեռնել էսքիզը:

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

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

Ահա մի քանի օգտակար զոդման տեսանյութ. Sոդման ուղեցույց սկսնակների համար Տեսանյութ `ապամոնտաժման մասին

Adafruit Youtube ալիք, այնտեղ շատ հետաքրքիր նյութեր կան:

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

Քայլ 2: Էսքիզ:

Նախ, իհարկե, մենք ներմուծում ենք գրադարանը և կառուցում նրանց օբյեկտները `աշխատելու համար. SoftwareSerial.h- ը ծրագրային ապահովման միջոցով սերիական նավահանգիստ ստեղծելու համար է: Շարահյուսությունը «mySerial (TxPin, RxPin);» է: GPS օբյեկտը պետք է մատնանշվի սերիայի վրա (փակագծերում): Ահա գրադարանների հղումները Adafruit GPS breakout- ի, MicroSD- ի ճեղքման համար (մաքուր աշխատանք կատարելու համար SD- ն պետք է ձևակերպեք նաև SD- ի այս ծրագրակազմով) և Softwareրագրային ապահովման սերիական գրադարան (այն պետք է ներառվի IDE- ում):

Ո NOTՇԱԴՐՈԹՅՈՆ. Ես բախվեցի որոշակի խնդրի, երբ փորձում էի շատ տեղեկություններ մի ֆայլում կցել կամ էսքիզում օգտագործել ավելի քան երկու ֆայլ: Ես SD- ն չեմ ձևաչափել այդ ծրագրաշարի միջոցով, գուցե դա կարող է լուծել խնդիրը: Բացի այդ, ես փորձեցի սարքում ավելացնել մեկ այլ սենսոր ՝ BMP280 (I2C մոդուլ) ՝ առանց որևէ հաջողության: Թվում է, թե I2C մոդուլի օգտագործումը էսքիզը խենթացնում է: Ես այդ մասին արդեն խոսել եմ Adafruit ֆորումում, բայց դեռևս պատասխան չեմ ստացել:

#ներառել «SPI.h»#ներառել «SD.h»#ներառել «Adafruit_GPS.h»#ներառել «SoftwareSerial.h» SoftwareSerial mySerial (3, 2); Adafruit_GPS GPS (& mySerial);

Այժմ մեզ պետք են մեր բոլոր փոփոխականները. Երկու տողերը նախատեսված են երկու նախադասություններ կարդալու համար, որոնք մեզ անհրաժեշտ են GPS- ից մի շարք օգտակար տեղեկություններ հաշվելու համար: Նշանը նախադասությունները նախքան դրանք վերլուծելը պահելու համար է, իսկ բոցերը `կոորդինատները աստիճաններով հաշվարկելու համար (GPS- ն ուղարկում է օգտագործման կոորդինատները աստիճաններով և րոպեներով, դրանք մեզ պետք են աստիճաններով` Google Earth- ում կարդալու համար): ChipSelect- ը այն քորոցն է, որտեղ մենք միացնում ենք MicroSD քարտի CS- ն: Այս դեպքում D4- ն է, բայց եթե դուք օգտագործում եք SD վահան, ապա այստեղ պետք է տեղադրեք D10- ը: Ֆայլի փոփոխականն այն է, ով կպահպանի էսքիզի ընթացքում օգտագործվող ֆայլի տվյալները:

Լարային NMEA1;

Լարային NMEA2; char c; բոց deg; բոց degWhole; բոց degDec; int chipSelect = 4; Ֆայլ mySensorData;

Այժմ մենք հայտարարում ենք մի քանի ֆունկցիաներ ՝ ուրվագիծը մի փոքր էլեգանտ և ավելի քիչ խառնաշփոթ դարձնելու համար.

Նրանք հիմնականում նույնն են անում ՝ կարդալ NMEA նախադասություններ: clearGPS () անտեսում է երեք նախադասություն և readGPS () խնայում է դրանցից երկուսը փոփոխականների մեջ:

Եկեք տեսնենք, թե. Երբ կա նոր նախադասություն, մենք դուրս ենք while հանգույցից, որտեղ նախադասությունն իրականում կարդացվում, վերլուծվում և համալրվում է NMEA- ի առաջին փոփոխականներով: Մենք անմիջապես նույնն ենք անում հաջորդի համար, քանի որ GPS- ն անընդհատ հոսում է, այն չի սպասում, որ մենք պատրաստ լինենք, մենք ժամանակ չունեինք այն անմիջապես տպելու համար

Սա շատ կարևոր է: Ոչ մի բան մի արեք նախքան երկու նախադասությունները պահեստավորելը, հակառակ դեպքում երկրորդը ի վերջո կփչանա կամ պարզապես սխալ կլինի:

Երկու նախադասություն ստանալուց հետո դրանք տպում ենք սերիալում ՝ վերահսկելու համար, թե ինչն է լավ ընթանում:

void readGPS () {

clearGPS (); մինչդեռ (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA1 = GPS.lastNMEA (); մինչդեռ (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA2 = GPS.lastNMEA (); Serial.println (NMEA1); Serial.println (NMEA2); } void clearGPS () {while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); մինչդեռ (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); w մինչ (! GPS.newNMEA ստացվել է ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); }

Դե, հիմա, երբ մենք բոլորս պատրաստ ենք, մենք կարող ենք հաղթահարել կարգավորումը ():

Նախ. Մենք բացում ենք հաղորդակցությունը Serial 115200- ի համար Arduino PC- ի և 9600- ի համար GPS մոդուլի Arduino- ի համար: Երկրորդ. Մենք երեք հրաման ենք ուղարկում GPS մոդուլին. Առաջինը `փակել ալեհավաքի թարմացումը, երկրորդը` պահանջել միայն RMC և GGA տողեր (մենք կօգտագործենք միայն դրանք, որոնք ունեն բոլոր այն տեղեկությունները, որոնք ձեզ երբևէ անհրաժեշտ կլինեն GPS), երրորդ և վերջին հրամանն է թարմացման արագությունը սահմանել 1 HZ- ի վրա, որն առաջարկել է Adafruit- ը:

Դրանից հետո մենք սահմանում ենք D10 քորոցը OUTPUT, եթե, և միայն այն դեպքում, եթե ձեր SD մոդելի CS պինն այլ չէ, քան D10- ը: Անմիջապես հետո, se- ն տեղադրեք CS- ն SD մոդուլի վրա chipSelect pin- ի վրա:

Մենք գործարկում ենք readGPS () գործառույթները, որոնք ներառում են cleanGPS ():

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

ՈEՇԱԴՐՈԹՅՈՆ. SD գրադարանը բավականին լուրջ է ամեն անգամ ֆայլը բացելու և փակելու հարցում: Հիշեք այն և փակեք այն ամեն անգամ: Գրադարանին ծանոթանալու համար հետևեք այս հղմանը:

Լավ, մենք իսկապես բոլորս պատրաստ ենք ձեռք բերել էսքիզի հոսքի և տեղեկամատյանի մասի միջուկը:

void setup () {

Serial.begin (115200); GPS. սկսել (9600); // Հրամաններ ուղարկեք GPS մոդուլին GPS.sendCommand ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); ուշացում (1000); // միայն այն դեպքում, եթե ձեր SD մոդուլի CS քորոցը D10 կապում չէ

pinMode (10, OUTPUT);

SD.begin (chipSelect); կարդալ GPS (); if (SD.exists ("NMEA.txt")) {mySensorData = SD.open ("NMEA.txt", FILE_WRITE); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS. ամիս); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS. վայրկյաններ); mySensorData.println ("***"); mySensorData.close (); } if (SD.exists ("GPSData.txt")) {mySensorData = SD.open ("GPSData.txt", FILE_WRITE); mySensorData.println (""); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS. ամիս); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS. վայրկյաններ); mySensorData.println ("***"); mySensorData.close (); }}

Այժմ մենք ստանում ենք ուրվագծի առանցքը:

Դա իսկապես շատ պարզ է:

Մենք կարդալու ենք GPS հոսքը readGPS () գործառույթով, քան մենք վերահսկում ենք, եթե ունենք 1 -ի հավասար ֆիքսացիա, ինչը նշանակում է, որ մենք կապված ենք արբանյակի հետ: Եթե մենք դա ստացանք, մենք պատրաստվում ենք մեր տեղեկությունները գրել ֆայլերում: «NMEA.txt» առաջին ֆայլում մենք գրում ենք միայն հում նախադասությունները: Երկրորդ ֆայլում ՝ «GPDData.txt», մենք կցում ենք կոորդինատները (փոխակերպված նախկինում տեսած գործառույթների հետ) և բարձրությունը: Այդ տեղեկությունները բավարար են.kml ֆայլ կազմելու համար ՝ Google Earth- ում ուղի ստեղծելու համար: Նկատի ունեցեք, որ մենք փակում ենք ֆայլերը ամեն անգամ, երբ դրանք բացում ենք ՝ ինչ -որ բան գրելու համար:

դատարկ շրջան () {

կարդալ GPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if (GPS.fix == 1) {// Տվյալների պահում միայն այն դեպքում, եթե մենք ունենք ամրագրում mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // Պատճենեք ֆայլը NMEA grezze mySensorData.println (NMEA1); // Scrive prima NMEA sul ֆայլ mySensorData.println (NMEA2); // Գրեք երկրորդ NMEA sul ֆայլը mySensorData.close (); // Chiude ֆայլ !!

mySensorData = SD.open ("GPSData.txt", FILE_WRITE);

// Converte e scrive la longitudine convLong (); mySensorData.print (աստիճան, 4); // Գրեք կոորդինատը gradi sul ֆայլում mySensorData.print (","); // Scrive una virgola per searere i dati Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine convLati (); mySensorData.print (աստիճան, 4); // Գրեք կոորդինատը gradi sul ֆայլում mySensorData.print (","); // Scrive una virgola per searere i dati Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

Այժմ, երբ ամեն ինչ ավարտված է, կարող եք վերբեռնել էսքիզը, կառուցել սարքը և վայելել այն:

Ուշադրություն դարձրեք, որ դուք պետք է այն օգտագործեք GPS սարքով դեպի երկինք, որպեսզի շտկում ունենաք = 1, կամ կարող եք միացնել արտաքին ալեհավաք:

Բացի այդ, հիշեք, որ շտկման դեպքում կարմիր լույսը թարթում է ամեն 15 վայրկյանը մեկ, իսկ եթե ոչ ՝ շատ ավելի արագ (2-3 վայրկյանը մեկ անգամ):

Եթե ցանկանում եք ավելին իմանալ NMEA նախադասությունների մասին, պարզապես հետևեք այս ուղեցույցի հաջորդ քայլին:

Քայլ 3. NMEA նախադասությունները և.kml ֆայլը

Սարքն ու էսքիզը ամբողջական են, լավ են աշխատում: Հիշեք, որ շտկում ստանալու համար (արբանյակների հետ կապ ունենալու համար) բեկումը պետք է ուղղված լինի դեպի երկինք:

Փոքրիկ կարմիր լույսը թարթում է ամեն 15 վայրկյանը մեկ, երբ շտկում եք ստանում:

Եթե ցանկանում եք ավելի լավ հասկանալ NMEA նախադասությունները, կարող եք կարդալ ավելին:

Էսքիզում մենք օգտագործում ենք ընդամենը երկու նախադասություն ՝ GGA և RMC: Դրանք ընդամենը մի քանի նախադասություն են, որոնք հոսում է GPS մոդուլը:

Եկեք տեսնենք, թե ինչ կա այդ տողում.

$ GPRMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003.1, W*6A

RMC = Առաջարկվող նվազագույն նախադասություն C 123519 = Ուղղում ՝ 12:35:19 UTC A = կարգավիճակ A = ակտիվ կամ V = անվավեր 4807.038, N = լայնություն 48 աստիճան 07.038 'N 01131.000, E = երկայնություն 11 աստիճան 31.000' E 022.4 = արագություն գետնի վրայով հանգույցներով 084.4 = Հետագծի անկյունը աստիճաններով Trueշմարիտ 230394 = Ամսաթիվ - 1994 թ. մարտի 23 003.1, W = Մագնիսական տատանում *6A = Չեկի գումարի տվյալները միշտ սկսվում են *-ով

$ GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M,, *47

GGA Global Positioning System Fix Data 123519 Ուղղումը վերցված է 12:35:19 UTC 4807.038, N լայնություն 48 աստիճան 07.038 'N 01131.000, E երկայնություն 11 աստիճան 31.000' E 1 Հաստատման որակ ՝ 0 = անվավեր; 1 = GPS շտկում (SPS); 2 = DGPS ուղղում; 3 = PPS ուղղում; 4 = Իրական ժամանակի կինեմատիկական; 5 = Բոց RTK; 6 = գնահատված (մահացած հաշիվ) (2.3 հատկություն); 7 = Ձեռքով մուտքագրման ռեժիմ; 8 = մոդելավորման ռեժիմ; 08 Հետևվող արբանյակների քանակը 0.9 Դիրքի հորիզոնական նոսրացում 545.4, M բարձրություն, մետր, միջին ծովի մակարդակից 46.9, M Երկրաչափության բարձրություն (միջին ծովի մակարդակ) WGS84 էլիպսոիդից (դատարկ դաշտ) ժամանակ DGPS- ի վերջին թարմացումից (դատարկ դաշտ) վայրկյանների ընթացքում) DGPS կայանի ID համարը *47 ստուգիչ գումարի տվյալները, միշտ սկսվում է *-ով

Ինչպես տեսնում եք, շատ ավելի շատ տեղեկություններ կան այն մասին, ինչ ձեզ հարկավոր է այնտեղ: Օգտագործելով Ադաֆրուտի գրադարանը, կարող եք զանգահարել դրանցից մի քանիսին, ինչպես օրինակ ՝ GPS.latitude կամ GPS.lat (լայնություն և լայնական կիսագունդ), կամ GPS.day/month/year/hour/minute/seconds/milliseconds… Նայեք Adafruit- ին կայք ՝ ավելին իմանալու համար: Դա այնքան էլ պարզ չէ, բայց հետևելով GPS- ի մոդուլների ուղեցույցի որոշ հուշումներին, կարող եք գտնել այն, ինչ ձեզ հարկավոր է:

Ի՞նչ կարող ենք անել մեր ունեցած ֆայլերի հետ: Հեշտ. Կազմեք kml ֆայլ ՝ Google Earth- ում ուղի ցույց տալու համար: Դա անելու համար պարզապես պատճենեք/անցեք այն կոդը, որը կգտնեք այս հղումից հետո (athանապարհ պարբերության ներքո), GPDData.txt ֆայլից ձեր կոորդինատները դրեք պիտակների միջև, պահպանեք.kml ընդլայնմամբ ֆայլը և բեռնեք այն Google Earth:

ՈEՇԱԴՐՈԹՅՈՆ.kml նշման լեզուն պարզ է, եթե արդեն գիտեք, թե ինչ է նշման լեզուն, ժամանակ պահեք ՝ կարդալու նախորդ հղումն ու փաստաթղթերը, իրականում հետաքրքիր է:

Kml- ի օգտագործումը վերաբերում է նրա պիտակների և փաստարկների իմացությանը: Ես գտա միայն Google- ի ուղեցույցը, որը ես միացրել էի նախկինում, և էական մասն այն է, որ պիտակների միջև ոճը որոշվի և այն # նշանով կոչվի, երբ կոորդինատները գրելու ժամանակն է:

Այս բաժնում ավելացված ֆայլը.kml է, որում կարող եք պարզապես տեղադրել ձեր կոորդինատները: հիշեք, որ շարադրեք այս շարահյուսությամբ `երկայնություն, լայնություն, բարձրություն

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