This is a USB mouse(Device). The mouse positions can be changed with the potentiometers on the MBD

Dependencies:   C12832_lcd DebounceInterrupts USBDevice mbed

Fork of USBAbsoluteMouse by Adam Green

USB Mouse

Goal

To build a USB Mouse (Host and device) using two MBEDs and test the communication between them.

Details

This is a device part of the USB mouse Project. The USB mouse project uses two MBED boards.

There is a bubble on the LCD of the Host MBED. The position of this bubble can be controlled using the potentiometers on the device MBED.

Pin Mappings

  • Pot1 is used to control Y position of the bubble
  • Pot2 is used to control X position of the bubble
  • Right button on joystick is used to emulate the right click
  • Left button on joystick is used to emulate the left click
  • Center button of joystick is used to emulate the pressing of the wheel

Block Diagram/Connection diagram

/media/uploads/bhakti08/block_diagram.jpg

Design Constraints

The output of the USB mouse(device) is adjusted according to the limits of the LCD on the other MBED board(the host). Due to this this mouse positions may be incorrect for any other sizes of the LCD or the Host computer.

Complete Testing(For both device and host)

Case DescriptionOutput ExpectedActual OutputStatus
ConnectionThe USB device should be properly enumerated when connected to the hostConnection recognized by the hostPASS
If the device is disconnected from the host, there should be some error messageWhen the device is disconnected, the LED4 on Host turns OFF and "Connect the USB mouse" is displayed on the LCDPass
Move Pot1 on the device and check the position of bubble on the Host.The pot should be able to control the bubble for the entire range of the LCD.Using Pot1 the Y position is controlled and the bubble moves from topmost position to bottom most positionPASS
Move Pot2 on the device and check the position of bubble on the Host.The pot should be able to control the bubble for the entire range of the LCD.Using Pot2 the X position is controlled and the bubble moves from leftmost position to the rightmost positionPASS
Press the left switch of the joystick on the deviceThe left click should be detected and the LED on the host should turn ONLED2 on the host turns ON. Thus, a left click on the device is detected by the host.PASS
Press the right switch of the joystick on the deviceThe right click should be detected and the LED on the host should turn ONLED1 on the host turns ON. Thus, a right click on the device is detected by the host.PASS
Press the center switch of the joystick on the deviceThe click of the wheel should be detected and the LED on the host should turn ONLED3 on the host turns ON. Thus, a wheel the wheel being clicked the device is detected by the host.PASS
Disconnect the host from the deviceThe LED4 on the host should turn OFFThe LED4 turns OFF along with the message on the LCD "Connect the USB mouse".PASS

Testing Device Specific

Power ConsumptionThe power consumed by the USB Device should be less than the specified valueThe power consumed by the device is approximately 700mW which satisfies the specifications.PASS
Operation when connected to the HubThe device operation should not be altered.The device works as expected even if it is connected to the host through a USB HubPASS
Compatibitity with other OSTest the device with various OSThe device is being tested on windows 8. The device works but the cursor movement is not as expected. This is because the resolution of the LCD on MBED does not match with the screen. The buttons work as expected. This error can be resolved by using the absolute mouse instead of relative.Not tested with all OS.
Working on heavy trafficLoad the USB bus with various devices.The device should be working properly.Not tested

Device Code

Import programUSB_Project_Device

This is a USB mouse(Device). The mouse positions can be changed with the potentiometers on the MBD

main.cpp

/*****************************************************************************/
/*Function: This program is used to emulate a USB Mouse. The mouse position  */
/*          can be changed by the potentiometers. The output values of x and */
/*          y are modified to move the bubble on the LCD on another MBED     */
/*          acting as USB Host. The program for MBED USB Host can be found at*/
/*          http://mbed.org/users/bhakti08/code/USB_Project_Host/            */
/*Author:   Bhakti Kulkarni                                                  */
/*Date:     03/27/2014                                                       */
/*****************************************************************************/
#include <mbed.h>
#include <USBMouse.h>
#include "DebouncedIn.h"
#include "C12832_lcd.h"
#include "DebouncedInterrupt.h"

#define RANGE 0.02
#define INTERRUPT
#define X_MAX 120
#define Y_MAX 28
#define x_move 7
#define y_move 3

Serial pc(USBTX,USBRX);

DebouncedIn right_click(p13);      //Button enulating right click
DebouncedIn left_click(p16);       //Button emulating left click
DebouncedIn wheel(p14);            //Button emulating the wheel button
C12832_LCD lcd;
AnalogIn X_in(p20);               //Analog input to move bubble in x position
AnalogIn Y_in(p19);               //Analog input to move bubble in y position
 
USBMouse  Mouse;

int Xpos = 0;
int Ypos = 0;

/*****************************************************************************/ 
/*This is the main program. This reads the input from the potentiometers,    */
/*converts them into the values that are required for the lcd display        */
/*and then sends them as the mouse outputs.                                  */
/*****************************************************************************/ 
int main()
{
   float AinX_old = 0;
   float AinX_new;
   float AinY_old = 0;
   float AinY_new;
   while (true){
        if(left_click)
        {
            Mouse.click(MOUSE_LEFT);  //if left click is pressed,
                                      // emulate mouse left
        }
        if (right_click)
        {
            Mouse.click(MOUSE_RIGHT);  //if right click is pressed,
                                      // emulate mouse right
        }
        if (wheel)
        {
            Mouse.click(MOUSE_MIDDLE); //if wheel button is pressed,
                                      // emulate wheel button pressed
        }
        AinX_new = X_in.read();
        //check if the values are between the LCD values
        if (AinX_new >= AinX_old + RANGE){         
            if (Xpos < X_MAX)
                Xpos += x_move;
            else
                Xpos = Xpos;
            AinX_old = AinX_new;        
        }
        else if (AinX_new < AinX_old - RANGE){
            if (Xpos > 0)
                Xpos -= x_move;
            else
                Xpos = Xpos;
            AinX_old = AinX_new;        
        }
        else
            Xpos = Xpos;
            
        AinY_new = Y_in.read();
        if (AinY_new >= AinY_old + RANGE){
            if (Ypos < Y_MAX)
                Ypos += y_move;
            else
                Ypos = Ypos;
            AinY_old = AinY_new;        
        }
        else if (AinY_new < AinY_old - RANGE){
            if (Ypos > 0)
                Ypos -= y_move;
            else
                Ypos = Ypos;
            AinY_old = AinY_new;        
        }
        else
            Ypos = Ypos;
        Mouse.move(Xpos,Ypos);      //Send the values as the mouse output
    }
}

/*****************************************************************************/

Host code

Import programUSB_Project_Host

USB Host

main.cpp

/*****************************************************************************/
/*                                   USB MOUSE HOST                          */
/*Function: This program is used to connect the MBED USB mouse. The bubble   */
/*          on the LCD moves according to the input from the USB device.     */
/*          The program for the MBED USB Device can be found at following    */
/*          location:                                                        */
/*          <http://mbed.org/users/bhakti08/code/USB_Project_Device/>        */
/*Author:   Bhakti Kulkarni                                                  */
/*Date:     03/27/2014                                                       */
/*****************************************************************************/

#include "mbed.h"
#include "USBHostMouse.h"
#include "C12832_lcd.h"
#include "DebouncedInterrupt.h"
#include "DebouncedIn.h"

DigitalOut connect(LED4);     //LED to indicate USB Mouse connected
C12832_LCD lcd;
Serial pc(USBTX,USBRX);
BusOut button (LED1,LED2,LED3);   //LEDs for the Button pressed on Device

/*Global Variables to process the X abd Y values*/
int x_lcd=0,y_lcd=0;
int Xpos=0,Ypos=0;
uint8_t buttons; 
int8_t x; 
int8_t y; 
int8_t z;
uint8_t b;

/*****************************************************************************/
/*Function: OnMouseEvent()                                                   */
/*          This function is called whenever there is change in mouse data   */
/*          It copies the values of x,y and buttons from the device into     */
/*          variables that can be accessed by the main logic to move the     */
/*          bubble on the LCD                                                */
/*Inputs:   The x,y and button values from the Mouse.                        */
/*Outputs:  None.                                                            */
/*****************************************************************************/
void onMouseEvent(uint8_t buttons, int8_t x, int8_t y, int8_t z) {
    pc.printf("Mouse values: x= %d, y= %d\r\n",x,y);
    //pc.printf("Buttons are: %d/r/n",buttons);
    Xpos = x;
    Ypos = y;
    b = buttons;// & 0x03;
}
/*****************************************************************************/

/*****************************************************************************/
/*This thread is the mouse_task thread which will check for the USB Device   */
/*connectivity. If the device is not connected it will issue an error message*/
/*Once the device is connected, this thread will attach the mouse event      */
/*thread.                                                                    */
/*****************************************************************************/
void mouse_task(void const *) {
    
    USBHostMouse mouse;
    
    while(1) {
        
        // try to connect a USB mouse
        while(!mouse.connect()){
            lcd.cls();
            lcd.locate(0,0);
            lcd.printf("Connect the USB Mouse\n");
            Thread::wait(500);
        }
    
        // when connected, attach handler called on mouse event
        mouse.attachEvent(onMouseEvent);
        
        // wait until the mouse is disconnected
        while(mouse.connected()){
            lcd.cls();
            connect = 1;
            lcd.fillcircle(Xpos,Ypos, 2, 1); 
            wait(.05);
            lcd.fillcircle(Xpos,Ypos, 2, 1);
            pc.printf("%d\r\n",b); 
            button = b;
            Thread::wait(100);
        }
         connect= 0;
    }
}
/*****************************************************************************/

/*****************************************************************************/
/*This is the main thread. This will do nothing but initiate the mouse task  */
/*thread and then wait forever in the loop                                   */
/*****************************************************************************/ 
int main() {
    Thread mouseTask(mouse_task, NULL, osPriorityNormal, 256 * 4);
    while(1) {
        Thread::wait(osWaitForever);
    }
}
/*****************************************************************************/

Note:Two Programs should be downloaded on different MBEDs.

Committer:
bhakti08
Date:
Thu Mar 27 19:04:33 2014 +0000
Revision:
4:42fa048620b3
Parent:
3:976579c5ba99
Modified to add comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bhakti08 4:42fa048620b3 1 /*****************************************************************************/
bhakti08 4:42fa048620b3 2 /*Function: This program is used to emulate a USB Mouse. The mouse position */
bhakti08 4:42fa048620b3 3 /* can be changed by the potentiometers. The output values of x and */
bhakti08 4:42fa048620b3 4 /* y are modified to move the bubble on the LCD on another MBED */
bhakti08 4:42fa048620b3 5 /* acting as USB Host. The program for MBED USB Host can be found at*/
bhakti08 4:42fa048620b3 6 /* http://mbed.org/users/bhakti08/code/USB_Project_Host/ */
bhakti08 4:42fa048620b3 7 /*Author: Bhakti Kulkarni */
bhakti08 4:42fa048620b3 8 /*Date: 03/27/2014 */
bhakti08 4:42fa048620b3 9 /*****************************************************************************/
AdamGreen 0:b2c327d045a2 10 #include <mbed.h>
AdamGreen 0:b2c327d045a2 11 #include <USBMouse.h>
bhakti08 3:976579c5ba99 12 #include "DebouncedIn.h"
bhakti08 3:976579c5ba99 13 #include "C12832_lcd.h"
bhakti08 3:976579c5ba99 14 #include "DebouncedInterrupt.h"
AdamGreen 0:b2c327d045a2 15
bhakti08 3:976579c5ba99 16 #define RANGE 0.02
bhakti08 3:976579c5ba99 17 #define INTERRUPT
bhakti08 4:42fa048620b3 18 #define X_MAX 120
bhakti08 4:42fa048620b3 19 #define Y_MAX 28
bhakti08 4:42fa048620b3 20 #define x_move 7
bhakti08 4:42fa048620b3 21 #define y_move 3
bhakti08 3:976579c5ba99 22
bhakti08 3:976579c5ba99 23 Serial pc(USBTX,USBRX);
bhakti08 3:976579c5ba99 24
bhakti08 4:42fa048620b3 25 DebouncedIn right_click(p13); //Button enulating right click
bhakti08 4:42fa048620b3 26 DebouncedIn left_click(p16); //Button emulating left click
bhakti08 4:42fa048620b3 27 DebouncedIn wheel(p14); //Button emulating the wheel button
bhakti08 3:976579c5ba99 28 C12832_LCD lcd;
bhakti08 4:42fa048620b3 29 AnalogIn X_in(p20); //Analog input to move bubble in x position
bhakti08 4:42fa048620b3 30 AnalogIn Y_in(p19); //Analog input to move bubble in y position
bhakti08 4:42fa048620b3 31
bhakti08 4:42fa048620b3 32 USBMouse Mouse;
AdamGreen 0:b2c327d045a2 33
bhakti08 3:976579c5ba99 34 int Xpos = 0;
bhakti08 3:976579c5ba99 35 int Ypos = 0;
bhakti08 4:42fa048620b3 36
bhakti08 4:42fa048620b3 37 /*****************************************************************************/
bhakti08 4:42fa048620b3 38 /*This is the main program. This reads the input from the potentiometers, */
bhakti08 4:42fa048620b3 39 /*converts them into the values that are required for the lcd display */
bhakti08 4:42fa048620b3 40 /*and then sends them as the mouse outputs. */
bhakti08 4:42fa048620b3 41 /*****************************************************************************/
bhakti08 4:42fa048620b3 42 int main()
bhakti08 3:976579c5ba99 43 {
bhakti08 3:976579c5ba99 44 float AinX_old = 0;
bhakti08 3:976579c5ba99 45 float AinX_new;
bhakti08 3:976579c5ba99 46 float AinY_old = 0;
bhakti08 3:976579c5ba99 47 float AinY_new;
bhakti08 3:976579c5ba99 48 while (true){
bhakti08 3:976579c5ba99 49 if(left_click)
bhakti08 3:976579c5ba99 50 {
bhakti08 4:42fa048620b3 51 Mouse.click(MOUSE_LEFT); //if left click is pressed,
bhakti08 4:42fa048620b3 52 // emulate mouse left
bhakti08 3:976579c5ba99 53 }
bhakti08 3:976579c5ba99 54 if (right_click)
bhakti08 3:976579c5ba99 55 {
bhakti08 4:42fa048620b3 56 Mouse.click(MOUSE_RIGHT); //if right click is pressed,
bhakti08 4:42fa048620b3 57 // emulate mouse right
bhakti08 4:42fa048620b3 58 }
bhakti08 4:42fa048620b3 59 if (wheel)
bhakti08 4:42fa048620b3 60 {
bhakti08 4:42fa048620b3 61 Mouse.click(MOUSE_MIDDLE); //if wheel button is pressed,
bhakti08 4:42fa048620b3 62 // emulate wheel button pressed
bhakti08 3:976579c5ba99 63 }
bhakti08 3:976579c5ba99 64 AinX_new = X_in.read();
bhakti08 4:42fa048620b3 65 //check if the values are between the LCD values
bhakti08 4:42fa048620b3 66 if (AinX_new >= AinX_old + RANGE){
bhakti08 4:42fa048620b3 67 if (Xpos < X_MAX)
bhakti08 4:42fa048620b3 68 Xpos += x_move;
bhakti08 3:976579c5ba99 69 else
bhakti08 3:976579c5ba99 70 Xpos = Xpos;
bhakti08 3:976579c5ba99 71 AinX_old = AinX_new;
bhakti08 3:976579c5ba99 72 }
bhakti08 3:976579c5ba99 73 else if (AinX_new < AinX_old - RANGE){
bhakti08 3:976579c5ba99 74 if (Xpos > 0)
bhakti08 4:42fa048620b3 75 Xpos -= x_move;
bhakti08 3:976579c5ba99 76 else
bhakti08 3:976579c5ba99 77 Xpos = Xpos;
bhakti08 3:976579c5ba99 78 AinX_old = AinX_new;
bhakti08 3:976579c5ba99 79 }
bhakti08 3:976579c5ba99 80 else
bhakti08 3:976579c5ba99 81 Xpos = Xpos;
bhakti08 3:976579c5ba99 82
bhakti08 3:976579c5ba99 83 AinY_new = Y_in.read();
bhakti08 3:976579c5ba99 84 if (AinY_new >= AinY_old + RANGE){
bhakti08 4:42fa048620b3 85 if (Ypos < Y_MAX)
bhakti08 4:42fa048620b3 86 Ypos += y_move;
bhakti08 3:976579c5ba99 87 else
bhakti08 3:976579c5ba99 88 Ypos = Ypos;
bhakti08 3:976579c5ba99 89 AinY_old = AinY_new;
bhakti08 3:976579c5ba99 90 }
bhakti08 3:976579c5ba99 91 else if (AinY_new < AinY_old - RANGE){
bhakti08 3:976579c5ba99 92 if (Ypos > 0)
bhakti08 4:42fa048620b3 93 Ypos -= y_move;
bhakti08 3:976579c5ba99 94 else
bhakti08 3:976579c5ba99 95 Ypos = Ypos;
bhakti08 3:976579c5ba99 96 AinY_old = AinY_new;
bhakti08 3:976579c5ba99 97 }
bhakti08 3:976579c5ba99 98 else
bhakti08 3:976579c5ba99 99 Ypos = Ypos;
bhakti08 4:42fa048620b3 100 Mouse.move(Xpos,Ypos); //Send the values as the mouse output
AdamGreen 0:b2c327d045a2 101 }
bhakti08 4:42fa048620b3 102 }
bhakti08 4:42fa048620b3 103
bhakti08 4:42fa048620b3 104 /*****************************************************************************/