Modification du plugin UsbSerial

1
Salut,

Afin d'améliorer la plage de vitesse possible avec une arduino sous ALDEN, je me suis rendu compte que le plugin UsbSerial ne transmettait que 2 octet sur la liaison série.
(par exemple pour l'information de vitesse, le 1er octet contient 'F' pour préciser que c'est une trame de vitesse, et le 2nd contient une valeur de 0 à 255).

Afin d'améliorer la plage de vitesse disponible, mon but est de coder cette information de 0 à 32768 (jedicut envoie l'information sur un int).

Je vous tiendrai au courant des évolutions puis posterai tout cela sur GIT une fois terminé.

@+

Vincent

Edit Jerome 25/11 : Les premiers échanges à l'origine de cette discussion sont ici viewtopic.php?f=13&t=10096

Re: Modification du plugin UsbSerial

2
Je ne connais pas la programmation des pluging, mais en lisant le code source cela me paraît plus compliqué .

Code : Tout sélectionner

JEDICUTPLUGIN_API  short EmettreBit(double chauffe) // unsigned char bitRotation, unsigned char bitSens, int vitesse,double chauffe
{
	unsigned char bitRotation;
	int bitRotationW;
	unsigned char bitSens;
	int bitSensW;
	int vitesse;
	char cmd[3];
	 _asm {
		 mov bitRotationW, eax
		 mov bitSensW,edx
		 mov vitesse,ecx
	 }
	bitSens = bitSensW & 0xff;
	bitRotation = bitRotationW & 0xff;
#ifdef DEBUG_OUTPUT
	fprintf(fp,"bitRot(Takt): 0x%02X bitSens(Richt.): 0x%02x vitesse: %d chauffe: %f\n",bitRotation,bitSens,vitesse,chauffe);
#endif

	// check if chauffe changed
	if((int)chauffe != currentChauffe)
	{
		// emit command to set chauffe (only valus between 0 and 255 allowed)
		cmd[0] = 'H';
		cmd[1] = (int)chauffe & 0xff;
		writeCommand(cmd);
		currentChauffe = (int)chauffe;
	}

	// send motor command
	sendMotorCmd(bitRotation,bitSens);

	// check if Vitesse changed
	if(vitesse != currentVitesse)
	{
		// emit command to set vitesse (only valus between 0 and 255 allowed)
		cmd[0] = 'F';
		cmd[1] = vitesse & 0xff;
		writeCommand(cmd);
		currentVitesse = vitesse;
	}


	return(0);
}
Des connaisseurs pourront peut-être nous aider !
Bonnes cogitations
Alain

Re: Modification du plugin UsbSerial

3
Pourquoi plus compliqué?

La seule partie qui m'intrigue un peu c'est la zone en assembleur mais de ce que je comprends les infos issues de jedicut sont recu dans un double qui est découpé pour récuperer les différentes variables (j'aurai plutot fait ca avec des masques...

Mais apres une fois les variables récuperées et mises en formes je ne vois rien d'insurmontable.

Actuellement j'ai modifié la fonction writeCommand pour que celle ci émettent 3 octets au lieu de 2, et j'ai modifié le tableau cmd pour que celui ci contienne 4 octets au lieu de 3 (meme si je pense que c'est inutile, mais au moins en cas d'envoi d'une chaine de caractere ca évite les risques de débordements).

En revanche en relisant tout ca il faudra que je vérifie si il n'y aurait pas un bug avec la variable currentVitesse qui n'est peut etre pas a jour ce qui fait que j'enverrai en boucle l'info?

Re: Modification du plugin UsbSerial

4
Salut,

Je ne suis pas à l'origine du plugin UsbSerial mais si vous avez des questions d'ordres générales sur le développement des plugins de Jedicut, n'hésitez pas à demander ;)

Il y a également une page sur le site qui expose les principes de bases : https://www.jedicut.com/developper-des- ... r-jedicut/

Je ne mettrai pas ma main à couper que cette documentation est à jour car c'est un peu comme la blockchain, c'est le code qui fait foi :p

Pour reprendre les mots d'Alain le sujet est passionnant (:D
Jerome

Re: Modification du plugin UsbSerial

5
Merci Jérome,

C'est effectivement la page que j'ai utilisée pour comprendre le fonctionnement du plugin UsbSerial.


J'ai poursuivi un peu mes investigations hier soir, le plugin ne passe bien qu'une seule fois dans l'envoi de la vitesse, il faut donc que j'analyse pourquoi est ce que l'arduino me retourne pleins d'overflow lorsque je passe en mode 3 caracteres au lieu de 2, en l'état je ne comprends pas ce qui pose probleme.


D'ailleurs Alain si tu as une solution pour debugger directement sur arduino je serait interessé de savoir comment tu as fait car c'est pénible de devoir basculer en permanence entre jedicut et arduino, et surtout de ne pas pouvoir mettre de breakpoint dans le code...

@+

Re: Modification du plugin UsbSerial

6
Bonjour modelvincent,

Lorsque j'écrivais "en lisant le code source cela me paraît plus compliqué" je voulais dire qu'il fallait déjà bien comprendre ce qui a été écrit dans le plugin et ce qui a été fait pour décoder ceci dans le sketch Arduino avant d'envisager les modifications.
Pour développer, je vais doucement, je travaille avec des organigrammes, j'utilise l'afficheur pour afficher les valeurs des variables ou des points de passage. Oui c'est chronophage et je n'ai pas de solution pour passer de IDE Arduino à Jedicut sans fermer les programmes.
Pour lire le source du plugin, j'ai utilisé Visual C++ 2010 Express, je ne sais pas si c'est la bonne solution, je découvre.

A+ Alain

Re: Modification du plugin UsbSerial

7
Ok merci alors, on utilise la meme méthode alors.

Personnellement j'ai installé visual studio 2017 qui est gratuit, ca fonctionne.

Par contre je vais regarder ce soir car j'ai vu des softs qui permettent apparemment de sniffer les trames RS232, ca peut peut etre aider.

Sinon pour le débogage OK je fais pareil, envoi des variables sur l'afficheur pour le débug mais j’espérais qu'il y'ait des méthodes plus pratique qui existent.

@+

Re: Modification du plugin UsbSerial

8
Bon voila, j'ai poursuivi mes essais et j'obtiens enfin un résultat !

J'ai mis un peu de temps a comprendre la logique du buffer (l'overflow et l'underflow) mais c'est bon.

donc dorénavant la vitesse est reglable entre 1 et 32767 (j'ai testé entre 20 et 32000), a la vitesse la plus lente le moteur tourne de facon quasi impercetible a l'oeil nu, alors qu'en mode rapide il tourne super vite.

Il me reste 2 soucis:
- Le 1er est purement graphique et lié a Jedicut, la barre de progression disparait alors que le moteur n'a pas fini de tourner en vitesse lente:
Jedicut ayant envoyé toutes ses trames, la barre de progression disparait, c'est logique, sauf que la carte pendant ce temps la n'a pas encore fini de traiter son buffer, du coup il lui faut encore quelques secondes pour dépiler son buffer, et plus la vitesse est lente, plus ce temps est long.
En fonctionnement ca ne devrait pas etre génant car normalement on fini toujours sur une avance rapide pour sortir le fil de la zone de coupe, mais je vais voir pour réduire un peu la profondeur de mon buffer.

- le 2nd soucis est sans doute lié a mon code, lorsque je passe d'une avance lente a une avance rapide, j'ai une latence énorme (1 secondes ou 2) qui se produit avant que le moteur ne se mette a tourner, je suppose que mon timer doit faire un tour complet avant de passer en mode rapide, il faut que j'analyse pourquoi.

Mais à part ces 2 soucis ça semble vouloir fonctionner correctement, ce soir j'essaye de les corriger puis je remets mon code au propre.

Re: Modification du plugin UsbSerial

9
Bonjour modelvincent,
Bravo pour ta rapidité, tu es très efficace.
Pour le 1er défaut graphique, ce n'est pas gênant lorsque l'on sait comment cela fonctionne, ceci est normal.
Pour le 2 ème défaut, c'est plus gênant, de toute façon avant de prendre en compte le nouvelle vitesse, il faut attendre l'interruption en cours en petite vitesse.
Bonne recherches.
A+ alain

Re: Modification du plugin UsbSerial

10
Merci pour les compliments ;)


Ce soir au moment de reprendre mon code plus rien ne fonctionnait, j'ai cherché pendant 2h en vain, ca m'a agacé je suis reparti de 0 pour refaire un code propre.

Et donc ca y'est ca fonctionne, plus de plantage, et surtout, meme si je n'ai pas encore compris comment, le bug de la chauffe est corrigé !! :D

Il me reste un petit point qui me gène, c'est la première trame qui semble ne pas être prise en compte, il faut que je regarde pourquoi.
Et toujours le problème du délai entre le passage du mode lent au mode rapide que je n'ai pas encore analysé.

Une fois tout ca corrigé je pourrais le commiter sur Git, d'ailleurs si quelqu'un peut m'expliquer comment faire, j'avoue ne pas maitriser ces outils en collaboratif, je l'utilise plutot pour suivre mes evolutions de versions au boulot...
`); }); })(jQuery, window, document, phpbb);