はじめに

書籍に沿って引き続き進めていきます。

距離計測は超音波もやりました。

測距モジュール

赤外線をピーと出したら物体に当たった時に反射してきます。距離が遠くなると入射角が大きくなって受信側の光が当たる位置が変化する感じで計測できます。

今回もI2Cで動作させますが、アナログ出力端子もあるので、1つや2つの動作であればアナログ値から求める方法をお勧めします。
(配線やプログラムが単純でいい)
反射角.png

使用部品

回路図

前回と同じような回路では動かなかったので変更。

これじゃいけないと思う。
供給電圧は5VまでOKだが、その他は5Vまで許可されていない。(仕様書参照)
良い子はまねをしないように。

これで動いたが…きっとこのPSoCは3.3Vで動作しているに違いない。(5Vで動いているとわかっていながらの確信犯)
測距_ブレッドボード.png

あぁ、電流が足りないのかな?平均消費電流が26~36mAになってる。(仕様書参照)
環境センサー加速度センサーは1mA程度でしたが… 赤外線出すから結構電流が必要なのか。(今までのやり方では1mA程度でした)
これはダメだ(´・ω・`)電流取れない。↓分圧の場合。
並列_回路図.png

3端子レギュレーターを使用するべきだと思います。

3端子レギュレータ_ブレッドボード.png

プログラム

スレーブアドレスは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);
    }
}

結果

センチメートルです。最大で計測できるのは63cmかな?と思ったが、使用書見たら50cmだった。
結果.png

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.