• カテゴリ その他 の最新配信
  • RSS
  • RDF
  • ATOM

ブログ - その他カテゴリのエントリ

大洪水

カテゴリ : 
その他
2011-11-10 13:28
朝、出社してみると天井から大量の水が。
上階に連絡に行った時には既に出水は収まっているものの床上浸水状態で、この水がどこかを伝わり下階へ流れ込んでいた模様。
床一面の水溜りとを1時間以上かけて処理するも未だに天井からは水滴がポトリ。
事務用PCと複合機が冠水してしまったので、事務作業は一時停止中。
水難の相でも出ていたか。

香り付き蚊取線香

カテゴリ : 
その他
2011-11-8 12:06
一般では風邪が流行っている様子ですが、個人的に頭を悩ませているのは11月を過ぎても発生している蚊。
この季節、対策グッズは入手困難で唯一入手可能であったのが蚊取線香。
なるほど、それなりの効き目はあったが2日たっても煙いのはやはり線香ゆえか。
しかも煙に効用がないときては香りくらいは欲しいところ。
お香にもなる蚊取線香なんて各メーカさん、どうですかねぇ。
うん、やっぱ電気蚊取でいいや(笑)

MATLAB/simulinkでDXLIB2を動かす

カテゴリ : 
その他
2011-8-19 20:20
MATLABでできてsimulinkでできないことはないよな。ってことで試してみた。
検証環境は前回同様以下の通り。
直接simulinkからDLLを呼出すことはできそうになかったので、MATLABを経由して呼出すことにした。
前回パスは通しているので、いきなりモデルを作成。ちなみにモデルのパスも登録が必要だ。

FunctionではなくEmbedded MATLAB Functionを配置して編集。
dx_openの中身は以下の通り。
function ret = dx_open()
eml.extrinsic ('dxopen');
ret = 0;
ret = dxopen();
MATLABで宣言したdxopenを呼出しているだけ。 当然dxopenはmファイルだ。
function ret = dxopen()
  if exists('dxlib2.h','file') ~= 2;
  disp('Not found');
  devid = 0;
 else
if ~libisloaded('dxlib2'); loadlibrary('dxlib2.dll','dxlib2.h'); end
  devid = calllib('dxlib2','DX_OpenPort','\\.\COM4',1000000);
 if devid ==0; unloadlibrary('dxlib2'); end
  disp('call DX_OpenPort');
  end
  ret = devid;
 disp('start end');
mファイルは前回使用したものを分割して戻り値を返すようにしただけなので、他のmファイルは割愛。
結果は次の通り。


まぁsimulinkから呼出せているからこれで良しとする。

MATLABでDXLIB2を動かす

カテゴリ : 
その他
2011-7-19 17:51
DXLIB2にはLabVIEWのサンプルがあるが、MATLABのサンプルはないのか?
そんな噂を耳にしたので軽くさわりだけの確認を。
検証環境は以下の通り。
準備としてdxlib2.dllとdxlib2.hを作業フォルダへコピー。
MATLABを起動し、「ファイル(F)」→「パス設定(H)」で作業フォルダを追加。
mファイルを新規作成し、以下をdxsample.mとして保存。

function dxsample
if exist('dxlib2.h') ~= 2;
    disp('header undefined');
    return;
end
if ~libisloaded('dxlib2') loadlibrary('dxlib2.dll','dxlib2.h');end
pcom = '\\.\COM3';
br = 1000000;
tout = 100;

devid = calllib('dxlib2','DX_OpenPort',pcom,br);
if devid==0;
    disp('Open failed!');
    unloadlibrary('dxlib2');
    return;
end
Err = libpointer('uint16Ptr', 0);
for i = 0:252
    Ret = calllib('dxlib2', 'DX_Ping', devid, i+1, tout, Err);
    if Ret;
        fprintf('Found ID=%d\n', i+1);
    else
        fprintf('Not found ID=%d [$%04x]\n', i+1, Err.Value);
    end
end

calllib('dxlib2','DX_ClosePort',devid);
unloadlibrary('dxlib2');
disp('Normal end');

結果はこんな感じ。

警告はMATLAB内のwin.hに起因しているようで、少々loadlibraryに時間がかかっているが、ここでは割愛。

またまたUD3出荷準備中

カテゴリ : 
その他
2011-7-6 20:06
先回のロットがあっという間に終わってしまったため、次ロットの準備を行っている最中です。在庫の充当にはあと数日かかりますので、もうしばらくお待ちください。
なお、既に予約いただいている分に相当数が割り当てられてしまう都合、購入される場合は見積依頼されることをお勧めします。

それと、GCC Developer Liteの更新が間近に迫っており、UD3のライブラリもアップデート対象となっています。一部のコンソールAPIが変更されるため、公開された際はサンプルプログラムも合わせて更新してください。

COMポートネタ

カテゴリ : 
その他
2011-5-6 17:21
最大は256までらしいが、255で正常に稼働せず。
まぁWindowsで256個もCOMポートを開くことはないが、Vistaが入ったPCで知らぬ間に使えるCOMポートが無くなっていたので、ちょっと調べてみたらとんでもない事に。どうやらBluetoothでペアリングを繰り返しているうちに、自動的に削除されていると思っていた仮想COMポートが、幽霊のように残っていた事が判明。
デバイスマネージャは通常接続されていない装置はリストに列挙されないが、環境変数"devmgr_show_nonpresent_devices"を追加し"1"を設定した後、デバイスマネージャで「非表示のデバイスの表示」にチェックを入れると、今まで見えなかったゴミもろとも表示される。

あとは片っ端から二度と使われることのないデバイスを一つ一つ手動で削除するだけだが、必要な物まで削除してしまわないように。
なお、Windows 7以降ならBluetoothデバイスのペアリングで追加されたCOMポートは、そのBluetoothデバイスを削除すれば一緒に無くなる模様。

ついでと言っては何だが、ちょっとだけプログラムネタ。
自前でCOMポートを扱うプログラムを作ろうとすると、設定項目とAPIのボリュームで結構大変。大そうな事をする訳でも無いのにプログラムの行数だけは増えてゆくもの。なんていうネタがあったので、至極単純なシリアルターミナルを数十行で作ってみた。
イベントやブロッキング・タイムアウトなんぞ一切無視して、全てポーリングで処理して無限ループするだけの代物。まるでマイコンのプログラムの様だw
#include <signal.h>
#include <windows.h>
#include <conio.h>

int term = 1;

void signal_handler (int signo) {
(void)signo;
signal (SIGINT, signal_handler);
term = 0;
}

void main (void) {
int i;
char c = 0;
HANDLE h = CreateFile ("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
DCB dcb = { BaudRate:115200, ByteSize: 8, Parity: NOPARITY, StopBits: ONESTOPBIT, };
COMMTIMEOUTS timeouts = {0,0,0,0,0};
COMSTAT stat;
DWORD l;
UCHAR buf[500];

if (h != INVALID_HANDLE_VALUE) {
signal (SIGINT, signal_handler);
if (SetCommState (h, &dcb)) {
if (SetCommTimeouts (h, &timeouts)) {
while (term) {
if (kbhit ()) {
c = getch ();
WriteFile (h, &c, 1, &l, NULL);
}
if (ClearCommError (h, NULL, &stat)) {
if (stat.cbInQue > sizeof (buf)) stat.cbInQue = sizeof (buf);
if (ReadFile (h, &buf, stat.cbInQue, &l, 0) != 0) for (i = 0; i < l; i++) putchar (buf[i]);
}
Sleep (5);
}
}
}
CloseHandle (h);
}
}
COMポートやボーレート等は適宜変更して、GCC Developer Liteのコンパイラオプションを開き、設定リストから「x86 (Console)」を選んでコンパイルすればWindowsのコマンドプロンプトで動くexeファイルの完成。終了するにはCtrl+Cを押してね。
まかり間違うとOSの負荷だけ上がってPCが熱暴走しかねないが、こんなおバカな代物でも時には使い道があるやも知れないので、備忘録として載っけておく。ってかTera TermやSimple Termでいいじゃん。

原発

カテゴリ : 
その他
2011-3-31 9:24
何か起こる前に全原発を安全に停止させて廃炉してくれ
リサイクルに回せないゴミは受付お断り
だからと言って不法投棄何ぞするな

もう原発の恩恵なんぞいらない

ユニバーサルドライバ3出荷準備中

カテゴリ : 
その他
2011-3-25 20:10
こんな時こそ助けにならなければならないロボットはいまだ何の役もかけない。とても辛い・・・。さらに計画停電が続く中、 四苦八苦しながらUD3の在庫充填準備中。。

今回から適用されるリビジョンE093Cからは、モータ用電源の有無を回路内で判断しゲートを駆動するので、モータ用電源が印可されない状態で不用意に動かしてもゲート回路が過電流に陥る事は軽減される予定。

なお、大事なパーツの一部が東北で作られていたりするが、それにもかかわらずある程度まとまった数が準備できたので、必要な時にショップをのぞいていただければ在庫無しという事はないはず。


それと、ついでと言ってはなんだが、dxlib2dxconfuss3confもアップデート済み。

ExcelでDXLIB2を動かす

カテゴリ : 
その他
2011-2-1 17:08
2011/2/2 dxlib2 Ver2.2公開にあたり

各開発環境毎でdllの扱いが違いすぎてごっつ使い辛いのがイラついたので、再度更新。
V2.0およびV2.1の使用を即刻中止し、V2.2に移行する事を強く推奨。

たびたびの修正ご容赦を。


これまで、Java,Ruby,Pythonよりdxlib2を使用したDynamixelの動作確認を行ってきた。

諸々試し始めている方は気付かれているかも知れないが、dxlib2はVBからの利用ができなくなっている。dxlib2の関数呼出規約がcdeclになっているが故に、VBから見えないという訳である。

そこで、VBないしVBAからの呼出しを可能にするため、dxlib2 Version2.1から呼出規約のデフォルトをstdcallに変更することとした。

それに伴う影響が以前紹介した言語にどこまで波及するか確認してみた。Javaはラッピング関数作成時のリンカオプションに-mrtdを付加することで解決。Pythonはcdllクラスからwindllクラスことで解決。Rubyに至っては影響なしという結果だった。
Ruby恐るべし。

肝心のVB(ここではExcelのVBA)での使用だが、通常のAPI呼出しと同様にdxlib2内の関数を適宜Declareするだけで使用することができる。
検証環境は以下の通り。
  1. OS: Windows 7(32bit)
  2. Microsoft Excel
  3. dxlib2 V2.1
準備はdxlib2.dllと同一フォルダに適当なExcelファイルを作成するだけ。
  1. VBAサンプル
    サンプルとして0~10のIDにPingを発行して結果をメッセージダイアログに表示する。
    宣言
    Declare Function DX_OpenPort Lib "dxlib2.dll" (ByVal pcom As String, ByVal br As Long) As Long
    Declare Function DX_ClosePort Lib "dxlib2.dll" (ByVal id As Long) As Boolean
    Declare Function DX_Ping Lib "dxlib2.dll" (ByVal devid As Long, ByVal uid As Byte, ByVal tout As Integer, ByRef terr As Integer) As Boolean
    本文抜粋
    Dim sMsg As String
    Dim devid As Long
    Dim i As Integer, terr As Integer
    Dim vRet As Variant
    ChDrive ActiveWorkbook.Path
    ChDir ActiveWorkbook.Path
    devid = DX_OpenPort("\\.\COM3", 1000000)
    If devid = 0 Then
    MsgBox "Port open failed!", vbCritical, "COMポートオープン失敗"
    Else
    For i = 0 To 10
    vRet = DX_Ping(devid, i, 50, terr)
    If vRet Then
    sMsg = sMsg & i & " Alive" & Chr(13) & Chr(10)
    Else
    sMsg = sMsg & i & " Dead : " & Hex(terr) & Chr(13) & Chr(10)
    End If
    Next
    DX_ClosePort devid
    End If
    MsgBox sMsg, , "DXLIB2 TEST"
  2. 実行結果

EXCELであればセルにデータを保持すればグラフなり何なりにする事も可能だが、既にdxlib2 V2.1のサンプルとして同梱されてるのでそちらをを参考に。

それと、dxlib2 V2.1をGCC Developer Liteで使う際は、コンパイルオプションに -mrtd を付けてビルドしないと自殺アプリになってしまうのでご注意を。

PythonでDXLIB2を動かす

カテゴリ : 
その他
2011-1-28 13:40
RubyでDXLIB2を動かすことができたので、更なるお試しとしてPythonでDXLIB2を動かすサンプルを作成してみた。
検証環境は以下の通り。
準備はRubyと同様、パスを通してHWの接続を確認。
  1. Pythonソース
    サンプルとして0~253のIDにPingを発行して結果をプロンプトに表示する。
    <SMPL1.py>
        from ctypes import *
    import sys
    # load library
    dxlib2 = cdll.LoadLibrary("dxlib2.dll")
    dxopen = dxlib2.DX_OpenPort
    dxclose = dxlib2.DX_ClosePort
    dxping = dxlib2.DX_Ping
    # set types for return and parameter of API
    dxopen.argtypes = [c_char_p, c_long]
    dxopen.restype = c_void_p
    dxclose.argtypes = [c_void_p]
    dxping.argtypes = [c_void_p, c_ubyte, c_int, c_void_p]
    # initialize
    terr = c_ushort()
    comport = "\\.\COM3"
    baudrate = 1000000
    timeout = 100
    procsw = 0
    OK = 1
    NG = 0
    cr = "\n"
    lf = "\r"
    # call API
    devid = dxopen( comport, baudrate )
    for idx in range(254):
    result = dxping( devid, idx, timeout, byref(terr) )
    if result == OK:
    sys.stdout.write( "\n%d alive" % idx )
    procsw = 0
    else:
    if procsw == 0:
    sys.stdout.write( cr )
    else:
    sys.stdout.write( lf )
    sys.stdout.write( "%d dead(%x)" % (idx,terr.value) )
    procsw = 1
    sys.stdout.flush()
    dxclose( devid )
  2. 実行
    a).以下のファイルが同一フォルダ内に存在していることを確認。
    SMPL1.py  dxlib2.dll
    b).コマンドプロンプトで実行。
    > python SMPL1.py
    結果はこんな感じ。

雑感、Rubyと同様、簡単にDynamixelの制御が可能となった。
ただ、Rubyよりもコーディングに若干のクセがあるようだ。