So-net無料ブログ作成

3軸加速度データ送信プログラム [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

あいかわらず、加速度センサのデータをUDPで送り出すプログラムを改善しておりました。 オリジナルのファイル"ad"を変更して、3軸加速度データを送信するようにしてみました。

文字列バッファと送信バッファを準備した

3軸の加速度データを送信するために、各加速度データを数値文字列に変換し、セミコロンでつないで一行のデータとしてみました。 変換後の数値文字列をnbufポインタの指示するバッファに入れて、 bufポインタの指示するバッファに順に送信データを作っていきます。

adinit(void){InitAd(0x70);}disp(char ch){PrNum(GetAd(ch));}
udpsend(char *str){
  char *soc,*nbuf,*buf;long ip;
  ip=GetIP(str);if(ip==0)return;
  soc=CreateSocket(0);
  buf=MemoryAlloc(30);
  nbuf=MemoryAlloc(10);
  InitAd(0x70);
  #stop 0
  for(;;){
    GetDigit(GetAd(4),nbuf);StrCpy(buf,nbuf);StrCat(buf,";");
    GetDigit(GetAd(5),nbuf);StrCat(buf,nbuf);StrCat(buf,";");
    GetDigit(GetAd(6),nbuf);StrCat(buf,nbuf);StrCat(buf,";");
    SendTo(soc,ip,30049,buf,StrLen(buf));
    if(Getc(0)=='q')break;
  }
  MemoryFree(nbuf);
  MemoryFree(buf);
  CloseSocket(soc);
}

まあ、動きはしますが、ワークエリアを複数取る上にプログラムが長ったらしくなるので、美しくありません。

送信バッファだけを使う方式

上の例は、BASIC的な発想に基づいています。 二つ目は、Cらしく、ポインタを駆使して、送信バッファだけを使います。

adinit(void){InitAd(0x70);}disp(char ch){PrNum(GetAd(ch));}
udpsend(char *str){
  char *soc,*buf;long ip;
  ip=GetIP(str);if(ip==0)return;
  soc=CreateSocket(0);
  buf=MemoryAlloc(30);
  InitAd(0x70);
  #stop 0
  for(;;){
    GetDigit(GetAd(4),buf);StrCat(buf,";");
    GetDigit(GetAd(5),buf+StrLen(buf));StrCat(buf,";");
    GetDigit(GetAd(6),buf+StrLen(buf));StrCat(buf,";");
    SendTo(soc,ip,30049,buf,StrLen(buf));
    if(Getc(0)=='q')break;
  }
  MemoryFree(buf);
  CloseSocket(soc);
}

StrLen()関数が重そうなのですが、多少はマシでしょう。

LPFを実装してみた

ローパスフィルタを入れてみました。 PC側でフィルタ処理をすると送信データ長が長くなってしまい、処理速度が低下すると思ったので、ColdFireで複数測定値の和を求めるように変更しました。

adinit(void){InitAd(0x70);}disp(char ch){PrNum(GetAd(ch));}
udpsend(char *str){
  char *soc,*buf;long ip;
  int i;
  long x,y,z;
  ip=GetIP(str);if(ip==0)return;
  soc=CreateSocket(0);
  buf=MemoryAlloc(30);
  InitAd(0x70);
  #stop 0
  for(;;){
    x=y=z=0;
    for(i=0;i<4;i++){x+=GetAd(4);y+=GetAd(5);z+=GetAd(6);}
    GetDigit(x,buf);StrCat(buf,";");
    GetDigit(y,buf+StrLen(buf));StrCat(buf,";");
    GetDigit(z,buf+StrLen(buf));StrCat(buf,";");
    SendTo(soc,ip,30049,buf,StrLen(buf));
    if(Getc(0)=='q')break;
  }
  MemoryFree(buf);
  CloseSocket(soc);
}

たった、4測定分の加速度データの和を求めているだけなのに、処理速度が落ちてしまいました。 これは、インタプリタという仕組みの限界なのでしょうか。

文字列変換は重そうなので、直接バイナリデータとして送信したほうが良さそうだな。

参考文献

まだ、在庫があるらしいぞ。

Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(3)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 3

Sim

こんにちは
ニコニコ動画にColdFire基板を使った工作の動画がありました。3軸加速度センサーを使っているみたいです。

ネギにLANを繋いで振ってみた
http://www.nicovideo.jp/watch/sm4346746

by Sim (2008-08-21 08:32) 

hamayan

> ネギにLANを繋いで振ってみた

やっぱりネギを振るのか。
誰もが「きっと誰かがやるな」と予感していて、やっぱり表われたと言う感じでしょうか。

by hamayan (2008-08-21 08:56) 

たけまろ

写真が同じままだったので更新に気がつきませんでした(^-^;

加速度センサについての動画ならここにもありますよー。
下のほうにYoutubeが貼られてます。
http://d.hatena.ne.jp/orangebook/20080807

by たけまろ (2008-08-21 19:57) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。