ニュース

    社内行事による臨時休業のお知らせ (2014/09/15)

    誠に勝手ながら、社内行事のため下記期間に臨時休業を予定しております。
    期間:2014年9月22日(月)~2014年9月25日(木)
    この間お電話によるお問い合わせは承る事ができません。
    なお、ウェブショップご利用の場合は、9月26日から順次対応致します。
    ご不便をお掛けいたしますが、ご理解を賜りますよう宜しくお願い申し上げます。
    また、予定が変更になりましたら再度お知らせ致します。

    管理部

    夏季休業のお知らせ (2014/08/11)

    8月13日~15日は全ての業務をお休みさせて頂きます。
    その間にオンラインショップからご注文頂いた場合は、休み明けから順次発送を行います。

    予めご了承ください。

    Digitus STM32F3マイコンボードリリースのお知らせ (2014/08/08)

    カスタム製品の一環としてDigitusシリーズを展開しておりますが、STマイクロエレクトロニクス社のSTM32F373CCを搭載したマイコンボードが好評のため、このたび一般販売を開始いたします。

    STM32F373のコアはARM社のCortex-M4で、DSP命令及びFPU命令をサポートし、小型ながら高速かつ高度な演算をこなす事ができます。

    両端のランドは40ピンのDIPパッケージのICと同じサイズになっており、ブレッドボード等で実験する際も扱い安くなっています。


    また、USB I/Fを介してPCと接続する事で電源供給が行える他、プログラムの書き換えが行えます。



    ショップページへ
    商品名:Digitus STM32F3
    商品番号:BTC097
    価格:¥4,400. (税別)
    付属品:本体・ピンヘッダ

    詳細はこちらをご覧ください。

ニュースのトップへ

ブログ

    Status Return Levelの復帰 (2014/08/26)

    Dynamixelはシリアル通信でホストとコミュニケーションを行いますが、そのコミュニケーションを設定によって容易に阻害する事ができてしまいます。そのアイテムはStatus Return Levelでして、デフォルトは2なのですが、0にすると通常のコミュニケーションは一切できない様に見せかけられてしまいます(唯一Pingパケットには応答します)。
    この設定は不揮発領域に配置されており、電源を入れ直しても自動的に元に戻る事はありません

    ということで、アクチュエータ系のDynamixel前提ですが、Status Returl Levelのリカバリ用プログラムを作ってみました。
    ツクリは単純でして、ボーレートを順次変えながらPingで検索し、見つかったidに対してReadが失敗したらStatus Return Levelが0になっていると仮定し、強制的に2で上書きするといったものです。

    #include <stdio.h>
    #include <conio.h>
    #include "dxlib.h"

    #define OFFSETTIME  (50)  // タイムアウトオフセット[ms]

    void main (void) {
      TDeviceID   dev;
      char        inputcomport[10], mycomport[20]="\\\\.\\";
      int         bdiv=-1, baud, i, yn;
      uint16_t    val16;
      uint8_t     val8;

     printf ("input com name=");
      gets (inputcomport);
      printf ("use [%s]\n",inputcomport);
      strcat (mycomport, inputcomport);

      if ((dev = DX_OpenPort (mycomport, 3000000))) {
        DX_SetTimeOutOffset (dev, OFFSETTIME);
        printf ("Open success\n");
        for (bdiv=-1;bdiv<250;bdiv++) {
          // ボーレートの変更
          if (bdiv >= 0) DX_SetBaudrate (dev, (baud=2000000 / (bdiv + 1)));
          else           DX_SetBaudrate (dev, (baud=3000000));
          printf("\rbaud=%7d ",baud);

          uint32_t num = 253;
          TDxAlarmStatus stat[255];
          // Ping2で検索
          if (DX_Ping2 (dev, &num, stat, NULL)) {
            printf ("%d device found\n", num);
            // 検索で見つかったデバイスを列挙
            for (i = 0; i < num; i++) {
              // アドレス16(Status Return Level)を読み出し
              if (DX_ReadWordData (dev, stat[i].id, 0, &val16, NULL)) {
                printf ("Found ID=%d stat:$%04X modelno:$%04X\n", stat[i].id, stat[i].Status, val16);
              } else {
                // 読み出しに失敗したらおそらくStatus Return Levelが0だろう
                printf ("Found ID=%d stat:$%04X modelno:???? \n", stat[i].id, stat[i].Status);
                printf ("Do you want to reset Status Return Level ? (y/n)->");
                yn = getch ();
                putch( yn);
                if (yn == 'y' || yn == 'Y') {
                  printf ("\nupdate....");
                  DX_WriteByteData (dev, stat[i].id, 16, 2, NULL);
                  Sleep (800);
                  if (DX_ReadByteData (dev, stat[i].id, 16, &val8, NULL)) {
                    if (val8 == 2) printf ("success\n"); else printf("fail\n");
                  } else printf ("fail\n");
                } printf ("\n");
              }
            }
          }
        }
        DX_ClosePort (dev);
      } else {
        printf ("Open error\n");
      }
    }
    DXLIBを使っていますので、コンパイルにはGCC Developer Liteを使用したコンパイルの方法を参考にしてください。

    また、コンパイルが面倒といった場合は、ちょっとイリガルな方法ですがDXCONFを使って書き換える事もできます。
    Status Return Levelが0でもPingには応答するため、スキャンすると以下の様に???(不明なデバイス)として列挙されます。


    通常であれば、該当デバイスをクリックする事で右半分に表示されるコントロールテーブルがそのデバイスに応じて切り替わるのですが、不明なデバイスの場合はこの画面キャプチャの様に5個のアイテムのみの表示になってしまい、値自体も不定となります。
    ではこのコントロールテーブル上にマウスカーソルを置き、右クリックしてください。ポップアップメニューが表示されますので、もしデバイスの型式がわかっているのであれば、この中から該当するデバイスを選択します。


    選択したデバイスに応じた コントロールテーブルの表示に切り替わりますので、その後強制的にNo.16 Status Return Levelを2に変更します。処置後は全ての通信ができるようになる筈です。


    お試しください。

    技術

    Digitus STM32F3用ブートローダ (2014/08/20)

    Digitus STM32F3用ブートローダの情報が不完全でしたので本日補完しました。
    STM32F3 Bootloader
    ST社のDfuSeというツールを使えばUSB経由でチップのフラッシュへ書き込む事ができますが、その前にBOOT0端子(CN2-38)を3.3V端子(CN1-2)につないでからUSBケーブルを接続してください。

    技術

    DXLIB V3.0公開 (2014/06/11)

    Dynamixel Library Version 3.0を公開しました。

    既にいくつかのソフトウェアには導入済みですが、DXLIB2(XLやProシリーズの新プロトコル用API)の機能拡張に伴い、パラメータの互換性を保つためDXLIBも修正を施しました。
    主な変更点は以下の通りです。
    • アドレス指定を8bitから16bitに変更
    • 不明瞭だったTDxAlarmStatus構造体のアライメントを1バイト境界に固定
    • 似非ReadSync APIを追加
    • 不定なDevice IDを指定された際のクラッシュを簡易的にブロック
    • dllのソースをC++に
    • API引数の変更に伴い各サンプルを修正
    • LabVIEWのサンプルを大幅に拡充
    • EXCELのVBAを64bitに対応
    特にLabVIEWから制御する際の使い勝手を向上させたのと、サンプルプログラムを増やしました。特定のアイテムへのアクセスを対象としたviは、ループ中に適用しても不用意にトラフィックを上げない様な仕掛けや、LabVIEWのイベントストラクチャを多用したり、ダイナミックなポートの開閉等、そこそこがんばってみました。

    PCから直接制御する際の参考にして下さい。

    技術

    DynamixelをPCから直接コントロール (2014/06/02)

    ■Dynamixelをコントロールするにあたり

    DynamixelシリーズをPCから制御ためのAPIとしてDXLIBを公開していますが、Dynamixelが持っているコントロールテーブルへアクセスする事に特化しているため、Dynamixelの素性に応じた違いや行いたい制御方法によっては無限とも言える組み合わせでユーザ自ら試行錯誤してプログラミングしなくてはなりません
    一応1台のDynamixelの動作を確認したり設定を変更するのであればDXCONFというツールである程度対応できますが、こちらもまたコントロールテーブルの中身を可視化させて書き換えがしやすくなっている意外には特別な機能は持っていません。
    さらに、マイコンから制御するとなると、これまたPCとは違う知識が要求される面が多々あって、「ひとまず動かしてみる」といった用途には向きません。

    結局のところ、プログラミングスキルを身につけないと、要求仕様のレベルが少し上がるだけでハードルがうんと高くなってしまうのが実情です

    ■とりあえずでもある程度動かす

    Dynamixelを使用する台数が多いアプリケーションは用途が複雑なケースが大半でしょうから、双方向で通信できる事に期待した機能も盛り込みたくなるのが心情です。しかしながら構成が変わる度にゼロからプログラミングするのはかなり酷ですし、複雑であるがゆえに初期の段階で試運転したくなります。

    ということで、少しでもそれらのニーズの一助となればと思い、PCとDynamixel間をDXHUBUSB-3WAY等で接続した環境において、予め設定しておいた様々な動きを再現させるだけのツールを準備する事としました。
    予め各々異なるIDを振りボーレートを同じにしたDynamixelを、みんなつないで一斉に面倒を見てくれるといった感じです。
    実は、これと同様な環境がROBO-ONEというイベントで頒布したツールにも含まれていましたが、イベントという事もあり解る方にしかわからない環境を要求されてしまうのと複数メーカをサポートしているため、二次的に頒布するには使い勝手が悪いのは否めませんでした。

    今回は用途を「ひとまず複数台を連動してスムーズに動かす」に限定し、全てNI社LabVIEWを使って作り直したものを提供することにします。

    ■大まかな構成

    プログラムは2つ提供します。

    <ホスト>
    Dynamixelとの通信を高い頻度で行い続けるホスト役で、ウィンドウの外観からは動いている事をうかがい知ることがほとんどできませんが、Dynamixelならではの処理ルーチンが集約されています。
    基本的に、後述する他のプログラム等から角度と角速度程度の情報をこのホストに投げかけると、目的の角度まで自動的にスムーズに動かしてくれます。
    また、アラームやエラー・温度・トルク・現在角度をリアルタイムに取得し続けていますので、これらの情報を他のプログラムからモニタする事もできます。
    なお、DynamixelのID・Baudrate・Return Delay Timeの3つの設定に限り本ツールより直接変更する機能も盛り込んでいますので、よほどのことが無い限りDXCONFいらずです。

    基本的な操作は、IDやDynamixelの種類、Goal Position等の位置と角度(deg)の変換係数、ホームポジションといった情報を登録するだけですが、接続されたDynamixelを自動的に検索して登録させる事もできます。



    <エディタ>
    DynamixelのネイティブなIDや位置の概念は無く、ホストに登録された順に軸を扱い、各軸のホームポジションからの角度(deg)の偏差と時間を扱うポーズエディタです。
    アニメーションの様にある時点の角度を記憶させ、それを複数用意し、最終的に連続して再生するといった手法を採用しています。本当のアニメーションの様にたくさんのポーズを作る必要はなく、今のポーズから次のポーズへ移行する時間を設定する事で、その間は自動的に直線的に補完します。ようするに道のりを問わないのであれば、A地点からB地点移動する場合はA地点とB地点の2つのポーズだけ登録し、その間を移動する時間を設定すれば良い訳です。なお、FDIII-HCのライブラリとほぼ考え方は一緒です。
    ポーズはファイルとして保存できますので、二次利用も容易なはずです。

    なお、本ツールではポーズの編集と再生以外の機能は持たせるつもりは無く、さらなる利便性やニーズに応える機能は別の機会に提供しようと考えています。
    一応ホストはそのままで、エディタをIKを使った6軸アームロボット制御プログラムに入れ替えたものや、もっと実機に近いイメージでポーズをデザインできるエディタ等は既に一部に提供済だったりしますが、他に何か楽しげなネタがあればリクエストいただければと思います。



    ■制約等

    <PC>
    最近のマルチコアCPUを搭載したPCがあると良いです。必須というわけではありませんが、ある程のリアルタイム性を確保するためには、ここ数年来のPCがあると良いです。

    <レイテンシ>
    DXHUBやUSB-3WAYはPCのUSBポートに接続して使用しますが、これらに適用されるデバイスドライバをデフォルトのまま使用すると通信の応答性が極端に悪くなり、スムーズな動作ができなくなります。
    各I/Fのドキュメントに記載されている応答の待ち時間を1にしなくてはなりません。

    <ボーレート>
    先のレイテンシと似ていますが、通信速度が遅いと情報の伝達速度も遅くなります。できるだけ高速な通信が望まれるため、ボーレートは1Mbpsを推奨します。

    <Dynamixel I/F>
    よく見受けられる散発的だったり一方通行のDynamixelとの通信プログラムとは異なり、ホストではかなり込み入ったトランザクションを処理します。そのため、正常に通信が行えないDynamixelがI/F上に1台でも存在していてはなりません。

    <ネットワーク環境>
    LabVIEWの機能をふんだんに使っているため、オンライン・オフラインにかかわらずファイアウォールの影響を受けます。アンチウィルス等でポート開放の動作が阻害されないようにしなくてはなりません。

    <LabVIEWのランタイムエンジン>
    提供するプログラムはexeファイルではありますが、LabVIEW 2011SP1にて開発されているため、ランタイムエンジンを予めインストールしておく必要があります。

    <制限>
    フリー版と有償版を準備する予定ですが、どの程度の機能制限をするかは検討中でして、今のところ軸数や動作時間を予定しています。



    といったところで、今月中には試食版を提供できる予定です。

    技術

ブログのトップへ