2012年2月5日日曜日

USBタイプの人感センサーSENSOR-HM/ECOをmbedで使ってみた



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 件のコメント: