Skyduino:~#
Articles
arduino, programmation, test

[Test] Usb Host Shield

Salut à tous !

Aujourd’hui je vais vous parler de la « Usb Host Shield »et plus précisément de la version fabriqué par sparkfun.
Avant toute chose je vous le dis tout de suite cette shield va prendre un gros – et vous allez comprendre pourquoi.
Ce n’est cependant pas la faute de sparkfun loin de là !

La « usb host shield » permet d’ajouter un port usb et les fonctionnalité du mode « host » usb à votre carte arduino.
Grâce à cette shield il est possible par exemple de récupérer les données d’une souris usb, d’un clavier usb ou de n’importe quelle autre type de périphérique usb.

Il existe plusieurs version de la « usb host shield », une premiére révision de sparkfun qui comporté un petit bug hardware (deux broches était inversé), où il fallait inversé deux valeur dans le fichier de configuration de pin utilisé par la librairie.
Par la suite sparkfun a corrigé ce bug dans une seconde version de la shield version.

Je poséde la 1er version, avec la librairie en version 1 je n’avais pas de probléme pour faire fonctionner ma shield avec ma carte arduino uno.
juste un petite modification à faire dans le fichier max3421e_constants.h

 #define MAX_GPX 7
 #define MAX_RESET 8

Mais tout à changer avec la version 2 de la librairie ! Désormais tout le systéme tourne via SPI, les broches sont hardcordé c’est beaucoup plus rapide, mais plus du tout compatible avec ma shield !

Je vais quand même vous faire une petite présentation rapide,
la shield se compose d’un port usb (normal), d’un switch qui permet d’alimenter ou nom l’arduino depuis le port usb et d’une série d’I/O.

Les I/O se désormais accessible avec la version 2 de la librairie mais comme elle ne marche pas avec ma shield …

Pour ceux voudrais quand même tentais l’expérience voici un sketch tiré du site officiel de circuit@home qui maintien la librairie.

Le code gére une souris usb, récupère les déplacement puis les affiches sur le port série.
(code pour la librairie en version 1 !)

#include <SPI.h>
#include <Max3421e.h>
#include <Usb.h>
 
#define DEVADDR 1
#define CONFVALUE 1
 
void setup();
void loop();
 
MAX3421E Max;
USB Usb;
 
void setup()
{
    Serial.begin( 115200 );
    Serial.println("Start");
//    Max.powerOn();
    delay( 200 );
}
 
void loop()
{
 byte rcode;
    Max.Task();
    Usb.Task();
    if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) {
        mouse0_init();
    }//if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING...
    if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) {  //poll the keyboard
        rcode = mouse0_poll();
        if( rcode ) {
          Serial.print("Mouse Poll Error: ");
          Serial.println( rcode, HEX );
        }//if( rcode...
    }//if( Usb.getUsbTaskState() == USB_STATE_RUNNING...
}
/* Initialize mouse */
void mouse0_init( void )
{
 byte rcode = 0;  //return code
  /**/
  Usb.setDevTableEntry( 1, Usb.getDevTableEntry( 0,0 ) );              //copy device 0 endpoint information to device 1
  /* Configure device */
  rcode = Usb.setConf( DEVADDR, 0, CONFVALUE );
  if( rcode ) {
    Serial.print("Error configuring mouse. Return code : ");
    Serial.println( rcode, HEX );
    while(1);  //stop
  }//if( rcode...
  Usb.setUsbTaskState( USB_STATE_RUNNING );
  return;
}
/* Poll mouse using Get Report and print result */
byte mouse0_poll( void )
{
  byte rcode,i;
  char buf[ 4 ] = { 0 };      //mouse buffer
  static char old_buf[ 4 ] = { 0 };  //last poll
    /* poll mouse */
    rcode = Usb.getReport( DEVADDR, 0, 4, 0, 1, 0, buf );
    if( rcode ) {  //error
      return( rcode );
    }
    for( i = 0; i < 4; i++) {  //check for new information
      if( buf[ i ] != old_buf[ i ] ) { //new info in buffer
        break;
      }
    }
    if( i == 4 ) {
      return( 0 );  //all bytes are the same
    }
    /* print buffer */
    if( buf[ 0 ] & 0x01 ) {
      Serial.print("Button1 pressed ");
    }
    if( buf[ 0 ] & 0x02 ) {
      Serial.print("Button2 pressed ");
    }
    if( buf[ 0 ] & 0x04 ) {
      Serial.print("Button3 pressed ");
    }
    Serial.println("");
    Serial.print("X-axis: ");
    Serial.println( buf[ 1 ], DEC);
    Serial.print("Y-axis: ");
    Serial.println( buf[ 2 ], DEC);
    Serial.print("Wheel: ");
    Serial.println( buf[ 3 ], DEC);
    for( i = 0; i < 4; i++ ) {
      old_buf[ i ] = buf[ i ];  //copy buffer
    }
    Serial.println("");
    return( rcode );
}

Conclusion :
C’est vraiment une sensation bizarre que de ce retrouvé bloquer par une mise à jour.
L’hardware est bien, la shield peut matériellement fonctionner en host comme en device (le mode device n’ayant cependant jamais était implanté), mais c’est le software qui fou tout en l’air !
De plus le développeur n’entend pas aider les possesseurs de « usb host shield by sparkfun » pour forcer la main vers l’achat d’un « usb host shield » v2 plus chère et surtout uniquement fabriqué par lui pour le moment.

J’aime pas du tout ça, et c’est pourquoi cette shield va prendre un gros – !
Si vous voulez vraiment utilisez l’usb avec votre arduino, pour connecter un téléphone android ou un périphérique hid par exemple, deux choix s’offre à vous :
– restez en librairie version 1 et utilisez les patch pour android adk et les sketch d’exemple du web,
– acheter une shield v2 et utilisez la librairie v2, bien plus complexe mais aussi bien plus puissance mais attention aucun des sktech d’exemple trouvable sur le web ne fonctionnera telle quelle si il n’as pas était conçu pour la v2 à l’origine.

Ps: Si quelqu’un connait THE astuce pour utiliser une shield sparkfun rev1 avec la librairie v2 et qui sait où trouver des tutoriels (anglais ou fr) pour utiliser des périphériques HID avec je prend !

Publicités

Discussion

5 réflexions sur “[Test] Usb Host Shield

  1. Bonjour,

    Utilisateur d’un arduino j’aurais aimé utiliser un Host USB et suite à votre article la décision de l’une ou l’autre version n’est pas simple d’autant que la version cirsuit@home n’est pas diffusée en france, en tout cas pas par
    les boutiques comme lextronic.
    Je vous signale que la revue Elektor de ce mois (fevrier 2012) vient de sortir une carte « AndroPod » qui permet de connecter un android avec une autre carte usb (esclave) qui pourrait très bien se connnecter sur Arduino.

    Exemple : Tel Android USB USB Host ( AndroPod ) USB Slave USB carte arduino

    Qu’en pensez-vous ? Cordialement Philippe Bouige

    Publié par homepb | 9 février 2012, 18 h 58 min
  2. J’ai acheté une USB shield chez lextronic et impossible de la faire marcher
    avec la version 1 et avec la 2 ça plante tout le temps : j’ai de temps en temps ce message :

    Circuits At Home 2011
    USB Host Shield Quality Control Routine
    Reading REVISION register… Die revision 03
    SPI long test. Transfers 1MB of data. Each dot is 64K……………. SPI long test passed
    GPIO test. Connect GPIN0 to GPOUT7, GPIN1 to GPOUT6, and so on
    Test failed. Value written: 00 Value read: FF
    Press any key to continue…
    GPIO test passed.
    PLL test. 100 chip resets will be performed
    Resetting oscillator
    Reset number 0
    Reset number 1
    Reset number 2
    Reset number 3
    Reset number 4
    Reset number 5
    Reset number 6
    Reset number 7 Time to stabilize – 5267 cycles
    Reset number 8 Time to stabilize – 556 cycles
    R …………..

    Raz le bol je déconseil ce produit !

    Publié par Louis Mariani | 9 avril 2012, 22 h 12 min
  3. Bonjour,
    j’ai trouvé la solution à ton problème:
    http://hardwarefun.com/tutorials/using-usb-host-shield-with-arduino

    « Old Sparkfun shield (part no: DEV-09628) with v2.0 of the library

    In v2.0 of the library the communication happens over the SPI pins and therefore you don’t have to make any change to the library. But to fix the swapped pin use you have to short the pin D7 to RESET. Take a small jumper cable and connect one end of it to D7 pin and the other end to the RESET pin (next to the 3.3V pin). This is the only change that is needed to get v2.0 of the library to work. »

    Bonne journée

    Publié par Baudouin de Marnhac | 13 décembre 2016, 16 h 57 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.