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