#はじめに
書籍に沿って引き続き進めていきます。
距離計測は超音波もやりました。
#測距モジュール
赤外線をピーと出したら物体に当たった時に反射してきます。距離が遠くなると入射角が大きくなって受信側の光が当たる位置が変化する感じで計測できます。
今回もI2Cで動作させますが、アナログ出力端子もあるので、1つや2つの動作であればアナログ値から求める方法をお勧めします。
(配線やプログラムが単純でいい)
#使用部品
- PSoC 5LP
-
GP2Y0E03
仕様書 - PCA9306
- 3.3Vを作り出す何か。(DCDCコンバータ, 3端子レギュレーター)
#回路図
前回と同じような回路では動かなかったので変更。
これじゃいけないと思う。
供給電圧は5VまでOKだが、その他は5Vまで許可されていない。(仕様書参照)
良い子はまねをしないように。
これで動いたが…きっとこのPSoCは3.3Vで動作しているに違いない。(5Vで動いているとわかっていながらの確信犯)
あぁ、電流が足りないのかな?平均消費電流が26~36mAになってる。(仕様書参照)
環境センサーや加速度センサーは1mA程度でしたが… 赤外線出すから結構電流が必要なのか。(今までのやり方では1mA程度でした)
これはダメだ(´・ω・`)電流取れない。↓分圧の場合。
3端子レギュレーターを使用するべきだと思います。
#プログラム
スレーブアドレスは0x80,0x81らしいが、前回同様右へシフトさせて0x40
#include "project.h"
#include <stdio.h>
#include <stdlib.h>
char imp[255];
uint8 I2C_Read(uint8 SlaveAddress, uint8 *DataAddress, uint8 Byte_Count, uint8 I2C_Mode){
uint8 temp;
temp = I2C_1_MasterWriteBuf(SlaveAddress,DataAddress,1,I2C_Mode);
while (temp != I2C_1_MSTR_NO_ERROR);
while(I2C_1_MasterStatus() & I2C_1_MSTAT_XFER_INP);
temp = I2C_1_MasterClearStatus();
temp = I2C_1_MasterReadBuf(SlaveAddress,DataAddress,Byte_Count, I2C_Mode);
while (temp != I2C_1_MSTR_NO_ERROR);
while(I2C_1_MasterStatus() & I2C_1_MSTAT_XFER_INP);
temp = I2C_1_MasterClearStatus();
return (temp);
}
int main(void)
{
CyGlobalIntEnable;
UART_1_Start();
I2C_1_Start();
CyDelay(2000);
uint8 wr_buff[2]={0,0};
for(;;)
{
wr_buff[0] = 0x5E;
I2C_Read(0x40,wr_buff,2,I2C_1_MODE_COMPLETE_XFER);
int ans;
ans = ((wr_buff[0]*16+wr_buff[1]) / 16) / 4 ;
sprintf(imp,"%d\n",ans);
UART_1_PutString(imp);
CyDelay(1000);
}
}