Go Down

Topic: controler la souris avec accelerometre sur la UNO (Read 1 time) previous topic - next topic

benichou

Bonjour à tous,

j'ai un projet en cours, je dois pouvoir contrôler le curseur de la souris sous windows à partir de l'arduino UNO,sur laquelle est branché un ADXL3xx de sparkfun pour les mouvements du curseur et deux résistance flexibles qui sont d'abord branchées sur un convertisseur analogique/numérique qui sera lui branché sur la UNO.

Je suis débutant avec les cartes Arduino. J'ai lu la documentation pour acquérir les données des accéleromètres. Pour l'instant , je souhaite utiliser que deux axes (x et y);
J'ai vu qu'avec la Uno, on pouvait reprogrammer l'ATMega8U2(controleur usb) pour qu'il soit reconnu comme un souris HID par le pc. J'aimerais donc savoir ce qu'il faut faire, je n'ai pas compris comment utiliser la librairie LUFA qui permet de faire cela. De plus je me demande ce qu'il faut que "j'envoi" comme donnée en USB, pour que le curseur se déplace.

Le convertisseur analogique/numérique ( a partir d'un comparateur) étant en cours d'élaboration, il ne va pas tarder a être graver, la fonction clique serait aussi intéressante.
je sais qu'il existe déja des projets la dessus, cependant la plupart utilise la duelmilanove, et donc passe par le port série voir en PS2, mais ils ont besoins de pilote pour le pc
je voudrais donc passer par l'usb de l'uno et profiter du driver mouse/HID déjà fait pour que je ne redeveloppe pas le pilote sur windows.

Merci


Luj06

Il faut suivre le tutoriel de ant.b qui l'a fait :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1285962838

Il y a une structure dédiée à la souris dans la lib LUFA, yaka suivre :
http://www.fourwalledcubicle.com/files/LUFA/Doc/101122/html/struct_u_s_b___mouse_report___data__t.html#_details

Cette structure doit être remplie avec les valeurs de l'accéléro et retournée par la fonction de callback HID.



benichou

merci pour ta réponse, cependant je n'ai pas accès a l'ancien forum, j 'ai un message " you are not allowed to access this section"
donc si tu pouvais m'en faire un copier coller ici, ou alors me donner un autre lien.
J'ai regardé du coté de la structure lufa, mais je ne vois absolument pas comment m'en servir.
J'ai regarder le HID.h que j'ai téléchargé avec la librairie, et je vois plein d'enum avec des paramètres.
Cependant, cela ne me semble pas être du language arduino mais plutot du c/c++.
Donc faut que j'en fasse quoi? et comment je flash le controleur usb de la uno?
si tout cela est dans le tuto de ant.b, j'en ai vraiment besoin.
Cordialement

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

benichou

#4
Mar 13, 2011, 07:46 pm Last Edit: Mar 13, 2011, 07:48 pm by benichou Reason: 1
Rebonjour,
je fait un deterrage mais j'ai pas eu le temps de prendre le temps de suivre le tuto et de m'occuper de mon projet avant.
J'ai avancé,j'ai suivi le tuto de ant.b,je vous poste mon code ici, qui pourrait poser problème, car ma uno est bien detectée en tant que LUFA mouse demo.
mais mon curseur ne bouge pas, donc je ne sais pas si c'est parce qu'avec le tuto de ant.b, on supprime quelque chose qui n'est pas utile pour le joystick, mais qu'il l'est pour la souris? ou si c'est moi qui fais des erreurs de type entre int et byte, ou meme autre chose.
voila mon Mouse.c
Code: [Select]


/** \file
*
*  Main source file for the Mouse demo. This file contains the main tasks of
*  the demo and is responsible for the initial application hardware configuration.
*/

#include "Mouse.h"
#include <LUFA/Drivers/Peripheral/Serial.c>
uint8_t dataIn;
uint8_t data[5];//data[0]:rien,data[1] et data[3]:direction et data[2] et data[4]:valeur
uint8_t counter;

/** Buffer to hold the previously generated Mouse HID report, for comparison purposes inside the HID class driver. */
uint8_t PrevMouseHIDReportBuffer[sizeof(USB_MouseReport_Data_t)];

/** LUFA HID Class driver interface configuration and state information. This structure is
*  passed to all HID Class driver functions, so that multiple instances of the same class
*  within a device can be differentiated from one another.
*/
USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
{
.Config =
{
.InterfaceNumber              = 0,

.ReportINEndpointNumber       = MOUSE_EPNUM,
.ReportINEndpointSize         = MOUSE_EPSIZE,
.ReportINEndpointDoubleBank   = false,

.PrevReportINBuffer           = PrevMouseHIDReportBuffer,
.PrevReportINBufferSize       = sizeof(PrevMouseHIDReportBuffer),
},
};

/** Main program entry point. This routine contains the overall program flow, including initial
*  setup of all components and the main program loop.
*/
int main(void)
{
SetupHardware();


sei();

for (;;)
{
HID_Device_USBTask(&Mouse_HID_Interface);
USB_USBTask();
if(counter==5){counter=0;}
if(Serial_IsCharReceived())
{
dataIn=Serial_RxByte();
if(dataIn == 0xFF){counter=0;}
data[counter]=dataIn;
counter+=1;

}

}
}

/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF);
wdt_disable();
Serial_Init(9600, false);
/* Disable clock division */


/* Hardware Initialization */



USB_Init();
}

/** Event handler for the library USB WakeUp event. */
void EVENT_USB_Device_Connect(void)
{
// fonction for led delete
}

/** Event handler for the library USB Suspend event. */
void EVENT_USB_Device_Disconnect(void)
{
// fonction for led delete
}

/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_Device_ConfigurationChanged(void)
{
bool ConfigSuccess = true;

ConfigSuccess &= HID_Device_ConfigureEndpoints(&Mouse_HID_Interface);

USB_Device_EnableSOFEvents();


}

/** Event handler for the library USB Control Request reception event. */
void EVENT_USB_Device_ControlRequest(void)
{
HID_Device_ProcessControlRequest(&Mouse_HID_Interface);
}

/** Event handler for the USB device Start Of Frame event. */
void EVENT_USB_Device_StartOfFrame(void)
{
HID_Device_MillisecondElapsed(&Mouse_HID_Interface);
}

bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
                                         uint8_t* const ReportID,
                                         const uint8_t ReportType,
                                         void* ReportData,
                                         uint16_t* const ReportSize)
{
USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData;

if (data[1]==8)// est ce bien ca? j'envoi :8 en byte
  MouseReport->X = -data[2];  // est ce que cela peut etre negatif? et le x represente le nombre de pixel du deplacement sur l'axe X ou la position sur l'ecran? auquel
                                                   //cas on dois ajouter le data a la valeur precedente
else if (data[1]==4)
  MouseReport->X =  data[2];
 
if (data[3]==16)
  MouseReport->Y = -data[4];
else if (data[3]==32)
  MouseReport->Y = data[4];




*ReportSize = sizeof(USB_MouseReport_Data_t);
return true;
}

/** HID class driver callback function for the processing of HID reports from the host.
*
*  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
*  \param[in] ReportID    Report ID of the received report from the host
*  \param[in] ReportType  The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
*  \param[in] ReportData  Pointer to a buffer where the created report has been stored
*  \param[in] ReportSize  Size in bytes of the received HID report
*/
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
                                          const uint8_t ReportID,
                                          const uint8_t ReportType,
                                          const void* ReportData,
                                          const uint16_t ReportSize)
{
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
}


et mon code sur la uno:
Code: [Select]
const int groundpin = 18;             // analog input pin 4 -- ground
const int powerpin = 19;              // analog input pin 5 -- voltage
const int xpin = A1;                  // x-axis of the accelerometer
const int ypin = A0;                // y-axis
int x_axe;
int y_axe;
int temp;
byte dataStart = 0xFF;
//const int zpin = A1;   

void setup()
{
  // initialize the serial communications:
  Serial.begin(9600);
 
  // Provide ground and power by using the analog inputs as normal
  // digital pins.  This makes it possible to directly connect the
  // breakout board to the Arduino.  If you use the normal 5V and
  // GND pins on the Arduino, you can remove these lines.
  //pinMode(groundpin, OUTPUT);
  //pinMode(powerpin, OUTPUT);
  //digitalWrite(groundpin, LOW);
  //digitalWrite(powerpin, HIGH);
}

void loop()
{
  Serial.print(dataStart); //byte pour signaler le debut de l'envoi
  // print the sensor values:
  x_axe=analogRead(xpin);// on recupère les valeurs pour x
  y_axe=analogRead(ypin);// on recupère les valeurs pour x
 
  if(x_axe < 475)
  {// si angle >20°
    Serial.print(8,BYTE);
    //Serial.print("\t");
    temp=480-x_axe;
    Serial.print(temp,BYTE);// on envoi la diffèrence par rapport a l'angle 0
  }
  else if(x_axe > 545)// si angle <-20°
   {
     Serial.print(4,BYTE);
     //Serial.print("\t");
     temp=x_axe-530;
     Serial.print(temp,BYTE);//on envoi la diffèrence par rapport a l'angle 0
   }
   else{
     Serial.print(0,BYTE);
     Serial.print(0,BYTE);
   }
  // print a tab between values:
 
 
  if(y_axe < 475)// si angle >20°
  {
   
     Serial.print(32,BYTE);
   //Serial.print("\t");
    temp=480-y_axe;
    Serial.print(temp,BYTE);// on envoi la diffèrence par rapport a l'angle 0

  }
  else if(y_axe > 545)// si angle <-20°
  {   
     Serial.print(16,BYTE);
    //Serial.print("\t");
     temp=y_axe-530;
     Serial.print(temp,BYTE);//on envoi la diffèrence par rapport a l'angle 0
  }
  else {
    Serial.print(0,BYTE);
    Serial.print(0,BYTE);
}
   
 
  // delay before next reading:
  delay(500);
}


merci de votre aide par avance, j'ai supprimé les includes joystick.h et bouton.h de mon Mouse.h ainsi que toutes les références aux leds, et j'ai mis en target du makefile Mouse, pour l'instant je ne gère pas les boutons, ils seront implementés plus tard avec des resistances flexibles. J'ai pas touché au descriptor, peut etre dois-je modifier les logical Maximum et logical minimum qui sont par defaut a 0 et 1.

Go Up