Aller au contenu
FR8QP

Affichage élévation avec Arduino

Recommended Posts

FR8QP

Bonjour  -  Je me suis procuré un Arduino + afficheur LCD avec I2C + accéléromètre ADXL345  afin d'installer un système d'élévation d'antenne.

j'ai cherché en vain un code pour faire fonctionner cet ensemble.  Uniquement des bribes de codes que j'ai tenté de mettre bout a bout, mais

ça ne fonctionne pas.  Je suis à la recherche du code qui permettrait le fonctionnement de cet accéléromètre avec uniquement l'affichage

de l'axe Z sur l'afficheur lcd.  Si vous avez cela, merci de votre aide.

Alain

 

Partager ce message


Lien à poster
F6ITU

Bonjour Alain

En guise de prolégomène, je précise que ma seule antenne est un doublet 40 mètre, et que, par voie de conséquence, je suis loin de pouvoir vous fournir quelqu'information pertinente en matière de machins qui tournent et autre épouvantails à moineaux.

Ceci étant, avez vous jeté un oeil sur le fork de N5FPP 

https://github.com/N5FPP/k3ng_rotator_controller

basé sur le code original de K3NG ? 

https://github.com/k3ng/k3ng_rotator_controller/wiki

il utilise également un accéléromètre (pas le même mais.... )

K3NG lui-même a réalisé une variante de son propre système baptisé le "frankenrotator", également avec un accéléromètre. Pour avoir collaboré (un tout petit peu) à la mise au point d'un autre de ses projets, je puis vous assurer qu'il répond volontiers aux questions techniques qui lui sont posées. 

Le fait de n'afficher que le Z va peut-être vous demander un peu de travail de nettoyage -doux euphémisme pour parler de l'élimination de près de 80% du sketch- mais ne devrait pas poser trop de difficultés je pense. 

73'

Marc

 

Partager ce message


Lien à poster
FR8QP

Bonjour Marc,  merci pour la réponse.

ce machin de K3NG j'y ai passé des heures !  d'abord le circuit "de base"  est faux , ensuite ce controleur rotor est fait pour ceux

qui possèdent un rotor  azimut / élévation Yaesu G5500 , donc en analogique avec des potars de recopie. J'ai bien essayé d'adapter

avec un potar recopie de 500 ohms.  Mais, déjà au départ,  avec le code fourni l'afficheur et les 4 boutons de direction ne fonctionnent pas.

J'ai passé beaucoup trop de temps sur ce montage qui en fait n'est pas adapté à mes besoins.

Je n'ai pas besoin de poursuite automatique pour suivre la lune.  Il me faut juste un truc simple. Je sais que certains ont réalisé ce

que je souhaite.

A +     73

Alain

 

 

Modifié par FR8QP
manque un mot

Partager ce message


Lien à poster
F6CER

Bonjour

ayant quelque peu pratiqué l’EME il y a longtemps (il y a prescription) je n’ai jamais eu de résultats corrects avec les pot de recopie des moteurs d’élévation  : ca s’est toujours terminé avec un potentiomètre de précision a frottement doux  (on en trouve assez souvent d’occasion) fixé sur le bati  des antennes ,et dont l’axe était tout simplement muni d’un contre-poids :c’est comme le fil a plomb , jamais en panne et facile a recaler  on place le tout dans une grosse boite en plastique  du genre Tupperware et voila .....

apres ça, la carte uP n’a plus qu’a fonctionner en ohm-mètre 

Partager ce message


Lien à poster
FR8QP

Bonjour Georges.

oui, les potars on faisait avec il y à longtemps.  Et j'ai même essayé récemment avec un potar 10 tours ( un Burns ) dans un vérin.

Alors là, ça été le bide  HI  le vérin qui soit disant est linéaire ne l'est pas, et de plus sur toute sa course (45 cm) il ne développe pas

toute la résistance du potar . Résultat : je me suis bien em... pendant des heures ( et des jours) à essayé de trouver une solution.

Si le vérin et le potar ne sont pas linéaires, pas la peine de continuer dans cette voie . L'affichage avec un galva manque de précision.

  Aujourd'hui, il y à ces petits accéléromètres vendus 8 ou 10 euros qui ont une précision phénoménale et qui sont faciles a cabler

sur un Arduino (4 fils)  le hic, c'est le soft adapté à mon application avec affichage en degrès , précision au 1/10 .

a suivre ....

73

Alain

 

 

Partager ce message


Lien à poster
F5OWL

Bonjour,

Je possède un rotor site/azimuth et je numérise simplement la tension présente sur les points milieu des potars pour afficher l'angle de site et d'élévation.

La résolution n'est que de 10bits mais c'est suffisant pour ce que je veux en faire.

Le soft de K3NG est vraiment exceptionnel mais assez difficile à maîtriser.

Citation

Je me suis procuré un Arduino + afficheur LCD avec I2C + accéléromètre ADXL345  afin d'installer un système d'élévation d'antenne. 

Je n'ai pas essayé avec un accéléromètre pour un rotor.

Cependant je suppose qu'il suffit de récupérer les valeurs fournies par l'accéléromètre. On trouve des libraires Arduino toutes faites.

Il suffit de vérifier que les valeurs sont cohérentes en les affichant sur le port série.

Ensuite vous calculez l'angle et contrôlez encore la valeur avec l'affichage sur le moniteur série. Si on considère qu'une composante c'est un simple calcul de trigo.

Si on veut plus de précision en tenant compte d'un écart de verticalité ça peut être un peu plus compliqué...

Voici le lien d'un tp sur ce thème qu'on faisait à l'IUT de Toulon avec un accéléromètre analogique. Les formules de calculs y sont données.

http://neanne.univ-tln.fr/IMG/pdf/m2206_dossiertechnique_inclinometre.pdf

Quand c'est correct il suffit de l'afficher sur l'afficheur LCD. Là encore on trouve une librairie arduino très simple.

Il se peut que l'affichage d'un réel sur le LCD soit problématique. Postez votre code pour avoir de l'aide.
 

Bonne réalisation,

Philippe

Partager ce message


Lien à poster
FR8QP

Bonjour Philippe

j'avais déjà vu le projet de l'IUT Toulon avec les formules de calcul. Mais, pour moi, comment les mettre dans un code Arduino ?

La trigo, c'est pas mon point fort.   Les accéléromètres sont dans tous les robots  avec lesquels les jeunes expérimentent l'électronique

et l' I A  embarquée.  ce sont des capteurs très précis .  Oui, il y a des librairies Arduino avec des exemples de code très courts et qui ne

correspondent pas a une simple conversion des données de l'angle Z .   Quel code utilisez vous pour votre système ? 

SI  vous vouliez me l'envoyer , je pourrais déjà expérimenter cela et voir si dans ma configuration matérielle ce serait acceptable, bien que je n'aime pas les potars.

 Alain

 

 

Modifié par FR8QP

Partager ce message


Lien à poster
F5MMX

Bonjour Alain,

la première chose prendre une librairie qui va bien comme par exemple celle de SparkFun et avec ça on peut écrire un truc du style:

#include <SparkFun_ADXL345.h> // SparkFun ADXL345 Library from https://github.com/sparkfun/SparkFun_ADXL345_Arduino_Library
ADXL345 adxl = ADXL345();
double angle;
void setup() {
  Serial.begin(9600);       // init port serie pour debug
  adxl.powerOn();           // Activation ADXL345
  adxl.setSpiBit(0);        // Configuration adxl345 en I2C
  adxl.setRangeSetting(2);  // fonctionnement en 2G pour plus de resolution

}

void loop() {
  int x, y, z;
  adxl.readAccel(&x, &y, &z);                   // Lecture des accelerations x,y,z
  angle = atan2(y, z) * 57.3;                   // Calcul rotation autour axe X de l'ADXL345
  Serial.println("angle :" + String(angle));    // Affichage de l'angle
  delay(100);                                   // Tempo 100ms
}

 

En filtrant on peut avoir une résolution de 0.2°.... ce n'est pas utile mais ça fait plaisir.

Jean-Michel

Modifié par F5MMX

Partager ce message


Lien à poster
F6ITU

bonjour à tous

Concernant le soft de K3NG, "le schéma est dans le code".. alors effectivement, les premiers brouillons sont plutôt bancales, il faut vraiment coller le nez dedans pour aboutir à un résultat concret. Ou récupérer les schémas de RemoteQTH en éliminant ce qui n'est pas désiré. Les gpio sont "conformes au code", c'est une certitude, et la totalité des fichiers "hard" est fournie. C'est du kicad, donc de l'open (hélas, la partie matérielle n'est pas sur github, c'est un peu enquiquinant car en théorie, on n'a pas le droit de forker) 

C'est un code assez modulaire, et l'on peut choisir à peu près toutes les options possibles avec un simple ajout ou retrait de commentaire sur les appels de fonctions (soleil, lune et autres fonctions indésirables sont donc a priori assez simples à carboniser... mais je n'ai pas passé des heures sur la lecture des dernières versions) 

le Frankenrotor et le N5FPP ne font plus appel aux potentiomètres de recopie, mais à des accéléromètres et, pour N5FPP, à un capteur de champ pour le nord magnétique. Il est lui également facilement accessible, actif entre autres lieux de perdition, sur le groupe de discussion Hermes Lite et dans certains cercles d'usinage cnc.

marc 

 

Partager ce message


Lien à poster
FR8QP

Bonsoir Jean Michel F5MMX .

Merci pour ce début de code qui contient la formule magique de conversion des données en angles.

Mais, il me faut  "habiller"  cela avec beaucoup de choses a déclarer pour que ça démarre.  j'ai du boulot !  HI !

je vais voir dans les prochains jours si je peux arriver à un résultat.

73 !

Alain

 

Partager ce message


Lien à poster
F5OWL

Oui le code de jean michel est un excellent point de départ.

Ensuite les formules plus exactes (roulis, tangage, verticalité) sont données page  8 du document de l'IUT.

ça permet de compenser le fait de l'axe z n'est pas exactement vertical

Philippe

 

Partager ce message


Lien à poster
F5MMX

J'oubliais, si la "précision" demandée est un point important, il sera alors nécessaire de calibrer l'accéléromètre https://www.analog.com/media/en/technical-documentation/data-sheets/adxl345.pdf

Quand j'écris important c'est chercher à corriger des erreurs de précision de l'ordre de 1°.

Il existe d'autres accéléromètres avec des spécifications plus sexy et à des prix similaires mais qui sont un poil plus complex à mettre en oeuvre. Ils permettent de mesure le dixième de degré en environment contrôlé, ce qui n'est pas le cas en haut d'un pylône...

Jean-Michel
 

Partager ce message


Lien à poster
F5MMX

Alain,

voila à quoi pourrait ressembler votre code pour afficher l'angle de l'accéléromètre sur votre écran LCD I2C:

#include <SparkFun_ADXL345.h>  // SparkFun ADXL345 Library from https://github.com/sparkfun/SparkFun_ADXL345_Arduino_Library
#include "LiquidCrystal_I2C.h" // depuis https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
ADXL345 adxl = ADXL345();
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0X27 est l'adresse de l'ecran LCD a valider avec la référence utilisée, 16 est le nombre de caracteres par ligne et 2 est le nombre de lignes
double angle;
void setup() {
  Serial.begin(9600);       // init port serie pour debug
  lcd.begin();              // init LCD
  adxl.powerOn();           // Activation ADXL345
  adxl.setSpiBit(0);        // Configuration adxl345 en I2C
  adxl.setRangeSetting(2);  // fonctionnement en 2G pour plus de resolution
  lcd.clear();              // efface ecran LCD
  lcd.setCursor(1, 1);      // positionne curseur
  lcd.print("Angle: ");     // affiche texte "Angle: "
}

void loop() {
  int x, y, z;
  adxl.readAccel(&x, &y, &z);                   // Lecture des accelerations x,y,z
  angle = atan2(y, z) * 57.3;                   // Calcul rotation autour axe X de l'ADXL345
  Serial.println("angle :" + String(angle));    // Affichage de l'angle
  lcd.setCursor(10, 1);                         // positionne curseur
  lcd.print(String(angle, 2) + " deg.  ");      // Affiche angle sur ecran
  delay(100);                                   // Tempo 100ms
}

N'ayant pas d'écran LCD sous la main, je n'ai pas testé ce code, mais il n'a pas de raison de ne pas fonctionner. Il faut bien sur faire un affiche plus joli ou mieux, passeur sur un écran graphique LCD ou OLED.

Le schéma avec un écran de type LCD ou OLED I2C pourrait ressembler à celui joint.

Jean-Michel
 

2019-01-18_14-20-00.jpg

Partager ce message


Lien à poster
FR8QP

Bonjour Jean Michel   j'étais justement en train de regarder toutes les caractéristiques de l'ADXL345 et aussi a chercher des codes qui s'y rapportent.

Votre dernier post devrait m'aider a aller plus vite dans l'obtention d'un résultat.  Je vous en remercie .

je vais m'en occuper la semaine prochaine, car j'ai démonté mes antennes 144 pour une amélioration en vue de la prochaine bonne propag EME

à laquelle je veux participer.  On en reparle dans une dizaine de jours .  Encore merci !

73 !

Alain

 

Partager ce message


Lien à poster
FR8QP

@ Jean Michel  bonjour -  ça marche !   mais je dois calibrer l'ADXL.   Pour zéro degré , j'affiche bien 0.00 , mais pour 90° j'affiche 95°.

Pour cette mesure , je la fait sur une table bien plane et la comparaison est faite avec un niveau électronique . Je ne pense pas que celui-ci

puisse être faux de 5 degrés.  Alors, avant de tout ficher en l'air ( HI ) car j'y ai passé quelques heures pour d'arriver à un résultat, selon vous

sur quels paramètres je dois agir pour avoir la précision ?

Partager ce message


Lien à poster
F5OWL

Bonjour,

Bravo pour la réalisation.

Je me demande si l'erreur ne vient pas du fait que la valeur sur l'axe z tend vers 0 lorsque l'angle tend vers 90°, ce qui donne un infini pour la tangente.

Pouvez vous afficher les valeurs brutes (x,y,z) pour différents angles et nous les communiquer ?

Juste après la lecture de l’accélération faire :

Serial.println(x);

Serial.println(y);

Serial.println(z);

La formule avec l'arc cosinus donnée par 8 du document de l'IUT est peut être plus pertinente pour les angles élevés. 

Vous pouvez l'essayer simplement en entrant les valeurs x,y et z dans une calculatrice et voir ce que ça donne.

73

Philippe

 

 

 

Modifié par F5OWL

Partager ce message


Lien à poster
FR8QP

Bonjour Philippe .   voilà ce que j'ai relevé :

avec l'horizontale zero degré :    x = -3          y = 0        z = 27

avec affichage à 95 degrés   :    x = - 4          y = 34      z = - 3

 

Partager ce message


Lien à poster
F4HTQ

Bonjour,

j'imagine que c'est le Z = -3 qui vous fait dépasser les 90°, avec y = 34 et z = 0 vous auriez eu 90°.

Donc le problème est au niveau de la mesure (imprécision), pas du code.

David.

 

 

Partager ce message


Lien à poster
FR8QP

Bonjour David

imprécision dans la mesure ? Pourtant le capteur est bien à l'horizontale pour le zéro , et pour 90°  je fais avec une équerre + le électronic digital angle gauge.

je peux pas faire mieux pour positionner le capteur.  Il s'agit bien d'un manque de calibration. Il faut aller dans les registres du capteur et là je m'en sent pas

le courage sans être guidé par quelqu'un qui connait ça.

Alain

 

Partager ce message


Lien à poster
F5OWL

re-bonjour,

Les deux formules donnent les même résultats.

Effectivement pour avoir 0° il faut y=0 et pour avoir 90° il faut z=0.

Dans vos mesures on voit que le module change entre 0° et 90° alors que ça ne devrait pas être le cas (x2+y2+z2 = constante).

Dans la doc il est préconisé de modifier les registres mais il doit être possible de faire la correction après coup.

La calibration la plus simple (selon la doc page 30) consiste à accumuler au moins 10 mesures à 0° (ce qui correspond à X=0g , Y=0g , Z=+1g) et d'en faire la moyenne.

Pour les axes x et y il suffit de retirer cette moyenne avant le calcul de l'angle. Pour trouver l'offset de l'axe z  il faut se ramener à 0g et donc enlever la sensibilité.

D'après ce que je comprend enlever la valeur théorique pour 1g.  ça doit être fait automatiquement si on place les valeurs moyennes dans les registres.

Ce que vous pourriez tenter c'est de prendre la moyenne de plusieurs mesures de z avec l'axe z à 0g (à 90°) et d'utiliser cette valeur comme offset pour z.

ça donnerait :

 x_corrigé = x - moyenne des x à 0°

 y_corrigé = y - moyenne des y à 0°

z_corrigé = z - moyenne des z à 90°

ensuite :

inclinaison = arccos ( z_corrigé / module_de_g)

module de  g = racine carré ( x_corrigé² +  y_corrigé² + z_corrigé²)

Je n'ai pas d'accéléromètre sous la main pour faire des mesures.

Mais si vous me donnez vos mesures je veux bien essayer de faire le programme pour voir si mon idée n'est pas trop bête. 

Philippe

 

Partager ce message


Lien à poster
FR8QP

Bonjour Philippe.

Les données transmises avant n'étaient pas les bonnes ( prises après calcul).   Ci après nouvelles données "brutes" :

position 0° :   x = - 19      y =  - 6      z =  220

position 90° : x = - 31      y = 271      z = - 16

Sur le net il y à beaucoup de réponses a ""calibration ADXL345""    chacun y va de sa façon, pas un ne ressemble l'autre.

j'ai essayé  7 codes pour calibrage,  tous sont truffés d'erreurs, impossible de compiler, trop d'erreurs, même en corrigeant.

j'ai du tomber sur le plus mauvais ADXL  ......

Alain

 

Partager ce message


Lien à poster
F5MMX

Juste une chose, pour moins d'erreur de calcul on peut remplacer dans la ligne de calcul la valeur 57.3 par 180/3.141592654

angle = atan2(y, z) * 57.3;                   // Calcul rotation autour axe X de l'ADXL345

Par ailleurs, j'ai rencontré des ADXL345 qui n'étaient pas bien calibrés en usine. Il est souvent moins consommateur de temps d'en changer ou si plus de résolution est nécessaire de passer sur un MPU6050 ou un MMA8451.

Jean-Michel

Modifié par F5MMX

Partager ce message


Lien à poster
FR8QP

Bonsoir -   en changeant la formule, c'est pareil, toujours 5° de plus.  J'ai continué a chercher et j'ai trouvé un site qui parait intéressant.

https://learn.sparkfun.com/tutorials/adxl345-hookup-guide/all      

il y à un code qui pour une fois n'a pas bugué pour lire les accélération mini et maxi .  je l'ai chargé, activé et effectivement je vois

les accélérations qui changent suivant l'orientation du capteur.  l'axe Y ne change pas, est ce normal ?

Alors, à partir de ces données d'accélération , comment calculer l'offset ?  Il faudrait prendre 8 mesures ?

J'ai un MMA8452 , est ce que le code de l'arduino lui convient ?

Merci pour votre aide.

Alain

 

 

Partager ce message


Lien à poster
F6DPV

Bonjour

Alors je ne connais pas ce capteur.Mais je voudrais revenir sur le soft en général, car on à tendance à croire, qu'il peu tout faire et de plus très bien . Pour ce capteur j'ai survolé la DS . il y a 3 convertisseurs Analog/Num de résolution, 10bits donc1024 pas de quantification, qui si je ne me trompe pas, ce pas, doit-être un nombre decimale, qui dit decimale, dit en soft un flottant et c'est la ou cela devient intéressant( rappel, flottant: signe explosant mantisse).

C'est la mantisse qui détermine la precision de notre nombre decimale.En mode standard, c'est du 32 bits 1 signe 7 pour l’exposant et 24 pour la mantisse,Tout cela est bien sur, orchestrée par notre compilateur. Petit arrêt sur celui ci :

Il y a les compilateurs libre et les compilateurs payant( en générale avec le compilateur il y a les fameuses librairie) je ne vais pas regarder les payantes,c'est trop chère  pour moi. Dans les libres, je vais voir celle que je connais, mais je pense que pour les autres cela doit être pareil.Alors je travail avec MICROCHIP  et le XC8, les flottants sont sur 24 BITS, OUI OUI, 1S 7E et donc 16 bits de mantisse. Bonjour la precision, pas la peine d’écrire dans un programme le NB 0.0048828125 (pas de quantification d'un CAN allez en français, d'un µC avec Vref+=VCC Vref-=VDD=5V) j'ai déjà vue :-) ou encore sur un AD9850 pour le calcul de la donnée à envoyer exemple  40 000 000 Hz même sous 32 bits il i y a des erreurs de conversion, Hexa-> vers flottant. Pour coder 40 000 000 il faut 26 bits de mantisse, bon je vais arrêter la ,

Alors la solution soit on refait les lib ,ce que certains fon, notamment sous arduino ou la elles ne sont pas terrible, soit on fait de ASM, ce que je fait sous 8 et 16 bits, soit on corrige les erreurs des la lib quant on peu.

 

Je m’excuse  d'avoir un peu débordé, sur votre fil,je voulais  remettre un peu le soft  à sa place.

Pour votre probleme je pense,qu' il ne doit pas être linaire  (pas un seul offset mais plusieurs sur différente plage) exemple du AD9850 sur les basses fréquences les erreurs sont quasiment nul, car le pas de quantification est de, à la louche 68

Bon courage a vous

et 73

 

Partager ce message


Lien à poster
F4HTQ

Bonjour,

Le XC8 est un compilateur propriétaire adapté aux microcontrôleurs PIC 8 bits, qui ne sont pas terribles ( comparé aux Atmega) au niveau taille et nombre des registres. D'ailleurs il me semble qu'on peut quand même le forcer à 32 bits dans les options ( même sur la version gratuite).

Dans le cas de l'arduino c'est le GCC qui est intégré et les nombres flottants sont gérés via une lib standard. Ils sont en 32 bits avec 1 bit de signe, 8 bits d'exposant, et 23 bits de mantise ( +1 bit fantôme ).

De toute façon, dans le cas qui nous intéresse l'erreur de mesure est bien supérieure a l’erreur de calcul ( avec 23 bits de mantise on a en gros 7 chiffres significatifs, c'est pas mal).

 

D'ailleurs j'en profite pour préciser que sur arduino les "double" ne sont pas des doubles, ils sont gérés comme des floats, donc en 32 bits. Quoi qu'il en soit, en C++ les plus motivés peuvent se refaire leurs propres routines de calcul en virgule flotante via la redéfinition des opérateurs.

Et pour une culture technique complète, il faut savoir que sur les processeurs PC ( qui n'ont pas besoin de librairie pour effectuer les calcul en nombre flottants vu qu'ils possèdent une unité de calcul dédiée), tous les calculs sont effectués en 80 bits ( que votre nombre soit un float ou un double) et c'est uniquement au moment ou ils passent du processeur à la mémoire que la précision est tronquée. Il s'agit donc d'une précision de stockage et non d'une précision de calcul. Ce qui n'est pas sans poser quelques problèmes entre des modes de compilation "release" et "debug", le release travaillant plus dans les registres afin d'accélérer la vitesse d'exécution aura aussi tendance à faire des calculs ( intermédiaires) plus précis, ce qui peut occasionner ( et heureusement c'est rare, vu que deux fois en carrière) des bugs qui arrivent en compilation release et non en compilation debug ( ou l'inverse).

Bonne journée.

David.

 

Modifié par F4HTQ

Partager ce message


Lien à poster

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×