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 7268 times)

0 Members and 2 Guests are viewing this topic.

Offline jacquesmomo

  • Il parait que je suis une
  • Legend
  • ******
  • Posts: 5545
  • Country: France fr
  • Karma: 273
  • 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: 561
  • 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: 3376
  • 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: 561
  • 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: 5545
  • Country: France fr
  • Karma: 273
  • 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: 561
  • 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: 561
  • 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 »