SSブログ

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

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