• カテゴリ 雑記 の最新配信
  • RSS
  • RDF
  • ATOM

ブログ - 雑記カテゴリのエントリ

DXCONF改良ネタ

カテゴリ : 
雑記
2011-3-2 0:18
既に公開されているdxlib2にはいくつか既知のバグが残ってはいますが、このdllを使用したDynamixel Configuratorに改造中です。
ついでと言ってはなんですが、今までConfiguratorとして「どしてそうなっとらん?」「どしてできんの?」だった挙動を片っ端から漁って対処していく気分になってきたので、リリース版では行方不明になっていたDynamixelが見つかるなんて事になるやもしれません。

dxlib2の修正と合わせて公開しますので、もう数日待っててください。

Javaついでに

カテゴリ : 
雑記
2011-1-18 15:50
猫も杓子もAndroid。寄らば大樹の陰といった所なのだろうか。


それはさておき、今のところAndroid端末は野良アプリのインストールを許容しているので、Javaついでという事で遊んでみた。

端末単体で動くアプリを作っても味気ないので、ちょっと欲張って大概の携帯についてるBluetoothを使ったRC-100Bモドキアプリにトライ。

RC-100BはBluetoothとしてマスターにしかならないが、今回のアプリではスレーブ構成でFDIII-HCへつなぎに行く事にした。基本的に公開されているチャットアプリのサンプルをちょっといじくっただけなので、ペアリング等のお膳立てがちゃんとしていないとうまくつながらなかったり、デザインなんぞ無視してたり、Android 2.2以上でないと動かないといったトコはご愛嬌。マルチタッチにまともに対応している端末であれば、ボタンの同時押しは一応再現できるといったところ。

動いてるとこの絵


後はGUIを凝ってみたり、一方通行の通信を双方向にてステータスをモニタしたりぶるぶるさせてみたり、勝手に死なないようにしてみたり、なんて事ぐらいだろうか。

怪しい野良アプリをインスコできる勇者はこちらからどうじょ。

JavaでDXLIB2を動かす

カテゴリ : 
雑記
2011-1-17 17:02
じゃばじゃばうるさいので、お試しとしてJavaからDXLIB2を動かすサンプルを作成してみた。
検証した環境は以下の通り。
お試しという事もあり、細かい事は抜きに動けばOKといったノリで条件付け。
  • DXLIB2を直接呼出すことはできないため、一旦ラッピング用DLLを作成する。
  • ラッピング関数名は使用するJavaのクラス名に依存。
  • unsigned short型やlong型はJava上でintとして使用する。
    必要に応じてラッピング関数内で型変換。
  • 全て同一フォルダ内に収める。
  • コンパイラ等へのパスは適宜通しておく。
スペースの都合かなり端折ってるが、こんな感じでやるのかなといった雰囲気だけ。
  1. Javaソース
    サンプルとして0~253のIDにPingを発行して結果をプロンプトに表示するソース。
    <SMPL1.java>
    public class SMPL1 {
      private native int DxOpenPort( String com, int br );
      private native boolean DxClosePort( int devid );
      private native boolean DxPing( int devid, int uid, int tout, char[] terr );
      static {
        System.loadLibrary( "dxtest" );  // 今回作成するラッピング用DLL(dxtest.dll)
      }
      public static void main( String args[] ) {
        String COMPORT = "\\\\.\\COM3";  // COMポート名
        int BUADRATE = 1000000;  // ボーレート
        int TIMEOUT = 50;  // タイムアウト
        char terr[] = new char[1];
        int devid, i;
        String msg = "Ping to ID:", mrk = "\n";
        SMPL1 me = new SMPL1();
        devid = me.DxOpenPort( COMPORT, BUADRATE );
        if ( devid != 0 ) {
          for ( i = 0; i < 253; i++ ) {
            if ( me.DxPing( devid, i, TIMEOUT, terr ) ) {
              System.out.printf( "\nPing to ID:%d...OK", i );
              mrk = "\n";
            }
            else {
              System.out.printf( "%sPing to ID:%d...NG(%x)", mrk, i, (int)terr[0] );
              mrk = "\r";
            }
          }
          if ( !me.DxClosePort( devid ) ) System.out.printf( "Close error\n" );
        }
        else
          System.out.printf( "Port not open\n" );
      }
    }

  2. ラッピング関数名の取得
    a). Javaソースをコンパイル(SMPL1.classを作成)。
    >javac SMPL1.java
    b). ヘッダファイルを作成(SMPL1.hを作成)。
    >javah -classpath . -d . SMPL1
    以下作成されるヘッダファイルの抜粋。
    <SMPL1.h>
    JNIEXPORT jint JNICALL Java_SMPL1_DxOpenPort  (JNIEnv *, jobject, jstring, jint);
    JNIEXPORT jboolean JNICALL Java_SMPL1_DxClosePort  (JNIEnv *, jobject, jint);
    JNIEXPORT jboolean JNICALL Java_SMPL1_DxPing  (JNIEnv *, jobject, jint, jint, jint, jcharArray)

  3. Cソース作成
    a). SMPL1.hをdxtest.cに変更。
    b). ラッピング関数の中身を作成。
    JavaとDLLの仲介役だが、相互の規約を気にしないと話にならない。とりあえず最低限必要なOpen/Close/Pingだけ作った。
    <dxtest.c>
    #define __MAKE_LIB__
    #include <stdio.h>
    #include <stdlib.h>
    #include <jni.h>
    #include "dxlib2.h"
    JNIEXPORT jint JNICALL Java_SMPL1_DxOpenPort
      (JNIEnv *env, jobject jobj, jstring pCom, jint br) {
      DXDEVICEID dev;
      char *port;
      int sz = (*env)->GetStringLength( env, pCom );
      // java文字列より取得
      const char *comPort = (*env)->GetStringUTFChars( env, pCom, 0 );
      port = (char *)malloc( sz + 1 );
      strcpy( port, comPort );
      port[strlen(port)] = 0x0;
      dev = DX_OpenPort( port, br );  // dxlib2.dllのDX_OpenPort()の呼出し
      // memory解放
      free( port );
      (*env)->ReleaseStringUTFChars( env, pCom, comPort );
      return (jint)dev;
    }
    JNIEXPORT jboolean JNICALL Java_SMPL1_DxClosePort
     (JNIEnv *env, jobject jobj, jint id) {
      return DX_ClosePort( (DXDEVICEID)id );
    }
    JNIEXPORT jboolean JNICALL Java_SMPL1_DxPing
      (JNIEnv *env, jobject jobj, jint devid, jint id, jint tout, jcharArray terr) {
      TDxErrorCode  err;
      BOOL      bResult;
      UCHAR   uID;
      jchar        *arrays; // local領域
      int             sz;         // 配列size
      jboolean jbl;         // isCopy
      uID = (UCHAR)(id & 0x00ff);
      bResult = DX_Ping( (DXDEVICEID)devid, uID, tout, &err );
      // 配列の取得
      arrays = (*env)->GetCharArrayElements( env, terr, &jbl );
      if ( (*env)->GetArrayLength( env, terr ) > 0 ) arrays[0] = err;
      // 配列の解放(Javaへ適用)
      (*env)->ReleaseCharArrayElements( env, terr, arrays, 0 );
      return bResult;
    }

  4. DLL作成
    a). dxtest.cをDLLにする。
    >gcc -shared -o dxtest.dll dxtest.c -l dxlib2 -Wl,-kill-at -I Javaのincludeパス -I Javaのincludeパス\win32 -L .
    Javaのincludeパスに空白が含まれている場合はダブルクォーテーションで括る等の措置を講じるべし。

  5. 実行
    a). 以下のDLLとクラスファイルが同じフォルダに存在していることを確認。
    SMPL1.class  dxtest.dll  dxlib2.dll
    b). おもむろにコマンドプロンプトで実行
    >java SMPL1
    実行結果はこんな感じになるだろうか。

雑感、何が楽しいのかさっぱり・・・。

Linuxで

カテゴリ : 
雑記
2010-10-4 21:52
何度か問い合わせをもらっているLinux対応。ってかGNUの恩恵を与っているに過ぎないので、どちらかというとLinux配下で揃えてもらえればって事なんですが・・・。

とりあえずWine使えばバイナリ自体は動くので、シリアルポート使った代物だけ小細工してあげようかなと考えちう。

ud3

カテゴリ : 
雑記
2010-9-28 21:41
作れど作れど間に合わず、申し訳ありません。。。
もう一点、次回カートが空になると次の充当は来年になりそうです・・・。

P.S.
今のUD3のライブラリはある程度余流があるという感触なので、次回アップデートで以下の機能を盛り込もうと考えています。
  • タスクのスタックとして512byte確保しているが、やりたいことが増えると足りなくなりかねないので、2kbyte程度まで増やす
  • Dynamixelプロトコルのスレーブをサポートしているが、ホストとしても機能させてみたいのでモードの切り替えとAPIを追加する
  • DUALSHOCK3のバッテリ残量が気になるらしいのでモニタできるようにする
  • それらに伴いサンプルプログラムを追加修正
  • プロポの初動位置にパンチを追加
といった所でしょうか。

Thethering

カテゴリ : 
雑記
2010-6-23 1:32
iOS4ってフツーにテザリングできるんじゃん。

USBスピーカ

カテゴリ : 
雑記
2010-6-10 18:30

これなんぞいかがでしょう。その名もOlasonic TW-S7
USBバスパワーで試聴に耐えるものなんぞないと思い込んでましたが、あるところにはあるもんです。

ACアダプタ不要で10Wクラスのパワーを発揮。


ディフューザーも効果ばっちし。


ちなみに、卵形ですけどニワトリじゃなくてダチョウサイズっす。Stereo Soundで購入すれば専用ケース付!

そこにドアがあるから

カテゴリ : 
雑記
2010-5-26 16:39



いちよーこのぐらいのコードでえんとちゃう?
なんつー無意味なマルチタスク加減。

at91sam7s/xの起動処理

カテゴリ : 
雑記
2009-12-3 0:35
ずーっと使いながら時々気になっていたことって良くあるものです。別のせいにしてお茶を濁してることもしばしば。at91sam7s/xでも似たようなことがって、あまり手を入れていなかった所に地雷が仕掛けられていました。それがPLLの初期化。
とりあえず現状でも動くのですが、起動させる条件(たとえばデバッガを使っていたりRAMでブートさせるといったと時)によって時折動かない事が起こり得えます。これはCPUの動作クロックを設定する部分に起因していて、フラグが意図通り変化しない場合に陥ります。openocdがガンガンバージョンアップしていく過程で明らかになった部分で、アセンブラであったこともあり気付くのに時間を要してしまいました。
GCC Developer Lite本体のWindows Vista/7対応レベルの向上、sam7s/xのx64環境でのUSBシリアルエミュレーションドライバ対応、sam7s/xのRAMデバッグ環境の見直し、FDIIIライブラリのバグフィクスと合わせて近々更新する予定です。

at91sam7s/xのボーレート

カテゴリ : 
雑記
2009-10-29 5:42
現在AT91SAM7S/Xシリーズ向けのシリアル通信ライブラリにおいて、USARTのボーレートは粗めの分解能でしか設定出来ません。特段理屈は無かったのですが、確かに高いボーレートになると合わせにくい所でもあります。
次のGCC Developer Liteのアップデート時にUSARTのSampling Divider関連は全て16から8に変更されますので、従来よりも倍の精度でボーレートが設定できるようになります。
なお、FDIII-HCにおいてもボーレートが全域においてDynamixelと一致しますので、666k,500kbpsといった最大速度に対して若干遅めのボーレートにも対応できるようになります。

それと、ボーレートついでに。
しばしば問い合わせのあるPCとDynamixel間の無線化は、特に特殊な事をせずともFDIII-HCを使用する事で実現できます。USB接続のみのDnamixelコンフィギュレータをFDIII-HCに置き換えるだけで、Bluetoothによる無線化が簡単に行えます。その場合FDIII-HC用に専用のプログラムを作る必要はありませんし、USBケーブルで有線、Bluetoothで無線といった具合に必要に応じて自由に使い分ける事もできます。もちろんPC上のソフトウェアの資産はそのままで、接続先に応じたCOMポート番号を変えれば良いだけ。
ちなみに、FDIII-HCではBluetoothのDTE速度を460.8kbpsとしていますので、無線化したとしてもリアルタイム性は別としてそこそこのスループットは得られるかと思います。