Étape 5: Programmation Arduino
1. LCD Driver
Tout d’abord, j’ai cherché une bibliothèque simple et petite pour l’écran LCD, Nokia 5110. Il y avait quelques bibliothèques différentes pour ce LCD: Adafruitde Sparkfunet Henning Klein' s. Parmi ces bibliothèques, j’ai choisi de Henning Karlsen, parce que j’ai eu besoin que de texte simple affichage avec un couple de tailles de police différentes. Henning Karlsen a séparé la bibliothèque de graphiques ainsi. Je tiens à remercier Henning pour son partage son beau travail sur la bibliothèque. Bibliothèque de Henning prend en charge 3 tailles de police différentes : SmallFont (texte et nombre, 6 × 8), MediumNumber (nombre seulement, 12 × 16) et BigNumber (numéro seulement, 14 x 24). Seul inconvénient de cette bibliothèque, c’est que les polices moyennes et grosses ne supportent pas de textes, mais uniquement des nombres. Aussi j’aurais besoin que des nombres à afficher avec les plus gros caractères, cette limitation n’est pas de problème avec moi.
2. calcul de la distance entre deux endroits
Il y a nombre de sites Web montrant comment calculer la distance entre deux endroits de latitudes et longitudes. Movable Type Scripts montre divers calculs de distance, azimut et autres conversions utiles à l’aide de la formule Haversine et BlueMM posté la formule Excel pour calculer la distance qui est essentiellement la même manière que Haversine.
Le calcul est assez simple, mais j’ai trouvé il y a un problème : Arduino (Atmega328p) ne peut pas gérer plus de 6-7 chiffres décimaux qui est très important dans le calcul trigonométrique sur courte distance.
Page de référence Arduino dit « flotteurs ont seulement 6-7 décimales de précision. Cela signifie que le nombre total de chiffres, pas le nombre à droite de la virgule décimale. Contrairement à d’autres plateformes, où vous pouvez obtenir plus de précision à l’aide d’un double (par exemple jusqu'à 15 chiffres), sur l’Arduino, double est la même taille que le flotteur. »
Permettez-moi de vous donner un exemple. Supposons que nous sommes partis d’une position A (lat : 40.00, long : 80) à une position B (lat : 40.01, long : 80.00). Autrement dit, nous avons déménagé 0,01 degré en latitude seulement. Si vous calculez la distance à l’aide de formule Haversine sur votre PC, vous obtiendrez environ 1 111,9 m. Toutefois, Arduino il calcule que 3 110,8 m. Grosse erreur ! Plus intéressant, c’est que même si vous réduisez la différence de latitude à 0,001 ou 0,0001 degrés, vous obtenez les mêmes résultats, 3 110,8 m. J’ai donc investiguer plus avant ce qui provoque exactement cette erreur. Bien sûr je sais que le coupable est la limitation de précision flotteur comme dit plus haut. Mais je voulais savoir quelle partie du calcul par Arduino provoquer cette grosse erreur. Il y a dans la formule Haversine, COS, SIN et ACOS fonctions utilisées. J’ai testé quelques calculs différents en utilisant ces fonctions et trouvé le calcul du COS et fonctions SIN affectent un minimum, mais le problème était l’ACOS. Si vous calculez la formule sur votre PC qu’à l’intérieur du support de l’ACOS, vous obtiendrez 0.9999999848. Voir mon point ? La troisième décimale inférieure à 6 dans la fonction ACOS est effectivement important de calculer la différence angulaire pour petite distance, mais malheureusement les Arduino ne peut pas gérer cela. Non seulement pour la petite distance, mais encore relativement longue distance (plus de 1 degré dites par exemple) il y a erreur entre les résultats sur le PC et Arduino.
Eh bien, alors j’ai commencé à réfléchir à comment éviter la fonction trigonométrique calcul lorsque sur 6 décimales sont importants. Et j’ai trouvé une solution ! Au lieu de calculer la différence angulaire entre deux positions et puis en calculant la distance en multipliant le rayon de la terre moyenne, calculer un ratio de l’angle entre deux positions (latitude et longitude séparément) sur 360 degrés et diviser la circonférence de la terre par ce ratio. En d’autres termes, conservez les numéros gros tout en calcul. Type de flotteur de l’Arduino a une limitation sur les petits décimales, mais peut gérer relativement grands nombres !
Voici ma formule :
La circonférence moyenne de la terre est x π 2 x 6 371 000 m = 40,030,170 m
ΔD (lat) = 40,030,170 x ΔΘ (lat) / 360 (en supposant que ΔΘ est petit)
ΔD(long) = 40,030,170 x ΔΘ(long) x cosΘm / 360 (Θm : moyenne latitude entre deux positions)
Maintenant, la distance est √ [Δd (lat) ^ 2 Δd (long) ^ 2]
J’ai testé cette méthode en mesurant la distance entre la maison et mon travail et il a bien fonctionné. Tout d’abord, j’ai obtenu les coordonnées de ma maison et mon travail et ensuite calculé la distance par Haversine méthode et par ma formule indiquée ci-dessus. Il y a une différence dans les résultats mais négligeable.
Croquis de l’Arduino est attaché. La bibliothèque LCD peut être téléchargée à partir ici.
Merci de lire mon Instructable. Hope quelqu'un trouver ceci est utile.