はじめに
書籍に沿って引き続き進めていきます。
3軸加速度センサー
X,Y,Zの3軸の加速度を計測することができるセンサーです。
マルチコプターには9軸センサをのせたりします。(加速度+ジャイロ+磁気)
加速度から傾きを求めることもできます。(計算すれば…今回はやめておきます)
使用部品
回路図
前回、加速度センサーはSPI通信がいいよーって言った気がしますが、I2Cで実行します。
プログラム
あまりキレイではないかも…いつか直そう。(;´・ω・)
仕様書にはスレーブアドレスが0x30,0x31と書いてありますが、一番下のbitはRead/Write用みたいなので、そこらへんはPSoCで勝手に後付するのかな?なので、右に1つシフトした(Read/Writeのbit無し)0x18を使用します。
Arduinoやラズベリーパイでも同様だったような気がします。
0x30, 0x31 を右に1つシフトすると、0x18
0x31(0b110001) → 0x18(0b11000)
# include "project.h"
# include <stdio.h>
# include <stdlib.h>
 
char imp[255];
 uint8 I2C_Write(uint8 SlaveAddress, uint8 *DataAddress, uint8 Byte_Count, uint8 I2C_Mode){
    uint8 temp;
    temp = I2C_1_MasterWriteBuf(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);
}
 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[6]={0,0,0,0,0,0};
    for(;;)
    {
        wr_buff[0] = 0x0F;
        I2C_Read(0x18,wr_buff,1,I2C_1_MODE_COMPLETE_XFER);
        if(wr_buff[0] == 0x33){break;}
    }
    wr_buff[0] = 0x20;
    wr_buff[1] = 0x77;
    I2C_Write(0x18,wr_buff,2,I2C_1_MODE_COMPLETE_XFER);
    I2C_Read(0x18,wr_buff,1,I2C_1_MODE_COMPLETE_XFER);
    UART_1_PutString("start \n");
    for(;;)
    {
        short x,y,z;
        uint8 wr_buffa[6]={0,0,0,0,0,0};
        wr_buff[0] = 0x28;
        I2C_Read(0x18,wr_buff,1,I2C_1_MODE_COMPLETE_XFER);
        wr_buffa[0] = 0x29;
        I2C_Read(0x18,wr_buffa,1,I2C_1_MODE_COMPLETE_XFER);
        int p = 0;
        if((wr_buffa[0] >> 7) == 1){p = 0xF;}else{p = 0;}
        x = (p << 12) | (wr_buffa[0] << 4) | (wr_buff[0] >> 4);
        wr_buff[0] = 0x2A;
        I2C_Read(0x18,wr_buff,1,I2C_1_MODE_COMPLETE_XFER);
        wr_buffa[0] = 0x2B;
        I2C_Read(0x18,wr_buffa,1,I2C_1_MODE_COMPLETE_XFER);
        if((wr_buffa[0] >> 7) == 1){p = 0xF;}else{p = 0;}
        y = (wr_buffa[0] << 4) | (wr_buff[0] >> 4);
        wr_buff[0] = 0x2C;
        I2C_Read(0x18,wr_buff,1,I2C_1_MODE_COMPLETE_XFER);
        wr_buffa[0] = 0x2D;
        I2C_Read(0x18,wr_buffa,1,I2C_1_MODE_COMPLETE_XFER);
        if((wr_buffa[0] >> 7) == 1){p = 0xF;}else{p = 0;}
        z = (wr_buffa[0] << 4) | (wr_buff[0] >> 4);
        sprintf(imp,"%hd,%hd,%hd\n",x,y,z);
        UART_1_PutString(imp);
        CyDelay(1000);
    }
}


