24 August 2014

METEX M-600Mのシリアル接続有効化のための赤外線LED

METEX製 デジタルマルチメーター M-6000M をコンピューターに接続して、データをダウンロードさせる場合、どうしても認識できない場合がある。

認識可能・不可能なソフトウエア

Ts Digital Multi Meter Viewer (Windows版) → ◎ 認識可
ふるた技工所 m-6000mtxt (Linux版) → △ 認識不可・ダウンロード可
るいもの戯れ言 Rubyによる読み込みプログラム (Linux版) → × 認識不可・ダウンロード不可

USB-RS232C 変換ケーブルは、何種類かをそれぞれ試した

認識可能な場合のシリアル通信

オシロスコープで、Ts Digital Multi Meter Viewer の通信開始時(デバイスの認識部分)を観察してみた。

20140824-tsdmm-osci.jpg

CTS/RTSを3000ミリ秒 Hi、50ミリ秒 Lo、1500ミリ秒 Hi、50ミリ秒 Lo の繰り返し。CTS/RTSがHiになった直後に、瞬間的にTXがHiとなる。

ソフトウエアで、信号をエミュレートしてみた

C言語で、似たような信号を出すプログラムを作成してみたが、M-6000Mはデータ送信モードに切り替わらなかった。

20140824-emulate-osci.jpg

作成したC言語のソフトウエアは次のようなもの

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/io.h>
#include <sys/ioctl.h>
#include <string.h>
 
int main(int argc, char **argv, char **env){
    printf("Serial Port : Send Break Test\n");
 
    struct termios old_termios, new_termios;
 
    int fd;
    // シリアルポートを開く
    fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY );
    if(fd < 0){
        printf("Port open error\n");
        return(1);
    }
 
    // シリアルポートの動作設定
    tcgetattr(fd, &old_termios);    // 終了前に書き戻すため現在値を保存
    new_termios = old_termios;
    new_termios.c_cflag &= ~CRTSCTS;
    new_termios.c_cflag |= CLOCAL;
    new_termios.c_lflag |= ICANON;
    tcsetattr(fd, TCSANOW, &new_termios);
 
    // 瞬間的にTXをHiにする処理
    char buf[16];
    int i;
    for(i=0; i<16; i++){
        buf[i] = (char)0x00;    // 0が電気信号Hiと対応
    }
    for(i=0; i<2; i++){
        write(fd, buf, 16);
    }
    
    // CTS/RTSをHiにする
    tcsendbreak(fd, 3000);
 
    // シリアルポートの動作設定を元に戻す
    tcsetattr(fd, TCSANOW, &old_termios);
    // シリアルポートを閉じる
    close(fd);
 
    usleep(100000);     // 100ミリ秒 信号中断
 
    fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY );
    tcsetattr(fd, TCSANOW, &new_termios);
    for(i=0; i<2; i++){
        write(fd, buf, 16);
    }
    tcsendbreak(fd, 1500);
    tcsetattr(fd, TCSANOW, &old_termios);
    close(fd);
 
    return(0);
}

考察

そもそも、±13V の信号であるRS-232CをTTLレベルで無理やりエミュレートしている「USB-RS232Cアダプタ」を用いること自体に無理があるのだろう。

26Vの電位差の起電力を使って赤外LEDを光らせていたのを、5Vでそれなりに光れと言われても… ですよね。

ただ、最近売る製品とすれば、USBシリアルアダプタを使うことも前提にデバイスを作って欲しい。

テスター背面の受光部に赤外線を浴びせればよい

なんでも研究所ブログ館 『M-6000M通信で4989(シクハック)』によれば、M-6000M 背面の赤外線受光部に赤外線を当ててやれば送信モードのON/OFFが切り替わるようだ。

家電リモコンのテスト回路を使って、連続光をM-6000M背面に当てると… 簡単に送信モードが切り替わった。この状態で、コンピュータと接続してシリアルポート経由でダウンロードすることができる。

20140824-back-irrecv.jpg

赤外線を発生させるだけのための、ライトを作成する。100円均一で売っている、ミニライトを改造した。

20140822-ir-light01.jpg
改造した100円均一ライト

20140822-ir-light02.jpg

3.0Vのボタン電池2個でオーバーロードされていた白色LEDを除去し、赤外LED (VF = 1.2〜1.4V, IF = 100mA )に換装する。

後部電池を除去し、抵抗15Ωを取り付ける。 抵抗値は、100mAの制限値をほんの少しオーバーロードする値となる、直近の抵抗を用いた

R = ( 3.0 - 1.3 ) / 0.100 = 17 Ω → 15 Ω

このLEDライトを使って「データ転送モード」に切り替えた後、シリアル接続アダプターでM-6000Mとコンピュータを接続し、受信プログラムを起動する

$ ./m-6000mtxt /dev/ttyUSB0
1408871343.801176016 DC 0e-3 V
1408871344.701083339 DC 0e-3 V
1408871345.601022092 DC 0e-3 V
1408871346.500832016 DC 0e-3 V
1408871347.400793327 DC 0e-3 V
1408871349.399990479 ## 3.049e+3 Lux
1408871350.300080532 ## 3.6e+1 Lux
1408871351.199890915 ## 8.6e+1 Lux
1408871352.099694788 ## 8.3e+1 Lux
1408871352.999614639 ## 8.1e+1 Lux
1408871353.899445030 ## 8.1e+1 Lux
1408871354.799491709 ## 8.0e+1 Lux

うまい具合に受信しています…

参考資料

・ 出力データのフォーマットは、デジタルマルチメータのシステムモジュール ES51986 のデータシートに全て書かれている。(http://www.cyrustek.com.tw/spec/ES51986.pdf