DJ-C7を改造してみたら

アルインコの無線機DJ-C7は最初からAM・FM・短波放送、エアーバンド、コードレスホン、VHF・UHFユーティリティ無線など受信できます。これだけ入ると無線機+ラジオ+αってかんじですね。広帯域受信機とはいえませんが、とても便利です。これ国内版なんですが送信改造してみます。以下できるらしいのでやってみたらできました、という報告。
無線機の送信改造をすると国内では限りなくグレーゾーンになるのでそのあたりとか改造そのものは自己責任で。持ってるだけで違法といわれることもあるし、送信しなければ問題なしとする意見もあります。まあ、技適マークの意味からすると手を加えた時点で技適の対象外になるんですが。。
改造ポイントは5箇所のネジを外して背面を開けたところで基板中央にある水晶振動子付近。下の写真で○で囲んだところにあるチップ抵抗を取り除き、リセット(FUNC+電源オン)を行ないます。 取説P28のメモリー保護をonにしておくとリセット時にメモリーの内容が無くならないらしいですが、offのままで全部消えました orz

右は取り外したチップ抵抗で実測2kΩ、サイズは1005です。改造前と比べて変化する送受信可能範囲は次のとおり。AM、短波、FMラジオは変わりません。
エアー TX  136.000MHz~141.995MHz  RX 108.000MHz~141.995MHz
VHF    TRX 142.000MHz~169.995MHz
L-UHF  TX  400.000MHz~429.995MHz  RX 380.000MHz~429.995MHz
H-UHF  TRX 430.000MHz~469.995MHz
※バンド表記は説明書に準ずる
エアーとL-UHFはバンドの途中から送信可能となります。バンドをまたいでいるのでわかりにくいけど、実質136.00MHz~169.995MHzと400.00MHz~469.995MHzが送信可能です。
ちなみに改造ポイントの写真を見るとわかりますが、チップ抵抗のランドから伸びているパターンが空きランドになっています。ロットや出荷先によっては、リード線カットでの送信改造をサポートしてたりするんでしょうか。→海外版ではワイヤーカットらしいです。eham.netのレビューより (海外版は周波数範囲が異なるようです) JAIA加盟メーカも少なくなったし、そろそろ日本仕様のCPUを止めて全世界共通で作ってコストダウンしてもいいんじゃないかな。
この機種はオートレピータのシフトとトーン設定が任意にできるのでこのままでも困ることはありませんが、いつでもPTTを押せば電波が出る状態なのはユーティリティ無線を聞くとき精神衛生上よくない気が。改造の可否が確認ができたのでもとどおり直すことにしましょう。。

このオフバンド送信機能が法の上で認められるのは遭難通信くらいでしょう。もし遭難したらチップを外してから適切な周波数で「メイデイ」と三回前置して呼出し、通報を行なえば良いのです。アマ無線の試験でも出る非常通信は免許の周波数と出力の範囲で行なうので改造は不要です。この場合「ヒゼウ」を三回前置して呼出し、通報を行ないます。
普段からオフバンド送信を有効にしておくのは不法無線局開設に問われる可能性大で、「遭難時の保険」という言い訳はできませんよ。たまに非常通信で助かる登山者の記事を見かけるけど、遭難時にチップを外しているヒマは無さそうですね。
ワイヤーカットならできるかもしれませが  :p

改造してオフバンダーになりたい人が多いのだろう。もしくは山で遭難して遭難通信をしたいのか、 とりあえず以前から割と人気がある記事なのだが、、MSN SpaceからWordpressに強制移行になった ときに写真が行方不明になったまま。面倒なので放置プレイ。

裏フタを開けたら改造ポイントはそこしかないといわんばかりに非常にわかりやすいので写真は要らないだろう。このリグで嫌なのは電池が専用のリチウム電池パックのみであることと、 充電状態表示が非常にわかりにくいこと。電源オフでの待機電流も結構多いらしく気づくと使えなかったり。リチウム電池は充電の管理ができてないと割と早く劣化します。当然だいぶ前に電池パックが少し膨れてきて、持たなくなる前に売却。DJ-X7が現行の間は電池パックの交換には困らないとは思いますが、とにかく他の機器も含めてあまりにも機種専用の電池パックの管理が面倒になったというのが本音。

他には音量調整が2レンジに分かれてて面倒とか、レピータのセミデュープの周波数メモリが分離しててサーチするときにかならずアップリンクも見るはめになるとか、小さいので仕方ないが音量が大きくても了解度が悪い(音質が悪い)とか、イヤホンジャックが2.5mmだとか、ダイヤルのカチカチがうるといとか、まあいろいろとアルインコっぽさはある。操作性の難はともかく、本体の小ささと軽さは何者にも勝るので、単四電池二~三本で運用できるオプションがあれば手放さなかったと思う。

IC-910の謎のパターン

先日オプション取り付け時に撮ったIC-910のPLLユニットの写真を見ていたら謎の空きパターンを発見。D-Sub9ピンコネクタとドライバIC用のパターンに見える。しかしドライバICから内側には繋がっていないのか、空きランドっぽいのでデバッグ時に手配線するのだろうか?
シャーシにも目隠しのアルミ板が貼ってあるのでこれを使えばTNCを内蔵させたりできるかもしれない。しないけど。
 それとオプションのCR-293は「高安定度基準発振水晶ユニット」と書かれているだけで、TCXOなのかOCXOなのか。はっきりしなかったので調べたら、メーカーのIC-R8500のページに「オプションの恒温槽タイプのクリスタルユニット」と書かれていました。つまりオーブン、OCXOですね。大きさと基板上の配置からおそらくOCXOだと思っていたけど、なんでOCXOと表現しないのか謎だ。それとオプション取り付け前に標準でついているCR-452は海外のサイトにあった回路図からTCXOだということが発覚。でも、標準TCXOだと精度は±3ppmらしいので結構悪いです。
この数値がどの程度かというと、1000MHzで±1ppmなら±1kHzです。145.00MHz、433.00MHzでの±3ppmは0.43kHz、1.3kHzなんでしたことありませんが、1250.00MHzで±3ppmとなると±3.75kHzなので、これではカタログでTCXOだから安定とうたうのは無理そうですね。SSBの占有周波数帯幅が6kHzなのですから、それより広い範囲でふらつくことになります。1.2GHzでSSBなんてしませんが。これがCR-293を取り付けると±0.5ppmなので1250.00MHzなら±0.625kHzとなります。これくらいなら安心です (?)。一般的なTCXOは±100~±1ppm程度、OCXOは±1~±0.01ppm以下なんで (参考文献 「長波JJY利用高安定基準発振器」より)標準のTCXOもオプションのCR-293もだいたい一般的な製品ではないかと思います。
それを考えるとヤエスのTCXOって±0.5ppmとなってるのである意味驚異的な気が…

CR-293追加

めったに使わないメインリグにオプションを追加。高安定度基準発振水晶ユニットCR-293取付け。このオプションは、IC-910の基準発振器として標準装備の発振器と交換するもの。いまどき入門機やモービル機でもTCXOは標準装備だったりするのに(IC-703、IC-7000、FT-897、etc…)、発売時期の古いIC-910はついていないのですよ。 (IC-910は標準でTCXOを持っています。ただし1200MHzとなるといまいち)

この純正オプション、すばらしく取り付けがめんどうでユーザを試しているのではないかと思うほど。上下フタを開けて、既に取り付けられているオプションを外し、内部のフタを開け、基板をシャーシから外してようやく取り付けポイントに到達。最初につけられている標準の発振器ユニット(CR-452)をハンダから外す。そして取り付け穴をふさいでいるハンダを除去して、オプションを手動挿入、ハンダ付け、リード線カット。外した部品をもとに戻して、ようやく動作チェック。ここまで30分くらいかかります。

▼交換前(オプション取付前) 取付けスペースに対して発振ユニットがすごく小さい

▼交換後(オプション取付後) 場所を明示しなくとも間違い探しにならない。。

他所の掲示板なんかによるとリード線カットをしなかったがためにショートしてメーカ送りにしたという事例が複数あるようです。なんでも説明書に書いてないとか。基板に実装した部品の余ったリードを切るのって、普通に基板組んだことがあれば説明不要で常識じゃないですか。まあ、やったことなければ思いも付かないのかも。そんなんでは資格についてる「技士」の字が泣きますよ。(まちがっている人が多い。アマチュアの資格は通信士ではなくて技士だ。おしゃべりは二の次ですよ。) あたりまえなんですが使ってみた感じ、なんにも変わりません。市内の1200MHzレピータにアクセスすると周波数ズレ表示が出てたのも変わらなかったので、レピータ側の周波数ズレなんでしょうね。
ついでに周波数とかモードを読み上げてくれる音声合成ユニットUT-102もとりつけて完成。本来はブラインドハムのための重要なオプションなんですが、画面を見なくても読み上げてくれるので少し便利。しばらく固定機関連のオプションは買わなくてもよさそうだ。

CRCが合いません!5

自分の中では既に解決済みだったので放置気味だったCRC計算。
 
今日はCRC16を計算するコード。テーブルを使わないバージョンのみ。
CRC16は末尾の処理が他と違うのが特徴。
 
[fcrc16.c]
/*
CCITT CRC16を計算する。
 
CRC16生成多項式 (ただし^は次数。XORではない。)
x = x^16+x^12+x^5+x^0
 
1000010000001000(1) = 0x8408
^x[0]            ^x[16]
 
処理はバイナリファイルの先頭から1バイトづつ、LSBを先頭としたビット列とし、
各ビットごとにCRCを右シフトし、
x^16(シフト前のCRCのLSB)の値とデータビットをXORした結果、
1ならCRC全体を生成多項式で除した後、1をMSB側から右シフトで挿入。
0なら0をMSB側から右シフトで挿入。
*/
 
#include <stdio.h>
 
unsigned long CalcCrc(unsigned char* pBuf, int nBytes);
unsigned long CalcCrc1byte(unsigned int nSample);
 
// CRCの初期値 CRC16では全ビット1
unsigned long Crc  = 0xffff;
 
// 生成多項式(除数)
unsigned long Poly = 0x8408;
 
// メインルーチン
// 指定のファイルを読んでCRC処理ルーチンに渡す
int main(int argc, char* argv[])
{
    unsigned long Result;       // CalcCrcが返すCRC値を受け取る
   
    const char nBufSize = 10240;    // システムに応じて適当なサイズの読み出しバッファ数
    int buf;
    int num;
    FILE *fd;
   
    if(argc == 2 && (fd = fopen(argv[1], "rb")) != NULL) {
       
        // 大容量バッファに変更。失敗しても問題ないのでエラー処理無し。
        setvbuf(fd, NULL, nBufSize, _IOFBF);
       
        // ファイルを先頭から1バイトずつ読み出してCRCを計算する。
        // ワード長は関係無く先頭バイトから、ビット並びはデータのLSBから処理。
        while(fread(&buf, 1, 1, fd) != 0) {
            CalcCrc((unsigned char*)&buf, 1);
        }
        fclose(fd);
       
        // 最終的なCRCの値を取得
        // (CalcCrcにバイト長0を与えて計算させずに結果を得る。ファイルサイズ0バイトに対応させるため)
        Result = CalcCrc(NULL, 0);
       
        // CRCを表示
        printf("%04X\n", Result);
    }
    else {
        printf("using>%s <file>\n", argv[0]);
    }
 
    return(0);
}
 
// バッファに詰められたデータを先頭から1バイトずつnBytesまで計算する。
// CRCは呼び出す側の変数に置いているので次回呼び出しまで単純に保存される。
unsigned long CalcCrc(unsigned char* pBuf, int nBytes)
{
    while(nBytes– != 0) {
        // 1バイトあたりのCRCを計算する
        CalcCrc1byte(*pBuf++);
    }
 
    return(Crc);
}
 
 
// 1ビットごとCRCを処理する
unsigned long CalcCrc1byte(unsigned int Data)
{
    unsigned int DataBit;   // 処理対象ビットの値
    unsigned int CrcTopBit; // CRCシフト時にあふれるビットの値
    int Bits;               // ビット処理のカウンタ
 
    Data = Data & 0xff;     // Dataにゴミがある場合の保険
 
    // 入力データはバイト単位、LSBから処理
    for(Bits=0; Bits<=7; Bits++) {
 
        DataBit   = (Data >> Bits) & 0x1;   // データの中から対象とするビットを取得
        CrcTopBit =  Crc & 0x0001;          // CRCからあふれるビットを取得
 
        // CRCは右シフトで詰める
        Crc = Crc >> 1;
 
        // CRCのあふれ(x^16の部分) xor 対象入力データ が1なら生成多項式で剰余を求める
        if(CrcTopBit ^ DataBit) {
            Crc = Crc ^ Poly;   // 右シフト時にMSBに0が詰められるので、MSBには暗黙に生成多項式の値から1が入る
        }
    }
   
    return Crc;
}
 
テーブルを使うバージョンも少しの改造で簡単にできるはず。 CRC32はテーブル使用版。
http://mzexe.spaces.live.com/blog/cns!A4AC1B4775193505!749.entry