IO-DATAの人感センサーSENSOR-HM/ECOをmbedに繋げてみました。
検出距離は30cmから120cmまで設定できるのだが、なぜか90cm以上に設定すると常時検出になってしまう。
下記のプログラムでは検出するとmbed上のLED4が点灯します。
USBHostShellに組み込んでいます。
// ecobox.cpp 2012/2/5 // ECOBOX-NET / SENSOR-HM/ECO #include "mbed.h" #include "USBHost.h" #include "Utils.h" DigitalOut myled1(LED1); DigitalOut myled4(LED4); u8 ecobox_buf[8]; #define REQUEST_TYPE_VENDOR 0x40 #define ECOBOX_RANGE_30CM 0x11 #define ECOBOX_RANGE_60CM 0x12 #define ECOBOX_RANGE_90CM 0x14 #define ECOBOX_RANGE_120CM 0x18 void ecobox_range(int device, int value) { USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_VENDOR|RECIPIENT_ENDPOINT, 0x10, value, 0, 0, 0); } void ecobox_Callback(int device, int endpoint, int status, u8* data, int len, void* userData) { //printf("ecobox_Callback D:%02x A:%02x status=%d len=%d\n", device, endpoint, status, len); //printfBytes("ecobox_Callback", data ,len); myled4 = data[4] & 1; myled1 = !myled1; USBInterruptTransfer(device, 0x81, ecobox_buf, sizeof(ecobox_buf), ecobox_Callback, userData); } int OnEcoboxInsert(int device) { printf("ECOBOX-NET inserted of %d\n", device); ecobox_range(device, ECOBOX_RANGE_60CM); USBInterruptTransfer(device, 0x81, ecobox_buf, sizeof(ecobox_buf), ecobox_Callback, (void*)0); return 0; }
autoEvents.cppのOnLoadDeviceにOnEcoboxInsertを追加します。
void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc) { printf("LoadDevice %d %02X:%02X:%02X\n",device,interfaceDesc->bInterfaceClass,interfaceDesc->bInterfaceSubClass,interfaceDesc->bInterfaceProtocol); char s[128]; for (int i = 1; i < 3; i++) { if (GetString(device,i,s,sizeof(s)) < 0) break; printf("%d: %s\n",i,s); } if (deviceDesc->idVendor == 0x067b && deviceDesc->idProduct == 0x2303) { OnPL2303Insert(device); return; } if (deviceDesc->idVendor == 0x04bb && deviceDesc->idProduct == 0x0f04) { OnEcoboxInsert(device); return; }
---
0 件のコメント:
コメントを投稿