「近接モード」は赤外線センサ単体(自分で赤外線を送受信して反射を使って)で近接物との距離を測定するモードです。超音波センサでは、だいたいcm単位での距離の数値がそのまま出力されましたが、赤外線センサの場合は、10cm~50cmの距離の間が10~70の値でほぼ比例的に出力され、それ以上距離がある(何も存在しない)と80~100の値になります。
「ビーコンモード」は赤外線リモコンが発信する赤外線を受光して、赤外線リモコンとの距離を測定するモードです。ビーコンモードはリモコンとの距離が10cm~2mくらいの間で10~100の値が比較的直線的に出力されます。
「リモコンモード」では、赤外線リモコンの操作ボタンの押下によって、押したボタンの種類ごとに違う番号が出力されます。
「ビーコンモード」と「リモコンモード」では赤外線リモコン側のチャネルが4チャネルあり、この切り替えにより値が返されるレジスタが変わります。
赤外線センサの特性などに関しては、アフレルさんのサイトに詳しい技術情報が掲載されています。
EV3 Sensor Adaptor for NXT には向き(Host側とセンサ側コネクタ)があるので、注意が必要です。っていうか、はじめ間違えて値が取れなかった・・・。
ソースはこんな感じ。ここにもおいておきます。
// S1ポートにEV3 Sensor Adaptor + 赤外線センサ を接続。 #include <stdio.h> #include <math.h> #include <time.h> #include <linux/i2c-dev.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <stdint.h> #include "wiringPi.h" #include "tick.h" #include "BrickPi.h" #define ESA_I2C_ADDRESS 0x32 // EV3 Sensor Adaptor のデフォルトI2Cアドレス #define ESA_I2C_DEVICE_NO 0x00 // EV3 Sensor Adaptor の I2Cバス上の番号 #define ESA_I2C_REGISTER_COMMAND 0x41 // コマンドレジスタ #define ESA_I2C_REGISTER_MODE 0x52 // モードレジスタ #define ESA_I2C_REGESTER_CHANNEL0 0x54 // 0チャネルセンサ値格納 #define ESA_I2C_REGESTER_CHANNEL1 0x56 // 1チャネルセンサ値格納 #define ESA_I2C_REGESTER_CHANNEL2 0x58 // 2チャネルセンサ値格納 #define ESA_I2C_REGESTER_CHANNEL3 0x5A // 3チャネルセンサ値格納 #define MODE_Color_ReflectedLight 0x00 // カラーセンサ反射光モード #define MODE_Color_AmbientLight 0x01 // カラーセンサ周囲明るさモード #define MODE_Color_MeasureColor 0x02 // カラーセンサ色モード #define MODE_Gyro_Angle 0x00 // ジャイロセンサ角度モード #define MODE_Gyro_Rate 0x01 // ジャイロセンサ角速度モード #define MODE_InfraRed_Proximity 0x00 // 赤外線センサ近接度モード #define MODE_InfraRed_Beacon 0x01 // 赤外線センサビーコンモード #define MODE_InfraRed_Remote 0x02 // 赤外線センサ遠隔モード #define MODE_Sonar_CM 0x00 // 超音波センサcmモード #define MODE_Sonar_Inches 0x01 // 超音波センサインチモード #define MODE_Sonar_Presence 0x02 // 超音波センサ存在検出モード int main(int argc, char *argv[]) { int result; uint8_t mode, p0, p1, p2, p3, v0, v1, v2, v3; char h0, h1, h2, h3; int value; unsigned int tmp; // モード選択。 //mode = MODE_InfraRed_Proximity; // 近接 //mode = MODE_InfraRed_Beacon; // ビーコン mode = MODE_InfraRed_Remote; // リモート // -- BrickPiの初期化。 // タイマのクリア。 ClearTick(); // BricPi初期化(ポートオープン)。 result = BrickPiSetup(); if (result) return 0; // 通信アドレス設定。 BrickPi.Address[0] = 1; BrickPi.Address[1] = 2; // -- センサポートの設定。 // S1ポートをI2Cセンサに設定。 BrickPi.SensorType[PORT_1] = TYPE_SENSOR_I2C; // S1ポートのI2Cスピードを100kbpsに設定。 BrickPi.SensorI2CSpeed[PORT_1] = 0; // S1ポートのI2C接続デバイス数を1に設定。 BrickPi.SensorI2CDevices[PORT_1] = 1; // アドレス設定。 BrickPi.SensorSettings[PORT_1][ESA_I2C_DEVICE_NO] = 0; BrickPi.SensorI2CAddr[PORT_1][ESA_I2C_DEVICE_NO] = ESA_I2C_ADDRESS; if (BrickPiSetupSensors()) return 0; // 赤外線センサのモード設定。 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGISTER_MODE; BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][1] = mode; result = BrickPiUpdateValues(); if (!result) { while (1) { switch (mode) { case MODE_InfraRed_Proximity: // 近接センサモード // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL0; // Ch0 result = BrickPiUpdateValues(); if (!result) { // int値取得算出。 tmp = (int)BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; tmp += ((int)BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]) << 8; if (tmp > 32767) { value = (int)tmp - 65536; } else { value = (int)tmp; } printf("IR: %d\n", value); } else { printf ("IR: Get result Error!!\n"); } break; case MODE_InfraRed_Beacon: // ビーコンモード h0 = 0; h1 = 0; h2 = 0; h3 = 0; p0 = 0; p1 = 0; p2 = 0; p3 = 0; // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL0; // Ch0 result = BrickPiUpdateValues(); if (!result) { // 方向(1バイト目)と近接(2バイト目)値取得。 h0 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; p0 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]; } // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL1; // Ch1 result = BrickPiUpdateValues(); if (!result) { // 方向(1バイト目)と近接(2バイト目)値取得。 h1 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; p1 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]; } // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL2; // Ch2 result = BrickPiUpdateValues(); if (!result) { // 方向(1バイト目)と近接(2バイト目)値取得。 h2 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; p2 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]; } // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL3; // Ch3 result = BrickPiUpdateValues(); if (!result) { // 方向(1バイト目)と近接(2バイト目)値取得。 h3 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; p3 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]; } //printf("h0=%d, h1=%d, h2=%d, h3=%d, p0=%d, p1=%d, p2=%d, p3=%d\n", h0, h1, h2, h3, p0, p1, p2, p3); printf("p0 = %d, p1=%d, p2=%d, p3=%d\n", p0, p1, p2, p3); break; case MODE_InfraRed_Remote: // リモートモード v0 = 0; v1 = 0; v2 = 0; v3 = 0; // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL0; // Ch0 result = BrickPiUpdateValues(); if (!result) { // 方向(1バイト目)と近接(2バイト目)値取得。 v0 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; v1 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]; } // センサー値取得 BrickPi.SensorI2CWrite[PORT_1][ESA_I2C_DEVICE_NO] = 1; // 書込バイト数 BrickPi.SensorI2CRead[PORT_1][ESA_I2C_DEVICE_NO] = 2; // 読込バイト数 BrickPi.SensorI2COut[PORT_1][ESA_I2C_DEVICE_NO][0] = ESA_I2C_REGESTER_CHANNEL1; // Ch1 result = BrickPiUpdateValues(); if (!result) { // 方向(1バイト目)と近接(2バイト目)値取得。 v2 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][0]; v3 = BrickPi.SensorI2CIn[PORT_1][ESA_I2C_DEVICE_NO][1]; } printf("v0=%d, v1=%d, v2=%d, v3=%d\n", v0, v1, v2, v3); break; default: break; } usleep(100000); } } return 0; }
0 件のコメント:
コメントを投稿