See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Le tableau de commande de Mars Bleu  (Read 7996 times)

0 Members and 1 Guest are viewing this topic.

Offline jacquesmomo

  • Il parait que je suis une
  • Legend
  • ******
  • Posts: 5559
  • Country: France fr
  • Karma: 274
  • Plus on rate, plus on a de chances de réussir !..
Reply #75 - 03 July 2017, 08:19:37
(...)
 Ça a l'air simple comme ça, mais c'est plus compliqué qu'il n'y paraît.
:trucdeouf: hébé...

Mes add-ons sont là !

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #76 - 03 July 2017, 08:39:34
@ Jacquesmomo, ne t'inquiètes pas, si j'ai réussi à faire fonctionner tout ça,
alors tout le monde peut le faire!!

@Antoo,  j'espère que ton projet avance bien.

@ tous les lecteurs, j'espère que la balade vous plaît.


Offline antoo

  • Legend
  • ******
  • Posts: 3384
  • Country: France fr
  • Karma: 138
  • 2, breaking left!
    • Forum de mon Asso d'Echasses Urbaines
Reply #77 - 03 July 2017, 21:14:32
Quote
@Antoo,  j'espère que ton projet avance bien.

Oui, vous aurez des news serieuses et photos demain soir :) .

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961
Ma chaîne Youtube : Airsoft, FPS, Simulation : http://www.youtube.com/channel/UCrzIPMeULZU6lR4M6DVsH2g

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #78 - 08 October 2017, 19:25:12
Il est grand temps que je continue d'exposer mes élucubrations, les dernières exposées ici remontant à une date déjà
lointaine. C'est que cet été, je n'ai pas eu tellement de plages temporelles propices pour développer, ni faire des
montages électroniques.
Par dessus le marché, lorsque j'ai voulu démarrer mon système, plus grand chose ne fonctionnait. C'était assez
frustrant. Maintenant que j'ai repris la main, je peux continuer.

Je vous parlais dans un précédent post de....

          Envoi de raccourcis clavier par mouvement de switch ou bouton poussoir

La UNO ne pas être vue comme un clavier sans quelques dispositions préalables. Voir les posts de Hysot à ce sujet. La librairie HIDKeyboard doit être "included". La doc qui l'accompagne montre l'utilisation par envoi de chaîne de caractère direct: par exemple,  keyboard.pressKey (CTRL, "a").

Mais je ne voulais pas avoir une structure pleine de if{}/else{}, ni de switch/case. Pour ça, il fallait faire un tableau, et utiliser la commande keyboard.pressKey() avec des paramètres.

Après quelques recherches et essais pas toujours réussis, j'ai fini par mettre au point le bout de code suivant:

En en-tête pour charger la librairie:

# include<HIDKeyboard.h>
HIDKeyboard keyboard;


Dans les déclarations:

const byte XrModifier[]={0,0,0,0,1,4,1,1,1,1,1,4,0,1,1,1};
const char XrKey[]={32,32,32,103,98,114,121,92,118,103,117,111,32,111,107,97}


XrModifier[] contient les caractères de contrôle: 0, pas de caractère de contrôle
                       1 correspond à CTRL
                       4 correspond à ALT

XrKey[] contient les codes ASCII des lettres à envoyer pour correspondre aux raccourcis clavier.

Le bout de code formant la fonction:

void keyboard_command(byte start, byte offset, unsigned int command);
{
   for( byte i=start;i<16;i++)
      {
         if(bitRead(command, i)==1)
            {
               keyboard.pressKey(XrModifier[i+offset], XrKey[i+offset];
               temporelease();
            }
      }
}


 Pour les raccourcis APU, cette fonction est appelée par:

keyboard_command(3,0,(PISOreg[0]^previousPISOreg[0]));


J'ai inséré cette fonction dans le programme principal tournant dans la UNO: téléversement, puis flashouillage pour la transformer en clavier. L'essai montre que le script Lua se fige dès qu'on ouvre le port de communication.

Normal!! Si la UNO est en keyboard, alors elle ne peut pas reçevoir de données. La carte UNO n'est donc pas le bon dispositif. En fait, il faut une Arduino qui permette d'envoyer des codes clavier sans être en permanence en mode clavier.
La carte Leonardo est tout à fait recommandée, car j'ai pu l'insérer sur son support en remplacement de la UNO. Petit inconvénient, elle a encore moins de mémoire disponible que la UNO (Il faudra compacter davantage le code!!!). Il existe heureusement la possibilité d'utiliser une DUE dont la mémoire est bien plus spacieuse, et la cadence d'horloge bien plus rapide. Mais il faudra lui faire un support adapté, et prévoir un interface pour que son 3.3volts d'entrées/sorties puisse travailler sans dégâts pour elle avec le 5 volts des circuits environnants.

Dans un prochain post, je vous parlerai de l'adaptation de mon petit bout de code à la carte Leonardo.
Ça va permettre à mon système de commander le Xr2 par les raccourcis clavier, tout en commandant les
lumineux présents sur mon tableau de commande. Mais ça va se compliquer un peu! :badfinger:


Offline jacquesmomo

  • Il parait que je suis une
  • Legend
  • ******
  • Posts: 5559
  • Country: France fr
  • Karma: 274
  • Plus on rate, plus on a de chances de réussir !..
Reply #79 - 09 October 2017, 00:04:44
Je suis toujours ça avec intéressement.... :applause:

Mes add-ons sont là !

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #80 - 09 October 2017, 22:46:05
Merci, Jacquesmomo!!
Et j'ai encore plein de trucs à exposer.


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #81 - 22 October 2017, 16:06:16
En effet, ça se complique dans la mesure où on va avoir deux façons d'envoyer un raccourci clavier. :wonder:
Premier mode: le changement d'état d'un switch provoque l'envoi d'un caractère.
Deuxième mode: l'appui sur un bouton-poussoir va lancer l'envoi d'un caractère, mais son retour à la position
initiale (on relâche le BP) ne va rien faire du tout.

Voici la nouvelle version, tenant compte de la syntaxe Leonardo, et de la possibilité switch/BP.



// Ce code commande un raccourci clavier pour  orbiter en fonction des bits de command
// J'ai ajouté un switch de sécurité: s'il est sur 1, alors l'envoi de caractère est autorisé
// s'il est sur 0, alors pas d'envoi de caractère.
// Avec le BP sur pin 3, je peux envoyer une commande de mouvement de gear sur changement d'état
// Ceci se fait avec la transmission de la variable XORdifference, modulée par switch_mode_mask
//
// Ici, c'est l'essai de ALT L (MAIN yaw vers la droite) sur la case 2 en mode BP
// On peut donc envoyer des caractères de contrôle d'Orbiter en mode switch ou en BP en fonction de APU_aux et switch_mode_mask

const byte secuSwitch=2;
const byte BP=3;
const byte led=13;
byte APU_aux;
byte secuSwitchstatus=0;

unsigned int var;
unsigned int old_var;
unsigned int switch_mode_mask;//si bit à 1, on est en mode"switch", si bit à 0, on est en mode "BP"

unsigned int XORdifference;
const byte xrmodifier[]={0,0,130,0,128,130,128,128,128,128,128,130,0,128,128,128};
const byte xrkey[]={32,32,108,103,98,114,121,92,118,103,117,111,32,111,107,97};
//Les deux lignes ci-dessus sont le tableau des raccourcis clavier auxquels on va s'adresser
//Les xrmodifier:128=>CTRL, et 130=>ALT. Pour info, 129=>SHIFT. Pas de modifier=>0.
//Les xrkey sont les codes ASCII des raccourcis clavier.

void setup()
{
pinMode(secuSwitch,INPUT);
pinMode(BP,INPUT);
pinMode(led,OUTPUT);
APU_aux=4;//commande MAIN yaw vers la droite
switch_mode_mask=8;//paramétrage en mode "switch"ou mode "BP"
}
void loop()

 {
   var=APU_aux*digitalRead(BP);
   XORdifference=(var^old_var);

   keyboard_command(3,0,XORdifference,switch_mode_mask);//appel de la fonction d'envoi de clavier, à installer.
   delay(50);
   old_var=var;
 }//End loop

//La fonction générant le raccourci clavier:
void keyboard_command(byte start,byte offset,unsigned int command,unsigned int switchModeMask)
    {
        secuSwitchstatus=digitalRead(secuSwitch);//ce secuSwitchstatus est là pour éviter un incident d'inaccessibilité
        digitalWrite(led, secuSwitchstatus);//signalisation de l'état de secuSwitchstatus sur la led 13 de la Leonardo
        boolean Switch_or_BP;   //variable booléenne  pour savoir si on est en mode Switch ou BP
        Keyboard.begin();
           for (byte i=start+offset;i<16+offset;i++)
            {
                Switch_or_BP=bitRead(switchModeMask,i);
                if ((bitRead(command,i)==1)&&(secuSwitchstatus==HIGH))
                    {
                         boolean bitvar=bitRead(var,i);//valeur pour transmettre l'état du bit de rang i de la variable globale var
                         xr_presskey(xrmodifier[ i ],xrkey[ i ],Switch_or_BP,bitvar);
                     }
             }
         Keyboard.end();
      }

//L'envoi des caractères:
 void xr_presskey(byte xrmodifier,byte xrkey,boolean SwitchOrBP,boolean bitVarStatus
 {
    if((SwitchOrBP==1)|(bitVarStatus==1&SwitchOrBP==0))
    {
    Keyboard.press(xrmodifier);
    Keyboard.press(xrkey);
    delay(20);
    }
    if((SwitchOrBP==1)|(bitVarStatus==0&SwitchOrBP==0))
    {   
    Keyboard.releaseAll();
    }
  }




En faisant varier la valeur de command, on va pouvoir définir l'envoi des raccourcis claviers. Et voilà!!

ATTENTION: Prévoir un dispositif d'arrêt d'urgence en hardware.

J'ai eu des ennuis de reprise en main de la Leonardo qui était partie à envoyer CTRL U toute les 5 secondes. Pour le Xr2 dans Orbiter, ça revenait à manœuvrer la porte de soute Baydoors, mais pour l'IDE Arduino, c'était le déclenchement d'un téléversement toute les 5 secondes. Du coup, plus moyen de changer le sketch tournant à l'intérieur.
J'ai fini par trouver: il faut laisser se faire un téléversement d'un sketch, mettons Fichier\Exemple\01.Basics\Blink. Avant qu'un nouveau CTRL U soit envoyé, il faut activer une nouvelle fenêtre, par exemple l'utilitaire Bloc Note qui recevra les caractères envoyés par la Leonardo, le temps que le téléversement se fasse. C'est comme ça que j'ai réussi à reprendre la main.
Pour éviter de nouveaux ennuis, j'ai installé un switch de sécurité en hardware. En cas de perte de contrôle par envoi intempestif de caractères par la Leonardo, la manœuvre du switch permettra de reprendre la main plus rapidement et plus facilement.
Par la suite, ayant maîtrisé l'affaire, j'ai pu retirer cette disposition de précaution.

Dans un prochain post, je vais m’employer à faire une petite vidéo pour montrer le fonctionnement de tout ça.
Je ne promets rien pour les délais, car j'ai encore beaucoup à faire pour rendre mes prototypes un peu jolis
à voir.

« Last Edit: 22 October 2017, 16:12:27 by Mars Bleu »

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #82 - 25 November 2017, 19:29:58
Afin de montrer que tout ce qui précède est fonctionnel, voici le lien de la vidéo promise dernièrement.
Je n'en suis qu'à moitié satisfait quant à la qualité, mais en l'état actuel des choses, pas moyen de
faire mieux :(. (Je sais que je devrais aller faire un stage chez Tex...)
Le lien:
https://www.youtube.com/watch?v=jycjemN2I5U

Je suis preneur de conseils pour les prises de vues, l'intégration de vidéos entre elles. Et aussi
de mettre une vidéo directement dans un post. Dans ce domaine, j'ai encore pas mal à apprendre.

Nous allons pouvoir passer à une autre partie du cockpit: il s'agit de l'équilibre du Xr2, et de
l'orientation des moteurs. Ça sera plus simple que la gestion des auxiliaires APU, vous verrez.

A +
Mars Bleu


Offline antoo

  • Legend
  • ******
  • Posts: 3384
  • Country: France fr
  • Karma: 138
  • 2, breaking left!
    • Forum de mon Asso d'Echasses Urbaines
Reply #83 - 27 November 2017, 12:42:28
Génial! Que c'est grisant  :love: !

A+

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961
Ma chaîne Youtube : Airsoft, FPS, Simulation : http://www.youtube.com/channel/UCrzIPMeULZU6lR4M6DVsH2g

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #84 - 28 November 2017, 12:54:30
Oui! Il est toujours très plaisant de voir le simpit s'amplifier,
et gagner de nouvelles fonctions.


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 575
  • Karma: 26
Reply #85 - 11 hours ago
La gestion des auxiliaires APU étant opérationnelle, nous allons pouvoir passer à un nouveau TP.
Il n'est pas très spectaculaire, mais excellent au niveau de l'exercice, vous verrez.

J'ai choisi de m'occuper de:

           Bargraphs pour la gestion de l'orientation des moteurs principaux et l'équilibre du vaisseau


On a la possibilité d'orienter les moteurs principaux, et SCRAM (gimbal), ainsi que de manœuvrer la masse d'équilibrage (rentrée atmosphérique).

L'initialisation se fait aussi à partir des données extraites du scn, et transmises à la UNO par des fonctions encadrées par les fonctions "widdernix" du script Lua. Dans le cockpit original dessiné par Altea Aerospace, on a des indicateurs à aiguille dont la gamme n'est pas la même pour tous les moteurs.

Pour des raisons économiques, j'ai préféré utiliser des bargraphs de 15 leds, pilotables par un mot de 16 bits. Quinze leds, c'est bien pour avoir une position centrale, avec le 8° bit allumé, et 7 bits éteints de chaque côté. L'ennui, c'est que j'avais à ma disposition uniquement des bargraphs de 20 leds. Pour arriver à mes fins, j'ai pris une scie, et coupé le plus proprement possible mes quatre bargraphs afin d'obtenir des bargraphs de 15 leds. Le résultat est tout à fait satisfaisant. J'ai installé tout cela avec ses résistances de protection de 1KΩ par led, plus un trimmer 0 à 1KΩ par bargraph.
En effet, pour des raisons de luminosité, cette disposition était la meilleure. J'ai terminé l'ensemble en faisant un câblage rampant pour relier les bargraphs aux connecteurs 2x13 pôles.



On est encore un peu dans du provisoire qui va durer, mais c'est fonctionnel. Vous voyez qu'il y a des câbles disponibles(p.ex.sur la nappe 3). Pour l'instant, je ne sais pas s'ils vont servir.

Le tableau (provisoire qui dure) de commande:




Pour la gestion logicielle, j'associe les mémoires:    SIPOreg[6] à Pitch Main dir
                                                                          SIPOreg[7] à Yaw Main
                                                                          SIPOreg[8] à Pitch SCRAM dir
                                                                          SIPOreg[9] à Center Gravity shift


On doit connaître le temps de transit d'un bout à l'autre de la gamme de mouvement de l'appareil considéré. On en tire une équation du premier degré donnant la position par rapport à un point central. Un peu de maths, les gars!

J'ai mesuré:      pitch main dir:    5 secondes, soit 5000 ms pour une amplitude de ±0,017455
                       main yaw:          7.2 secondes, soit 7200 ms pour une amplitude de ± 0,12987
                       pitch scram dir:  6 secondes, soit 6000 ms pour une amplitude de ± 0,087156
                       gravity shift:      70 secondes, soit 70000 ms pour une amplitude de ±4,115


Comme j'ai besoin de la durée de référence, et qu'on s'aperçoit que 70000 ne peut pas être codé sur deux octets (unsigned int), j'ai décidé d'y mettre un coefficient de 1.25 plus petit. Ce qui fait qu'on aura 70/1,25=56. D'où:

                    Gravity shift   56 1,25 secondes, soit 56000 1,25ms pour une amplitude de ±4,115
                    Or 56000 tient dans deux octets (65535>56000): ça tombe bien.

On en tire les équations suivantes, avec level tiré de scn (à la bonne ligne):

   main pitch dir:       value=143225,43*level+2500
   main yaw:             value=27720,027*level+3600
   scram pitch dir:     value=34421,038*level+3000
   gravityshift:          value=6804,3842*level+28000

Ces calculs sont faits par le script Lua et envoyés par USB vers le sketch Arduino dans respectivement les cases Position[16 à 19], où les valeurs pourront être modifiées par appui sur les boutons-poussoirs de commande.

Dans un prochain post je vous ferai part des codes Lua et C++ nécessaires au bon fonctionnement de ce dispositif. Bonne lecture!