Мазмуну:

GPS менен жол табуу: 9 кадам
GPS менен жол табуу: 9 кадам

Video: GPS менен жол табуу: 9 кадам

Video: GPS менен жол табуу: 9 кадам
Video: Дана алқаш байына күн бермейді 2024, Июль
Anonim
GPS менен жол табуу
GPS менен жол табуу

GPS маалыматын түшүнүү жана колдонуу боюнча тез көнүгүү

  • Керектүү убакыт: 2 саат
  • Баасы: 75-150 доллар

Жаратуучулар үчүн жогорку сапаттагы геомейкиндик маалыматтарын электроника долбоорлоруна киргизүү арзан болуп калды. Ал эми акыркы бир нече жылда GPS (Global Positioning System) кабыл алуучу модулдары Arduino, PIC, Teensy жана Raspberry Pi сыяктуу өнүгүү такталары менен биригүү үчүн алда канча ар түрдүү, күчтүү жана оңой өстү. Эгерде сиз GPSтин айланасында курууну ойлоп жатсаңыз, анда баштоо үчүн жакшы убакытты тандадыңыз.

1 -кадам: Бул кантип иштейт

GPS модулу спутник паркы тарабынан белгилүү жыштыктарда берилген сигналдарды иштетүүчү кичинекей радио кабыл алгыч. Бул спутниктер Жерди болжол менен тегерек орбитада айланып, өтө так абалды жана саат маалыматтарын төмөндөгү жерге жеткиришет. Жерге байланышкан ресивер бул спутниктерди жетишээрлик түрдө "көрө" алса, анда аларды өзүнүн жайгашкан жерин жана бийиктигин эсептөө үчүн колдоно алат.

GPS билдирүүсү келгенде, кабыл алуучу алгач анын эфирдин убактысын текшерет жана качан жөнөтүлгөнүн көрөт. Космостогу радио толкунунун ылдамдыгы белгилүү туруктуу (c) болгондуктан, алуучу сигналды басып өткөн аралыкты аныктоо үчүн эфирди жана кабыл алуу убактысын салыштыра алат. Төрт же андан көп белгилүү спутниктерден алыстыгын аныктагандан кийин, өз позициясын эсептөө 3D триангуляциясынын өтө жөнөкөй көйгөйү болуп саналат. Муну тез жана так аткаруу үчүн, кабыл алуучу бир убакта 20га чейин маалымат агымынын сандарын ыкчам кырып алышы керек. GPS системасынын Жердин бардык жеринде колдонууга жарактуу болгон максаты бар болгондуктан, система жок дегенде төрт спутникти камсыз кылышы керек. - артыкчылыктуусу - дүйнөнүн ар бир жеринен бардык убакта көрүнүп турат. Учурда 32 GPS спутниги бар, 20 000 км бийиктиктеги сейрек булутта кылдаттык менен хореографиялык бийди аткарат.

2 -кадам: Fan Fact

GPS Эйнштейндин салыштырмалуулук теориясынсыз иштей албайт, анткени орбиталык атомдук сааттар Жердин тартылуу талаасында убакыттын кеңейишинен күн сайын алган 38 микросекундуна компенсация төлөнүшү керек.

3 -кадам: Баштоо

Баштоо
Баштоо

Сиздин долбооруңуз кандай болбосун, GPSти интеграциялоо оңой. Көпчүлүк кабыл алуучу модулдар жөнөкөй сериялык протокол менен байланышат, андыктан контролеруңуздун тактысында запастык сериялык портту таба алсаңыз, физикалык байланышты түзүү үчүн бир ууч зымдар керек. Жана болбосо да, контроллерлердин көбү эмуляцияланган "программалык камсыздоонун" сериялык режимин колдойт, аны сиз каалаган казыктарга туташуу үчүн колдоно аласыз.

Жаңы баштагандар үчүн Adafruitтин Ultimate GPS Breakout модулу жакшы чечим. Рынокто көптөгөн атаандаш продуктулар бар, бирок Ultimate акылга сыярлык баада бекем аткаруучу болуп саналат, чоң тешиктери бар, алар ширетүүгө же нан тактасына туташууга оңой.

Биринчиден, жерге жана бийликке туташтырыңыз. Arduino терминдеринде, бул GND микроконтроллеринин бирин модулдун GND'ине, +5V пинди модулдун VIN'ине туташтыруу дегенди билдирет. Маалымат берүүнү башкаруу үчүн, модулдун TX жана RX казыктарын Arduino менен туташтыруу керек. Мен бул үчүн Arduino 2 (TX) жана 3 (RX) казыктарын өзүм билемдик менен тандайм, бирок 0 жана 1 казыктар "аппараттык сериялык порт" же UART катары колдонуу үчүн атайын иштелип чыккан. Эмне үчүн? Анткени мен бул AVR процессорлору бар жалгыз UARTти текке кетиргим келбейт. Arduino UART борттогу USB туташтыргычы менен катуу туташтырылган, жана мен аны мүчүлүштүктөрдү оңдоо үчүн компьютериме туташтырганды жакшы көрөм.

4 -кадам: Datastreamдеги манжа

Datastreamдеги бармак
Datastreamдеги бармак

Сиз электр кубатын колдонгонуңузда, GPS модулу TX линиясында текст маалыматтарынын бир бөлүгүн жөнөтө баштайт. Ал дагы эле бир спутникти көрбөшү мүмкүн, анча -мынча "оңдоо" бар, бирок маалымат краны дароо иштей баштайт жана эмне чыкканы кызык. Биздин биринчи жөнөкөй эскиз (төмөндө) бул иштетилбеген маалыматты көрсөтүүдөн башка эч нерсе кылбайт.

#кошуу #аныктоо RXPin 2

#TXPin 3#аныктоо GPSBaud 4800

#define ConsoleBaud 115200

// GPS deviceSoftwareSerial ss (RXPin, TXPin) менен сериялык байланыш;

жараксыз орнотуу () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS 1 -мисал");

Serial.println ("GPS модулу аркылуу берилген NMEA чийки маалыматтарын көрсөтүү.");

Serial.println ("Микал Харт тарабынан"); Serial.println ();

}

боштук цикл ()

{if (ss.available ()> 0) // Ар бир белги келген сайын…

Serial.write (ss.read ()); // … аны консолго жазыңыз

}

ЭСКЕРТҮҮ: Эскиз кабыл алуу пинин (RXPin) 2 деп аныктайт, бирок биз буга чейин өткөргүч (TX) пин 2 -пинге туташтырыларын айтканбыз. Бул адаштыруунун жалпы булагы. RXPin - бул Arduino көз карашы боюнча кабыл алуу пини (RX). Албетте, ал модулдун өткөргүч (TX) пинине туташуусу керек, жана тескерисинче.

Бул эскизди жүктөп, Serial Monitorду ачыңыз 115, 200 bod. Эгерде баары иштеп жатса, үтүр менен бөлүнгөн тексттин тыгыз, чексиз агымын көрүшүңүз керек. Ар бири абзацтын башында экинчи сүрөткө окшош болот.

Бул айырмалоочу саптар NMEA сүйлөмдөрү деп аталат, анткени мындай формат Улуттук Деңиз Электроникасы Ассоциациясы тарабынан ойлоп табылган. NMEA бул сүйлөмдөрдүн санын аныктайт (орду жана убактысы), эзотерикке чейин (спутник сигналынын-ызы-чуунун катышы, магниттик дисперсия ж. Өндүрүүчүлөр кабылдагычтары кайсы сүйлөм түрлөрүн колдонооруна карама -каршы келишет, бирок GPRMC абдан маанилүү. Сиздин модул оңдолгондон кийин, сиз бул GPRMC сүйлөмдөрүнүн адилеттүү санын көрүшүңүз керек.

5 -кадам: Өзүңдү табуу

Чийки модулдун чыгышын программаңыз колдоно турган маалыматка айландыруу анча деле маанилүү эмес. Бактыга жараша, муну сиз үчүн кыла турган чоң китепканалар бар. Лимор Фриддин популярдуу Adafruit GPS китепканасы, эгер сиз алардын акыркы үзүлүшүн колдонуп жатсаңыз, ыңгайлуу тандоо. Бул Ultimate үчүн уникалдуу өзгөчөлүктөрдү иштетүү үчүн жазылган (ички маалыматтарды каттоо сыяктуу) жана өзүнө ыңгайлуу коңгуроолорду жана ышкырыктарды кошот. Менин сүйүктүү талдоо китепканам, бирок - бул жерде мен, албетте, толугу менен калысмын - мен жазган TinyGPS ++. Мен муну комплекстүү, күчтүү, кыска жана колдонууга оңой кылып түздүм. Келгиле, аны айлантуу үчүн алалы.

6 -кадам: TinyGPS ++ менен коддоо

Программисттин көз карашында, TinyGPS ++ колдонуу абдан жөнөкөй:

1) GPS объектисин түзүү.

2) Модулдан келген ар бир белгини gps.encode () аркылуу объектке багыттаңыз.

3) Сиз позицияңызды, бийиктигиңизди же убактыңызды же датаңызды билишиңиз керек болгондо, gps объектисин сураңыз.

#кошуу #кошуу

#аныктоо RXPin 2

#аныктоо TXPin 3

#аныктоо GPSBaud 4800

#define ConsoleBaud 115200

// GPS deviceSoftwareSerial ss (RXPin, TXPin) менен сериялык байланыш;

// TinyGPS ++ объектиси

TinyGPSPlus gps;

жараксыз орнотуу () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS мисал 2");

Serial.println ("TinyGPS ++ колдонуучу жөнөкөй трекер.");

Serial.println ("Микал Харт тарабынан");

Serial.println ();

}

void loop () {

// Эгерде кандайдыр бир белгилер GPSтен келген болсо, /

/ аларды TinyGPS ++ объектине жөнөтүү

while (ss.available ()> 0)

gps.encode (ss.read ());

// Келгиле, жаңы жерди жана бийиктикти көрсөтөлү

// качан алардын бири жаңыртылганда

if (gps.location.isUpdated () || gps.altitude.isUpdated ())

{

Serial.print ("Жайгашкан жери:");

Serial.print (gps.location.lat (), 6);

Serial.print (",");

Serial.print (gps.location.lng (), 6);

Serial.print ("Бийиктик:");

Serial.println (gps.altitude.meters ());

}

}

Экинчи колдонмобуз талдоого жардам берүү үчүн TinyGPS ++ аркылуу алуучунун жайгашкан жерин жана бийиктигин дайыма көрсөтүп турат. Чыныгы түзмөктө сиз бул маалыматты SD картага жазсаңыз же ЖКда көрсөтсөңүз болот. Китепкананы алыңыз жана FindingYourself.ino эскизин алыңыз (жогоруда). Китепкананы адаттагыдай эле Arduino китепканалары папкасына орнотуңуз. Эскизди Arduinoго жүктөңүз жана Serial Monitorду 115, 200 baud ачыңыз. Сиз реалдуу убакытта жайгашкан жериңизди жана бийиктигиңизди көрүп турушуңуз керек. Кайсы жерде турганыңызды так билүү үчүн, алынган кеңдиктин/узунунун координаттарынын бир бөлүгүн Google Карталарга чаптаңыз. Эми ноутбукту туташтырып, сейилдөөгө же дискке барыңыз. (Бирок жолдон көзүңдү албоону унутпа!)

7 -кадам: "ТӨРТҮНЧҮ ӨЛЧӨМ"

GPSти космостогу жайгашкан жери менен байланыштырганыбыз менен, бул спутниктер убактысын жана маалымат белгилерин өткөрүп турарын унутпаңыз. Орточо GPS сааты секундасынын он миллиондон бир бөлүгүнө чейин так жана теориялык чеги андан да жогору. Убакытты көзөмөлдөө үчүн сизге проектиңиз керек болсо да, GPS модулу дагы эң арзан жана оңой чечим болушу мүмкүн.

FindingYourself.ino'ду супер-так саатка айландыруу үчүн, жөн гана ушул сыяктуу акыркы бир нече саптарды өзгөртүңүз:

эгер (gps.time.isUpdated ()) {

char buf [80];

sprintf (buf, "Убакыт%02d:%02d:%02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

8 -кадам: Өз жолуңду табуу

Өз жолуңду табуу
Өз жолуңду табуу

Үчүнчү жана акыркы колдонмо - бул TinyGPS ++ эскизин жазуу үчүн 100 чакырымга жетпеген жеке кыйынчылыктын натыйжасы, бул колдонуучуну "түз кармоо" же "солго буруу" сыяктуу жөнөкөй текст көрсөтмөлөрүн колдонуп, көздөгөн жерине жеткирет.

#кошуу #кошуу

#Define RXPin 2

#аныктоо TXPin 3

#аныктоо GPSBaud 4800

#define ConsoleBaud 115200

// GPS deviceSoftwareSerial ss (RXPin, TXPin) менен сериялык байланыш;

// TinyGPS ++ объектиси TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#EIFFEL_LAT 48.85823#EIFFEL_LNG аныктоо 2.29438

/* Бул мисал адамды (же дронду) көздөгөн жерине жетектөө үчүн курсту жана аралыкты кантип колдонууга болоорун көрсөткөн негизги негизди көрсөтөт. Бул көздөгөн жер Эйфель мунарасы. Аны талапка ылайык өзгөртүү

Латын/узун координатты алуунун эң оңой жолу-Google Карталардагы (maps.google.com) көздөгөн жерди оң басуу жана "Бул жерде эмне бар?". Бул издөө кутучасына так маанилерди коёт

*/

жараксыз орнотуу () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS мисал 3");

Serial.println ("Анча-мынча комплекстүү жетектөө системасы");

Serial.println ("Микал Харт тарабынан");

Serial.println ();

}

void loop () {

// Эгерде GPSтен кандайдыр бир белгилер келген болсо, // аларды TinyGPS ++ объектине жөнөтүү учурунда (ss.available ()> 0) gps.encode (ss.read ());

// Ар бир 5 секундда, жаңыртып туруңуз

эгер (миллис () - lastUpdateTime> = 5000)

{

lastUpdateTime = миллис ();

Serial.println ();

// Учурдагы абалыбызды орнотуу

double distanceToDestination = TinyGPSPlus:: distanceBetween

gps.location.lat (), gps.location.lng (), EIFFEL_LAT, EIFFEL_LNG);

double courseToDestination = TinyGPSPlus:: courseTo

gps.location.lat (), gps.location.lng (), EIFFEL_LAT, EIFFEL_LNG);

const char *directionToDestination = TinyGPSPlus:: кардинал (courseToDestination);

int courseChangeNeeded = (int) (360 + courseToDestination - gps.course.deg ()) % 360;

// мүчүлүштүктөрдү жоюу Serial.print ("DEBUG: Course2Dest:");

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

Serial.print (gps.course.deg ());

Serial.print ("Dir2Dest:");

Serial.print (directionToDestination);

Serial.print ("RelCourse:");

Serial.print (courseChangeNeeded);

Serial.print ("CurSpd:");

Serial.println (gps.speed.kmph ());

// 20 метр аралыкта? Биз бул жердебиз

эгерде (distanceToDestination <= 20.0)

{Serial.println ("КУТТУКТОО: Сиз келдиңиз!");

чыгуу (1);

}

Serial.print ("DISTANCE:"); Serial.print (distanceToDestination);

Serial.println ("метрге чейин.");

Serial.print ("НАСААТ:");

// Бир орунда турасызбы? Жөн гана кайсы багытка баруу керек экенин көрсөтүңүз

эгер (gps.speed.kmph () <2.0)

{

Serial.print ("Баш");

Serial.print (directionToDestination);

Serial.println (".");

кайтуу;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Түз алга!");

башка болсо (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Бир аз солго карай.");

башка болсо (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Бир аз оңго карай.");

башка болсо (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Солго буруңуз.");

башка болсо (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Оңго буруңуз.");

башка

Serial.println ("Толугу менен айлануу.");

}

}

Ар бир 5 секунд сайын код колдонуучунун жайгашкан жерин жана багытын (саякаттын багытын) тартып алат жана TinyGPS ++ courseTo () методун колдонуу менен подшипникти (көздөгөн жерге карай) эсептейт. Эки векторду салыштыруу төмөндө көрсөтүлгөндөй түз кетүүнү же бурулууну сунуштайт.

FindingYourWay.ino эскизин көчүрүңүз (жогоруда) жана Arduino IDEге чаптаңыз. Көздөгөн жериңизди 1км же 2км аралыкка коюңуз, эскизди Arduinoго жүктөңүз, ноутбукуңузда иштетип көрүңүз жана ал сизди ошол жакка жетелейт. Бирок андан да маанилүүсү, кодду изилдеп, анын кантип иштээрин түшүнүү.

9 -кадам: Мындан ары

GPSтин чыгармачылык потенциалы эбегейсиз. Мен жасаган эң канааттандырарлык нерселердин бири-бул алдын ала программаланган бир жерде гана ачылуучу GPS иштетилген табышмак кутусу. Эгерде сиздин жабырлануучуңуз кенчти ичине бекитип алууну кааласа, анда ал жашыруун жайгашкан жерди аныктап, кутуну физикалык жактан алып келиши керек. Популярдуу биринчи проект идеясы-транс-Пеннин жолунда сейилдеген саякатчынын мүнөттүк абалын жана бийиктигин мүнөткө жаздыруучу кандайдыр бир жыгач. Же ошол начар магниттик трекерлердин бири жөнүндө DeA агенттери жаман балдардын машиналарына жабышып калышат? Экөө тең толугу менен ишке ашат жана, балким, куруу кызыктуу болмок, бирок мен сизди Амазонкадан сатып ала турган нерселерден тышкары, кеңири ойлонууга чакырам. Бул жерде чоң дүйнө. Мүмкүн болушунча алыс жана кеңири роуминг.

Сунушталууда: