我以前在51上做过hid,这次看到想弄个在电脑运行的,顺便手头有个mg995舵机,论坛有人大甩卖的时候买的,就做个hid控制的舵机。
如图是实物图,用一个棉签来指示方向。
接线很简单,舵机1接地2接5v,3接pwm。这里pwm由于可随便引至方便的引脚,所以这里接最下面的。
程序是用lpcopen的usbd_rom_hid_generic和sct_pwm改的。
usbd_rom_hid_generic里需要改的是描述符文件和相应的处理文件。在描述符文件中,需要把USB_FsConfigDescriptor中的端点描述的最大包长改成需要的。这里我看见论坛之前有人发的hid的帖子没提到这个,经试验,这样会导致pc机写的时候片子只能收到前4字节,读的时候全是乱码。然后修改HID_INPUT_REPORT_BYTES和HID_OUTPUT_REPORT_BYTES宏定义到对应长度,它们在HID_ReportDescriptor中被使用。随后就是在回调函数HID_Ep_Hdlr中写相关的处理,函数如下:
static ErrorCode_t HID_Ep_Hdlr(USBD_HANDLE_T hUsb, void *data, uint32_t event)
{
USB_HID_CTRL_T *pHidCtrl = (USB_HID_CTRL_T *) data;
switch (event) {
case USB_EVT_OUT:
USBD_API->hw->ReadEP(hUsb, pHidCtrl->epout_adr, dat);
Chip_SCTPWM_SetDutyCycle(SCT_PWM, SCT_PWM_OUT,
Chip_SCTPWM_PercentageToTicks(SCT_PWM,dat[0]/10.0+2.5));
USBD_API->hw->WriteEP(hUsb, pHidCtrl->epin_adr, dat,8 );
break;
}
return LPC_OK;
}
这里我把收到的值处理后赋给pwm,随后回写给上位机以方便调试。主程序中我参照SCT_PWM的程序初始化了一个50hz的pwm,具体程序见附件。
随后是上位机,界面如下:
这里可以手输位置也可以用
Slider来拖。左上角是发送的值的回显。
上位机用的是qt,加上mingw,ddk用的是mingw自带的ddk,具体程序参照的是圈圈的usb写的。
下图是回返的数据的截图
其实这里一个字节来通讯也够。。。但是为了试验多个字节通讯的办法我改成了八个 字节。
下面是几张上位机和舵机对照看的图:
由图可知,我拖动了
Slider,舵机的位置做了相应的改变。
下面是qt的工程和lpc片子对应改动的部分。
hid.zip
(22.96 KB, 下载次数: 26)