#はじめに
書籍に沿って引き続き進めていきます。
#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);
}
}