Jauge de contrainte + HX711 - Optimisation de code

Bonsoir à tous!

En ce moment je joue avec une jauge de contrainte de 100kg à 4 fils + son petit HX711 pour lire via une arduino des pressions exercées. Le montage fonctionne tip top. Pour une valeur donnée, j’ouvre un petit relais un certain temps, et il lui est impossible de s’ouvrir à nouveau si la valeur n’est pas repassée sous une certaine pression (comme une sorte d’anti-rebond au final).

MAIS, je trouve que la lecture de la valeur de la pression de la sonde est un peu mollassonne [voir molle du cul :zipper_mouth_face: ] , et je me demande si il y a moyen d’optimiser mon code. J’utilise une version qui ne renvoie rien du tout, aucune utilisation de Serial, mais voici ma version “qui parle” que j’utilise pour pour mes réglages avant de passer à la version mutted

El codigo:

#include "HX711.h"
#define CLK 2
#define DOUT 3
HX711 scale (DOUT, CLK);


const int pinShift =  4;
const int capteurEmbrayage = 5;
const int ledDebrayage = 13;



// Déclaration des variables
unsigned long deb =  0;
float weight;
float calibration_factor = 35000; //Valeur pour que le calibrage soit à 0kg a vide (avec jauge de 100Kg)

boolean onPeutShifter = true;      //Validation pour le prochain cycle


/***********REGLAGE DU SHIFTER***********/
const float seuil_Enclenchement = 5 ;  //SEUIL DE DÉCLENCHEMENT DE LA COUPURE EN KG (0.75 = 750g)
const float seuil_Rearmement =  3;     //SEUIL DE RÉ-ARMEMENT (quand la pression rediminue, seuil a dépasser pour pouvoir reclaquer un shifting)
const int temps_Coupure = 65;            //Délai de coupure allumage (en ms -> 70=70ms), ne pas descendre sous 59ms!))
const int delai_Post_Embrayage = 500;    //Délai après lequel on récupère le shifter, une fois la moto ré-embrayée (en ms)
/***************************************/


void setup() {

  Serial.begin(115200);                   //Activation du moniteur (mettre //devant pour faire taire)

  Serial.println("_____________________________________");
  Serial.println("Shifter par gauge de contrainte");
  Serial.println("");
  Serial.println("Initilisation:...");
  Serial.println("Réglages:");
  Serial.println("");
  Serial.print("Seuil déclenchement: ");Serial.print(seuil_Enclenchement*1000);Serial.println(" grammes");
  Serial.print("Seuil réarmement: ");Serial.print(seuil_Rearmement*1000);Serial.println(" grammes");
  Serial.print("Temps coupure: ");Serial.print(temps_Coupure);Serial.println("ms");
  Serial.print("Delai réactivation après embrayage: ");Serial.print(delai_Post_Embrayage);Serial.println("ms");Serial.println("");


  pinMode(pinShift, OUTPUT);
  digitalWrite(pinShift, LOW);

  pinMode(capteurEmbrayage, INPUT_PULLUP);

  pinMode(ledDebrayage, OUTPUT);
  digitalWrite(ledDebrayage, LOW);


  scale.set_scale();
  scale.tare(); //Reset the scale to 0
  long zero_factor = scale.read_average(); //Get a baseline reading


  Serial.println("Done!");
  Serial.println("Pensez à bien faire chauffer la moto avant de shifter");
  Serial.println("_____________________________________");
  delay(2000);
}


void loop() {

  while (digitalRead(capteurEmbrayage) != LOW) //Actionne la fonction shifter, SI t'es embraye
  {
    digitalWrite(ledDebrayage, LOW); //Led interne de l'arduino OFF = shifter dispo
    strain();
    shifter();
  }
  //Si tu debrayes, coupure du systeme (pas besoin de shifter pour rien)
  Serial.println("->Débrayage: coupure fonction shifter");
  digitalWrite(ledDebrayage, HIGH); //Led interne de l'arduino ON = shifter desactive
  delay(delai_Post_Embrayage); //le temps de lacher completement le levier, pour reactiver le shifter

}



/***********Fonctions***********/
void strain() {
  scale.set_scale(calibration_factor); //Ajustement du facteur de calibrage
  weight = scale.get_units(1);
  Serial.print("Shifter autorisé, pression: "); //RETIRER LES // AVANT LES LIGNES SUIVANTES POUR AFFICHER LE POIDS LU
  Serial.print(weight);      //BIEN PENSER A REMETTRE //DEVANT CES LIGNES AVANT LA MISE EN SERVICE REELLE
  Serial.println("Kg");
}


void shifter() {

  if (weight > seuil_Enclenchement && onPeutShifter) { //Seuil de déclenchement
    deb = millis();
    digitalWrite(pinShift, HIGH);
    Serial.println("_____________________________________");
    Serial.println("Seuil déclenchement dépassé: Shift");
    Serial.println("_____________________________________");
    onPeutShifter = false;
  }

  if (millis() - deb > temps_Coupure)
    digitalWrite(pinShift, LOW);

  if (weight <= seuil_Rearmement)
    onPeutShifter = true; //Seuil de ré-engament
}

Il y a des commentaires débiles, mais c’est pour que mon petit frère puisse s’en servir :grinning:
Plus sérieusement, y voyez-vous un quelconque moyen d’optimisation? Le but recherché est que si la valeur faut immédiatement 5Kg (par exemple), boum relais ouvert immédiatement. Et non que la sonde à pression immédiate dise: 4,3Kg; 4,5K; 4,9kg; AH! 5Kg, on ouvre!

Je suis preneur de toute bizarreries :stuck_out_tongue: Vous trouverez en PJ le look général de la jauge + le schéma de mon montage. La jauge est la même, mais pas de cette marque, c’est juste pour vous donner une petite idée du visu

Merci à vous et bonne soirée

T.

Brasiligun:
MAIS, je trouve que la lecture de la valeur de la pression de la sonde est un peu mollassonne

Bonsoir
Déjà les modules basiques/lambda HX711 sont cablés en 10 SPS (pin15 à GND)
tu peux les passer en 80 SPS (en cablant le pin 15 à VDD)

de plus je pense que dans ton application , tu devrais travailler en mode raw avec le HX711

Artouste:
Bonsoir
Déjà les modules basiques/lambda HX711 sont cablés en 10 SPS (pin15 à GND)
tu peux les passer en 80 SPS (en cablant le pin 15 à VDD)

de plus je pense que dans ton application , tu devrais travailler en mode raw avec le HX711

Merci pour cette réponse ultra rapide! Je ne savais pas du tout, mais le pin15 de l’arduino? Les UNO et Nano ne s’arrêtent pas à 13?

Pareil le mode RAW je ne connais pas, (fin le format photo oui :p) Je vais me renseigner. Mais effectivement, si c’est le forcer à transmettre plus d’informations, c’est exactement ce que je cherche

EDIT: j’ai choppé ça, donc le port A1? C’est à dire passer CLK 2, DOUT 3 à DOUT A0 et CLK à A1?

Brasiligun:
Merci pour cette réponse ultra rapide! Je ne savais pas du tout, mais le pin15 de l'arduino? Les UNO et Nano ne s’arrêtent pas à 13?

Pareil le mode RAW je ne connais pas, (fin le format photo oui :p) Je vais me renseigner. Mais effectivement, si c'est le forcer à transmettre plus d'informations, c'est exactement ce que je cherche

EDIT: j'ai choppé ça, donc le port A1? C'est à dire passer CLK 2, DOUT 3 à DOUT A0 et CLK à A1?

:grin:

Non non !
le pin 15 duc chip HX711

Pour le mode RAW c'est simplement de lire l'acquisition sans moyenner (lib)
En ce moment , je suis en plein dans la trituration des HX711 (hors mode pesée) :sunglasses:

Un petit programme de test mode RAW directement exploitable avec le traceur de l'IDE
Perso je pense que dans ton cas , le mode 10SPS (pas de modif du module est suffisant)

/*

  Arduino pin
  2 -> HX711 CLK
  3 -> DOUT
  5V -> VCC
  GND -> GND

  Most any pin on the Arduino Uno will be compatible with DOUT/CLK.

  The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine.

*/

#include "HX711.h"

#define DOUT  3
#define CLK  2

HX711 scale(DOUT, CLK);

void setup() {
  Serial.begin(115200);


}

void loop() {
  Serial.println(scale.read());                 // print a raw reading from the ADC : exploitable par le traceur serie IDE



}

Bonsoir

cette pin 15 n'est elle pas reliée à la masse par une piste passant sous le boitier du HX711 ?

@Artouste : je triture aussi avec des utilisations 'déviantes' : µAmpèremetre, thermocouple, PT100.....

al1fch:
Bonsoir

cette pin 15 n'est elle pas reliée à la masse par une piste passant sous le boitier du HX711 ?

@Artouste : je triture aussi avec des utilisations 'déviantes' : µAmpèremetre, thermocouple, PT100.....

sur les modules asia surement
je te repond demain

Perso , je suis en train de "valider" de l'acquisition vitesse air (BASE MPX10DP HX711)
Pour réduire le "bruit" de manière efficace j'alimente le HX711 non pas avec un régulateur , mais avec une réference de tension (MCP1541 en l’occurrence) , certes ce n'est pas très académique , mais c'est bougrement efficace ;D

Artouste:
:grin:

Non non !
le pin 15 duc chip HX711

Pour le mode RAW c’est simplement de lire l’acquisition sans moyenner (lib)
En ce moment , je suis en plein dans la trituration des HX711 (hors mode pesée) :sunglasses:

Un petit programme de test mode RAW directement exploitable avec le traceur de l’IDE
Perso je pense que dans ton cas , le mode 10SPS (pas de modif du module est suffisant)

/*

Arduino pin
2 → HX711 CLK
3 → DOUT
5V → VCC
GND → GND

Most any pin on the Arduino Uno will be compatible with DOUT/CLK.

The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine.

*/

#include “HX711.h”

#define DOUT 3
#define CLK 2

HX711 scale(DOUT, CLK);

void setup() {
Serial.begin(115200);

}

void loop() {
Serial.println(scale.read()); // print a raw reading from the ADC : exploitable par le traceur serie IDE

}

Ça marche merci! Je vais test, et effectivement le mien est relié à la masse (perceuse a colonne incomming :3)

Je suis curieux d’essayer de l’accelérer + ta methode

Mais en mettant ce pin à 5v, doit-on modifier qlq chose dans la librairie du hx ou spontanément il passe en accéléré?

Ptite photo de mon mien

Brasiligun:
Ça marche merci! Je vais test, et effectivement le mien est relié à la masse (perceuse a colonne incomming :3)

Je suis curieux d'essayer de l'accelérer + ta methode

Mais en mettant ce pin à 5v, doit-on modifier qlq chose dans la librairie du hx ou spontanément il passe en accéléré?

Ptite photo de mon mien

Avant d'intervenir sur le PCB :grin:
Fais déjà un test avec le traceur serie et le programme raw et regarde la "tete" de la courbe lorsque tu sollicite/relache
la jauge

Je vais essayer d'ici quelques minutes :stuck_out_tongue: Tu penses que juste ceci peut régler mon soucis de petite latence entre ce qui se passe réellement, et le temps que l'arduino accepte de me dire la pression instantané?

(Je préfère demander pour éviter un bide :p)

Merci en tout cas

Brasiligun:
Je vais essayer d'ici quelques minutes :stuck_out_tongue: Tu penses que juste ceci peut régler mon soucis de petite latence entre ce qui se passe réellement, et le temps que l'arduino accepte de me dire la pression instantané?

(Je préfère demander pour éviter un bide :p)

Merci en tout cas

Regarde déjà ce que donne le traçé

Ça m'a effectivement l'air plus vif!

Je me suis permis de te faire une petite vidéo de comparaison, et pout contextualiser:

Vidéo

Brasiligun:
Ça m'a effectivement l'air plus vif!

Je me suis permis de te faire une petite vidéo de comparaison, et pout contextualiser:

Vidéo

là tu ne te sert que du monitor serie :smiley:
pas du traceur serie
quelle version ton IDE ?

Très juste, my bad

La voici: Vidéo

Et mon code adapté en circonstance:

/*
   Version en lecture brute de la valeur de la sonde
   Ce sont des valeurs, pas des poids!
*/

#include "HX711.h"
#define CLK 2
#define DOUT 3
HX711 scale (DOUT, CLK);


const int pinShift =  4;
const int capteurEmbrayage = 5;
const int ledDebrayage = 13;



// Déclaration des variables
unsigned long deb =  0;
//float weight;

boolean onPeutShifter = true;      //Validation pour le prochain cycle


/***********REGLAGE DU SHIFTER***********/
const float seuil_Enclenchement = 150000; //SEUIL DE DECLENCHEMENT DE LA COUPURE ouvrir traceur série pour réglages
const float seuil_Rearmement =  0;        //SEUIL DE RE-ARMEMENT (quand la pression rediminue, seuil a depasser pour pouvoir reclaquer un shifting)
const int temps_Coupure = 65;             //Délai de coupure allumage (en ms -> 70=70ms), ne pas descendre sous 59ms!))
const int delai_Post_Embrayage = 500;     //Délai après lequel on recupere le shifter, une fois la moto re-embrayee (en ms)
/***************************************/


void setup() {

  Serial.begin(115200); //Activation du moniteur

  Serial.println("_____________________________________");
  Serial.println("Shifter par jauge de contrainte");
  Serial.println("");
  Serial.println("Initilisation:...");
  Serial.println("Réglages:");
  Serial.println("");
  Serial.print("Seuil déclenchement: "); Serial.print(seuil_Enclenchement); Serial.println();
  Serial.print("Seuil réarmement: "); Serial.print(seuil_Rearmement); Serial.println();
  Serial.print("Temps coupure: "); Serial.print(temps_Coupure); Serial.println("ms"); Serial.println();
  Serial.print("Delai réactivation après embrayage: "); Serial.print(delai_Post_Embrayage); Serial.println("ms"); Serial.println();


  pinMode(pinShift, OUTPUT);
  digitalWrite(pinShift, LOW);

  pinMode(capteurEmbrayage, INPUT_PULLUP);

  pinMode(ledDebrayage, OUTPUT);
  digitalWrite(ledDebrayage, LOW);


  Serial.println("Done!");
  Serial.println("Pensez à bien faire chauffer la moto avant de shifter");
  Serial.println("_____________________________________");
  delay(2000);
}


void loop() {

  while (digitalRead(capteurEmbrayage) != LOW) //Actionne la fonction shifter, SI t'es embrayé
  {
    digitalWrite(ledDebrayage, LOW); //Led interne de l'arduino OFF = shifter dispo
    shifter();
  }
  //Si tu debrayes, coupure du systeme (pas besoin de shifter pour rien)
  Serial.println("->Débrayage: coupure fonction shifter");
  digitalWrite(ledDebrayage, HIGH); //Led interne de l'arduino ON = shifter desactive
  delay(delai_Post_Embrayage); //le temps de lacher completement le levier, pour reactiver le shifter

}



/***********Fonctions***********/

void shifter() {

  Serial.print("Shifter autorisé, valeur pression: "); //Valeur brute de la jauge de contraine (strain gauge)
  Serial.print(scale.read());      //BIEN PENSER A REMETTRE //DEVANT CES LIGNES AVANT LA MISE EN SERVICE REELLE
  Serial.println("");

  if (scale.read() > seuil_Enclenchement && onPeutShifter) { //Seuil de déclenchement
    deb = millis();
    digitalWrite(pinShift, HIGH);
    Serial.println("_____________________________________");
    Serial.println("Seuil déclenchement dépassé: Shift");
    Serial.println("_____________________________________");
    onPeutShifter = false;
  }

  if (millis() - deb > temps_Coupure)
    digitalWrite(pinShift, LOW);

  if (scale.read() <= seuil_Rearmement)
    onPeutShifter = true; //Seuil de ré-engament
}

Le 80sps fait quoi concrètement? En 10SPS c’est 10 lectures par secondes, alors qu’en 80 on passe à 80/secondes? Je joue au niveau de la milliseconde dans mon cas :stuck_out_tongue: Je suis très curieux d’essayer le montage avec le mode RAW que tu m’as proposé

Plus de news demain!

Brasiligun:
Très juste, my bad

La voici: Vidéo

Et mon code adapté en circonstance:
...
Le 80sps fait quoi concrètement? En 10SPS c'est 10 lectures par secondes, alors qu'en 80 on passe à 80/secondes? Je joue au niveau de la milliseconde dans mon cas :stuck_out_tongue: Je suis très curieux d’essayer le montage avec le mode RAW que tu m'as proposé

Plus de news demain!

Bonjour
en 10 ou 80 le mode raw reste le meme , c'est ce que tu a testé :grin:
Je reste persuadé que tu n'a pas besoin ici de passer en 80 sps
ceci etant si tu y tiens vraiment il s'agit juste de connecter la pin 15 à VCC
tu peux aussi pour test passer la liaison serie (traceur monitor) au dessus de 115200
test fait à 100000 (valeur générées par random (je n'ai pas de HX711 sous la main pour l'instant)
Ce n'est absolument pas significatif , mais ça permet de voir que le traceur série peut etre assez interessant en visu brute.
video rapide

Effectivement, en tout cas merci de tes retours. Je vais essayer ça en laissant en 10, et je ferai un petit retour dans la journée

Bonne journée et merci

Brasiligun:
Effectivement, en tout cas merci de tes retours. Je vais essayer ça en laissant en 10, et je ferai un petit retour dans la journée

Bonne journée et merci

J'ai repris ta photo de ton module HX711
la "chirurgie" pour passer de 10 à 80 semble simple
COUPER la piste en X
Relier pin 15 et 16

al1fch:
sur les modules asia surement
je te repond demain

Bonsoir

cette pin 15 n'est elle pas reliée à la masse par une piste passant sous le boitier du HX711 ?

@Artouste : je triture aussi avec des utilisations 'déviantes' : µAmpèremetre, thermocouple, PT100.....

bonjour al1
J'ai plusieurs provenance de module HX711 asia
aujourd'hui , je n'ai que celui là sous la main
le pin 15 n'est pas routé (en l'air)
à comparer avec celui posté par brasiligun
le ... mien :smiley: est donc encore plus simple à passer en 80 SPS

Voilà les nouvelles, alors étonnament le RAW est encore plus mou que la version plus lourde. Je te poste 2 videos, le RAW et la méthode plus lourde

MAIS! J’ai opéré ! Et je n’ai pu tester qu’avec la version non raw, et bah putain ça marche. Directement j’ai vu que le serial était bien bavard :stuck_out_tongue:

Je n’ai pas encore pu trop jouer avec, je réattaque ce soir, mais il m’a semblé bien plus réactif et fluide, plus aucune résistance dans mon sélecteur

Quelques photos de l’opération en PJ

Et soudé

Petit retour, en 80sps c'est juste parfait! J'ai été filmé en roulant, je posterai le retour

Merci de ton aide pour le mode 80hz!