せっかなくので、やってみた。

日々のあんなこと、こんなこと、せっかくなのでやってみた

無謀にもX68000compactXVIのコンデンサを総取り換えした件を振り返ってみた

※この記事はコンデンサ取り換え素人の私が独自に調べてトライした内容です。
道具の使い方など正しくない可能性があるので、参考に作業される方はあくまで自己責任でお願いします。

思い起こせば2013年の夏の終わり。
X68000 compact XVI(REDZONE)が起動しなくなってから1-2年経った頃だと思う。
なんとか自分の手で復活させたい(修理代が捻出できない)との思いから、遂に奮起してコンデンサ総取り換えを決意しました。
X68のコンデンサは、アルミ電解コンデンサや面実装コンデンサと呼ばれている取り外しの難しいタイプで、 パターンを剥がすなど失敗すると、再起不能になる可能性があり、ずっと作業を躊躇していました。
そのまま放置してもコンデンサから漏れ出した電解液でパターンが腐食し、どちらにしても再起不能になるのは 時間の問題なので、とにかくやってみるしかないという思いでした。
半田ごてなど、中学の技術の授業以来、数えるほどしか使ったことないので、まずは道具をそろえました。

  • テスター
  • 半田ごて40W、23W一本ずつ
  • 小手先クリーナー
  • 半田吸い取り線
  • 銅線
  • 精密機械用半田
  • フラックスクリーナー
  • 練習用のジャンク基盤(秋葉原のジャンク屋で購入)

f:id:moneci:20190921233128j:plain:w300
この写真のみ今回追加で撮影しました。練習用基板は当時のものですがパターンは剥がしまくっていました…。ページの最後にamazonのリンクを貼っておきます。

新しいコンデンサは選定の知識がないので、修理業者の方から一式取り寄せました。
コンデンサの外し方をネットで調べたところ、色々テクニックがあるみたいで、両方の電極を半田ごてで温めて少しずつコンデンサをずらす方法、 銅線をU字型に加工して電極にのせて一本の半田で同時に温める方法、銀色のコンデンサ本体をニッパで切り取り、台座を取り外す方法(これは後から知った※1)、色々テクニックがあります。
とりあえず、ジャンクの基盤で練習。
半田が古いせいか、こてを当ててもなかなか溶けない。両手で両端に半田ごてあてると、コンデンサをずらす手が足りない(w)ので、U字の銅線を使ったりして、なんとか取り外し成功しました。

※1 本体をニッパで切り取るのは、台座ごともぎ取ってしまいそうで怖いですが、こちらに動画が挙がっていました。こちらを見る限りは一番作業しやすそうです。
表面実装コンデンサーの交換作業風景 - YouTube

2,3個練習していよいよ実機に取り掛かりますが、まずはその前の分解がしんどい。
compactタイプの筐体のねじは一本のみで、ねじを外したあとは、パズルの様に分解してゆきます。各パーツがプラスチックの爪で 固定されているので、折らないよう注意しながら外してゆきます。(それでもフロントパネルの爪を一カ所折ってしまった。)
f:id:moneci:20190921174159j:plain:w300 f:id:moneci:20190921174210j:plain:w300 f:id:moneci:20190921174220j:plain:w300 f:id:moneci:20190921174229j:plain:w300 f:id:moneci:20190921174238j:plain:w300 f:id:moneci:20190921174248j:plain:w300

こちらのサイトに非常に詳しく書かれていてとても参考になりました。

x68k-retro.cocolog-nifty.com 今もサイトがあって良かった!

取り外したメインボードはこんな感じ。コンデンサを取り付けるときに分かるように現状を撮影しておきます。
f:id:moneci:20190921174258j:plain:w300
f:id:moneci:20190921174503j:plain:w300 f:id:moneci:20190921174453j:plain:w300

U字の銅線はこんな感じで使いましたが、なかなか練習通りいきません。
半田が古いのか、こての使い方が下手なのか、思うように半田が溶けてくれません。

f:id:moneci:20190921174342j:plain:w300

半分無理やりでやっとの事外した感じです。周りのプラスチックを溶かしてしまった。

f:id:moneci:20190921174352j:plain:w300 f:id:moneci:20190921174402j:plain:w300

パターンを剥がしてしまったら即アウトの中、この作業を60コ以上は心が折れそうになります。

がんばって外してくうち、だんだん慣れてきて油断したのか、とうとうパターンを剥がしてしまいました!
ADPCMの二階建て基盤のプラス側を剥がしてしまい涙目です。とりあえず辞めるわけにもいかないので、作業を進めました。
そんなこんなで3日かかってやっと全てのコンデンサを取り外しました。
結局、追い半田などでなんとか溶かす→吸い取り線で溶かした半田を吸い取る。というのが自分がやった中で外しやすかったと思います。

f:id:moneci:20190921234600j:plain:w300 f:id:moneci:20190921234551j:plain:w300
コンデンサの取り外し後がだいぶ汚いです。

その後、風呂場で基盤全体がひたひたになるほどクリーナーをスプレーして洗いました。
正しいやり方なのか分かりませんが、スプレーで汚れを洗い飛ばしたあと、自然乾燥させています。
コンデンサの端子部分はさらに綿棒にクリーナーをつけてきれいに汚れをふき取りました。
真ん中のSHARPの白い帯に印字されていた日付も消えてしまった…。
f:id:moneci:20190921174553j:plain:w300

端子もきれいになったので、コンデンサの取り付けはそれほど難しくありませんでした。半田も簡単に載ってくれました。
しかし二階建て基盤のコンデンサをどうにかしないといけません。
あまり覚えていないのですが、確かテスターでパターンの繋がっている先を調べたのだと思います。で、隣の白いコードにつながっていたので、 銅線で無理やり空中配線しました。(w)
錆びるのが心配なので、半田メッキもしてあります。これで動いてくれると良いのだけど…。
f:id:moneci:20190921174604j:plain:w300

そしてやっとのことメイン基板のコンデンサ取り付け完了!
バックアップ電池も合わせて付け替えています。今思えばソケット化すればよかった…。
f:id:moneci:20190921174615j:plain:w300

68000CPUやシャープのカスタムチップやYM2151などが配置されていて、凄いかっこいいなぁ。

しかしこれで終わりではありません。拡張スロットとFDD基板のコンデンサも交換します。
FDD基板は元に戻せるよう、構造をチェックしながら慎重に分解しました。
最終的にプラスチックみたいなケーブルでモーターと繋がる部分以外は全て分解しています。
左下の写真の3つのコンデンサを交換。後ろに写っているHDDは作業台です。w
f:id:moneci:20190921174634j:plain:w300 f:id:moneci:20190921174644j:plain:w300 f:id:moneci:20190921174624j:plain:w300 f:id:moneci:20190921174704j:plain:w300

これですべてのコンデンサの交換が完了しました!
とりあず電源だけ接続して、煙や変な匂いがでないかおっかなびっくり確認しました。
異常はなさそうなので、元通り組み立てて恐る恐るパワースイッチを押したところ…。無事起動しました!

f:id:moneci:20190921174713j:plain:w300

ADPCMも問題なく鳴っています。けどLINE OUTが片側しか出力しない…。
まぁ、素人の修理で起動までできただけでも良かったとしましょう。

ということで、素人でも練習と気力があればコンデンサ交換ができるという報告です。
しかし、その後電源が逝ってしまい、電源はさすがに怖くて手が出せないのでヤフオクの業者の方へ修理を依頼し、 LINE OUT含め修理していただきました。
正直、同じ作業をもう一度やれるかと言われるとしんどいです。
失敗のリスクや手間を考えると、現在ヤフオクで出品されている金額はかなり安い(部品代込みだし) と思うし、 まだメンテナンスしてくれる方がいるのは本当に助かります。

あと、コンデンサ交換の前からですが、たまにFDDを入れてもドライブランプが点灯せず認識してくれない症状がありました。
コンデンサ交換しても解消しなかったので、別の問題っぽいです。こちらの情報だと、
www.okqubit.net

下側のFDDのディスク挿入検知のマイクロスイッチ(入口左側)が動作不良になっていて、何回か押してちゃんと導通するようにしてやる必要があった。

との事なので、同じ問題かもしれません。現状ではあまりFDDは使用していないので放置。(w)
ただし、x68はFDDドライブが認識されないと起動しないので注意が必要です。

あれからもう6年たちましたが、今のところ問題無く動作しています。

goot 一般電気用はんだこて KS-20R

goot 一般電気用はんだこて KS-20R

goot 一般電気用はんだこて KS-40R

goot 一般電気用はんだこて KS-40R

Sanwa(三和電気計器) デジタルマルチメーター PM-3

Sanwa(三和電気計器) デジタルマルチメーター PM-3

goot はんだ吸取り線 CP-30Y

goot はんだ吸取り線 CP-30Y

goot 精密プリント基板用はんだ SD-62

goot 精密プリント基板用はんだ SD-62

Laravelで作ったAPIをaxiosから呼ぶとPUTのパラメータが渡されない件

普段PUTを使用するAPIを使うことがあまりないのだけど、Laravelとの組み合わせではまったのでメモ。
リクエストは受け付けてくれるのだけど、Laravel側でPUTされたパラメータを受け取ってくれない。
以下の様に、HTMLフォームのデータでは、PUTやDELETEなどはサポートされていないらしいので、 '_method'というパラメータを作成し、実際のmethodを仕込んでPOSTする。

ルーティング 5.5 Laravel

ソースはこんな感じ。

import Axios from 'axios';
const AjaxClient = Axios.create({
  withCredentials: true,
  xsrfHeaderName: 'X-CSRF-Token',
  headers:{
      'X-Requested-With': 'XMLHttpRequest',
      'Content-Type':'application / x-www-form-urlencoded'
  }
});

let url = 'http://....';
let params = {key1: 'val1', key2: 'val2'};
let formData = new FormData();
formData.append('_method', 'PUT');
for (let key in params) {
    formData.append(key, params[key]);
}
AjaxClient.post(url, formData);
    .then((response) => {
        console.log('success');
    }).catch((error) => {
        console.log('error');
    });

chromeで日本語を検索すると、「このサイトにアクセスできません」のエラーとなる件

chromeのアドレスバーで日本語の文字列で検索すると、「このサイトにアクセスできません」のエラーとなる場合がある。

f:id:moneci:20190630000840p:plain

表示されているサイトは、検索文字をピニュコードで変換したURLで、初めは変なウィルスにでも感染したのかと焦った。
ja.wikipedia.org

同じ文字列でも上記のようになる場合とちゃんと検索される場合があり、プラグインを外したりとか試してみたが 原因を突き止める事ができなかったが、やっと動作がわかった。

chromeでは、アドレスバーに検索文字を入力し、[Ctrl]+[Enter]で検索すると、自動的に
「www.検索文字.com」をアクセスする様だ。
私のIME切替えは、昔なつかしの「かんな」に合わせて、[Ctrl]+oを追加でバインドしているのだが、
アドレスバーに日本語入力したあと、つい癖で、[Ctrl]+oで日本語入力をOFF→すかさず[Enter]で検索 してしまっていたので、[Ctrl]+oと[Enter]が同時に反応してしまっていたらしい…。
とにかく原因が分かってすっきしりた。

これ普通に使っている人はまず発生しないエラーですね。

androidでAttempt to invoke virtual methodという謎のエラーに悩まされる件

androidでプログラムを変更した時に、何かのタイミングで

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference

というエラーが発生するようになった。

スタックトレースを見ても、andoridフレームワークの中しか動いていなくて、自分のプログラムのどこで落ちているのか全く分からず。
viewのエラーなので、画面処理で発生しているのはなんとなく想像できるが、更新のタイミングが複数のスレッドからのコールバックで動いているので、 ステップ実行してもなかなか特定することができなかった。
仕方なく怪しいところ全てにログを仕込んでやっと発生個所を特定。

ArrayAdapterの継承クラスのgetView()メソッドで、nullを返却するルートがあった...。
そりゃ落ちますわな。

androidでbluetoothのiBeaconのデータを取得したい件

bluetooth難しいです。タイトルの日本語が正しいのかすら分かりません...

androidでは、標準のライブラリとして、android 4.3 (API level 18)以降から利用できるBluetooth low energy(BLE) APIが提供されています。
developer.android.com

ただし、Bluetooth機器全般を制御する為のAPIで、iBeacon対応デバイスの仕様書に書かれているようなデータを簡単に取得する事はできない。
で、AltBeaconライブラリを使えば簡単に取得できるのだけど、BLEのAPIと比べて若干機器検出の反応が鈍い気がする。(個人の感想です。)
github.com

じゃあやっぱりBLEのAPIで取得したいところですが、なかかな仕様が複雑です。 bluetoothの機器からは一定間隔でアドバタイズパケットが送信されているのですが、そのペイロード(データ?)の中身を解析し、 iBeaconをはじめとするいくつかのデータフォーマットに合わせて取得する必要があります。

この記事に全てが集約されています。

qiita.com

うれしいことに、記事の作者さんが公開されている nv-bluetooth を使用することにより、 BLE APIを使用してiBeaconのデータを簡単に取得することができます。
ありがたく使わせていただきます。
GitHub - TakahikoKawasaki/nv-bluetooth: Bluetooth utility library, mainly for Android.

使い方はREADMEに書かれていまます。

機器にもよりますが、ローバッテリーなどの情報は、iBeaconのデータから取得することができます。 ちなみに、iBeaconのデータを拾うだけならGATT接続する必要はありません。 こんな感じで取得できます。

ArrayList scanFilterList = new ArrayList();
// フィルターで色々な条件を指定できる。
scanFilterList.add(new ScanFilter.Builder().setDeviceName("機器名など").build()); 
// スキャンモードの作成
// SCAN_MODE_LOW_POWER     0.5秒スキャン→4.5秒待つを繰り返します。アプリがフォアグラウンドにいない場合、このモードが強制される。(default)
// SCAN_MODE_BALANCED      2秒スキャン→3秒待つを繰り返します。
// SCAN_MODE_LOW_LATENCY   ずっとスキャンします。アプリがフォアグラウンドにいるときのみの利用が推奨されている。
// SCAN_MODE_OPPORTUNISTIC 特別なモードです。他のアプリがBLEスキャンを実行するとスキャン結果が通知されます。
ScanSettings scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();

// スキャン開始(mBluetoothLeScannerのインスタンスは取得済みの前提)
mBluetoothLeScanner.startScan(scanFilterList, scanSettings, new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);

        // アドバタイズパケットをパースしたADStructureから、iBeaconのデータのみ取得する。
        List<ADStructure> structures = ADPayloadParser.getInstance().parse(result.getScanRecord().getBytes());
        IBeacon iBeacon = null;
        for (ADStructure structure : structures) {
            if (structure instanceof IBeacon) {
                iBeacon = (IBeacon)structure;
                break;
            }
        }
        if (iBeacon == null) {
            Log.d(TAG, "No iBeancon data found");
        } else {
            Log.d(TAG, "iBeacon data: "
                    + "major:" + iBeacon.getMajor() + "\n"
                    + "minor:" + iBeacon.getMinor() + "\n"
                    + "uuid:" + iBeacon.getUUID() + "\n"
                    + "power:" + iBeacon.getPower());
        }
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        super.onBatchScanResults(results);
    }

    @Override
    public void onScanFailed(int errorCode) {
        super.onScanFailed(errorCode);
    }
});

XM6で英語キーボードを使う

XM6、素晴らしいエミュレータです。
ただ、私のPCのキーボードは英語キーボードなので、そのまま使用すると 日本語(JIS)キー配列となってしまうので使いにくいです。

WindowsやXM6の設定ではなく、68のキー入力環境改善ソフトのKeyWitchで解消できました。

KeyWitch.X - キー入力 - システム環境 - ソフトウェアライブラリ - X68000 LIBRARY

アーカイブ内のKeyWEnv.Lzhににascii配列の設定ファイルが含まれているのでこちらを使用する。
CONFIG.SYSに以下を追加。

DEVICE=\path\to\KeyWitch.x -e \path\to\ascii.env

必要なのは、-eオプションとenvファイルの指定です。それ以外のオプションはどうも同時に設定できない様なので、説明書を読んで設定してください。
確認しているのはXM6typeGですが、68側の設定なので他のエミュレータでも動作すると思います。
しかし、エミュレータなど存在しない時代のソフトなのに、なぜ純正キーボード以外の設定を入れてくれていたのか...? とにかくお陰で助かりました!

ついでにWindowsキーをXF1に割り当てたいのだが、Windows側と競合してしまうので無効にする方法を 探したところ、NoWinKeyというのがあった。ありがたく使わせていただきます。

NoWinKey
http://www.asahi-net.or.jp/~ee7k-nsd/page3.htm

今のところWindows10でも問題なく動作している。 ただ、管理者権限で起動するので、このままではスタートアップに登録できない。
こちらも探してみると、タスクスケジューラーで起動させることができた。

Windows10 - 管理者権限が必要なアプリを自動起動(スタートアップ) - PC設定のカルマ

これでXM6がさらに使いやすくなりました!

2019.8.15追記
新規にWindowsをセットアップしたところ、上の手順ではキーバインドの設定が足りないことが分かりました。
XM6のメニューで、ツール>オプション>キーボード>編集
で、この画像の様に、6つのキーを変更してあげる必要があります。

f:id:moneci:20190815220248p:plain

(キートップの画像はwikipediaから拝借しました。)
キー配列 - Wikipedia

gradleのjavaプロジェクトをeclipseで取り込んだ時にクラス出力フォルダーをbuild配下にする

いまさらですがgradle初心者です。
gradleでeclipseプラグインを使ってeclipse用のファイルを色々作成し、eclipseからインポートしてもクラスの出力フォルダーはeclipseJavaプロジェクト標準のbinになってしまう。
プロジェクトのプロパティ―>Javaのビルドパス で /build/classes/java配下を指定したいのだが、普通に指定しようとすると、
「出力フォルダー ... をネストできません」
と怒られてしまう。
f:id:moneci:20190523171521p:plain

以下で設定できた。

  • デフォルト出力フォルダーに 「プロジェクト/build/classes/java/default 」を指定(defaultは存在しない適当なフォルダ)
  • 「ソースフォルダーごとに出力フォルダーの指定を可能にする」をチェック
  • 各ソースフォルダーの出力フォルダーに「build/classes/java/main」や「build/classes/java/test」を指定

f:id:moneci:20190523171733p:plain

他に正しいやりかたがありそうだけど、これでbinを消せました。