OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7449|回复: 22

USB空中鼠标实验

[复制链接]

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-4-17 12:44:12 | 显示全部楼层 |阅读模式


原子哥,上面这个截图个是下载你的USB触控实验后,插上USB后,可以在电脑的设备管理器里面显示出来有一个USB外设


下面这个是我的实验,我想使用原子哥的USB通信,下面这个是我的程序,编译也没有错误,但插上USB线后,就是在设备管理器里面找不到USB外设,提示无法识别的USB外设,什么情况呀?原子哥指点呀


合肥-文盲
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-4-17 12:50:23 | 显示全部楼层
回复【楼主位】合肥-文盲:
---------------------------------
坐等原子哥指点呀,在线等
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-4-17 13:09:58 | 显示全部楼层
回复【楼主位】合肥-文盲:
---------------------------------
哪位大神知道呀??指点指点呀
合肥-文盲
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-17 14:05:03 | 显示全部楼层
回复【楼主位】合肥-文盲:
---------------------------------
你换个接口试下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-4-17 14:08:45 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
换了   一样的提示   你看下可是我的程序的问题,我感觉是我移植的程序的问题呀,你QQ多少?我QQ2300950641,我加你   你帮我看看呀
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-4-17 14:10:51 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
#include "usart.h"
#include "sys.h"
#include "delay.h"
#include "hmc5883l.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "inv_mpu.h"
#include "Time.h"
#include "myiic.h"
#include "math.h"
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"


#define Cursor_Step 1

//定义不同测量范围的刻度因子
#define Accel_4_Scale_Factor    8192.0f

#define FILTER_NUM               20
#define Accel_Zout_Offset  400
#define Accel_FILTER_98HZ   98
#define MPU6050_Addr            0x68
#define _M_1                   0x6B
#define Gyro_Xout_H         0x43
#define Accel_Xout_H     0x3B

#define Kp 2.0f     //proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.005f   //integral gain governs rate of convergence of gyroscope biases


u8 data_write[14];
float Gyro_Xout_Offset, Gyro_Yout_Offset, Gyro_Zout_Offset;
float q0, q1, q2, q3;
float exInt = 0, eyInt = 0, ezInt = 0;        // scaled integral error
float init_ax, init_ay, init_az, init_gx, init_gy, init_gz, init_mx, init_my, init_mz;

u8 get_gyro_bias(void); //校准陀螺仪零偏函数
void init_quaternion(void); //得到初始化四元数函数
void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz); //AHRSUpdate算法
float invSqrt(float x); //快速计算 1/Sqrt(x) 


int main(void)
{
int result;
SystemInit();
delay_init(); //SYSTICK的时钟固定为HCLK时钟的1/8,SYSCLK:系统时钟为72MHz.
uart_init(9600); //串口1初始化,波特率为9600,工作在全双工收发模式

NVIC_Configuration();

//USB配置
USB_Interrupts_Config();    
Set_USBClock();   
USB_Init();
SYSTICK_INIT(); 

IIC_Init();
delay_ms(10); 
HMC5883L_Init();
PrintChar("hmc5883l initialization complete......\n "); //hmc5883 initialization complete
HMC5883L_Calibrate();
PrintChar("hmc5883l_calibrate initialization complete......\n "); //hmc5883 initialization complete
result = mpu_init();
if(!result)
{
PrintChar("mpu initialization complete......\n "); //mpu initialization complete

if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL)) //选择所需传感器
PrintChar("mpu_set_sensor complete ......\n");
else
PrintChar("mpu_set_sensor come across error ......\n");

data_write[0]=0x01; //GX_PLL:0x01
if(!IIC_Write(MPU6050_Addr, _M_1, 1, data_write)) //设置MPU6050的时钟源为GX的PLL
PrintChar("mpu6050_set_ClockSource complete ......\n");
else
PrintChar("mpu6050_set_ClockSource error ......\n");

if(!mpu_set_gyro_fsr(500))  //设置陀螺仪测量范围:+-500度/s
PrintChar("mpu_set_gyro_fsr complete ......\n");
else
PrintChar("mpu_set_gyro_fsr error ......\n");

if(!mpu_set_accel_fsr(4))  //设置加速度计测量范围:+-4G
PrintChar("mpu_set_accel_fsr complete ......\n");
else
PrintChar("mpu_set_accel_fsr error ......\n");

if(!mpu_set_lpf(Accel_FILTER_98HZ)) //设置加速度计的低通滤波器DLPF选98hz,
      //后面还需要加权平均滤波
PrintChar("mpu_set_lpf complete ......\n");
else
PrintChar("mpu_set_lpf error ......\n");

if(!mpu_set_sample_rate(DEFAULT_MPU_HZ)) //设置采样率1kHz
PrintChar("mpu_set_sample_rate complete ......\n");
else
PrintChar("mpu_set_sample_rate error ......\n");

if(!get_gyro_bias())  //通过500次静置加权平均求出陀螺仪零偏OFFSET
PrintChar("get_gyro_bias complete ......\n");
else
PrintChar("get_gyro_bias error ......\n");
}
else
PrintChar("mpu initialization error......\n");

PrintChar("Start Calculating .....\n"); //开始计算
delay_ms(2000);      //2s后系统稳定

init_quaternion();    //得到初始化四元数
while(1)
{
uint8_t i;
static uint8_t j;
signed short int gyro[3], accel[3];
static tg_HMC5883L_TYPE hmc5883l;
static u8 filter_cnt=0;
float temp[3]={0};
float ACC_X_BUF[FILTER_NUM], ACC_Y_BUF[FILTER_NUM], ACC_Z_BUF[FILTER_NUM];

if(!IIC_Read(MPU6050_Addr, Accel_Xout_H, 14, data_write))
{
accel[0]=(((signed short int)data_write[0])<<8) | data_write[1];
accel[1]=(((signed short int)data_write[2])<<8) | data_write[3];
accel[2]=((((signed short int)data_write[4])<<8) | data_write[5])   + Accel_Zout_Offset;
gyro[0] =((((signed short int)data_write[8])<<8) | data_write[9]);
gyro[1] =((((signed short int)data_write[10])<<8) | data_write[11]);
gyro[2] =((((signed short int)data_write[12])<<8) | data_write[13]);
 
init_ax=(float)accel[0];      
init_ay=(float)accel[1];
init_az=(float)accel[2];
init_gx=((float)gyro[0] - Gyro_Xout_Offset) * 0.000266;    //单位转化成:弧度/s,0.000266=1/(Gyro_500_Scale_Factor * 57.295780)
init_gy=((float)gyro[1] - Gyro_Yout_Offset) * 0.000266;
init_gz=((float)gyro[2] - Gyro_Zout_Offset) * 0.000266;
//accel加权平均滤波,部分消除震动影响
ACC_X_BUF[filter_cnt] = init_ax;//更新滑动窗口数组
ACC_Y_BUF[filter_cnt] = init_ay;
ACC_Z_BUF[filter_cnt] = init_az;
for(i=0;i<FILTER_NUM;i++)
{
temp[0] += ACC_X_BUF;
temp[1] += ACC_Y_BUF;
temp[2] += ACC_Z_BUF;
}
init_ax = temp[0] * 0.05;     // 相当于除以FILTER_NUM,提高运算速度
init_ay = temp[1] * 0.05;     
init_az = temp[2] * 0.05;     
filter_cnt++;
if(filter_cnt==FILTER_NUM)
filter_cnt=0;                    

j++;
if(j==50)
{
j=0;
HMC5883L_Init();   
delay_ms(10);                  
HMC5883L_MultRead(&hmc5883l);   //读磁阻仪数据(速度:慢, ms级延时过程)
}
//进行x y轴的校准,未对z轴进行校准,参考ST的校准方法 
init_mx =hmc5883l.hx;
init_my =hmc5883l.hy;
init_mz =hmc5883l.hz;

AHRSupdate(init_gx, init_gy, init_gz, init_ax, init_ay, init_az, init_mx, init_my, init_mz);









void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) 
{
float norm, halfT;
float hx, hy, hz, bz, bx;
float vx, vy, vz, wx, wy, wz;
float ex, ey, ez;
// float itch, Roll, Yaw;
static s8 sb_x,sb_y,sb_z;

/*方便之后的程序使用,减少计算时间*/
//auxiliary variables to reduce number of repeated operations,
float q0q0 = q0*q0;
float q0q1 = q0*q1;
float q0q2 = q0*q2;
float q0q3 = q0*q3;
float q1q1 = q1*q1;
float q1q2 = q1*q2;
float q1q3 = q1*q3;
float q2q2 = q2*q2;   
float q2q3 = q2*q3;
float q3q3 = q3*q3;

/*归一化测量值,加速度计和磁力计的单位是什么都无所谓,因为它们在此被作了归一化处理*/        
//normalise the measurements
norm = invSqrt(ax*ax + ay*ay + az*az);       
ax = ax * norm;
ay = ay * norm;
az = az * norm;
norm = invSqrt(mx*mx + my*my + mz*mz);          
mx = mx * norm;
my = my * norm;
mz = mz * norm;         

/*从机体坐标系的电子罗盘测到的矢量转成地理坐标系下的磁场矢量hxyz(测量值),下面这个是从飞行器坐标系到世界坐标系的转换公式*/
//compute reference direction of flux
hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);

/*计算地理坐标系下的磁场矢量bxyz(参考值)。
因为地理地磁水平夹角,我们已知是0度(抛去磁偏角的因素,固定向北),我定义by指向正北,所以by=某值,bx=0
但地理参考地磁矢量在垂直面上也有分量bz,地球上每个地方都是不一样的。
我们无法得知,也就无法用来融合(有更适合做垂直方向修正融合的加速度计),所以直接从测量值hz上复制过来,bz=hz。
磁场水平分量,参考值和测量值的大小应该是一致的(bx*bx) + (by*by)) = ((hx*hx) + (hy*hy))。
因为bx=0,所以就简化成(by*by)  = ((hx*hx) + (hy*hy))。可算出by。这里修改by和bx指向可以定义哪个轴指向正北*/
bx = sqrtf((hx*hx) + (hy*hy));
//by = sqrtf((hx*hx) + (hy*hy));
bz = hz;        

// estimated direction of gravity and flux (v and w),下面这个是从世界坐标系到飞行器坐标系的转换公式(转置矩阵)
vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3;

/*我们把地理坐标系上的磁场矢量bxyz,转到机体上来wxyz。
因为bx=0,所以所有涉及到bx的部分都被省略了。同理by=0,所以所有涉及到by的部分也可以被省略,这根据自己定义那个轴指北有关。
类似上面重力vxyz的推算,因为重力g的az=1,ax=ay=0,所以上面涉及到gxgy的部分也被省略了
你可以看看两个公式:wxyz的公式,把by换成ay(0),把bz换成az(1),就变成了vxyz的公式了(其中q0q0+q1q1+q2q2+q3q3=1)。*/
 wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
 wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
 wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);
// wx = 2*by*(q1q2 + q0q3) + 2*bz*(q1q3 - q0q2);
// wy = 2*by*(0.5 - q1q1 - q3q3) + 2*bz*(q0q1 + q2q3);
// wz = 2*by*(q2q3 - q0q1) + 2*bz*(0.5 - q1q1 - q2q2);

//现在把加速度的测量矢量和参考矢量做叉积,把磁场的测量矢量和参考矢量也做叉积。都拿来来修正陀螺。
// error is sum of cross product between reference direction of fields and direction measured by sensors
ex = (ay*vz - az*vy) + (my*wz - mz*wy);
ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
ez = (ax*vy - ay*vx) + (mx*wy - my*wx);

//   // integral error scaled integral gain
//   exInt = exInt + ex*Ki;
//   eyInt = eyInt + ey*Ki;
//   ezInt = ezInt + ez*Ki;
//   // adjusted gyroscope measurements
//   gx = gx + Kp*ex + exInt;
//   gy = gy + Kp*ey + eyInt;
//   gz = gz + Kp*ez + ezInt;

halfT=GET_NOWTIME(); //得到每次姿态更新的周期的一半

if(ex != 0.0f && ey != 0.0f && ez != 0.0f)      //很关键的一句话,原算法没有
{
// integral error scaled integral gain
exInt = exInt + ex*Ki * halfT;    //乘以采样周期的一半
eyInt = eyInt + ey*Ki * halfT;
ezInt = ezInt + ez*Ki * halfT;
// adjusted gyroscope measurements
gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;
}         


if(gx > (+1.5))
sb_x += Cursor_Step;
if(gx < (-1.5))
sb_x -= Cursor_Step;

if(gy > (+1.0))
sb_y += Cursor_Step;
if(gy < (-2.5))
sb_y -= Cursor_Step;

if(gz > (+1.5))
sb_z += Cursor_Step;
if(gz < (-1.5))
sb_z -= Cursor_Step;

Joystick_Send(0,sb_x,sb_y,0); //发送数据到电脑
}
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-4-17 14:46:48 | 显示全部楼层
回复【5楼】合肥-文盲:
---------------------------------
怎么只有人看,没有人回呀?????????????????????????????????????????????????????????都不会USB鼠标吗
合肥-文盲
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-17
在线时间
0 小时
发表于 2014-4-17 17:50:57 | 显示全部楼层
有没相应修改各类描述符的
回复 支持 反对

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-5-11
在线时间
26 小时
发表于 2014-5-11 17:11:32 | 显示全部楼层
回复【6楼】合肥-文盲:
---------------------------你的AHRSupdate  有送上位机显示过3D吗
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-5-12 08:52:23 | 显示全部楼层
送过3D显示
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-3-27 22:36:26 | 显示全部楼层
回复【10楼】合肥-文盲:
---------------------------------
你usb空中鼠标问题解决了吗,我今天刚好要做这个,能看下你的代码吗?
creazylq@163.com。多谢啦
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-3-31 09:10:29 | 显示全部楼层
回复【11楼】鹅卵石的天空:
---------------------------------
二维的做出来了,三维的没做出来
合肥-文盲
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-1 20:52:53 | 显示全部楼层
回复【12楼】合肥-文盲:
能看下你的二维的吗?多谢了……
creazylq@163.com
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-1 21:15:07 | 显示全部楼层
USB接口硬件图中,是不是D+和D-都得接上拉电阻啊?不接不行是吧?这是我的板子USB部分电路图:


没有接上拉电阻,调试了好几天主机都检测不到设备,没有一点反应,郁闷啊!
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-4-2 13:11:06 | 显示全部楼层
回复【14楼】鹅卵石的天空:
---------------------------------
你没加电平匹配电阻吧   在MCU的USB口和电脑的USB口之间串个22Ω的电阻(D+    D-都要串)
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-4-2 13:14:42 | 显示全部楼层
回复【14楼】鹅卵石的天空:
---------------------------------
在 USB 设备中,如果是高速设备,则会在 D+上接一个1.5K 的电阻上拉到3.3V,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到3.3V。这样当设
备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。
合肥-文盲
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-2 18:33:05 | 显示全部楼层
回复【15楼】合肥-文盲:
---------------------------------
好的,多谢了,我试一试……
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-2 18:33:29 | 显示全部楼层
回复【16楼】合肥-文盲:
---------------------------------
恩恩,这个问题现在懂了,多谢指点……
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-2 18:42:18 | 显示全部楼层
回复【15楼】合肥-文盲:
---------------------------------
我问别人,说STM32f103内部PA11和PA12引脚接了电阻的,所以外部不用接也行,是吧?  
我觉得内部的不保险,外部接一个最好了!
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-4-8 15:11:41 | 显示全部楼层
回复【13楼】鹅卵石的天空:
---------------------------------
公司的东西   不能泄密    如果是我个人开发的  我就开源给你了
合肥-文盲
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-9 21:56:40 | 显示全部楼层
回复【20楼】合肥-文盲:
---------------------------------
恩恩,没事,这个问题我解决了。还是谢谢你
回复 支持 反对

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2016-4-30 20:23:58 | 显示全部楼层
我也是这样,请教大师怎么解决的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-5-8
在线时间
2 小时
发表于 2016-5-10 13:41:29 | 显示全部楼层
我也想做了一个。可是插在电脑上电脑显示无法识别USB设备,请问怎样解决?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 01:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表