Агуулгын хүснэгт:

Arduino GPS бүртгэгч: 3 алхам
Arduino GPS бүртгэгч: 3 алхам

Видео: Arduino GPS бүртгэгч: 3 алхам

Видео: Arduino GPS бүртгэгч: 3 алхам
Видео: GPS приемник GY-NEO6MV2, обзор и подключение 2024, Долдугаар сарын
Anonim
Arduino GPS бүртгэгч
Arduino GPS бүртгэгч
Arduino GPS бүртгэгч
Arduino GPS бүртгэгч

Сайн уу залуусаа, Хүмүүс бидний өдөр тутам хийдэг олон технологийг илүү сайн ойлгох боломжийг олгодог жижиг төслүүдээс би маш их татгалзаж байна.

Энэхүү төсөл нь GPS -ийн эвдрэл, SD бүртгэлийн тухай юм. Энэ зүйлийг бүтээх явцад би маш их зүйлийг сурсан.

Сэдвүүдийг илүү гүнзгий ойлгохын тулд энэ хичээлийг дагаж, миний өгсөн линкийг дагаж олон зүйлийг олж авах болно гэсэн олон ойлголт байдаг.

Тэгэхээр, энэ юу вэ? Энгийн: microSD дээр байрлал, өндөр, хурд, огноо/цагийг бүртгэдэг GPS мөрдөгч юм.

Танд хэрэгтэй зүйл:

- Ардуино Нано (Би ноорог бүтээхдээ НҮБ-ыг ашигласан, гэхдээ тэд яг адилхан!)- Adafruit-ийн GPS-ийн эцсийн таслалт- MicroSD картны таслалт- Гагнуурын хэрэгсэл (гагнахад хэрэгтэй бүх зүйл)- Universal Stripboard (би ашигласан) 5х7 см хэмжээтэй) утас

Эдгээр бүх бүрэлдэхүүн хэсгүүд нь GPS модулийг эс тооцвол нэлээд хямд байдаг. Энэ нь ойролцоогоор 30-40 доллар бөгөөд хамгийн үнэтэй хэсэг юм. Шинэ гагнуурын төмрийн багц ч гэсэн бага өртөгтэй байж болно.

GPS болон SD картын модулиудтай хамт Adafruit бамбай байдаг. Хэрэв та үүнийг ашиглахыг хүсч байвал Arduino UNO -д зориулагдсан гэдгийг санаарай, ингэснээр танд нано биш харин НҮБ хэрэгтэй болно. Ноорог дээр ямар ч ялгаа байхгүй.

Цаашаа явцгаая …

Алхам 1: Бүрэлдэхүүн хэсгүүдийг холбох

Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох
Бүрэлдэхүүн хэсгүүдийг холбох

За, бүрэлдэхүүн хэсгүүдийг авсны дараа тэдгээрийг холбох хэрэгтэй болно. Эндээс та маш бүдүүлэг схемүүдийг олох боломжтой. Гэсэн хэдий ч энд бас тэмдэглэгээ байна:

MicroSD -ийн эвдрэл

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Хэрэв та бамбай ашиглаж байгаа бол энэ нь D10 -д суурилагдсан)

GPS -ийн эвдрэл

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

Эдгээр модулийн талаархи бяцхан тэмдэглэл: Тэр хоёр бяцхан хүү Arduino -той өөр өөр замаар харилцаж байна. GPS нь Arduino -той Serial Monitor -ээр харилцахдаа ашигладаг ижил төрлийн TTL цувралыг ашигладаг тул GPS нь 9600 -ийг анхдагчаар ашиглахыг хүсдэг тул номын сангаар дамжуулан шинэ цуврал (Tx ба Rx) зарлах шаардлагатай болдог. бас ашиглахыг хүсч байна. GPS модуль нь залгууртай бол өгөгдлийг байнга, байнга дамжуулдаг. Энэ бол шийдвэрлэх хэцүү хэсэг юм, учир нь хэрэв бид өгүүлбэрийг уншаад хэвлэхээс илүү дараагийн хэсгийг нь алдаж магадгүй юм. Кодлохдоо бид үүнийг санаж байх ёстой!

MicroSD нь самбартай харилцах өөр нэг арга болох SPI (Serial Perifheral Interface) -ээр дамжуулан харилцдаг. Ийм төрлийн модуль нь үргэлж D13 дээр CLK, D12 дээр DO, D11 дээр DI ашигладаг. Заримдаа эдгээр холболтууд нь өөр нэртэй байдаг: CLK = SCK эсвэл SCLK (Цуваа цаг), DO = DOUT, SIMO, SDO, SO, MTSR (эдгээр нь бүгд Master гаралтыг харуулдаг) ба DI = SOMI, SDI, MISO, MRST (Мастер оролт). Эцэст нь MicroSD дээр бичихийг хүссэн зүйлээ илгээдэг зүүг зааж өгдөг CS эсвэл SS байна. Хэрэв та хоёр өөр SPI модулийг ашиглахыг хүсч байвал хоёуланг нь ашиглахын тулд энэ зүүг ялгахад л хангалттай. Жишээлбэл, LCD дэлгэц ба MicroSd нь бидний ашиглаж буй дэлгэц шиг. Энэ нь өөр өөр CS -д холбогдсон хоёр өөр LCD ашиглан ажиллах ёстой.

Самбар дээр эдгээр хэсгүүдийг нийлүүлж, ноорогоо байршуулахад бэлэн боллоо!

Ноорог дээр харж байгаачлан би шууд бүрэлдэхүүн хэсгийн оронд зарим dupont эмэгтэй холбогчийг гагнана, учир нь ирээдүйд би уг бүрэлдэхүүн хэсгийг дахин ашиглах эсвэл өөрчлөхийг хүсч магадгүй юм.

Би бас GPS модулийг холбогчтой буруу чиглэлд гагнаж байсан, энэ нь миний буруу байсан, би хүсээгүй, гэхдээ энэ нь ажилладаг, тэр жижиг новшнуудын хальсыг тайлах гэж оролдож эвдэх эрсдэлтэй байхыг би хүсэхгүй байна! Зүгээр л зөв аргаар гагнах, бүх зүйл сайхан болно!

Энд зарим ашигтай гагнуурын видео байна: Эхлэгчдэд зориулсан гагнуурын гарын авлагаГэсгээдэгчийн тухай видео

Adafruit Youtube суваг, тэнд маш олон сонирхолтой зүйлс байна!

Гагнахдаа зөвхөн шаардлагатай хэмжээний төмрийг ашиглахыг хичээгээрэй, эс тэгвээс эмх замбараагүй байдал үүснэ. Үүнийг хийхээс бүү ай, магадгүй тийм ч үнэтэй биш зүйлээс эхэлж, өөр зүйл гагнахаас өөр аргагүй юм. Зөв материал нь мөн ялгааг бий болгодог!

Алхам 2: Ноорог

Мэдээжийн хэрэг, бид номын санг импортолж, тэдгээрийн объектуудыг хамтран ажиллахаар бүтээдэг: SPI.h нь SPI модулиудтай харилцах зориулалттай, SD бол MicroSD номын сан, Adafruit_GPS бол GPS модулийн номын сан юм. SoftwareSerial.h нь програм хангамж ашиглан цуваа порт үүсгэхэд зориулагдсан. Синтакс нь "mySerial (TxPin, RxPin);". GPS объектыг цуврал (хаалтанд) зааж өгөх шаардлагатай. Энд Adafruit GPS -ийн тасалдал, MicroSD -ийн тасалдлын талаархи номын сангийн холбоосууд байна (цэвэрхэн ажил хийхийн тулд та SD холболтын програм хангамжаар SD -ийг форматлах хэрэгтэй). Програм хангамжийн цуваа номын сан (үүнийг IDE -д оруулах ёстой).

ТАЙЛБАР: Олон файлыг нэг файлд оруулах эсвэл хоёроос илүү файлыг ноорог дээр ашиглах гэж оролдоход надад зарим асуудал тулгарсан. Би SD -ийг програм хангамжаар форматлаагүй, магадгүй энэ нь асуудлыг шийдэж магадгүй юм. Мөн би төхөөрөмжид BMP280 (I2C модуль) гэсэн өөр мэдрэгч нэмж оруулахыг оролдсон боловч амжилт олсонгүй. I2C модулийг ашиглавал ноорог галзуурах шиг боллоо! Би энэ талаар Adafruit форум дээр аль хэдийн ярьсан боловч хариулт аваагүй хэвээр байна.

#include "SPI.h" #include "SD.h" #include "Adafruit_GPS.h" #include "SoftwareSerial.h" SoftwareSerial mySerial (3, 2); Adafruit_GPS GPS (& mySerial);

Одоо бидэнд бүх хувьсагч хэрэгтэй: Хоёр мөр нь GPS -ээс хэрэгтэй олон мэдээллийг тооцоолоход шаардлагатай хоёр өгүүлбэрийг уншихад зориулагдсан болно. Чар нь өгүүлбэрүүдийг задлан шинжлэхээс өмнө нөөцлөхөд зориулагдсан бөгөөд хөвөгч нь координатыг градусаар тооцоолоход зориулагдсан болно (GPS нь координатыг градус, минутаар илгээдэг, тэдгээрийг Google дэлхий дээр уншихын тулд бидэнд градус шаардлагатай байдаг). ChipSelect бол MicroSD картын CS -ийг залгах зүү юм. Энэ тохиолдолд D4 байна, гэхдээ хэрэв та SD бамбай ашиглаж байгаа бол D10 -ийг энд байрлуулах хэрэгтэй болно. Файлын хувьсагч нь ноорог хийх явцад бидний ашиглаж буй файлын мэдээллийг хадгалах болно.

NMEA1 мөр;

NMEA2 мөр; char c; хөвөх градус; float degWhole; float degDec; int chipSelect = 4; MySensorData файл;

Ноорогыг арай дэгжин, эмх замбараагүй болгохын тулд бид функцүүдийн хосыг зарлаж байна.

Тэд үндсэндээ ижил зүйлийг хийж байна: NMEA өгүүлбэрүүдийг унших. clearGPS () нь гурван өгүүлбэрийг үл тоомсорлож, readGPS () нь тэдгээрийн хоёрыг хувьсагчдад хадгалж байна.

Хэрхэн харцгаая: Модуль дээр шинэ NMEA өгүүлбэр байгаа эсэхийг хэсэг хугацааны давталт хянаж, GPS урсгалыг нэг болтол нь уншиж байна. Шинэ өгүүлбэр байгаа тохиолдолд бид өгүүлбэрийг үнэхээр уншиж, задлан шинжилж, NMEA -ийн анхны хувьсагчдад хадгалдаг while давталтаас гарна. Дараагийнх нь хувьд бид яг ижил зүйлийг хийж байна, учир нь GPS байнга урсаж байдаг тул биднийг бэлэн байхыг хүлээдэггүй, тэр даруй хэвлэх цаг бидэнд байдаггүй.

Энэ бол маш чухал! Хоёр өгүүлбэрийг нөөцлөхөөсөө өмнө юу ч бүү хий, эс тэгвээс хоёр дахь нь эцэстээ эвдэрсэн эсвэл зүгээр л буруу болно.

Бид хоёр өгүүлбэр авсны дараа сайн байгаа эсэхийг хянахын тулд тэдгээрийг цувралаар хэвлэв.

хүчингүй readGPS () {

clearGPS (); while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA1 = GPS.lastNMEA (); while (! 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 ()); while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); w while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); }

За, одоо бид бүгд бэлэн болсон тул бид тохиргоог хийж болно ():

Нэгдүгээрт: бид Arduino PC -ийн Цуврал 115200 дээр, Arduino GPS модулийн 9600 дээр харилцаа холбоог нээдэг. Хоёрдугаарт: бид GPS модульд гурван тушаалыг илгээдэг: эхнийх нь антенны шинэчлэлтийг хаах, хоёрдугаарт зөвхөн RMC болон GGA мөрийг асуух явдал юм (бид танд хэрэгтэй бүх мэдээлэлтэй зөвхөн эдгээрийг ашиглах болно. a GPS), гурав дахь ба сүүлчийн тушаал бол Adafruit -ийн санал болгосон шинэчлэлтийн хурдыг 1 Гц болгож тохируулах явдал юм.

Үүний дараа бид D10 зүүг OUTPUT болгож тохируулсан бөгөөд хэрэв таны SD горимын CS зүү нь D10 -аас өөр байвал. Үүний дараа CS модулийг CS модулийг чип дээр сонгоно уу.

Бид cleanGPS () -ийг агуулсан readGPS () функцуудыг ажиллуулдаг.

Одоо файлууд дээр ямар нэгэн зүйл бичих цаг боллоо! Хэрэв файл аль хэдийн Sd картанд байгаа бол тэдгээрийн дээр цаг хугацааны тамга хавсаргана уу. Ийм байдлаар бид үргэлж хуралдаануудыг хянаж байх эсвэл файлуудыг устгах шаардлагагүй болно. Тохиргооны функц дотор цагийн тэмдгийг бичсэн тул бид файлд нэг сессийг нэг удаа л салгах болно.

ТАЙЛБАР: SD номын сан нь файлыг нээх, хаах талаар нухацтай ханддаг! Үүнийг санаж, цаг тутамд хаагаарай! Номын сангийн талаар мэдэхийг хүсвэл энэ линкээр орно уу.

За, бид ноорогны урсгал ба бүртгэлийн хэсгийг авахад үнэхээр бэлэн байна.

хүчингүй тохиргоо () {

Цуваа.begin (115200); GPS. эхлэх (9600); // GPS.sendCommand GPS модульд командыг илгээх ("$ 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 (); хэрэв (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. жил); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.минут); 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. жил); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.минут); mySensorData.print (":"); mySensorData.print (GPS.секунд); mySensorData.println ("***"); mySensorData.close (); }}

Одоо бид ноорогны гол хэсгийг олж авч байна.

Энэ бол үнэхээр энгийн зүйл юм.

Бид GPS -ийн урсгалыг readGPS () функцээр унших болно, гэхдээ хэрэв бид 1 -тэй тэнцэх засвартай бол бид хиймэл дагуултай холбогдсон гэсэн үг юм. Хэрэв бид олж авсан бол бид файлуудаа мэдээллээ бичих болно. Эхний файл "NMEA.txt" дээр бид зөвхөн түүхий өгүүлбэрүүдийг бичдэг. Хоёрдахь файл болох "GPDData.txt" дээр бид координат (өмнө нь харсан функцүүдээр хөрвүүлэгдсэн) болон өндрийг хавсаргана. Эдгээр мэдээлэл нь Google Earth дээр зам үүсгэхийн тулд.kml файлыг бүрдүүлэхэд хангалттай юм. Бид ямар нэгэн зүйл бичихийн тулд файлуудыг нээх бүртээ хаадаг болохыг анхаарна уу!

void loop () {

уншихGPS (); // Condizione if che controlla se l'antenna ha segnale. Дахин хэлэхэд, энэ бол маш сайн ойлголт юм. if (GPS.fix == 1) {// Зөвхөн бидэнд mySensorData = SD.open ("NMEA.txt", FILE_WRITE) гэсэн залруулга байгаа тохиолдолд л өгөгдлийг хадгална уу; // NMEA програмын файлыг зааж өгөөч mySensorData.println (NMEA1); // NMEA програмыг mySensorData.println (NMEA2) програмыг хуулж аваарай; // MySensorData.close () секундын NMEA файлыг хуулж аваарай; // Chiude файл !!

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

// Convertte e scrive la longitudine convLong (); mySensorData.print (градус, 4); // mySensorData.print (",") градиуль файл дахь координатыг хуулж аваарай; // Нэгийг нь онлайнаар хуулж бичээрэй Serial.print (deg); Serial.print (","); // Өргөргийн хөрвүүлэгчийг хөрвүүлэх (); mySensorData.print (градус, 4); // mySensorData.print (",") градиуль файл дахь координатыг хуулж аваарай; // Seriver a un virgola per separare i dati Serial.print (deg); Serial.print (","); // lSaltive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

Одоо бид бүгд бэлэн болсон тул та ноорогоо байршуулж, төхөөрөмжийг бүтээж, таашаал авах боломжтой!

Засвар = 1 авахын тулд та үүнийг GPS -тэй тэнгэр рүү харсан байх ёстой, эсвэл гадны антеныг залгаж болно гэдгийг анхаарна уу.

Түүнчлэн, хэрэв засвар хийвэл улаан гэрэл 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 = Замын өнцөг градусаар үнэн 230394 = Огноо - 1994 оны 3 -р сарын 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 Latitude 48 deg 07.038 'N 01131.000, E Уртраг 11 deg 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 checksum data, үргэлж *гэж эхэлдэг

Таны харж байгаагаар тэнд хэрэгтэй зүйлсийн талаар илүү их мэдээлэл байна. Adafruit -ийн номын санг ашиглан та GPS.latitude эсвэл GPS.lat (өргөрөг ба өргөргийн хагас бөмбөрцөг) эсвэл GPS.day/month/year/hour/minute/seconds/milliseconds гэх мэт заримыг нь дуудаж болно. илүү ихийг мэдэхийн тулд вэбсайт. Энэ нь тийм ч ойлгомжтой биш боловч GPS модулийн гарын авлага дээрх зарим зөвлөмжийг дагаж та хэрэгтэй зүйлээ олж чадна.

Бидэнд байгаа файлуудыг бид юу хийж чадах вэ? Хялбар: Google Earth дээрх замыг харуулахын тулд kml файлыг эмхэтгээрэй. Үүнийг хийхийн тулд энэ линкийг дагаж мөрдөх кодыг хуулж/өнгөрүүлээрэй (Замын догол мөрийн доор), координатаа GPDData.txt файлаас хаягийн хооронд байрлуулж, файлыг.kml өргөтгөлтэй хадгалаад ачаална уу. Google Earth.

ТАЙЛБАР:.kml тэмдэглэгээний хэл нь энгийн, хэрэв та тэмдэглэгээний хэл гэж юу болохыг аль хэдийн мэдэж байгаа бол өмнөх линк, бичиг баримтыг дотор нь уншихад цаг заваа зориулаарай, энэ үнэхээр сонирхолтой юм!

Kml -ийг ашиглах нь түүний хаяг, аргументыг мэдэх явдал юм. Би зөвхөн Google -ийн гарын авлагыг олж авсан бөгөөд өмнө нь холбож өгсөн бөгөөд үндсэн хэсэг нь шошгоны хоорондох хэв маягийг тодорхойлж, координат бичих цаг болоход үүнийг # тэмдгээр дуудах явдал юм.

Энэ хэсэгт миний оруулсан файл бол.kml бөгөөд та зүгээр л координатаа буулгаж болно. Энэ синтаксийг оруулахыг санаарай: уртраг, өргөрөг, өндөр

Зөвлөмж болгож буй: