[RESOLU]Ajouter un port USB pour clavier

Salut, j'essaye et réessaye de faire fonctionner différentes versions de la librairie v-usb mais ça ne compile pas !
Une infinité d'erreurs sont renvoyées, mais là, c'est pas ma faute : les exemples fournis ne fonctionnent pas non-plus.

S.V.P. revoir Reply précédente :

numero_744:
La leonardo est incompatible avec tous les shields ou quelques-uns seulement ?
L'Ethernet, par exemple ?

Merci !

numero_744:
Salut, j'essaye et réessaye de faire fonctionner différentes versions de la librairie v-usb mais ça ne compile pas !
Une infinité d'erreurs sont renvoyées, mais là, c'est pas ma faute : les exemples fournis ne fonctionnent pas non-plus.

Les exemples de v-usb compilent, pas de toute là dessus ... tu doit avoir une (grosse) erreur de configuration dans usbconfig.h :wink:
Et normalement avec Google Code Archive - Long-term storage for Google Code Project Hosting. tu ne devrais rien avoir à configurer.

numero_744:
La leonardo est incompatible avec tous les shields ou quelques-uns seulement ?
L'Ethernet, par exemple ?

L'ethernet shield officielle devrait marcher car elle utilise le port ICSP pour communiquer avec l'arduino.
Mais toutes les autres shields qui utilisent le spi, i2c, ... ne fonctionnerons pas avec la leonardo.

Merci skywodd,
Bon, on est d'accord :
Je clique sur le lien affiché et j'atterris sur cette page.
Ensuite, je clique sur "arduinousb_release_004.tar.gz", j'ouvre le *.zip et je met le dossier dans "librairies".
J'ouvre l'IDE Arduino.

Fichier
->Exemples
-->arduinousb_release_004
--->UsbKeyboardDemo1
Je clique sur "Vérifier"... Il me renvoie son infinité d'erreurs :

UsbKeyboardDemo1.cpp:1:25: error: UsbKeyboard.h: No such file or directory
UsbKeyboardDemo1.cpp: In function 'void loop()':
UsbKeyboardDemo1.pde:-1: error: 'UsbKeyboard' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_H' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_E' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_L' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_O' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_SPACE' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_W' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_R' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_D' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_ENTER' was not declared in this scope

Je remplace les "" de #include par des <>, je re-clique sur "Vérifier" et... Il continue à me renvoyer des erreurs, sauf la première :

UsbKeyboardDemo1.cpp: In function 'void loop()':
UsbKeyboardDemo1.pde:-1: error: 'UsbKeyboard' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_H' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_E' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_L' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_O' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_SPACE' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_W' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_R' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_D' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_ENTER' was not declared in this scope

Il faut copier les 3 sous dossiers du dossier "libraries" de l'archive dans le dossier "libraries" de ton installation arduino.
Tu as du copier le dossier "libraries" entier, du coup l'ide ne cherchant pas dans les sous dossier il ne trouve pas la librairie.

Je viens de tester à l'instant :

Binary sketch size: 2 826 bytes (of a 32 256 byte maximum)

Merci, j'ai corrigé et il me renvoie

UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice':
/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:139: undefined reference to `usbInit()'
UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice::update()':
/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:150: undefined reference to `usbPoll()'

Au fait, sendKeyStroke() va juste envoyer des signaux comme quoi des touches ont été pressées, comme Keyboard.print() pour une leonardo. Quels sont les équivalents de Keyboard.press() et de Keyboard.release() ?

Au fait2, à quoi sert UsbKeyboard.update() ?

Au fait3, à partir du document ci-joint, p.53 à début 59, puis-je modifier les #define KEY_TOUCHE NUMERO et en rajouter ?

Merci !

Hut1_11.pdf (880 KB)

numero_744:
Merci, j'ai corrigé et il me renvoie

UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice':

/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:139: undefined reference to usbInit()' UsbKeyboardDemo1.cpp.o: In function UsbKeyboardDevice::update()':
/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:150: undefined reference to `usbPoll()'

Il faut utiliser la dernière version de la librairie :
http://code.google.com/p/vusb-for-arduino/downloads/detail?name=vusb-for-arduino-005.zip&can=2&q=

La version de vusb utilisait par la lib. étant assez vieille j'ai fait un zip avec la dernière version de vusb et de usbKeyboard.h (voir pièce jointe).

numero_744:
Au fait, sendKeyStroke() va juste envoyer des signaux comme quoi des touches ont été pressées, comme Keyboard.print()pour une leonardo.

Oui mais une touche à la fois (avec la possibilité d'ajout un modificateur (ALT, CTRL, ...)), alors que la version leonardo envoi toute une série de touches d'un seul coup.

numero_744:
Quels sont les équivalents de Keyboard.press() et de Keyboard.release() ?

Ils n'y en a pas.
La librairie envoi un appui puis un relâchement de touche à chaque sendKeyStroke().
Si tu veut faire un clavier usb virtuel "à la sauce leonardo" ouvre usbKeyboard.h (garde de côté usbconfig.h) et fait ton propre code en partant de vusb directement :wink:
La fonction de setup de l'usb fait une dizaine de lignes et la partie envoi d'une touche ce résume en deux lignes.

numero_744:
Au fait2, à quoi sert UsbKeyboard.update() ?

A lancer un "pool" du bus usb, c'est ce qui fait que l'usb marche.

numero_744:
Au fait3, à partir du document ci-joint, p.53 à début 59, puis-je modifier les #define KEY_TOUCHE NUMERO et en rajouter ?

Tu peut en rajouter mais les valeurs que tu ajoutes doivent être dans la norme HID sinon l'ordinateur ne verra pas la bonne touche.

UsbKeyboard.zip (109 KB)

Merci. Ça compile, maintenant.

Quand j'appuie sur la touche 'a', comment l'ordinateur sait si j'envoie

a a a a a a a a a a a a a a a

très rapidement ou si j'envoie

a______________________

(une pression continue) ?

Mon but est de faire une manette de jeux vidéos qui envoie à l'ordinateur des commandes clavier, et j'aimerais éviter les saccades qui peuvent êtres dérangeantes...
Je peux même en faire une manette multi-jeux : je connecte à l'ordi en USB série, j'envoie un caractère à la carte selon le jeux auquel je vais jouer, je coupe, je débranche (alim. jack) et je rebranche à la prise v-usb.

Mon shield proto arrive, avant d'acheter les composants, merci de me confirmer que c'est bien ce circuit :

Le *.pdf est téléchargé depuis usb.org, je pense que les références sont bonnes.

numero_744:
Quand j'appuie sur la touche 'a', comment l'ordinateur sait si j'envoie

a a a a a a a a a a a a a a a

très rapidement ou si j'envoie

a______________________

(une pression continue) ?

Plusieurs appuis = plusieurs événements USB appui / relâche.
Un appui continu = un événements USB appui seul.

numero_744:
Mon but est de faire une manette de jeux vidéos qui envoie à l'ordinateur des commandes clavier, et j'aimerais éviter les saccades qui peuvent êtres dérangeantes...
Je peux même en faire une manette multi-jeux : je connecte à l'ordi en USB série, j'envoie un caractère à la carte selon le jeux auquel je vais jouer, je coupe, je débranche (alim. jack) et je rebranche à la prise v-usb.

Tu devras faire ta propre version de la librairie usbKeyboard en enlevant la partie relâchement "auto" de la touche.

numero_744:
Mon shield proto arrive, avant d'acheter les composants, merci de me confirmer que c'est bien ce circuit :

C'est bon.

Mille mercis Skywodd !
Je vais sauter sur le code source de usbKeyboard et modifier la fonction sendKeyStroke façon leonardo et changer les #define des touches pour avoir un clavier plus complet.
Je suis vraiment soulagé !

J'ai fait les modifications de "UsbKeyboard.h" (document ci-joint)
Est-ce bien ?
Je sais que l'exemple ne fonctionnera plus avec.
Je crains plutôt que mes if dans le sendKeyStroke soient mal placés ou que mes #define dysfonctionnent.
Encore merci !

UsbKeyboard.h (7.11 KB)

S'cusez-moi, y'a erreur, je remets la bonne version. Enfin, je ne sais pas si elle marche. Mais elle devrait. Elle compile (aussi avec l'exemple) mais je ne peux pas l'essayer. Donc celle qui devrait marcher, quoi !
Pouvez vous me dire si elle fonctionne correctement s'il vous plaît ?

UsbKeyboard.h (7.61 KB)

C'est pas trés clair le code ...
Moi je garderai juste le nécessaire pas plus (voir pièce jointe).

(Attention: j'ai pas testé le code !)

usbKeyboard.h (4.5 KB)

Merci pour ta réponse, mais ton code ne peut pas marcher : il faut garder sendKeyStroke() (sinon ça ne compile pas ]:))
J'aimerais juste savoir si

  void press(byte keyStroke) {
    while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keystroke
      //       so we know the previous keystroke was
      //       sent.
    }
      
    memset(reportBuffer, 0, sizeof(reportBuffer));

    reportBuffer[0] = 0;
    reportBuffer[1] = keyStroke;
        
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }

et

  void release(byte keyStroke) {
    while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keystroke
      //       so we know the previous keystroke was
      //       sent.
    }
      
    // This stops endlessly repeating keystrokes:
    memset(reportBuffer, 0, sizeof(reportBuffer));      
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }

marcheront (en tout cas, ça compile).

Sinon,

  void send(byte keyStroke) {
    sendKeyStroke(keyStroke);
  }

est juste un raccourcis. (Quel flemmard je suis ! :stuck_out_tongue_closed_eyes:)

Merci encore, mon proto shield devrait arriver aujourd'hui, j'irai acheter les composants demain !

numero_744:
Merci pour ta réponse, mais ton code ne peut pas marcher : il faut garder sendKeyStroke() (sinon ça ne compile pas ]:))

Moi je part du principe que je suit l'API leonardo et que par conséquent j'oublie l'ancienne api de usbKeyboard :wink:

numero_744:
J'aimerais juste voir si

  void press(byte keyStroke) {

while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keystroke
      //       so we know the previous keystroke was
      //       sent.
    }
     
    memset(reportBuffer, 0, sizeof(reportBuffer));

reportBuffer[0] = 0;
    reportBuffer[1] = keyStroke;
       
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }



et


void release(byte keyStroke) {
    while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keystroke
      //       so we know the previous keystroke was
      //       sent.
    }
     
    // This stops endlessly repeating keystrokes:
    memset(reportBuffer, 0, sizeof(reportBuffer));     
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }



marcheront (en tout cas, ça compile).

Ça marchera mais autant faire une seule fonction qui prend une touche + modificateur en argument et qui est appelé par les autres fonctions.
Copier coller du code n'est jamais une bonne solution.

Salut, j'ai reçu mon proto shield et je ne sais pas comment souder ma prise USB, manque de trous...
Merci !

numero_744:
Salut, j'ai reçu mon proto shield et je ne sais pas comment souder ma prise USB, manque de trous...

Comment ça ?

Y'a pas de trous ! J'les mets où le broches de la prise ?
Cf image jointe à ce post.

Image 1.png

numero_744:
Y'a pas de trous ! J'les mets où le broches de la prise ?
Cf image jointe à ce post.

C'est l'emplacement pour un composant CMS !
Si tu veut souder ton port usb c'est de l'autre côté dans la zone avec des pastilles qu'il faut travailler :wink:

Oups ! :astonished: :fearful:
:sweat_smile: Cette partie (pièce jointe) ?
Comment placer la prise pour que d+ et d-; 5V et GND ne soient pas reliés ?

Image 2.png

. . ./_ _ /. . ./
. ./
. _ ./. .//_ ./. . / /./. _ ./ _ // _ . . ./. . . . _/. . . . /
. . ./
_ _/. . ./