Go Down

Topic: Tutorial - How to change firmware on 8u2 (Read 116 times) previous topic - next topic

Blue_Boy

#35
Dec 08, 2010, 04:27 pm Last Edit: Dec 08, 2010, 07:28 pm by Blue_Boy Reason: 1
I thought of this too.
Didn't make a difference.
Why did you add the extra 0x00 after 0xff by the way?
My Code, as it stands now.

Hid Descriptor
Code: [Select]
USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
{
     0x05, 0x01,          /* Usage Page (Generic Desktop)                       */
     0x09, 0x04,          /* Usage (Joystick)                                   */
     0xa1, 0x01,          /* Collection (Application)                           */
     0x09, 0x01,          /*   Usage (Pointer)                                  */
     0xa1, 0x00,          /*   Collection (Physical)                            */
     0x05, 0x01,          /*     Usage Page (Generic Desktop)                   */
     0x09, 0x30,          /*     Usage (X)                                      */
     0x09, 0x31,          /*     Usage (Y)                                      */
     0x09, 0x32,          /*     Usage (Z)                                      */
     0x09, 0x35,          /*     Usage (Rz)                                     */
     0x15, 0x00,          /*     Logical Minimum (0)                         */
     0x26, 0xff, 0x00,    /*     Logical Maximum (255)                          */
     0x75, 0x08,          /*     Report Size (8)                                */
     0x95, 0x04,          /*     Report Count (4)                               */
     0x81, 0x82,          /*     Input (Data, Variable, Absolute, Volatile)     */
     0xc0,                /*   End Collection                                   */
     0x05, 0x09,          /*   Usage Page (Button)                              */
     0x09, 0x02,          /*   Usage (Button 2)                                 */
     0x09, 0x01,          /*   Usage (Button 1)                                 */
     0x15, 0x00,          /*   Logical Minimum (0)                              */
     0x25, 0x01,          /*   Logical Maximum (1)                              */
     0x75, 0x01,          /*   Report Size (1)                                  */
     0x95, 0x02,          /*   Report Count (2)                                 */
     0x81, 0x02,          /*   Input (Data, Variable, Absolute)                 */
     0x75, 0x06,          /*   Report Size (6)                                  */
     0x95, 0x01,          /*   Report Count (1)                                 */
     0x81, 0x01,          /*   Input (Constant)                                 */
     0xc0                 /* End Collection                                     */
};


Code: [Select]
typedef struct
           {
                 int8_t  X; /**< Current absolute joystick X position, as a signed 8-bit integer */
                 int8_t  Y; /**< Current absolute joystick Y position, as a signed 8-bit integer */
                 int8_t  Z; /**< Current absolute joystick Z position, as a signed 8-bit integer */
                 int8_t  Rz; /**< Current absolute joystick Rz position, as a signed 8-bit integer */
                 uint8_t Button; /**< Bit mask of the currently pressed joystick buttons */
           } USB_JoystickReport_Data_t;


Data Holders

Code: [Select]
uint8_t dataIn;
uint8_t data[5];
uint8_t counter;


Main loop

Code: [Select]
int main(void)
{
     SetupHardware();
     
     //LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
     
     sei();
     
     for (;;)
     {
           HID_Device_USBTask(&Joystick_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;
           }


     }
}


Code: [Select]
USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;

JoystickReport->X  =  data[1];
JoystickReport->Y  =  data[2];
JoystickReport->Z  =  data[3];
JoystickReport->Rz =  data[4];

JoystickReport->Button = 0;

*ReportSize = sizeof(USB_JoystickReport_Data_t);
     return false;


And Arduino code:

Code: [Select]
int sensorBottom[] = {0, 0, 0, 0};
int sensorTop[] = {1024, 1024, 1024, 1024};

byte dataStart = 0xFF;
byte sensorValue;

void setup()
 {  
 // initialize serial communications at 9600 bps:
 Serial.begin(9600);
 }

void loop() {
 // Send start byte to 8u2
 Serial.print(dataStart);
 
 for (int i = 0; i < 4; i++)
   {
   sensorValue = analogRead(i);            

   sensorValue = map(sensorValue, sensorBottom[i], sensorTop[i], 0, 255);
   sensorValue = constrain(sensorValue, 0, 255);
   
   // print the results to the serial monitor:        
   Serial.print(sensorValue);
   }
 delay(40);    
}


Problem: the values "wrap" around.
In the Windows 7 calibrate dialog I see the values ranging from 0 to 63 and then wrap around, a total of 4 time. (This makes sense in a way, it equals 256. I'm still not sure why though...)
Also, no matter what range (I tried 64 steps instead of 265), the values still "roll around" 4 times in a row.

ant.b

#36
Dec 08, 2010, 11:52 pm Last Edit: Dec 09, 2010, 12:17 am by ant.b Reason: 1
The problem seems to be with
Code: [Select]
sensorValue = analogRead(i);
sensorValue is a byte so its range is 0-255

then you map:
Code: [Select]
sensorValue = map(sensorValue, 0, 1024, 0, 255);
 so sensorValue=255*255/1024=63  

I hope this can help you

PaulS

Code: [Select]
sensorValue = map(sensorValue, 0, 1024, 0, 255);
Please don't do this.
sensorValue = analogRead(i)/4;
produces the same result, in much less time.

Blue_Boy

Hey Guys,
You were right.
It was indeed the analogRead() value being pushed in a byte.
Thanks!

fkeel


thanks for this tutorial. gives me some hope to be able to build my custom mouse one day :-)

Go Up