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のローカットフイルタの演算が必要だったので、加速度を直接表示するに止めました。
(計算をする気で、残骸が残ってます)

Revision:
0:a24cdf5b45c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 01 13:00:03 2014 +0000
@@ -0,0 +1,78 @@
+/*
+    32dot*16dot LED display demo.
+    For FRDM-KL25Z.
+    地震計デモ
+        2014.05.25
+*/
+
+#include "mbed.h"
+#include "kp1632d.h"
+
+Serial pc(USBTX, USBRX);
+DigitalIn SW1(D2,PullUp),SW2(D3,PullUp);
+KP1632D disp(D7,D9,D10,D6,D5,D4); //defalut interrupt speed = 200uS
+I2C i2c(PTE25,PTE24); //MMA8451Q
+
+void writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) {
+    char buf[2];
+    buf[0]=regAddr;
+    buf[1]=data;
+    i2c.write(devAddr<<1,buf,2,false);
+}
+
+void readBytes(uint8_t device,uint8_t address, uint8_t length, char *data) {
+    char buf[2];
+
+    buf[0]=address;
+    i2c.write(device<<1,buf,1,true);
+    i2c.read(device<<1,data,length,false);
+}
+
+int main() {
+    uint8_t i,n,buf[2];
+    int16_t y,y0=8;
+    uint8_t gs=3;
+//float speed,l;
+    const uint16_t gain[12]={1,2,5,10,20,50,100,200,500,1000,2000,5000};
+//    const float K=((9.8e3/2)*50e-3)/4096; // G=9.8m/s^2 s=50mS N=4096/G
+
+    Timer timer;
+    timer.start();
+    writeByte(0x1d,0x2a,0x01);  //MMA8451Q syscon reg 1 ,set ACTIVE mode
+
+    while(1){
+        timer.reset();
+        readBytes(0x1d,0x03,2,(char*)buf); //MMA8451Q read Y axis
+        y=(buf[0] << 6) | (buf[1] >> 2); //16bit left adjust -> 14bit right adjust
+        if (y > 8191) y -= 16383; //offset binary -> 2'
+
+//speed=y*K;// speed=mm/s (50ms)
+//l += speed*50e-3;//mm (50ms)
+
+        y=y/gain[gs] + 8;//display gain
+        if(y<0)y=0;
+        if(y>15)y=15;
+
+        for(i=0;i<16;i++){
+            disp.abuf[i].i32 <<= 1;
+        }
+        disp.abuf[y].i32 |= 1;
+        if(y>y0){
+            n=(y-y0)>>1;
+            for(i=1;i<=n;i++){
+                disp.abuf[y0+i].i32 |= 2;
+                disp.abuf[y-i].i32 |= 1;
+            }
+        } else {
+            n=(y0-y)>>1;
+            for(i=1;i<=n;i++){
+                disp.abuf[y+i].i32 |= 1;
+                disp.abuf[y0-i].i32 |= 2;
+            }
+        }
+        y0=y;
+
+        disp.tranfer_sw=true;
+        while(timer.read_ms()<50);   //wait_ms(50);
+    }
+}