![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
G-senser wave form display Uses 32dot x 16dot LED
加速度をLEDマトリクスに波形表示するデモ
32x16 LEDドットマトリクス表示を使って、加速度センサーの信号を波形として表示します。
波形が飛び飛びになると見にくいので、補間表示しています。
このプログラムには、加速度センサーが必要です。
接続をさぼるために、初期からセンサーが搭載されている、FRDM-KL25Zで動作させました。
他のmbedでは、外付けの加速度センサーを利用する必要があります。
FRDM-KL25Z搭載のMMA8451Qは、3軸の加速度センサーでI2C接続です。
最低限必要な設定だけを済ませて利用しています。
表示に利用しているのはY軸データのみです。
地震計を作りたかったのですが、加速度⇒速度⇒移動距離への変換と、f0=1Hzのローカットフイルタの演算が必要だったので、加速度を直接表示するに止めました。
(計算をする気で、残骸が残ってます)
main.cpp
- Committer:
- morita
- Date:
- 2014-06-01
- Revision:
- 0:a24cdf5b45c0
File content as of revision 0:a24cdf5b45c0:
/* 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); } }