Arduino PVG32 Radiocommande

Aprés, il y a sûrement des tolérances à la symétrie

Par exemple, dans ton montage, si tu réduit fortement la R de 10k, tu t'approches de V1=Udc quand Q est bloqué.

Et comme de toute façon quand ton transistor est passant saturé, Vce n'est pas égal à 0V mais plutôt 0.2 V environ, tu peux essayer de faire une symétrie pour que la chute de tension dans R1 quand Q est bloqué soit égal à Vce Q passant.

Mais c'est un peu hasardeux voir risque de fluctuer en fonction de la température.

On peux aussi espérer qu'avec un MOS ayant une trés faible résistance entre Drain et Source quand il est passant, on puisse avoir de meilleurs résultat qu'avec un NPN ou PNP.

Bref, moi perso, à ce niveau, ce n'est pas ma spécialite de faire en sorte que ce soit un signal symétrique trés précisément autour de Udc/2.

Le mieux que je pense pouvoir faire, c'est V2=0V et V1=Udc ou des bidouilles.

Bonjour Jef,

Maintenant que ça marche on à le temps d'analyser le fonctionnement. Si tu reprend mes paramètres dans mon programme :

J'ai été obligé de modifier les valeurs PWM en sortie pour être au neutre sur les EV, logiquement il me faudrait :
En bas : 64
Au centre : 128
En haut : 192

Je pense qu'il faut que je fasse une mesure de tension en sortie de mes L298N et un petit coup d'oscilloscope pour contrôler.
Mais c'est la que j'avais besoin du programme de JPBbricole pour avoir une valeur fixe au niveau de mes joysticks (512) et pas une valeur approchante comme me donne mes joysticks. Cela me permettra d'avoir des valeurs fiable.

mon avis pour résoudre les incompréhensions ...

et après tu veux brider sur les valeurs de sortie du PWM pour avoir les 25% et 75%, si je comprend bien ?

Bonjour william270peel

C'est en cours de finition :wink:

C'est surtout le petit coup de l'oscillo qui est important pour voir que le PWM est entre le GND et Udc, la tension mesurée au voltmètre n'a que peu d'importance.

Je pense que tes L298, utilisés ainsi peuvent être remplacés par un simple transistor ou un ULN2803.
L'exigence de l'EV est un signel PWM entre GND et Udc avec quelques contingences de limites minimum, rien de bien compliqué.


Un simple essai avec un transistor NPN serait intéressant.

Bonne après midi
jpbbricole

Tu as une référence de transistor NPN ? Je vais en commander avec des ULN pour faire des tests.

Bonsoir william270peel

N'importe quel petit NPN comme le 2N2222.

A+
jpbbricole

Vous tournez en boucle les copains,

Regardez cela SVP

Je simule la commande du PNP par le switch à gauche, et je mesure la tension "Symétrique" autour de 6V obtenue.

Je mesure +6.55V et 0V, ce n'est absolument pas symétrique!.

Symétrique, ca veut dire que entre Vmax et Udc/2 (6V) il y a autant que entre Udc/2 et Vmin.

Ici on a 6.55-6=0.55V et 6-0=6V, ce n'est pas symétrique.

Je l'ai écris ici, pour que ce soit symétrique, au mieux, il faudrait R1 << 12K, c'est le principe du pont diviseur.

Mon explication à cela

Sans doute que ton joystick A1 est branché à l'inverse de ce que tu attend, quand tu fais du "+", l'axe de la grue en rapport fais du "-", donc tu a inversé les mini et maxi, pour moi c'est OK, ce n'est pas un probléme.

Le Joystick A2 à sans doute une course mécanique moins importante que les autres, donc il ne peur pas être lu sur sa course 0-1023 mais sur une course moindre 200-823.

Mais tu remarquera qu'il est symétrique, tu a rajouté 200 (0+200) d'un coté et retiré 200 de l'autre (1023-200).

200 ça représente 5/1023200=0.977V
823 ça représente 5/1023
823=4.022V
Ça fait une course centrée autour de 2.5V +/-1.52V

Pour le PWM, j'ai une vague idée, mais je plussoie cela

Bonsoir william270peel

Il n'y a qu'à demander :wink:

Introduction de la simulation du joystick.

Les commandes ne sont pas sensibles à la casse.
La commande est JS pour Joystick Simulation.
Le format est JSjvvvvttt
j = numéro du joystick (de 0 à ..) 1 chiffre. Si absent, arrêt de toutes les simulations.
vvvv = valeur simulée, 4 chiffres. Si == 0 ou absent, arrêt de la simulation de ce joystick.
ttt = durée de la simulation, format libre. Si == 0 ou absent, pas de limite de temp de la simulation.

Exemples :
JS105122000 joystick 1 à 512 pour 2000 millisecondes.
JS10512 ttt == 0 ou absent, pas de limite de temps.
JS1 vvvvv == 0 ou absente, joystick 1 arrêt de la simulation.
JS sans paramètres, arrêt de toutes les simulations.

Quand une simulation est active sur un joystick, sa valeur n’est plus prise en compte.
Quand la simulation est terminée, la valeur du joystick et reprise en compte.

Exemple d’utilisation :
JS1051211000 Joystick 1 à 512 pour 11 secondes.
pour arrêter cette commande avant les 11 secondes :
JS1 ou JS10

Il y a des indications quant au fonctionnement du programme dans le moniteur.

Le programme :

/*
	Name:       AF_Vanne_Danfoss_PVG32_PVEM.ino
	Created:	17.12.2024
				modif william 20/01/2025
	Author:     jpbbricole/william270peel
	Remarque:	https://forum.arduino.cc/t/controle-distributeur-hydraulique-danfoss-pvg32/1325278/211
				https://assets.danfoss.com/documents/187048/BC152886483664fr-001401.pdf
	04.01.2025  torJoyInactZone individuelles #265
	05.01.2025  Ajout de torToBeDisable #265
	06.01.2025  Ajout de JoyInMin et joyInMax + amélioration display #300
	18.01.2025  TOR à 0 quand au neutre #442
	20.01.2025  Nettoyage du programme
	21.01.2025	Ajout de commandes de paramétrage #
	26.01.2025	Paramètre inversion PWM #
	26.01.2025	Simulation du joystick par commande #29
*/

//------------------------------------- Définition de l'objet vanne
struct vanneParamDef     // Définition des paramètres des vannes
{
	const int joystickPin; // Potentiomètre joystick
	const int joyInMin; // Lecture valeur minimum
	const int joyInMax; // Lecture valeur maximum
	const int joyInactZone; // Zone d'inaction
	const int electrovannesPin; // Commande électrovanne (EV) PWM
	const boolean evPwmReverse; // Si inversion signal PWM
	const int evPwmMin; // Electrovanne PWM minimum
	const int evPwmMax; // Electrovanne PWM maximum
	const int evPwmMiddeLow; // Electrovanne PWM milieu bas
	const int evPwmMiddleHigh; // Electrovanne PWM milieu haut
	int evStatus; // Etat de l'électrovanne 1 bas, 2, milieu, 3 haut
	const int torPin; // Commande tout ou rien
	int joyPosition; // Position du joystick
	int pwmValue; // Valeur du PWM
};
vanneParamDef vanne[] =
{
//	Joy		joyMin	joyMax	Inact	EV		PWM reverse		PWMmin	PWMmax	PWMm bas	PWMm haut	EV etat		TOR pin		Joy position	PVM
	{A0,	0,		1023,	1,		6,		false,			190,	46,		120,		136,		0,			7,			0,				0},
	{A1,	0,		1023,	1,		5,		false,			46,		190,	120,		136,		0,          4,			0,				0},
	{A2,	200,	823,	20,		3,		false,			170,	64,		120,		136,		0,          2,			0,				0},
	{A3,	0,		1023,	1,		9,		false,			56,		190,	120,		136,		0,          8,			0,				0},
};
const int vannesNombre = sizeof(vanne) / sizeof(vanne[0]); // Nombre d'electrovannes

const int torPinEtatOn = HIGH; // Etat pour commmander ON
boolean torToBeDisable = false; // Si TOR doit être désactivé

enum evStatusIndex {evStatusIndexNull, evStatusIndexBas, evStatusIndexNeutre, evStatusIndexHaut};
const String evStatusLabel[] = {"-", "BAS", "NEUTRE", "HAUT"}; // Etats de l'EV

const unsigned long displayTempo = 500; // Tout les 1/2 seconde
unsigned long displayMills = millis(); // Tout les 1/2 seconde, chrono

//------------------------------------- Paramétrage manuel (manPar)
struct manParDef
{
	boolean joyOn; // Si le paramétrage simulation du joystick est actif
	int joyValue; // Valeur simulée du joystick
	unsigned long joyTimeTempo; // Durée de la simulation
	unsigned long joyTimeMillis; // Durée de la simulation, chrono
};
manParDef manPar[]=
{
//	Manuel		Valeur	Tempo	Millis
	{false,		512,	0,		0},
	{false,		512,	0,		0},
	{false,		512,	0,		0},
	{false,		512,	0,		0},
};

void setup()
{
	Serial.begin(115200);
	// Initialiser les pins des joysticks et des électrovannes
	for (int v = 0; v < vannesNombre; v ++)
	{
		pinMode(vanne[v].electrovannesPin, OUTPUT);
		pinMode(vanne[v].torPin, OUTPUT);
		if (torToBeDisable)
		{
			digitalWrite(vanne[v].torPin, !torPinEtatOn); // TOR OFF
		}
		else
		{
			digitalWrite(vanne[v].torPin, torPinEtatOn); // TOR ON
		}
	}
	
	Serial.println("Systeme de commande d'electrovannes: " + String(vannesNombre));
	//cmdExecute("js0080020000");
	//cmdExecute("js1080015000");
	//cmdExecute("js2080010000");
	//cmdExecute("js308008000");
}

void loop()
{
	// Lire les valeurs des joysticks
	for (int v = 0; v < vannesNombre; v ++)
	{
		if (!manPar[v].joyOn) // Si pas valeur joystick manuelle
		{
			vanne[v].joyPosition = analogRead(vanne[v].joystickPin);  // Lecture joystick
		} 
		else // Valeur manuelle
		{
			vanne[v].joyPosition = manPar[v].joyValue;
		}
		// Conversion de la position du joystick (0-1023) à une valeur de PWM (evPwmMin-evPwmMax)
		vanne[v].pwmValue = map(vanne[v].joyPosition, vanne[v].joyInMin, vanne[v].joyInMax, vanne[v].evPwmMin, vanne[v].evPwmMax);
	}

	// Appliquer les commandes proportionnelles et TOR pour chaque électrovanne
	for (int v = 0; v < vannesNombre; v ++)
	{
		controlElectrovanne(v);
	}

	// Commandes
	if (Serial.available()) // Si commande
	{
		cmdExecute(Serial.readStringUntil('\n')); // Lire le port série juaqu'à nouvelle ligne
	}

	// Affichage des valeurs
	if (millis() - displayMills >= displayTempo) // Si c'est le moment d'afficher
	{
		for (int v = 0; v < vannesNombre; v ++)
		{
			Serial.print(String(v) + " " + evStatusLabel[vanne[v].evStatus] + " " + String(vanne[v].joyPosition) + " " + String(vanne[v].pwmValue) + "\t");
		}
		Serial.println("");
		displayMills = millis(); // Redémarrage du chrono
	}

	// Commande des joystick, timout
	for (int v = 0; v < vannesNombre; v ++)
	{
		if (manPar[v].joyTimeTempo != 0) // Si timer pour ce joystick en mode paramétrage manuel
		{
			if (millis() - manPar[v].joyTimeMillis >= manPar[v].joyTimeTempo) // Si fin du paramètre manuel
			{
				joySimulOff(v);
			}
		}
	}
}

void controlElectrovanne(int index)
{
	int pwmVanne = ( vanne[index].evPwmReverse == true) ? pwmVanne = 255 -vanne[index].pwmValue : vanne[index].pwmValue;
	 
	if (vanne[index].pwmValue > vanne[index].evPwmMiddleHigh + vanne[index].joyInactZone) // +x pour zône neutre
	{
		vanne[index].evStatus = evStatusIndexHaut; // Enregistrement de la position
		digitalWrite(vanne[index].torPin, torPinEtatOn);  // Activation TOR (12V)
		analogWrite(vanne[index].electrovannesPin, pwmVanne);  // Appliquer le PWM à l'électrovanne
	}
	else if (vanne[index].pwmValue < vanne[index].evPwmMiddeLow - vanne[index].joyInactZone) // -x pour zône neutre
	{
		vanne[index].evStatus = evStatusIndexBas; // Enregistrement de la position
		digitalWrite(vanne[index].torPin, torPinEtatOn); //Activation TOR (12v)
		analogWrite(vanne[index].electrovannesPin, pwmVanne);  // Appliquer le PWM à l'électrovanne
	}
	else
	{
		vanne[index].evStatus = evStatusIndexNeutre; // Enregistrement de la position
		digitalWrite(vanne[index].torPin, !torPinEtatOn); // TOR Off
	}

}

/*
	Les commandes ne sont pas sensibles à la casse.
	Commandes reconnues:
	JS pour joystick simulation
	JSjvvvvttt	j = numéro du joystice (de 0 à ...) vvv = valeur commande tttt = temps de la simulation en millisecondes
				j toujours 1 chiffre, vvvv toujours 4 chiffres et tttt libre, si ttt absent ou tttt = 0 simulation en continu
	JS20475200 Joystick 2 à 475 pour 200 millisecondes
	
	Si JS est sans paramètres, le programme remet tout les joystick en mode normal.
	Si vvvv = 0 ou absent passage du joystick j en mode normal
*/

void cmdExecute(String cmdRx) // Execution de la commande re?ue
{
	cmdRx.trim(); // Nettoyage de la commande
	cmdRx.replace(" ",""); // Supprimer les espaces
	cmdRx.toUpperCase(); // Tout en majuscules
	Serial.println("Commande recue:" + cmdRx);
	
	if (cmdRx.startsWith("JS")) // Si joystick simulation
	{
		cmdRx.replace("JS", ""); // Ne garder que les paramètres
		if (cmdRx == "") // Si pas de paramètres alors toutes simulation off
		{
				for (int v = 0; v < vannesNombre; v ++)
				{
					joySimulOff(v);
				}
		} 
		else
		{
			int joyNum = cmdRx.substring(0, 1).toInt(); // Numéro de vanne
			manPar[joyNum].joyValue = cmdRx.substring(1, 5).toInt(); // Valeur joystick
			manPar[joyNum].joyValue = constrain(manPar[joyNum].joyValue, 0, 1023);

			manPar[joyNum].joyTimeTempo = cmdRx.substring(5).toInt(); // Temps de la commande
			manPar[joyNum].joyTimeMillis = millis();// Chrono de la commande
			
			if (manPar[joyNum].joyValue != 0)
			{
				manPar[joyNum].joyOn = true;
			} 
			else
			{
				joySimulOff(joyNum);
			}
//Serial.println(joyNum);
//Serial.println(manPar[joyNum].joyValue);
//Serial.println(manPar[joyNum].joyTimeTempo);
		}
	}
	else
	{
		Serial.println("Commande inconnue !!!:" + cmdRx);
	}
}

void joySimulOff(int joyIndex)
{
	Serial.println("\tJoystick simulation OFF " + String(joyIndex));
	manPar[joyIndex].joyOn = false; // Arrêter le mode simulation du joystick
	manPar[joyIndex].joyTimeTempo = 0; // Arrêter la temporisation
}

Amuses toi bien :wink:

Bonne soirée
jpbbricole

Re,

Moi je ne veux rien de particulier.

Je pense que le constructeur veut un signal symétrique par rapport à Udc/2, ça c'est une premiére chose demandée de sa part.

Et je pense qu'il veut un (modification de ma part) DUT variant de 25% à 75%, c'est un deuxiéme impératif qui n'a aucun rapport avec le premier.

Et je constate que la datasheet de ce fabricant laisse des zones d'ombres ne permettant pas de savoir ce dont il a absolument besoin.

(modification de ma part)c'est quoi "DUT"?

Par exemple je lis ceci à propos des PVEM


et aussi cela à propos des même PVEM

Donc ou pourrait croire qu'une même PVEM peut être pilotée par un signal continue variant de 25 à 75% de Udc.

Ou un signal DUT via PWM variant de 25 à 75% DUT!

DUT, c'est quoi ça?
DUT comme Duty-Cycle?

Je n'ai pas d'idée certifiée à ce sujet (j'ai juste une idée personnelle), si un surdoué de l'élec sait dire ce que c'est DUT dans ce cas précis?

On voit aussi ce terme dans des datasheet pour désigner dans un schéma le composant testé

DUT = Dispositif (ou Device) Under Test.

(bon, je sais, les IUT ont remplacé le DUT en 2 ans par le BUT en 3 ans, aucun rapport!)

Bonjour,

Si je poursuis ma logique qui consiste a essayer au mieux d'avoir un signal symétrique centré sur Udc/2.

Si on opte pour la proposition de @jpbbricole qui consiste à dire

-On prend un Interrupteur "Low Side" comme un transistor NPN, qui relie Us à 0V via l'inter Low Side, ou à Udc via une résitance de PULLUP quand le Low Side est ouvert.

Ou selon ma logique

-On prend un Interrupteur "High Side" comme un transistor MOS canal P, qui relie Us à Udc via l'inter High Side ou à 0V via la résitance de PULLDOWN que représente la résitance d'entrée de 12k sur Us quand le High Side est ouvert.

Dans un cas comme dans l'autre, quand le LOW ou HIGH side sont fermés, ils n'ont pas une tension nulle à leurs bornes.

Le NPN n'a pas une tension Vce Sat nulle.
Le MOS canal P n'a pas une Rds de 0 Ohms.

Donc ni l'un ni l'autre ne relié Us à 100% à Udc ou 0V.

Se serra plutôt
Pour le NPN, le Low Side va relier Us à un peu plus de 0V quand il serra fermé.

Pour le MOS canal P, il va relier Us à un peu moins de Udc quand il serra fermé.

Et selon moi, ces "un peu plus" ou "un peu moins" participent à rendre le signal Us asymétrique.

Encore plus dans le cas du NPN car dans le montage proposé, quand le Low Side est ouvert, Us est relié a Udc via une résitance qui crée un diviseur de tension avec la résitance de 12k derriére Us.

10k et 12k, ça fait quasiment un diviseur par 2.

Donc avec le NPN
-Low Side Fermé, on a un peu plus de 0V sur Us
-Low Side Ouvert, on a environ Udc/2 sur Us

Ce n'est ABSOLUMENT PAS symétrique par rapport a Udc/2

Avec le MOS canal P
-High Side Fermé, on a un peu moins de Udc sur Us
-High Side Ouvert, on a 0V sur Us

C'est PRESQUE symétrique par rapport à Udc/2

Il vaut mieux je pense le "presque" que le "absolument pas" si on arrive à corriger avec le code.

Ou il faut trouver un montage avec un inter High Side et un inter Low Side parfaitement symétrique.

Ou il faut espérer que le PVEM admet une certaine tolérance sur la symétrie (je pense que oui).

Ou il faut espérer que le PVEM lit la valeur moyenne pour déterminer le degré d'ouverture des vanne, j'y crois.

Bonjour JPBbricole,

Très beau boulot je ferais des tests samedi et vous tiens au courant.

Merci beaucoup !

Bonjour Jef,

Excuse moi mais je n'ai absolument rien compris, c'est trop complexe pour moi :pensive: et la fatigue de la journée n'arrange rien.

Il ne faut pas oublier que j'ai un module d'origine Danfoss sous la main. Es ce que tu veux que je fasse quelque mesure dessus pour avoir un peux plus de données ?

Bonne soirée

Ce n'est pas grave, je vais faire autrement.

Pour info, quel module Danfoss as tu sous la main?

J'ai le module de commande qui était utiliser à l'origine pour faire la communication entre mes joysticks et mes EV. Voici la ref :

Je me suis amusé à faire un relevé à l'oscilloscope en même temps que je fais bouger mon joystick, voici une vidéo :
test module origine

Il n'y a rien qui vous choque ??

Bonjour william270peel

Je te rassure, je suis dans la même situation que toi :woozy_face:

Avec plaisir :wink:

Bonne soirée
jpbbricole

Bonsoir william270peel

Non, si c'est le fait qu'il n'y a pas de PWM, c'est normal, ton EV accepte les 2 modes de fonctionnement, analogique ou PWM.
D'après l'oscillo, le joystick au milieu, donne 5V et ~2V en bas et ~8V en haut.

Bonne soirée.
jpbbricole

Vous m'aidez pas là les gars!

On reprend, parce que là, c'est moi qui suis perdu.
Je te cite @william270peel :
"Pour dégrossir : le distributeur à 6 fonctions hydraulique double effet (pour commander des vérins hydraulique d'une grue de remorque forestière) chaque fonction double effet est piloté par une électrovanne proportionnel Danfoss PVEM (ref : 11166829). Si je ne dis pas de bêtise l'électrovanne à pour fonctionnement :
6V = neutre
12V = ouverture vérin
0V = fermeture vérin

Les électrovannes sont contrôlées par deux joysticks (potentiomètres), 3 fonctions chacun.
Pour faire la communication entre un joystick et 3 électrovannes il y a une circuit imprimé aussi appelé "Module de commande 3 entrées sorties pour PVG proportionnel" ( ref : E12MPVG3E3S)"

Ce qui veut dire:
Il y a le boîtier E12MPVG3E3S de commande qui reçoit les signaux des potentiomètres et les envoi au "groupe de distributeurs hydrauliques"

PVG32, c'est le groupe de distributeurs hydraulique, avec une partie électronique et une partie hydraulique.

PVEM, c'est la partie électronique du PVG32.

Donc ton module envoit ses info au PVEM du PVG32, ce sont tes infos, ça c'est reglé.
Relire post#30
image
Et


Donc soit la doc est fausse, soit on peut commander le PVEM par les signaux que tu a filmé (analogiques) mais aussi commander le PVEM par un signal PWM, et c'est ce qu'on essaye de faire comme l'indique la doc.

C'est à dire (je pense)
A condition que le PWM soit symétrique par rapport à Udc/2

Exemple Udc=12V, Udc/2=6V
Alors un signal qui varie entre 6 +3 =9 et 6 -3 =3 est symétrique autour de 6V

Idem pour 6+4 et 6-4 etc.

J'ai vérifié, mon montage est symétrique par rapport à 6V.

Aprés, je ne vais pas entrer dans un truc +/- "compliqué" pour vous expliquer qu'un signal qui "navigue" entre +12V et 0V a une valeur moyenne qui dépand du PWM.

Si le PWM est de 75%, le signal symétrique +12V/0V a une valeur moyenne de 12x0.75=9V

Si le PWM est de 25%, le signal symétrique +12V/0V a une valeur moyenne de 12x0.25=3V

Ça semble marcher, autant @jpbbricole pense que le montage élec est mauvais et tout à refaire, autant moi je trouve (personnellement) que le code brouille les pistes et est à remettre à plat.

De mon côté j'attends avec impatience un composant qui vient de Chine et qui me semble pas mal du tout pour faire un PWM symétrique, il devrait arriver bientôt


C'est ce circuit intégré

Hello,

Moi ça me choque que se soit du 5V +/-2.5V car @william270peel nous a parlé de PVEM


Et se sont les PVEH-U qui fonctionnent en 5V +/-2.5V.

On va où là?

Bonjour Jef
Pour reprendre mon premier post :

J'ai dis un bêtise, à ce moment la je ne connaissais pas bien le fonctionnement du module d'origine.
Quand je fais bouger mon joystick j'ai au multimetre :
En avant = 3V
Au neutre = 6V
En arrière = 9V
J'ai bien constaté un décalage à l'oscilloscope mais je ne saurais dire pourquoi.

De mon point de vu le module E12MPVG3E3S est un système basique proposé par Danfoss qui utilise un signal analogique pour contrôler les EV. Danfoss à peut-être mis au point des systèmes plus avancé pour des utilisation spécifiques qui là ont besoin de signaux PWM.

Je me répète, je vous ai peut-être induit en erreur à cause de mes faibles connaissances en elec....

Je pense qu'on à pas été dans l'ordre, il y aurait fallut faire des relevés à l'oscilloscope dès le depart sur le module E12MPVG3E3S avant de faire quoi que se soit....