Posted at

LIS3DHをRaspberry Piで使う方法(SPI編)

More than 3 years have passed since last update.

秋月電子通商で買った3軸加速度センサモジュール(LIS3DH)をSPIインターフェイスを用いてRaspberry Piで使ってみる。


前提

WiringPiを使用する。


方法

WiringPiで準備されているSPIのモジュールを使って入出力を行うため、wiringpiSPI.hをincludeする。

初期設定のためwiringPiSPISetupを実行する。

wiringPiSPIDataRWで入出力をするのだが、LIS3DHは最初の1byteでアドレスとReadなのかを指定し、次の1byteで情報が帰ってくるというのがデータシートに書いてあるのが、最初は良くわからなかったorz

以下にサンプルコードを示す。


spa_LIS3DH.c

/* SPI LIS3DH */

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>

char outdat[3]={0x00,0x00,0x00};

int main(int argc, char *argv[])
{
char c;
int fd,data,out;

/* WiringPi SPI Setup */
fd=wiringPiSPISetup(0, 500000);
if(fd<0){
printf("SPI Open error!\n");
return(1);
}

/* LIS3DH WHO_AM_I */
outdat[0]=0x0F;
outdat[0]|=0x80;//READ
printf("%X ",outdat[0]);
data=wiringPiSPIDataRW(0,outdat,2);
printf("%X ",outdat[1]);
if(outdat[1]==0x33) printf("I AM LIS3DH\n");
else return(2);

/* LIS3DH CTRL_REG1 */
outdat[0]=0x20;
outdat[1]=0x27;// 10Hz, normal mode
data=wiringPiSPIDataRW(0,outdat,2);

while(1){

/* LIS3DH OUT_X */
outdat[0]=0x28;
outdat[0]|=0x80;//READ
outdat[0]|=0x40;//increment address in multiple reading
printf("%d ",outdat[0]);
data=wiringPiSPIDataRW(0,outdat,3);
out=(outdat[2]<<8 | outdat[1]);
if(out>0x7FFF)out=out-0xFFFF;

printf("OUT_X = %6d ",out);

/* LIS3DH OUT_Y */
outdat[0]=0x2A;
outdat[0]|=0x80;//READ
outdat[0]|=0x40;//increment address in multiple reading
data=wiringPiSPIDataRW(0,outdat,3);
out=(outdat[2]<<8 | outdat[1]);
if(out>0x7FFF)out=out-0xFFFF;

printf("OUT_Y = %6d ",out);

/* LIS3DH OUT_Z */
outdat[0]=0x2C;
outdat[0]|=0x80;//READ
outdat[0]|=0x40;//increment address in multiple reading
data=wiringPiSPIDataRW(0,outdat,3);
out=(outdat[2]<<8 | outdat[1]);
if(out>0x7FFF)out=out-0xFFFF;

printf("OUT_Z = %6d ",out);

printf("\n");

delay(100);
}

return(0);
}