![](/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@1:7c07dd843bbd, 2014-06-01 (annotated)
- Committer:
- morita
- Date:
- Sun Jun 01 13:08:57 2014 +0000
- Revision:
- 1:7c07dd843bbd
- Parent:
- 0:a24cdf5b45c0
G-senser displayd wave forms; 32dot x 16dot LED display;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |