Potentiomètre PWM à deux canaux

Bonjour udina

Je t'ai fait un extrait de ton programme qui contient la gestion des 2 boutons, avec la bibliothèque OneButton (excellent choix :wink:)

  boutonAppuiPedale
  boutonRelanchementPedale

Le programme:

#include "OneButton.h"

const int boutonAppuiPedalePin = 9;
const int boutonRelanchementPedalePin = 10;

OneButton boutonAppuiPedale(boutonAppuiPedalePin, true); // https://github.com/mathertel/OneButton#initialize-on-instance-creation-old-way
OneButton boutonRelanchementPedale(boutonRelanchementPedalePin, true);

int pwmValue_A;
int pwmValue_B;

// _______________________________________________________  SETUP  ___________________________________________________________

void setup() {

  Serial.begin(115200);

  // ------------------  Initialisation des boutons  ---------------------
  boutonAppuiPedale.attachClick(simpleClickAppuiPedaleAction);
  boutonRelanchementPedale.attachClick(simpleClickRelachementPedaleAxction);

}

// ___________________________________________________________  LOOP  _______________________________________________________________________


void loop() {


  boutonAppuiPedale.tick();
  boutonRelanchementPedale.tick();

}

// _________________________________________________________________  FONCTION(S) _____________________________________________________________

void simpleClickAppuiPedaleAction() {

  /* j'aimerais pouvoir à chaque appui sur le bouton diminuer de 10 la valeur Canal_A et augmenter la valeur Canal_B
     de 10 également et que les valeurs soient mémorisées pour une deuxième impulsion sur le bouton*/

	pwmValue_A -=10; // Diminuer A
	pwmValue_B +=10; // Augmenter B
	pwmValue_A = constrain(pwmValue_A, 0, 255); // Pour limiter les valeurs
	pwmValue_B = constrain(pwmValue_B, 0, 255); // https://docs.arduino.cc/language-reference/en/functions/math/constrain/
    Serial.println("A " + String(pwmValue_A) + "\t" + "B " + String(pwmValue_B));
}


void simpleClickRelachementPedaleAxction() {

  /* j'aimerais pouvoir à chaque appui sur le bouton augmenter de 10 la valeur Canal_A et diminuer la valeur Canal_B
      de 10 également et que les valeurs soient mémorisées pour une deuxième impulsion sur le bouton*/

	pwmValue_A +=10; // Augmenter A
	pwmValue_B -=10; // Diminuer B
	pwmValue_A = constrain(pwmValue_A, 0, 255); // Pour limiter les valeurs
	pwmValue_B = constrain(pwmValue_B, 0, 255); // https://docs.arduino.cc/language-reference/en/functions/math/constrain/
	Serial.println("A " + String(pwmValue_A) + "\t" + "B " + String(pwmValue_B));
}

Essaies ça et redis-moi :wink:

A+
jpbbricole

Voici le principe,

J'ai quatre boutons en tout sur un émetteur de ce type :


Le récepteur est constitué de quatre relais interne. Ma carte Uno vient surveiller ces quatre relais comme des contacteurs, branché chacun avec des résistances PullUp de 10Khoms.

Les entrées suivantes surveillent ces contacts :

  • Entrée 9
  • Entrée 10
  • Entrée 11
  • Entrée 15

( La détection de mes fonctions via la bibliothèque OneButton fonctionne bien )

J'ai 6 relais qui servent de basculement entre le circuit du véhicule et la carte Uno, véhicule qui possède des calculateurs ( voir schéma du potentiomètre double en haut de post), au repos, le relais permet de conserver une continuité de chaque fils coté véhicule et lorsqu'ils sont actionnés, c'est ma carte Uno qui transmet les tensions au véhicule.

Les sorties de la carte qui pilotent les relais :

  • relaisInverseur = 2; // permet la mise en marche avant du levier d'inverseur électrique du véhicule
  • relaisCanal_A_B_PedaleAccelerateur = 12; // le fameux potentiomètre double de pédale d'accélérateur
  • relaisParking = 13; // permet le verrouillage du véhicule lors de l'arrêt de ce dernier

Les sorties qui simulent une tension après basculement des relais afin de leurrer les calculateurs :

  • valeurFilVertInverseur = 8; // envoi une tension simple de 5V ou 0V
  • valeurFilBlancInverseur = 3; // envoi une tension de 5V ou 0V
  • valeurFilBleuInverseur = 4; // envoi une tension de 5V ou 0V
  • Canal_A = 6; // le CanalA qui simule en sortie l'action sur la pédale d'accélérateur
  • Canal_B = 5; // le CanalB qui simule en sortie l'action sur la pédale d'accélérateur
  • ValeurCanal_A = A0; // Relié avec un fils à la borne du relais sur pin 6 pour lecteur de tension
  • ValeurCanal_B = A5; // Relié avec un fils à la borne du relais sur pin 5 pour lecteur de tension

Lorsque mon véhicule est démarré, si je veux utiliser ma radiocommande, je bascule un contacteur dans la cabine qui bascule les circuits ci-dessus sur ma carte Uno. La carte est régulé en tension à 9V par un régulateur pour éviter d'être sur les tensions de charge du véhicule ( 13.5V à 14V ).

Le programme démarre par la fonction arretDuVehiculeAuDemarrageDuProgramme(); qui se situe à la fin du SETUP. Dans cette fonction, les deux canaux de mon potentiomètre double sont configurer pour sortir les données suivantes analogWrite(Canal_A, 205); analogWrite(Canal_B, 50); . Ces dernières valeurs correspondent à la position relâchée de la pédale.

Il faut ensuite que je puisse lancer mon véhicule en marche avant avec la fonction simpleClickRelanceVehicule();

Et à partir de la, il faut que puisse par la fonction simpleClickAppuiPedale(); augmenter les valeurs PWM des deux canaux de manière simultané, comme des vases communicants de manière à avoir ceci :

  • Une pression sur le bouton de ma radio boutonAppuiPedale.tick(); de la pédale augmente de 10 unités la valeur PWM du Canal_A et diminue de 10 unités la valeur du Canal_B. Une deuxième pression redémarre la boucle ou elle s'était arrêté en valeur. Le tout bloqué entre 205 et 50 en buté.
  • Une pression sur le bouton de ma radio boutonRelanchementPedale.tick(); de la pédale diminue de 10 unités la valeur PWM du Canal_A et augmente de 10 unités la valeur du Canal_B. Une deuxième pression redémarre la boucle ou elle s'était arrêté en valeur. Le tout bloqué entre 205 et 50 en buté.

Tout le programme fonctionne bien en dehors de la pédale d'accélérateur que je cherche à construire. Donc les deux fonctions qui me pose problème sont : simpleClickAppuiPedale(); et simpleClickRelachementPedale();

J'espère avoir été plus clair, dites moi si vous avez encore des interrogations

Bonjour udina

Est ce que l'augmentation/diminution doit être progressive?

A+
jpbbricole

C'était l'idée oui, pour obtenir une progressivité et une souplesse.

Ok, je rajoutes ça à mon exemple du post#22.

Voilà comment ça réagi sur le moniteur série :

Il faudrait que les valeurs démarrent par 205 et 50 et que ça prenne cette forme la :

Essaies ça:

Le programme:

#include "OneButton.h"

const int boutonAppuiPedalePin = 9;
const int boutonRelanchementPedalePin = 10;
//const int boutonAppuiPedalePin = 11; // Paramètres jpbbricole
//const int boutonRelanchementPedalePin = 3;

OneButton boutonAppuiPedale(boutonAppuiPedalePin, true); // https://github.com/mathertel/OneButton#initialize-on-instance-creation-old-way
OneButton boutonRelanchementPedale(boutonRelanchementPedalePin, true);

const int Canal_A = 6;
const int Canal_B = 5;

int pwmValue_A;
int pwmValue_B;

const int pwmValMin = 50;
const int pwmValMax = 205;

// _______________________________________________________  SETUP  ___________________________________________________________

void setup() {

  Serial.begin(115200);

  // ------------------  Initialisation des boutons  ---------------------
  boutonAppuiPedale.attachClick(simpleClickAppuiPedaleAction);
  boutonRelanchementPedale.attachClick(simpleClickRelachementPedaleAxction);

pwmValue_A = pwmValMax;
pwmValue_B = pwmValMin;

}

// ___________________________________________________________  LOOP  _______________________________________________________________________


void loop() {


  boutonAppuiPedale.tick();
  boutonRelanchementPedale.tick();

}

// _________________________________________________________________  FONCTION(S) _____________________________________________________________

void simpleClickAppuiPedaleAction() {
  /* j'aimerais pouvoir à chaque appui sur le bouton diminuer de 10 la valeur Canal_A et augmenter la valeur Canal_B
     de 10 également et que les valeurs soient mémorisées pour une deuxième impulsion sur le bouton*/
	int pwmValue_Aold = pwmValue_A;

	pwmValue_A -=10; // Diminuer A

	pwmValue_A = constrain(pwmValue_A, pwmValMin, pwmValMax); // Pour limiter les valeurs  https://docs.arduino.cc/language-reference/en/functions/math/constrain/
	pwmValue_B = 255 - pwmValue_A; //

	for ( int a = pwmValue_Aold; a >= pwmValue_A; a-- ) {
		analogWrite(Canal_A, a);
		analogWrite(Canal_B, 255 -a);
		delay(50);
		Serial.println("A " + String(a) + "\t" + "B " + String(255 - a));
	}

    Serial.println("");
}


void simpleClickRelachementPedaleAxction() {

  /* j'aimerais pouvoir à chaque appui sur le bouton augmenter de 10 la valeur Canal_A et diminuer la valeur Canal_B
      de 10 également et que les valeurs soient mémorisées pour une deuxième impulsion sur le bouton*/
	int pwmValue_Bold = pwmValue_B;

	pwmValue_B -=10; // Diminuer B

	pwmValue_B = constrain(pwmValue_B, pwmValMin, pwmValMax); // Pour limiter les valeurs  https://docs.arduino.cc/language-reference/en/functions/math/constrain/
	pwmValue_A = 255 - pwmValue_B; //

	for ( int b = pwmValue_Bold; b >= pwmValue_B; b-- ) {
		analogWrite(Canal_B, b);
		analogWrite(Canal_A, 255 -b);
		delay(50);
		Serial.println("A " + String(255 - b) + "\t" + "B " + String(b));
	}

	Serial.println("");
}

A+
jpbbricole

Merci beaucoup, j'ai fais plusieurs test avant de finir ma journée, la fonction simpleClickAppuiPedaleAction(); et la fonction simpleClickRelachementPedaleAxction() ;
fonctionnent parfaitement dans n'importe quel ordre.

J'ai juste un problème, lorsque je lance le véhicule via la fonction simpleClickRelanceVehicule(); je suis obligé de passer les valeurs suivantes sur la pédale pour que le véhicule se mette en mouvement, sinon il lève un défaut.

void simpleClickRelanceVehicule() {

  digitalWrite(relaisInverseur, HIGH);

  digitalWrite(valeurFilVertInverseur, LOW);
  digitalWrite(valeurFilBlancInverseur, LOW);
  digitalWrite(valeurFilBleuInverseur, HIGH);

  delay(1000);

  digitalWrite(relaisInverseur, LOW);
  
  analogWrite(Canal_A, 160); 
  analogWrite(Canal_B, 95);  
  
}

Ces deux valeurs mettent le bazars dans les deux fonctions de la pédale car les valeurs sont de const int pwmValMin = 50; const int pwmValMax = 205; ne sont pas identique à 160 et 95.
Je n'ai pas eu le temps de tester mais j'image qu'en intégrant const int pwmValMin = 95; const int pwmValMax = 160; la fonction simpleClickAppuiPedale(); commencera à ces valeurs ?

Je vais prendre le temps de décortiquer tes deux fonctions pour bien piger la logique.
Merci à toi