Mätning av avstånd (och mer) enhet använder Arduino och GPS (5 / 5 steg)
Steg 5: Arduino programmering
1. LCD-chaufför
Först av allt, sökte jag för en enkel och liten bibliotek för LCD, Nokia 5110. Det fanns några olika bibliotek för denna LCD: Adafruit, Sparkfunoch Henning Karlsen' s. Bland dessa bibliotek valde jag Henning Karlsen eftersom jag behövde bara enkel text visas med ett par olika storlekar. Henning Karlsen har separata bibliotek för grafik också. Jag skulle vilja tacka Henning för att hans dela hans fina arbete på biblioteket. Henning's library stödjer 3 olika storlekar: SmallFont (text och nummer, 6 × 8), MediumNumber (nummer, 12 × 16) och BigNumber (nummer endast, 14 x 24). Enda nackdelen med detta bibliotek är att de medelstora och stora teckensnitt inte stöder texter men bara siffror. Men jag behöver bara siffror att Visa med större teckensnitt, var denna begränsning inga problem med mig.
2. avstånd beräkning mellan två orter
Det finns antal webbplatser visar hur man beräknar avståndet mellan två platser från latituder och longituder. Movable Type skript visar olika beräkningar av avstånd, bärande och andra användbara konverteringar använda Haversine formel och BlueMM postat Excel formel för att beräkna avstånd vilket är i princip samma sätt som Haversine.
Beräkningen är ganska enkelt men jag hittade ett problem: Arduino (Atmega328p) inte kan hantera mer än 6-7 decimaler vilket är mycket viktigt i trigonometriska beräkningar för kort avstånd.
Arduino referenssida säger "flöten har endast 6-7 decimaler för precision. Det innebär att det totala antalet siffror, inte numret till höger om decimalkommat. Till skillnad från andra plattformar, där du kan få mer precision genom att använda en dubbel (t.ex. upp till 15 siffror), på Arduino, är dubbel samma storlek som flöte."
Låt mig ge er ett exempel. Antag att vi startade från en position A (lat: 40,00, lång: 80) till en position B (lat: 40.01, lång: 80,00). Det vill säga flyttade vi 0,01 grader latitud bara. Om du beräknar avståndet med Haversine formel på din PC, kommer att du få ca 1,111.9m. Dock beräknas Arduino som 3,110.8m. Stora fel! Mer intressanta är att även om du minskar latitude skillnaden till 0.001 eller 0,0001 grader, du får samma resultat, 3,110.8m. Så undersöka jag närmare vad exakt orsakar felet. Jag vet naturligtvis skyldige är flyttal precision begränsningen som sa ovan. Men jag ville veta vilken del av beräkningen av Arduino orsakar stora felet. I den Haversine formeln finns COS, synd och ACOS funktioner används. Jag testade några olika beräkningar med dessa funktioner och fann vid beräkningen av COS och SIN funktioner påverkar minimal men problemet var ACOS. Om du beräknar formeln på datorn bara inne i ACOS fäste, får du 0.9999999848. Se min poäng? Decimalerna nedan 6 i ACOS funktion är faktiskt viktigt att beräkna kantiga skillnaden för små avstånd, men tyvärr Arduino inte kan hantera detta. Inte bara för små avstånd utan även relativt lång sträcka (säga över 1 grad för anföra som exempel) det finns fel mellan resultaten på PC och Arduino.
Tja, så jag började tänka på hur man undviker trigonometriska funktionen beräkning när över 6 decimaler är viktiga. Och jag hittade en lösning! I stället för beräkning av kantiga skillnaden mellan två positioner och sedan beräkna avståndet genom att multiplicera betyder jordens radie, beräkning av ett förhållande av vinkeln mellan två positioner (latitud och longitud separat) över 360 grader och klyftan omkretsen på jorden av detta förhållande. Med andra ord hålla siffrorna stora medan beräkningen. Arduino's float typ har en begränsning på antalet decimaler som liten, men kan hantera relativt stora siffror!
Här är min formel:
Jorden betyder omkrets är 2 x 6,371,000m x π = 40,030,170 m
Δd (lat) = 40,030,170 x ΔΘ (lat) / 360 (om ΔΘ är små)
Δd(Long) = 40,030,170 x ΔΘ(long) x cosΘm / 360 (Θm: betyder latitud mellan två positioner)
Avståndet är nu √ [Δd (lat) ^ 2 Δd (lång) ^ 2]
Jag har testat denna metod genom att mäta avståndet från hemmet till mitt arbete och det fungerade bra. Först av allt, jag fick koordinaterna för mitt hem och mitt arbete och därefter beräknas avståndet med Haversine metod och av min formeln ovan. Det finns vissa skillnader i resultat, men instrument.
Arduino skiss bifogas. LCD biblioteket kan laddas ner från här.
Tack för att läsa min Instructable. Hoppas någon hittar detta användbara.