CleUSB : Différence entre versions
Ligne 51 : | Ligne 51 : | ||
Pour ajuster le volume d'un ordinateur, il existe 3 caractères spéciaux nommés XF86volume_up, XF86volume_down et XF86volume_mute. | Pour ajuster le volume d'un ordinateur, il existe 3 caractères spéciaux nommés XF86volume_up, XF86volume_down et XF86volume_mute. | ||
Pour pouvoir envoyer ces caractères, il faut modifier les fichiers ARDUINO HID.cpp et USBAPI.h qui gèrent la partie "périphérique USB" de l'ARDUINO LEONARDO. | Pour pouvoir envoyer ces caractères, il faut modifier les fichiers ARDUINO HID.cpp et USBAPI.h qui gèrent la partie "périphérique USB" de l'ARDUINO LEONARDO. | ||
+ | Voici un exemple que nous avons trouvé qui ajoute à l'interface homme-machine la classe Remote permettant l'usage de fonctions de base d'une télécommande. | ||
{| class="wikitable" | {| class="wikitable" | ||
Ligne 58 : | Ligne 59 : | ||
| On déclare la classe Remote_ après les classes Keyboard_ et Mouse_ :<br/> | | On déclare la classe Remote_ après les classes Keyboard_ et Mouse_ :<br/> | ||
<small> | <small> | ||
+ | <source lang=c> | ||
//================================================================================ | //================================================================================ | ||
//================================================================================ | //================================================================================ | ||
Ligne 78 : | Ligne 80 : | ||
private: | private: | ||
public: | public: | ||
− | Remote_(void); | + | Remote_(void); |
− | void begin(void); | + | void begin(void); |
− | void end(void); | + | void end(void); |
− | // Volume | + | // Volume |
− | void increase(void); | + | void increase(void); |
− | void decrease(void); | + | void decrease(void); |
− | void mute(void); | + | void mute(void); |
− | // Playback | + | // Playback |
− | void play(void); | + | void play(void); |
− | void pause(void); | + | void pause(void); |
− | void stop(void); | + | void stop(void); |
− | // Track Controls | + | // Track Controls |
− | void next(void); | + | void next(void); |
− | void previous(void); | + | void previous(void); |
− | void forward(void); | + | void forward(void); |
− | void rewind(void); | + | void rewind(void); |
− | // Send an empty report to prevent repeated actions | + | // Send an empty report to prevent repeated actions |
− | void clear(void); | + | void clear(void); |
− | }; | + | }; |
extern Remote_ Remote; | extern Remote_ Remote; | ||
− | + | </source> | |
</small> | </small> | ||
|} | |} | ||
Ligne 111 : | Ligne 113 : | ||
|- | |- | ||
| On déclare Remote l'instance de _Remote au début du programme: | | On déclare Remote l'instance de _Remote au début du programme: | ||
− | <small>Mouse_ Mouse; | + | <small> |
− | + | <source lang=c> | |
− | + | Mouse_ Mouse; | |
− | + | Keyboard_ Keyboard; | |
+ | Remote_ Remote; | ||
+ | </source> | ||
+ | </small> | ||
|- | |- | ||
− | | | + | | On place l'impémentation de Remote à la fin du fichier, |
+ | après l'implémentation de Mouse et Keyboard, et avant les #endif finaux: | ||
+ | <small> | ||
+ | <source lang=c> | ||
+ | //================================================================================ | ||
+ | //================================================================================ | ||
+ | // Remote | ||
+ | |||
+ | Remote_::Remote_(void) | ||
+ | { | ||
+ | } | ||
+ | |||
+ | void Remote_::begin(void) | ||
+ | { | ||
+ | } | ||
+ | |||
+ | void Remote_::end(void) | ||
+ | { | ||
+ | } | ||
+ | |||
+ | void Remote_::increase(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = VOLUME_UP; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::decrease(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = VOLUME_DOWN; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::mute(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = VOLUME_MUTE; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::play(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = REMOTE_PLAY; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::pause(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = REMOTE_PAUSE; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::stop(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = REMOTE_STOP; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::next(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = REMOTE_NEXT; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::previous(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = REMOTE_PREVIOUS; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::forward(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = 0; | ||
+ | m[1] = REMOTE_FAST_FORWARD >> 8; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::rewind(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = 0; | ||
+ | m[1] = REMOTE_REWIND >> 8; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | |||
+ | void Remote_::clear(void) | ||
+ | { | ||
+ | u8 m[2]; | ||
+ | m[0] = 0; | ||
+ | m[1] = 0; | ||
+ | HID_SendReport(4,m,2); | ||
+ | } | ||
+ | </source> | ||
+ | </small> | ||
|- | |- | ||
− | | | + | |On place la description HID des élément de Remote après <small><source lang=c> |
+ | #if RAWHID_ENABLED | ||
+ | // RAW HID | ||
+ | ... | ||
+ | #endif | ||
+ | </source></small> (ligne 130 environ) | ||
+ | <small><source lang=c> | ||
+ | //----------------------------------------------------------------------------- | ||
+ | |||
+ | /* Cross-platform support for controls found on IR Remotes */ | ||
+ | |||
+ | 0x05, 0x0c, // Usage Page (Consumer Devices) | ||
+ | 0x09, 0x01, // Usage (Consumer Control) | ||
+ | 0xa1, 0x01, // Collection (Application) | ||
+ | 0x85, 0x04, // REPORT_ID (4) | ||
+ | 0x15, 0x00, // Logical Minimum (0) | ||
+ | 0x25, 0x01, // Logical Maximum (1) | ||
+ | 0x09, 0xe9, // Usage (Volume Up) | ||
+ | 0x09, 0xea, // Usage (Volume Down) | ||
+ | 0x75, 0x01, // Report Size (1) | ||
+ | 0x95, 0x02, // Report Count (2) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xe2, // Usage (Mute) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb0, // Usage (Play) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb1, // Usage (Pause) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb7, // Usage (Stop) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb5, // Usage (Next) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb6, // Usage (Previous) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb3, // Usage (Fast Forward) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x09, 0xb4, // Usage (Rewind) | ||
+ | 0x95, 0x01, // Report Count (1) | ||
+ | 0x81, 0x06, // Input (Data, Variable, Relative) | ||
+ | |||
+ | 0x95, 0x06, // Report Count (6) Number of bits remaining in byte | ||
+ | 0x81, 0x07, // Input (Constant, Variable, Relative) | ||
+ | 0xc0 // End Collection | ||
+ | </source></small> | ||
|} | |} | ||
+ | Voici le fichier USBAPI.h modifié(les fichiers .cpp ne peuvent pas etre importé sur le wiki): | ||
*[[Media:USBAPI.h]] | *[[Media:USBAPI.h]] |
Version du 11 janvier 2016 à 15:41
L'objectif de ce projet est de réaliser une clé USB capable de régler le volume de l'ordinateur sur lequel elle est branchée, puis de servir de télécommande ou stocker et saisir des mots de passes. Pour cela nous allons réaliser successivement plusieurs clés, la première servira uniquement à envoyer des informations à l'ordinateur afin d'ajuster le volume.
Sommaire
Conception de la première carte
Notre projet est basé sur un ATMEGA32U4, nous avons donc repris le schéma de l'ARDUINO LEONARDO, en ne conservant que la partie utile à notre clé USB. Ainsi nous pouvons supprimer les entrées et sorties ARDUINO. La carte sera toujours alimentée par USB donc la borne de connexion pour alimentation et le système de régulation de tension peuvent être supprimés. L'objectif étant de miniaturiser au maximum la carte, nous avons décidé de supprimer également les inductances et condensateurs destinés à l'amélioration de la qualité des mesures.
Nous allons ajouter sur le port D maintenant inutilisé 4 boutons et 4 LEDs
Voici la première version de la clé USB:
Bootloader
Afin de téléverser les programmes sans utiliser le connecteur ISP et d’exécuter le programme à la mise sous tension du microcontrôleur, nous allons installer un bootloader sur l'ATMEGA32U4. Pour cela, avant de le souder sur la carte, nous plaçons le microcontrôleur dans un boitier d'adaptation et utilisons l'outil "graver la séquence d'initialisation" du logiciel ARDUINO. Dans la première version de la carte nous avons conservé l'ISP comme sécurité si le bootloader ne fonctionne pas.
Problèmes rencontrés
Le connecteur ISP de la carte sur laquelle est soudé ce boitier d'adaptation, ne sont pas reliées aux bonnes broches du microcontrôleur. Nous allons donc créer une nouvelle carte d'adaptation sur laquelle nous souderons le boitier. Les broches à connecter sont:
Nom | Broche ATMEGA32U4 |
---|---|
MISO | 11 |
MOSI | 10 |
SCLK | 9 |
/RESET | 13 |
VCC | 14,34 |
GND | 15,23,35,43 |
Quartz | 16,17 |
Le boitier n'étant pas au format standard, il faut recréer le composant sur Eagle.
voici la carte d'adaptation que nous avons réalisé.
Réglage du volume
Pour ajuster le volume d'un ordinateur, il existe 3 caractères spéciaux nommés XF86volume_up, XF86volume_down et XF86volume_mute. Pour pouvoir envoyer ces caractères, il faut modifier les fichiers ARDUINO HID.cpp et USBAPI.h qui gèrent la partie "périphérique USB" de l'ARDUINO LEONARDO. Voici un exemple que nous avons trouvé qui ajoute à l'interface homme-machine la classe Remote permettant l'usage de fonctions de base d'une télécommande.
USBAPI.h |
---|
On déclare la classe Remote_ après les classes Keyboard_ et Mouse_ :
//================================================================================
//================================================================================
// Remote
#define REMOTE_CLEAR 0
#define VOLUME_UP 1
#define VOLUME_DOWN 2
#define VOLUME_MUTE 4
#define REMOTE_PLAY 8
#define REMOTE_PAUSE 16
#define REMOTE_STOP 32
#define REMOTE_NEXT 64
#define REMOTE_PREVIOUS 128
#define REMOTE_FAST_FORWARD 256
#define REMOTE_REWIND 512
class Remote_
{
private:
public:
Remote_(void);
void begin(void);
void end(void);
// Volume
void increase(void);
void decrease(void);
void mute(void);
// Playback
void play(void);
void pause(void);
void stop(void);
// Track Controls
void next(void);
void previous(void);
void forward(void);
void rewind(void);
// Send an empty report to prevent repeated actions
void clear(void);
};
extern Remote_ Remote;
|
HID.cpp |
---|
On déclare Remote l'instance de _Remote au début du programme:
Mouse_ Mouse;
Keyboard_ Keyboard;
Remote_ Remote;
|
On place l'impémentation de Remote à la fin du fichier,
après l'implémentation de Mouse et Keyboard, et avant les #endif finaux: //================================================================================
//================================================================================
// Remote
Remote_::Remote_(void)
{
}
void Remote_::begin(void)
{
}
void Remote_::end(void)
{
}
void Remote_::increase(void)
{
u8 m[2];
m[0] = VOLUME_UP;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::decrease(void)
{
u8 m[2];
m[0] = VOLUME_DOWN;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::mute(void)
{
u8 m[2];
m[0] = VOLUME_MUTE;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::play(void)
{
u8 m[2];
m[0] = REMOTE_PLAY;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::pause(void)
{
u8 m[2];
m[0] = REMOTE_PAUSE;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::stop(void)
{
u8 m[2];
m[0] = REMOTE_STOP;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::next(void)
{
u8 m[2];
m[0] = REMOTE_NEXT;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::previous(void)
{
u8 m[2];
m[0] = REMOTE_PREVIOUS;
m[1] = 0;
HID_SendReport(4,m,2);
}
void Remote_::forward(void)
{
u8 m[2];
m[0] = 0;
m[1] = REMOTE_FAST_FORWARD >> 8;
HID_SendReport(4,m,2);
}
void Remote_::rewind(void)
{
u8 m[2];
m[0] = 0;
m[1] = REMOTE_REWIND >> 8;
HID_SendReport(4,m,2);
}
void Remote_::clear(void)
{
u8 m[2];
m[0] = 0;
m[1] = 0;
HID_SendReport(4,m,2);
}
|
On place la description HID des élément de Remote après #if RAWHID_ENABLED
// RAW HID
...
#endif
//-----------------------------------------------------------------------------
/* Cross-platform support for controls found on IR Remotes */
0x05, 0x0c, // Usage Page (Consumer Devices)
0x09, 0x01, // Usage (Consumer Control)
0xa1, 0x01, // Collection (Application)
0x85, 0x04, // REPORT_ID (4)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x09, 0xe9, // Usage (Volume Up)
0x09, 0xea, // Usage (Volume Down)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xe2, // Usage (Mute)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb0, // Usage (Play)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb1, // Usage (Pause)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb7, // Usage (Stop)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb5, // Usage (Next)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb6, // Usage (Previous)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb3, // Usage (Fast Forward)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x09, 0xb4, // Usage (Rewind)
0x95, 0x01, // Report Count (1)
0x81, 0x06, // Input (Data, Variable, Relative)
0x95, 0x06, // Report Count (6) Number of bits remaining in byte
0x81, 0x07, // Input (Constant, Variable, Relative)
0xc0 // End Collection
|
Voici le fichier USBAPI.h modifié(les fichiers .cpp ne peuvent pas etre importé sur le wiki):