Molette arduino

Bonjour tout le monde,

J’ai pour projet d’utilisé les plateaux d’un disque dur en tant que molette sur Windows, j’ai réussi à récupérer les valeurs de la part du disque dur sur mon arduino mega, mais je n’arrive pas à l’utilisé sur l’ordi. Le meilleur serait une interface plug&play par usb comme le fait vusb (http://www.practicalarduino.com/projects/virtual-usb-keyboard) mais j’ai tenté de l’utiliser mais ça ne marche pas, Windows ne le détecte pas…
Les claviers et souris peuvent être utilisé en périphériques hid alors un arduino peut le faire aussi non ?
Donc je m’en remets à vous pour savoir comment faire.

Une autre question : Les librairies fonctionnants pour les versions antérieures à la 1.0 marchent en 1.0 ?

Bonjour,

leni:
J’ai pour projet d’utilisé les plateaux d’un disque dur en tant que molette sur Windows, j’ai réussi à récupérer les valeurs de la part du disque dur sur mon arduino mega, mais je n’arrive pas à l’utilisé sur l’ordi. Le meilleur serait une interface plug&play par usb comme le fait vusb (http://www.practicalarduino.com/projects/virtual-usb-keyboard) mais j’ai tenté de l’utiliser mais ça ne marche pas, Windows ne le détecte pas…
Les claviers et souris peuvent être utilisé en périphériques hid alors un arduino peut le faire aussi non ?

Tu pourrai publier la partie "récupération des valeurs" ça m'intéresserai beaucoup.

Pour vsub il faut faire tout un petit montage, rien de bien compliquer quelques diodes zerner, résistances et un condensateur :wink:
Si tu suis le tuto du lien que tu a posté tu devrais te retrouver avec un clavier usb fonctionnelle (j'ai déja fait le montage ya quelque temps, il marche ya pas de probléme).
Avec vusb ou avec la librairie "vusb simplifié pour arduino" tu peut faire sans probléme n'importe quelle type de périphériques HID en norme usb 1.1 :wink:

leni:
Une autre question : Les librairies fonctionnants pour les versions antérieures à la 1.0 marchent en 1.0 ?

La réponse n'est pas simple : OUI et NON, certaines librairies vont compiler sous 1.0, d'autres non, et d'autre vont compiler mais ne vont pas fonctionner comme voulu.

Bonjour
Si le portage de vusb sur Arduino n'est pas encore tout à fait au point (pas testé pour ma part) il reste :
-le changement de firmware du mega16u2 d'une carte Arduino récente ?
-l'utilisation d'une carte ou le mega328 est remplacé par un mega32u4 (futur Leonardo, vinciDuino, breakout d'Adafruit, Teensy ...)

Pour la partie récupération des valeurs c’est simple, les plateaux des disques dur sont sur un moteur, si tu tournes les plateaux sa fait une dynamo. J’ai mes 2 des 3 pins du moteur sur la carte (gnd et A0) et la carte sait si le moteur tourne, à quelle vitesse et dans quel sens.

skywodd:
Pour vsub il faut faire tout un petit montage, rien de bien compliquer quelques diodes zerner, résistances et un condensateur :wink:

Je n’ai pas vu de condensateur sur le schéma, tu l'as mis où ? Et aussi tu avais quelle version de l’IDE quand tu la fait fonctionner ? au cas où c'est la version de l'IDE qui fait que vusb ne marche pas.

J’ai la version de la 3 mega, donc c’est un Atmega 16U2. J’ai vu qu’on pouvait mettre LUFA sur la carte pour l'utiliser en hid mais pour changer le programme sur la carte il faudra changer le firmware ou je pourrais faire comment avant avec juste des fonctions supplémentaire ?

leni:
Je n’ai pas vu de condensateur sur le schéma, tu l'as mis où ?

Entre +5v et GND pour stabiliser l'alimentation du circuit :wink:

leni:
Et aussi tu avais quelle version de l’IDE quand tu la fait fonctionner ?

Arduino 0023

leni:
au cas où c'est la version de l'IDE qui fait que vusb ne marche pas.

Il faut une version antérieur à 1.0, 0023 par exemple, car la librairie a était créer à l'époque de arduino 0020 et n'as pas était mis à jour depuis.

leni:
J’ai la version de la 3 mega, donc c’est un Atmega 16U2. J’ai vu qu’on pouvait mettre LUFA sur la carte pour l'utiliser en hid mais pour changer le programme sur la carte il faudra changer le firmware ou je pourrais faire comment avant avec juste des fonctions supplémentaire ?

Il faut impérativement changer le firmware pour utiliser le 16U2 en périphérique HID, cela signifie aussi qu'il ne sera plus possible d'uploader de sketch arduino par usb sans remettre avant le firmware de base :wink:
Donc je te conseil de rester sous vusb, ça marche trés bien je peut te le garantir, si tu ne comprend pas déja vusb en version "brut" sans arduino, LUFA sera vraiment trés compliqué à mettre en œuvre :wink:

LUFA :
Avec un mega16u2 il ya à priori la place pour loger à la fois le bootloader Et HID
Certains travaillent le sujet..... pas certain qu'il ya ait à ce jour un résultat abouti à ce jour.
Sans cela la gymnastique permanente de permutation du firmware du
8u2 ou 16u2 est fastidieuse en phase de mise au point.

Si Skywodd garantit le fonctionnement de VUSB sous Arduino il vaut sans doute mieux persévérer dans cette voie.... en attendant une solution efficace côté firmware 'double' sur 16u2.
Pour info : LUFA Hacks Archives | Arduino Blog

al1fch:
Avec un mega16u2 il ya à priori la place pour loger à la fois le bootloader Et HID
Certains travaillent le sujet..... pas certain qu'il ya ait à ce jour un résultat abouti à ce jour.

Ils ont du courage, pour avoir le bootloader DFU + le programme de CDC pour le port série, tout en laissant de la place pour l'utilisateur ... à moi d'avoir un 32u4 je crois pas qu'il vont s'en sortir ...

al1fch:
Si Skywodd garantit le fonctionnement de VUSB sous Arduino il vaut sans doute mieux persévérer dans cette voie.... en attendant une solution efficace côté firmware 'double' sur 16u2.

Vusb marche avec arduino 0023 je peux le garantir, de même pour le schéma du lien cité plus haut :wink:

al1fch:
Pour info : LUFA Hacks Archives | Arduino Blog

Sympa ! Je bookmark :slight_smile:

Hs: J'attends d'avoir ma UNO Rev3 pour porter le programmateur avr-ISP de la lib LUFA dessus. L'avantage ? Pouvoir reprogrammer son arduino directement en ISP sans le moindre programmateur externe 8) (J'avais pas pu le mettre sur la UNO Rev-1/2 car le 8u2 n'avait pas assez de flash :stuck_out_tongue_closed_eyes:)

J'ai refait 2 fois le montage et sa ne fonctionne pas, Windows ne détecte même pas la carte.
Par contre je n'est pas mis de condensateur de régulation il en faut un de quelle capacité ?

je le donne le code au cas où c'est lui qui à un problème.

#include "UsbKeyboard.h"
int ledPin = 13;

void setup()
{
  // Set up the activity display LED
  pinMode (ledPin, OUTPUT);
  digitalWrite (ledPin, HIGH);

  // Disable timer0 since it can mess with the USB timing. Note that
  // this means some functions such as delay() will no longer work.
  TIMSK0&=!(1<<TOIE0);

  // Clear interrupts while performing time-critical operations
  cli();

  // Force re-enumeration so the host will detect us
  usbDeviceDisconnect();
  delayMs(250);
  usbDeviceConnect();

  // Set interrupts again
  sei();
}

/**
* Main program loop. Scan for keypresses and send a matching keypress
* event to the host
* FIXME: currently repeats as fast as it can. Add transition detection
*/
void loop()
{
  UsbKeyboard.update();

      UsbKeyboard.sendKeyStroke(KEY_A);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  
 
    UsbKeyboard.sendKeyStroke(KEY_B);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  
  
    UsbKeyboard.sendKeyStroke(KEY_C);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  
 
    UsbKeyboard.sendKeyStroke(KEY_D);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
    }

/**
* Define our own delay function so that we don't have to rely on
* operation of timer0, the interrupt used by the internal delay()
*/
void delayMs(unsigned int ms)
{
  for (int i = 0; i < ms; i++) {
    delayMicroseconds(1000);
  }
}

Le site original de la version vusb pour arduino : Project Log : Arduino USB - ProjectLogArduinoUSB est down et la seul version que j'ai s’appelle "vusb-for-arduino-005" si c'est une ancienne version a celle que tu a utilisé sa expliquerai pourquoi sa ne marche pas.

leni:
J'ai refait 2 fois le montage et sa ne fonctionne pas, Windows ne détecte même pas la carte.
Par contre je n'est pas mis de condensateur de régulation il en faut un de quelle capacité.

Le site original de la version vusb pour arduino : Project Log : Arduino USB - ProjectLogArduinoUSB est down et la seul version que j'ai s’appelle "vusb-for-arduino-005" si c'est une ancienne version a celle que tu a utilisé sa expliquerai pourquoi sa ne marche pas.

La lib : Google Code Archive - Long-term storage for Google Code Project Hosting. -> v5
Ide 0023 ou 1.0

code :

/**
 * VirtualUsbKeyboard
 *
 * Enumerates itself as a HID (Human Interface Device) to a host
 * computer using a USB shield. The Arduino then appears to the host to
 * be a USB keyboard and keypress events can be sent on demand.
 *
 * This example watches the state of 6 push buttons and when a button
 * is pressed it sends a matching keypress event to the host.
 *
 * Copyright 2009 Jonathan Oxer <jon@oxer.com.au>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version. http://www.gnu.org/licenses/
 *
 * www.practicalarduino.com/projects/easy/virtual-usb-keyboard
 */

// Requires the use of the "UsbKeyboard" library available from
//   http://code.rancidbacon.com/ProjectLogArduinoUSB
#include "UsbKeyboard.h"

// Define the inputs to use for buttons
#define BUTTON_A 6
#define BUTTON_B 7
#define BUTTON_C 8
#define BUTTON_D 9
#define BUTTON_MSG 10
#define BUTTON_ENTER 11

// Use the on-board LED as an activity display
int ledPin = 13;

/**
 * Configure button inputs and set up the USB connection to the host
 */
void setup()
{
  // Set up the activity display LED
  pinMode (ledPin, OUTPUT);
  digitalWrite (ledPin, HIGH);

  // Set the button pins to inputs
  pinMode (BUTTON_A, INPUT);
  pinMode (BUTTON_B, INPUT);
  pinMode (BUTTON_C, INPUT);
  pinMode (BUTTON_D, INPUT);
  pinMode (BUTTON_MSG, INPUT);
  pinMode (BUTTON_ENTER, INPUT);

  // Enable the CPU's internal 20k pull-up resistors on the button
  // inputs so they default to a "high" state
  digitalWrite (BUTTON_A, HIGH);
  digitalWrite (BUTTON_B, HIGH);
  digitalWrite (BUTTON_C, HIGH);
  digitalWrite (BUTTON_D, HIGH);
  digitalWrite (BUTTON_MSG, HIGH);
  digitalWrite (BUTTON_ENTER, HIGH); 

  // Disable timer0 since it can mess with the USB timing. Note that
  // this means some functions such as delay() will no longer work.
  TIMSK0&=!(1<<TOIE0);

  // Clear interrupts while performing time-critical operations
  cli();

  // Force re-enumeration so the host will detect us
  usbDeviceDisconnect();
  delayMs(250);
  usbDeviceConnect();

  // Set interrupts again
  sei();
}


/**
 * Main program loop. Scan for keypresses and send a matching keypress
 * event to the host
 * FIXME: currently repeats as fast as it can. Add transition detection
 */
void loop()
{
  UsbKeyboard.update();

  if (digitalRead(BUTTON_A) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_A);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_B) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_B);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_C) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_C);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_D) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_D);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_MSG) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_H, MOD_SHIFT_LEFT);
    UsbKeyboard.sendKeyStroke(KEY_E);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_O);
    UsbKeyboard.sendKeyStroke(KEY_SPACE);
    UsbKeyboard.sendKeyStroke(KEY_W);//, MOD_SHIFT_LEFT);
    UsbKeyboard.sendKeyStroke(KEY_O);
    UsbKeyboard.sendKeyStroke(KEY_R);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_D);
    UsbKeyboard.sendKeyStroke(KEY_ENTER);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_ENTER) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_ENTER);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }
}


/**
 * Define our own delay function so that we don't have to rely on
 * operation of timer0, the interrupt used by the internal delay()
 */
void delayMs(unsigned int ms)
{
  for (int i = 0; i < ms; i++) {
    delayMicroseconds(1000);
  }
}

mon circuit :

-> marche nikel !
Point important : il faut brancher l'usb puis faire un reset de l'arduino.

Donc vérifie que les zener que tu utilise sont bien des 3v3, et que tes fils ne soit pas trop long, il n'y a aucune raison que cela marche pour moi et pas pour toi :wink:

Mes zener sont des 3v6, j'ai pas de résistance de 68 donc j'ai mis 3 de 22 sa fait 24 au multimètre.

Vusb fonctionne sur une mega 2650 ?

leni:
Vusb fonctionne sur une mega 2650 ?

Fallait le dire tout de suite !

Vusb "brut" fonctionne avec l'ATmega2560 mais pas la lib vusb-for-arduino.
Regarde dans config.h il y a la définition du port et des bits correspondant au broches que tu veut utiliser, faudra aussi modifier UsbKeyboard.h

Si tu garde la config de base il faudrait utiliser PD2, PD4, PD5, sauf que sur la mega PD4 et PD5 ne sont relié à aucune broche donc ça peut pas marcher.

Quand tu dis relier à aucune broche sa veut dire quelles ne sont pas utilisable ?

leni:
Quand tu dis relier à aucune broche sa veut dire quelles ne sont pas utilisable ?

Regarde par toi même tu comprendra :wink:

(PD4 - PD5)

j'ai modifié dans le dossier Usbkeyboard usbsonfig.h

#define USB_CFG_DMINUS_BIT      6
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */

et

#define USB_CFG_PULLUP_BIT          7
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 * above) where the 1.5k pullup resistor is connected. See description
 * above for details.
 */

//private: TODO: Make friend? c'etait dans le UsbKeyboard.h

Il y a d'autre chose à modifier ?

leni:
Il y a d'autre chose à modifier ?

Si tu reste sur le port D normalement non.

Les port sont configuré comme dans le schéma que tu ma donné ?

ph3 signifie port H pin 3 ?

leni:
ph3 signifie port H pin 3 ?

Yes :wink:

J'ai remodifier le fichier de config et windows le détecte, enfin il est non reconnue mais c'est un mieux l'erreur est "Windows a arrêté ce périphérique car il présente des problèmes. (Code 43)"

Le fichier de config indique BIT pour configuré chaque sortie, ça correspond au numéro marqué sur le pcb où comme je pense au numéro à droite de la lettre du port écrite là http://arduino.cc/en/Hacking/PinMapping2560 ?

Ma nouvelle config c'est :

#define USB_CFG_IOPORTNAME      E

#define USB_CFG_DMINUS_BIT      4
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */
#define USB_CFG_DPLUS_BIT       3
#define USB_CFG_PULLUP_IOPORTNAME   E
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
 * V+, you can connect and disconnect the device from firmware by calling
 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
 * This constant defines the port on which the pullup resistor is connected.
 */
#define USB_CFG_PULLUP_BIT          5
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 * above) where the 1.5k pullup resistor is connected. See description
 * above for details.

il y a aussi une define pour l'horloge

#define USB_CFG_CLOCK_KHZ       (F_CPU/1000)
/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
 * 16500 and 20000. The 12.8 MHz and 16.5 MHz versions of the code require no
 * crystal, they tolerate +/- 1% deviation from the nominal frequency. All
 * other rates require a precision of 2000 ppm and thus a crystal!
 * Default if not specified: 12 MHz

La uno et la mega n’ont pas la même fréquence non ?

leni:
Le fichier de config indique BIT pour configuré chaque sortie, ça correspond au numéro marqué sur le pcb où comme je pense au numéro à droite de la lettre du port écrite là http://arduino.cc/en/Hacking/PinMapping2560 ?

Le numéro de bit correspond au numéro de port, exemple PD4 -> port D, bit 4

leni:
La uno et la mega n’ont pas la même fréquence non ?

La uno et la mega ont la même fréquence 16MHz défini comme F_CPU.

D'aprés ta nouvelle config :
D+ -> D5
D- -> D2
Dup -> D3

Dans UsbKeyboard.h il faudra modifier :

PORTD = 0; 
DDRD |= ~USBMASK;

par

PORTE = 0;
DDRE |= ~USBMASK;

ça ne marche toujours pas, je vais faire un test ce soir pour voir si ce n'est pas les zeners qui ont un défaut.
Ton condensateur de régulation fessait quelle capacité ?