G-senser wave form display Uses 32dot x 16dot LED

Dependencies:   KP1632D mbed

加速度をLEDマトリクスに波形表示するデモ

32x16 LEDドットマトリクス表示を使って、加速度センサーの信号を波形として表示します。
波形が飛び飛びになると見にくいので、補間表示しています。

このプログラムには、加速度センサーが必要です。
接続をさぼるために、初期からセンサーが搭載されている、FRDM-KL25Zで動作させました。
他のmbedでは、外付けの加速度センサーを利用する必要があります。

FRDM-KL25Z搭載のMMA8451Qは、3軸の加速度センサーでI2C接続です。
最低限必要な設定だけを済ませて利用しています。
表示に利用しているのはY軸データのみです。

地震計を作りたかったのですが、加速度⇒速度⇒移動距離への変換と、f0=1Hzのローカットフイルタの演算が必要だったので、加速度を直接表示するに止めました。
(計算をする気で、残骸が残ってます)

Committer:
morita
Date:
Sun Jun 01 13:00:03 2014 +0000
Revision:
0:a24cdf5b45c0
Gsens_demo.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morita 0:a24cdf5b45c0 1 /*
morita 0:a24cdf5b45c0 2 32dot*16dot LED display demo.
morita 0:a24cdf5b45c0 3 For FRDM-KL25Z.
morita 0:a24cdf5b45c0 4 地震計デモ
morita 0:a24cdf5b45c0 5 2014.05.25
morita 0:a24cdf5b45c0 6 */
morita 0:a24cdf5b45c0 7
morita 0:a24cdf5b45c0 8 #include "mbed.h"
morita 0:a24cdf5b45c0 9 #include "kp1632d.h"
morita 0:a24cdf5b45c0 10
morita 0:a24cdf5b45c0 11 Serial pc(USBTX, USBRX);
morita 0:a24cdf5b45c0 12 DigitalIn SW1(D2,PullUp),SW2(D3,PullUp);
morita 0:a24cdf5b45c0 13 KP1632D disp(D7,D9,D10,D6,D5,D4); //defalut interrupt speed = 200uS
morita 0:a24cdf5b45c0 14 I2C i2c(PTE25,PTE24); //MMA8451Q
morita 0:a24cdf5b45c0 15
morita 0:a24cdf5b45c0 16 void writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) {
morita 0:a24cdf5b45c0 17 char buf[2];
morita 0:a24cdf5b45c0 18 buf[0]=regAddr;
morita 0:a24cdf5b45c0 19 buf[1]=data;
morita 0:a24cdf5b45c0 20 i2c.write(devAddr<<1,buf,2,false);
morita 0:a24cdf5b45c0 21 }
morita 0:a24cdf5b45c0 22
morita 0:a24cdf5b45c0 23 void readBytes(uint8_t device,uint8_t address, uint8_t length, char *data) {
morita 0:a24cdf5b45c0 24 char buf[2];
morita 0:a24cdf5b45c0 25
morita 0:a24cdf5b45c0 26 buf[0]=address;
morita 0:a24cdf5b45c0 27 i2c.write(device<<1,buf,1,true);
morita 0:a24cdf5b45c0 28 i2c.read(device<<1,data,length,false);
morita 0:a24cdf5b45c0 29 }
morita 0:a24cdf5b45c0 30
morita 0:a24cdf5b45c0 31 int main() {
morita 0:a24cdf5b45c0 32 uint8_t i,n,buf[2];
morita 0:a24cdf5b45c0 33 int16_t y,y0=8;
morita 0:a24cdf5b45c0 34 uint8_t gs=3;
morita 0:a24cdf5b45c0 35 //float speed,l;
morita 0:a24cdf5b45c0 36 const uint16_t gain[12]={1,2,5,10,20,50,100,200,500,1000,2000,5000};
morita 0:a24cdf5b45c0 37 // const float K=((9.8e3/2)*50e-3)/4096; // G=9.8m/s^2 s=50mS N=4096/G
morita 0:a24cdf5b45c0 38
morita 0:a24cdf5b45c0 39 Timer timer;
morita 0:a24cdf5b45c0 40 timer.start();
morita 0:a24cdf5b45c0 41 writeByte(0x1d,0x2a,0x01); //MMA8451Q syscon reg 1 ,set ACTIVE mode
morita 0:a24cdf5b45c0 42
morita 0:a24cdf5b45c0 43 while(1){
morita 0:a24cdf5b45c0 44 timer.reset();
morita 0:a24cdf5b45c0 45 readBytes(0x1d,0x03,2,(char*)buf); //MMA8451Q read Y axis
morita 0:a24cdf5b45c0 46 y=(buf[0] << 6) | (buf[1] >> 2); //16bit left adjust -> 14bit right adjust
morita 0:a24cdf5b45c0 47 if (y > 8191) y -= 16383; //offset binary -> 2'
morita 0:a24cdf5b45c0 48
morita 0:a24cdf5b45c0 49 //speed=y*K;// speed=mm/s (50ms)
morita 0:a24cdf5b45c0 50 //l += speed*50e-3;//mm (50ms)
morita 0:a24cdf5b45c0 51
morita 0:a24cdf5b45c0 52 y=y/gain[gs] + 8;//display gain
morita 0:a24cdf5b45c0 53 if(y<0)y=0;
morita 0:a24cdf5b45c0 54 if(y>15)y=15;
morita 0:a24cdf5b45c0 55
morita 0:a24cdf5b45c0 56 for(i=0;i<16;i++){
morita 0:a24cdf5b45c0 57 disp.abuf[i].i32 <<= 1;
morita 0:a24cdf5b45c0 58 }
morita 0:a24cdf5b45c0 59 disp.abuf[y].i32 |= 1;
morita 0:a24cdf5b45c0 60 if(y>y0){
morita 0:a24cdf5b45c0 61 n=(y-y0)>>1;
morita 0:a24cdf5b45c0 62 for(i=1;i<=n;i++){
morita 0:a24cdf5b45c0 63 disp.abuf[y0+i].i32 |= 2;
morita 0:a24cdf5b45c0 64 disp.abuf[y-i].i32 |= 1;
morita 0:a24cdf5b45c0 65 }
morita 0:a24cdf5b45c0 66 } else {
morita 0:a24cdf5b45c0 67 n=(y0-y)>>1;
morita 0:a24cdf5b45c0 68 for(i=1;i<=n;i++){
morita 0:a24cdf5b45c0 69 disp.abuf[y+i].i32 |= 1;
morita 0:a24cdf5b45c0 70 disp.abuf[y0-i].i32 |= 2;
morita 0:a24cdf5b45c0 71 }
morita 0:a24cdf5b45c0 72 }
morita 0:a24cdf5b45c0 73 y0=y;
morita 0:a24cdf5b45c0 74
morita 0:a24cdf5b45c0 75 disp.tranfer_sw=true;
morita 0:a24cdf5b45c0 76 while(timer.read_ms()<50); //wait_ms(50);
morita 0:a24cdf5b45c0 77 }
morita 0:a24cdf5b45c0 78 }