空間的な温度を測定する

MEMS非接触温度センサ D6T

静止人物も検出できる
高感度な人感センサを実現
ここでは「形D6T-44L-06」を用います。
これは4×4の空間の16点の温度を測定できるセンサーです。


信号は下図のようになります。
Vccは5Vであることに注意してください。

16点を測定するセンサー1つを計測する。
メインプログラム
D6Ttest.c
#include "vs-wrc003.h"

void startInit(char* str)
{
  const BYTE MainCycle = 100;
  Init((BYTE)MainCycle);  //初期設定
  InitSci3(CBR_115200,non,1);
	LED(3);
  Mtr_Run(0, 0, 0, 0);
  while(!getSW());
	LED(0);
  printf(str);
}

void main(void)
{
  int i, j, data[16];
	startInit("*** D6T test ***\n");
  D6Tinit(data);

  while(1)
  {
    if(!Read())
    {
      for(i=0; i<4; i++) {
        for(j=0; j<4; j++) {
          printf("%d ", data[i*4+j]);
        }
      }
      printf("\n");
    }
    Wait(500);
  }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 


i2c.c
#include "vs-wrc003.h"
/* ----------------------------------------------------------------------
    i2c.c
    i2c バス処理
---------------------------------------------------------------------- */
#include "iodefine.h"


/* ----------------------------------------------------------------------
    i2c_checkBusCondition
    i2c バスが空くまで待つ
---------------------------------------------------------------------- */
void i2c_waitBusFree() 
{
    while (IIC2.ICCR2.BIT.BBSY == 1);
}

/* ----------------------------------------------------------------------
    i2c_sendStartCondition
    i2c バスに開始要求を送る
---------------------------------------------------------------------- */
void i2c_sendStartCondition() 
{
    IIC2.ICCR2.BYTE = 0xbd;
}

/* ----------------------------------------------------------------------
    i2c_sendStopCondition
    i2c バスに停止要求を送る
---------------------------------------------------------------------- */
void i2c_sendStopCondition() 
{
    IIC2.ICSR.BIT.STOP = 0; // STOP をクリアする
    IIC2.ICCR2.BYTE = 0x3D; // 停止条件を発行する(BBSY=0, SCP=0)
    while (IIC2.ICSR.BIT.STOP != 1) ;
}

/* ----------------------------------------------------------------------
    i2c_setTransmitMode
    i2c 送受信モードの設定

    0: スレーブ受信モード
    1: スレーブ送信モード
    2: マスタ受信モード
    3: マスタ送信モード
---------------------------------------------------------------------- */
void i2c_setTransmitMode(unsigned char tmode) 
{
  switch (tmode){
    case 0: tmode = 0x00;   // MST=0, TRS=0
        break;
    case 1: tmode = 0x10;   // MST=0, TRS=1
        break;
    case 2: tmode = 0x20;   // MST=1, TRS=0
        break;
    case 3: tmode = 0x30;   // MST=1, TRS=1
        break;
  }
  // レジスタに送受信モードを設定する
  IIC2.ICCR1.BYTE = ((IIC2.ICCR1.BYTE & 0xcf) | tmode);
}

/* ----------------------------------------------------------------------
    i2c_sendByte
    i2c バスへ1バイト送信
---------------------------------------------------------------------- */
unsigned char i2c_sendByte(unsigned char ch) 
{
    unsigned char tend;

    // データを送信する
    IIC2.ICDRT = ch;
    while(1) {
        tend = IIC2.ICSR.BIT.TEND;
        if(tend == 1) break;
    }
    // ACK を返す
    return(IIC2.ICIER.BIT.ACKBR);
}

/* ----------------------------------------------------------------------
    i2c_receiveByte
    i2c バスから1バイト受信
    
    ack: データ受信時相手に返すACKビット
    rcvd: 最終バイトをリードするときは1にするこの後停止条件発行可能になる
          連続してデータ受信する場合は0
---------------------------------------------------------------------- */
unsigned char i2c_receiveByte(unsigned char ack, unsigned char rcvd) 
{
    unsigned char rdt;

    // データ受信後に送信するACKフラグを設定する。
    IIC2.ICIER.BIT.ACKBT = ack;

    // 最終バイト読み込み時は1
    IIC2.ICCR1.BIT.RCVD = rcvd;
    
    // i2c バスから送られるデータの受信開始
    rdt = IIC2.ICDRR;

    // データが8bit転送されるまで待つ
    while(IIC2.ICSR.BIT.RDRF != 1) ;

    // 揃ったデータを取り出す    
    rdt = IIC2.ICDRR;

    return(rdt);
}

/* ----------------------------------------------------------------------
    i2c_init   
    i2c初期化
---------------------------------------------------------------------- */
void i2c_init(void) 
{
    // I2C の転送レートをΦ/200(Φ=20MHz, 100kHz)に設定する
    IIC2.ICCR1.BIT.CKS = 0x0d;

  // IIC バスモードをMSB ファースト、ウェイト挿入しない、
  // ビット数: 9 ビットに設定する
    IIC2.ICMR.BIT.MLS  = 0; // MSB First
    IIC2.ICMR.BIT.WAIT = 0; // WAIT 無し
    IIC2.ICMR.BIT.BCWP = 0; // ビットカウンタライトプロテクト解除
    IIC2.ICMR.BIT.BC = 0;   // 9ビット
    IIC2.ICMR.BIT.BCWP = 1; // ビットカウンタライトプロテクト

  // IIC2 I/F モジュールの動作状態を転送動作可能状態
  // (SCL/SDA は、バス駆動状態)に設定する
    IIC2.ICCR1.BIT.ICE = 1;
}

/*----------------------------------------------------------------
  ここからHMC5883L専用ルーチン
-----------------------------------------------------------------*/


void sendByte(int Device, int address, int data)
{
    unsigned char rdt;

    i2c_waitBusFree();                      // i2c バス空き待ち
    do {
        i2c_setTransmitMode(3);             // マスタ送信モード
        i2c_sendStartCondition();           // i2c バスを開始条件にする
        rdt = i2c_sendByte(Device);         // スレーブアドレスを送信
    } while(rdt == 1);                      // デバイスからACKが返るまでガンバル
    i2c_sendByte(address);                  // デバイス内アドレス番号を送信
    i2c_sendByte(data);                     // 設定する値を送信
    IIC2.ICSR.BIT.TEND = 0;
    i2c_sendStopCondition();                // i2c バスを停止条件にする。
    i2c_setTransmitMode(0);                 // スレーブ受信モードにする
}

int DeviceAddress;

unsigned char readByte(unsigned  reg) {

    unsigned char rdt;

    i2c_waitBusFree();                      // i2c バス空き待ち
    do {
        i2c_setTransmitMode(3);             // マスタ送信モード
        i2c_sendStartCondition();           // i2c バスを開始条件にする
        rdt = i2c_sendByte(DeviceAddress);  // スレーブアドレスを送信
    } while(rdt == 1);                      // デバイスからACKが返るまでガンバル
    i2c_sendByte(reg);                      // レジスタ番号を送信
    i2c_setTransmitMode(3);                 // マスタ送信モード
    i2c_sendStartCondition();               // i2c バスを開始条件にする
    i2c_sendByte(DeviceAddress|1);             // スレーブアドレスを送信
    i2c_setTransmitMode(2);                 // マスタ受信モード
    IIC2.ICSR.BIT.TDRE = 0;
    rdt = i2c_receiveByte(1, 1);            // ACK=1, RCVD = 1で受信する。
    i2c_sendStopCondition();                // i2c バスを停止条件にする。
    IIC2.ICCR1.BIT.RCVD = 0;
    i2c_setTransmitMode(0);                 // スレーブ受信モードにする

    return(rdt);
}


int getData(unsigned func, unsigned param, unsigned char Data[], unsigned n)
{
  int i, n1;
  unsigned char rdt;

  i2c_waitBusFree();                    // i2c バス空き待ち
  i=0;
  do {
    i2c_setTransmitMode(3);             // マスタ送信モード
    i2c_sendStartCondition();           // i2c バスを開始条件にする
    rdt = i2c_sendByte(DeviceAddress);  // スレーブアドレスを送信
    if(i++ == 100) {                    // 返事が無かったらあきらめる
      i2c_sendStopCondition();          // i2c バスを停止条件にする。
      i2c_setTransmitMode(0);           // スレーブ受信モードにする
			printf("wait %x\n",DeviceAddress);
      return 1;
    }
  } while(rdt == 1);                    // デバイスからACKが返るまでガンバル
  i2c_sendByte(func);                   // レジスタ番号を送信
  i2c_sendByte(param);
  i2c_sendStartCondition();             // i2c バスを開始条件にする
  i2c_sendByte(DeviceAddress|1);        // スレーブアドレスを送信
  i2c_setTransmitMode(2);               // マスタ受信モード
  n1 = n-1;
  for(i=0; i< n; i++) {
    IIC2.ICSR.BIT.TDRE = 0;
    if(i==n1) Data[i] = i2c_receiveByte(1, 1);    // ACK=1, RCVD = 1で受信する。
    else Data[i]  = i2c_receiveByte(0, 0); 
    IIC2.ICCR1.BIT.RCVD = 0;
  }
	Wait(1);
  i2c_sendStopCondition();                // i2c バスを停止条件にする。
  i2c_setTransmitMode(0);                 // スレーブ受信モードにする
  return 0;
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101
102
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168 
169 
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 


D6T.c
#include "vs-wrc003.h"
extern int DeviceAddress;
static int length = 35;
static char buffer[36];
static int *dataBuffer;

int Read() 
{
	int i, error;
	error = getData(0x4c, 0, buffer, length);
	if(error)
	{
		printf("i2c error\n");
	}
	else{
  	for(i=0; i<16; i++) {
    	dataBuffer[i] = (buffer[(i+1)*2]&0xff) + (buffer[(i+1)*2+1]&0xff)*256;
		}
  }
  return error;
}

void D6Tinit(int *databuff)
{
  i2c_init();             // I2Cの初期設定
  DeviceAddress=0x14;			// 8bit address, 7bitaddress=0x0A
  buffer[length]=0;
  dataBuffer = databuff;
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29