Spine testeur - archerie

Bonjour la communauté,

Je souhaite réaliser un appareil, utilisé en archerie, qui permet de peser les flèches et d'en mesurer la "rigidité" : le spine.
Les "extrémités" de la flèche reposent sur 2 capteurs de force 5kg, chacun ayant son propre amplificateur HX711.
Les actions sont déclenchées par des bouton poussoirs.
Les valeurs sont affichées sur un petit écran LCD I2C.

Mon soucis est que les valeurs sont absurdes ... c'est embêtant quand même :sweat_smile:
Les capteurs mesurent bien les variations de poids, mais les mesures ne fonctionnent pas du tout : Après la tare, la mesure du poids à vide indique 454 G au lieu de 0 et lorsque je pèse une flèche "étalon", la mesure ajoute 11 G au lieu de 21.
J'ai testé plusieurs exemples pour vérifier que mes capteurs fonctionnent bien, soient bien branchés, etc ... et tout va bien de ce côté là.
J'ai utilisé les exemples de calibrage, notamment celui de la bibliothèque HX711.h, ce qui m'a permis de déterminer les facteurs de calibrage des capteurs, mais je me suis rendu compte que quand le code appelle < scale[m].get_units(10)> , il ne va chercher que le 1er (449.93). Le deuxième n'est pas utilisé dans le calcul.

Bref, voici le code en question
(je ne l'ai pas précisé, mais j'imagine que vous comprendrez de vous même que je suis novice, autodidacte, qu'il y a beaucoup de notions qui m'échappent encore, ... Mais je suis motivé pour apprendre ... de mes erreurs et aussi de vos conseils avisés et bienveillants)
(J'espère avoir mis les bonnes balises :sweat_smile: )

//MON PROGRAMME DE SPINE TESTEUR//

                                                       //LES LIBRAIRIES//
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneButton.h>
#include <HX711.h>

                                                        //DECLARER L'AFFICHEUR//
LiquidCrystal_I2C lcd(0x27, 16, 2);


                                                        //DECLARER LES BOUTONS, PINS ET ETAT//
OneButton bouton1 (4, true);
OneButton bouton2 (5, true);
OneButton bouton3 (6, true);

const uint8_t pinsDOUT[] = {2, 7};
const uint8_t pinsCLK[] = {3, 8};

float calibration_factor [] = {449.93, -476};           //DEFINIR LES FACTEURS DE CALIBRATION DES 2 HX711
float baseWeight = 0.00;
float spineWeight = 0.00;

HX711 scale1;
HX711 scale2;
HX711 scale[] = {scale1 , scale2};

void setup() {
  Serial.begin (9600);
  Serial.println("ARCHER, ");
  Serial.println("JE TE SALUE !");
  Serial.println(" ");
  Serial.println("Bouton 1 : PESER LA FLECHE");
  Serial.println("Bouton 2 : MESURER LE SPIN");
  Serial.println("APPUYER LONG SUR LE bouton 1 POUR FAIRE LA TARE DU CAPTEUR DE CHARGE" );
  Serial.println("_____________________________________________________________________" );
  Serial.println();

  lcd.init();

                                                              // ECRIRE UN MESSAGE D'ACCUEIL//
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Archer, ");
  lcd.setCursor(0, 1);
  lcd.print("Je te salue !");
  delay (1000);

                                                              //FONCTIONS DES BOUTONS//
  bouton1.attachClick(Click1);
  bouton1.attachLongPressStop (LongPressStop1);
  bouton2.attachClick(Click2);
  bouton3.attachClick(Click3);
  //bouton3.attachLongPressStop(LongPressStop3);
}

void loop() {                                                  //INITIALISATION DES BOUTONS//
  bouton1.tick();
  bouton2.tick();
  bouton3.tick();
}

void LongPressStop1() {                                        //Action du bouton 1 si appui long : faire la tare//
  uint8_t m;
  scale[m].begin(pinsDOUT[m], pinsCLK[m]);
  scale[m].set_scale(calibration_factor [m]);
  scale[m].tare();
  delay (100);

  lcd.clear();                                                  //AFFICHAGE SUR L'ECRAN LCD
  lcd.setCursor (0, 0);
  lcd.print ("Poids :");
  lcd.setCursor (0, 1);
  lcd.print (0.0, 2);
  lcd.setCursor (5, 1);
  lcd.print ("G");

  Serial.println ("APPUI LONG SUR BOUTON 1 = TARE");            //AFFICHAGE SUR LE MONITEUR SERIE
  Serial.print ("Facteur de calibrage :  ");
  Serial.println(calibration_factor [m]);
  Serial.println ("Tare ok ");
  Serial.println();
  delay(100);
}

void Click1() {                                                 //Action du bouton 1 si appui court : peser et indiquer le poids su l'afficheur//
  uint8_t m;
  scale[m].begin(pinsDOUT[m], pinsCLK[m]);
  scale[m].set_scale(calibration_factor [m]);
  scale[m].get_units(10);

  baseWeight = scale[m].get_units(10);

  lcd.clear();                                                  //AFFICHAGE SUR L'ECRAN LCD
  lcd.setCursor (0, 0);
  lcd.print ("Poids :");
  lcd.setCursor (0, 1);
  lcd.print (baseWeight, 2);
  lcd.setCursor (7, 1);
  lcd.print ("G");

  Serial.println ("APPUI SUR BOUTON 1 = MESURE DU POIDS");      //AFFICHAGE SUR LE MONITEUR SERIE
  Serial.print ("POIDS : ");
  Serial.println (baseWeight, 3);
  Serial.println();
  delay(100);
}

void Click2() {                                                  //Action du bouton 2 : peser, calculer le spine et l'afficher//
  uint8_t m;
  scale[m].begin(pinsDOUT[m], pinsCLK[m]);
  scale[m].set_scale(calibration_factor [m]);
  scale[m].get_units(10);
  delay (100);

  baseWeight = scale[m].get_units(10);
  spineWeight = ((((baseWeight / 1000.00) - 0.521980143) * 60 / 1.565940428) + 20);


  lcd.clear();                                                   //AFFICHAGE SUR L'ECRAN LCD
  lcd.setCursor (0, 0);
  lcd.print ("Spine :");
  lcd.setCursor (0, 1);
  lcd.print(spineWeight, 3);
  lcd.setCursor (8, 1);
  lcd.print ("Gr");

  Serial.println ("APPUI SUR BOUTON 2 = MESURE DU SPINE");       //AFFICHAGE SUR LE MONITEUR SERIE
  Serial.print ("POIDS : ");
  Serial.println (baseWeight, 3);
  Serial.print ("SPINE : ");
  Serial.println (spineWeight, 3);
  Serial.println();
  delay (100);
}

void Click3() {                                                  //Action du bouton 3 : Pas de fonction utile pour ce projet//
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print("Bouton 3");                                         //L'affichage permet de vérifier que le cablage est bon//
  delay(100);
}

Est ce que vous sauriez me dire si le principe de ce code peut fonctionner ? (faire fonctionner 2 HX711 en parallèle et traiter les données moyennes ?), ou si je devrais repartir sur une autre piste ?
D'avance merci !

Vos scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); doivent être dans le setup

Dans ce code par exemple

La variable m est indéfinie. Ça fait donc n’importe quoi.

Mettre les initializations dans le setup

Le spine est représentatif de la rigidité du tube constituant la flèche.
Le poids du tube est un autre paramètre et se mesure en gramme, avec des capteurs 5kg la sensibilité sera limité.
Précision pour les non pratiquants : une flèche c'est un tube de "spine" et de longueur adaptée à l'archer et à la puissance de l'arc + une encoche + une pointe + des plumes.

Le principe de mesure du spin a changé ?
Le tube était placé sur 2 supports fixe, disposé à une distance bien connue et normalisée.
Un poids de valeur bien précise était suspendu au milieux du tube et le "spine" était obtenu en mesurant la flèche avec un "système comparateur".

Le principe :
image

Un matériel plus évolué :

Quel est ton principe ?
Tu fais descendre un doigt qui appuie sur le tube jusqu'à ce que chaque capteur détecte un "poids" correspondant à 440 grammes et tu mesure le déplacement du doigt ?

Une petite vidéo (7 s) pour montrer le départ spectaculaire d'une flèche et l'importance de la rigidité :

Merci J-M-L, je vais déjà corriger ça.
En même temps, je me rend compte aussi que [m] est normalement le résultat de la moyenne des valeurs des 2 capteurs, mais qu'elle n'est calculée nulle part.
J'imagine qu'une formule du genre : (scale1+scale2)/2 , ne marchera pas ? :sweat_smile:
Quelle serait la bonne méthode ?

68tjs, Le principe de mesure du spin n'a pas changé : la plupart des appareils permettent de mesurer la déflexion du fût (distance) et on utilise une abaque qui nous indique le spin (en livres -#).
Sur les tubes carbones, c'est facile, c'est marqué dessus :sweat_smile: . Mais je tire des flèches bois et il est souvent nécessaire de mesurer le spin sur chaque quart du périmètre du fût. C'est un peu fastidieux avec le montage manuel que j'ai déjà (pied à coulisse bas de gamme dont je n'ai pas tout à fait confiance).

En cherchant d'autres solutions, je suis tombé sur le tuto suivant :

Le principe de mesure du spin est alors inversé : Au lieu de mesurer l'effet (la déflexion) en appliquant un poids connu et constant, on mesure le poids généré par une pression au centre du fût (sur une distance toujours égale) ; le fût reposant sur les capteurs espacés de 26", comme sur les autres systèmes.

Et bien non puisque lorsque tu appliques une force sur la flèche celle-ci est répartie également sur les 2 points d'appui.
Donc, si tu appliques 800g sur la flèche tu auras 400g sur chacun des points de mesure.

C'est tellement logique une fois que tu l'as dit ^^
Donc, il ne faut pas chercher à mesurer une moyenne, mais extrapoler la répartition de la force ?
Il s'agit donc d'additionner les lectures de valeurs ?

Je suis parti du code de "Roberto di Pace", mais je n'ai pas compris comment il fait fonctionner ses 2 HX711. J'ai l'impression que son amplificateur permet d'y brancher les 2 capteurs, contrairement aux miens (d'après ce que j'ai lu ailleurs sur le forum).
J'ai donc cherché comment connecter les 2 HX711. Je recherche, mais ne retrouve pas, pour le moment, le message et le code qui montre que la solution pourrait être de créer un "tableau" regroupant les 2 HX711 , avec "uint8_t" (je ne suis pas sûr des termes, désolé).

Est-ce que ça vous semble la bonne piste ?

Il n'a qu'un HX711. Les 2 jauges de contrainte sont mises en parallèle.

Faut pas se le cacher, coté documentation c'est un peu léger il n'y a pas vraiment de schéma non plus. Juste un "plan de câblage". Donc on joue un peu aux devinettes.
Tout est là

Je n'arrive pas à le retrouver mais je suis certain que l'on a déjà eu un projet comme celui-ci sur le forum francophone mais je n'arrive pas à mettre la main dessus.

480 g + 480 g = 880 g.
C'est un peu la même chose non ? :rofl:

As tu fait les exemples de la bibliothèque ?
Utiliser des capteurs 5kg pour mesurer des faibles poids, je suis méfiant question poids minimal détectable.

Ce n'est qu'un risque, c'est peut-être bon, mais je préférerais vérifier que la mesure sort du bruit avant d'aller plus avant.

Sur la video les affichages sont très stables, mais c'est peut-être grâce à un moyennage musclé et trop de muscle peut masquer des problèmes.

Si on veut pinailler, sur le système mécanique, on suspend un poids de 2 livres (907g). (Bon d'accord, c'est le seul sujet sur lequel je suis apte à pinailler ici :yum: ).
Alors, oui, j'ai testé les capteurs et les branchements avec les exemples de la bibliothèque. C'est tout bon, mais c'est vrai que je m'étais posé la question de la précision car, pour un spine testeur mécanique ad'hoc, on mesure la déflexion en mm et on a besoin d'une précision de 2 décimales (1 pourrait suffire, mais 2 c'est mieux). Mais je ne me rends pas compte du besoin de précision de poids que ça induit ...
Selon vous, pour un poids d'environ 500g, je devrais utiliser quel capteur ?

Perso, je préfèrerais une lecture "réelle" et pas trop moyennée.

En fait j’ai réussi a trouver le source du programme et il ne semble pas y avoir de moyenage.

Je n’ai pas dit qu’il fallait changer de capteur, j’ai dit qu’il fallait vérifier ce point.
C’est ce type de question qu’il faut se poser au début d’un projet.
Ce n’est pas le cout de ces capteurs qui limite les tests, c’est plutot les délais de livraison.

il y a quand même ça:

 baseWeight=scale.get_units(10);                 //Average of ten readings 

...

localWeight=scale.get_units(10); 

Edit:
Mais en même temps, comme il n'y a pas de scale.reset() ou de scale.set_average_mode() le mode de calcul est celui par défaut c'est-à-dire 0 (pas de moyenne)

scale.get_units (10) , ça fait bien une moyenne sur 10 mesures. C'est bien ça ?
Mais comment faire la moyenne (et coder) les valeurs sortants des 2 HX711 ?

Oui, vous avez raison. Je vais essayer d'aboutir avec ces capteurs et si l'utilisation n'est pas concluante, j'en monterais d'autres.

Oui, si tu l'actives par l'une des méthodes suivantes, dans le setup() par exemple:

  //  get average of multiple raw reads
  //  times = 1 or more
  float    read_average(uint8_t times = 10);

  //  get median of multiple raw reads
  //  times = 3..15 - odd numbers preferred
  float    read_median(uint8_t times = 7);

  //  get average of "middle half" of multiple raw reads.
  //  times = 3..15 - odd numbers preferred
  float    read_medavg(uint8_t times = 7);

  //  get running average over times measurements.
  //  the weight alpha can be set to any value between 0 and 1
  //  times = 1 or more.
  float    read_runavg(uint8_t times = 7, float alpha = 0.5);

Sinon par défaut il n'y a pas de moyenne.

La moyenne est réalisé par la librairie.

Ah ok, il me manquait cette partie pour obtenir une moyenne. Merci !
Bon, il faut que je trouve le temps de m'y remettre maintenant ^^

Bonjour,
Après une petite pause, je vais essayer de reprendre ce projet.
Concernant la mise en parallèle des capteurs de charge, je me demande comment le signal sera traité par l'amplificateur. Il va y avoir 2 mesures, issues de capteurs qui n'ont pas le même étalonnage. Est-ce les valeurs s'additionnent à la jonction des cablages ? ... ça peut vraiment marcher ?

hello, j'ai ce doc en stock
2-Loadcell-cabling.pdf (619,9 Ko)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.