2026年4月29日水曜日

nRF52840でUART BLE変換アダプタ

 先日入手したSeeed Studio XIAO nRF52840を使ってUARTをBLEで飛ばせないかどうか試してみた。FNIRSI DMC-100のリアルタイム計測データとか飛ばせたら便利かなぁと言うことで。

どうやらbluefruitライブラリを使うとNordic UART ServiceのUUIDとかがそのまま使えるっぽいので結構簡単にUARTをBLEに変換できそう。DMC-100は1パケット13バイトなのでBLEの1パケットにも収まりそうだし。

#include <bluefruit.h>

BLEUart bleuart;

void setup() {
  Serial1.begin(9600);

  Bluefruit.begin();
  Bluefruit.setTxPower(4);
  Bluefruit.setName("DMC100-BLE");

  bleuart.begin();
  startAdv();
}

void startAdv(void) {
  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
  Bluefruit.Advertising.addTxPower();
  Bluefruit.Advertising.addService(bleuart);
  Bluefruit.ScanResponse.addName();

  Bluefruit.Advertising.restartOnDisconnect(true);
  Bluefruit.Advertising.setInterval(32, 244);
  Bluefruit.Advertising.setFastTimeout(30); 
  Bluefruit.Advertising.start(0);
}

void loop() {
  if (!Bluefruit.connected()) {
    return;
  }
  if (Serial1.available() >= 2) {
    if (Serial1.peek() == 0x5A) {
      Serial1.read();  // 0x5A

      if (Serial1.peek() == 0xA5) {
        Serial1.read();  // 0xA5

        uint8_t buffer[13];
        buffer[0] = 0x5A;
        buffer[1] = 0xA5;

        Serial1.readBytes(&buffer[2], 11);

        bleuart.write(buffer, 13);
      }
    } else {
      Serial1.read();
    }
  }
}

とりあえずDMC-100のヘッダを確認するぐらいでそのまま13バイトを送るようにしてみた。データのデコードはPC側でやる形に。

とりあえずGNDとUARTのRXをDMC-100に繋いでPCから給電してテスト。
この前のPythonツールをbleakライブラリを使ってBLE対応にしただけ。

13バイト6Hzぐらいのデータだったら問題なくBLEでも取れてそう。発熱も全く無いのでこれなら内蔵してしまっても良さそうだな…

内蔵したときに内部のソフトを書き換えるのが面倒かもという理由で今回データを直接送ってみたけど、他社品とかのアプリがそのまま使えるようなスケッチにすればスマホからも簡単に使えたりするかな…

とりあえずFNIRSI DMC-100を簡単にBLE対応にできてしまった。受信側のツールをもう少し作り込まないとだめかな。グラフとか欲しいし。

2026年4月19日日曜日

スマホクリップファンを買ってみた。

 ビックカメラのポイントが切れそうだったので、ビックカメラに行ってみたんだけど何も欲しいものがなかったので、通販サイトをうろついていたらめっちゃ安くなっている物があったのでポチってみた。

Lightningに指すタイプのスマホ用ファン。最近iPhoneのバッテリを交換したし、使い物にならなかったら改造するベースにいいかなと思って。

オレンジとピンクが80円になっていたのでつい…80ポイント消費するだけでポイントの期限が2年伸びるし。Android版は変換アダプタで対応してそうな感じだけど、820円するのにLightning版は80円という激安。

仕組み的にはスイッチとモータがつながっていてOTGケーブルの電源を取るだけバージョンみたいな感じ。80円ならお得かなと思うようなレベルかな…

iPhone 12 miniでも普通に動いた。しかし画面占有率が高くなっているのでクリップする部分がほぼないという。ホームボタン付きのiPhone用かな?

風量はまあまあいい感じかもしれないけど、結構うるさい気がする。

改造ベース用としてはなかなか良いかも。

2026年4月18日土曜日

FNIRSI DMC-100で外部出力できるか解析してみた

 新しいテスターが欲しいなと思っていたらFNIRSI DMC-100を見つけて、中身がSDICのSD7502とAT32F415CBT7で制御していて分解画像を見たらUARTで通信してそうだったので解析してみた。
FNIRSIのハンディーオシロスコープが話題になっていたような気がする。

ちなみにUSBはファームウェアアップデート専用っぽくて、PCとつなぐと充電中は使わないでねという警告が表示される。データ保存はできるけどUSBで取得できるわけではなさそう。メモ程度かな…

ネジ6個で止まっているので分解するとクランプメータのところがフレキシブルケーブルなのでちょっと注意。

左側の小さいICがLCDとかを制御しているAT32F415CBT7で、大きいICがADC
とかを担当してるマルチテスターICのSD7502っぽい?その間に22Ωの抵抗が2つあるんだけど、これがAT32F415CBT7のUARTにつながってそう。
LiPo充電ICは定番のTC4056Aが搭載されていて、SOT-23の部品たちはY1がNPNでY2がPNPなトランジスタ、A1sHBはPchFETぐらいなもんで3.3Vは裏側で作ってるのかな?

SD7502側の22Ωの下側(どっちでも良さそうだけど)からSD7502の出力が取れそうだったのでそこに0.26mmのポリウレタン銅線をはんだ付けして、GNDはUSB端子あたりから取って解析してみた。

CoolTermでBaudrateを9600で受信してみるとHEXモードで"5A A5 06 E0 FB 0B 0A 00 01 00 00 00 00"のようなデータが流れてきた。周期はだいたい6Hzぐらい。
5A A5がヘッダのUART通信はよくありがちな気がするのでボーレートはあってそう。

いろんなモードに変更してみて、電圧モードだと入力の値が変更しやすそうだったので電圧モードで電圧を変更していくとどうやら電圧に応じたデータというよりもこのテスターICが出力している4桁のセグメントディスプレイ用の出力がそのままUARTで出ているのではないかという疑惑がでてきた。

0.000V、0.100V、0.200Vみたいな感じでデータを入れていって解析してみると規則性が出てきたのでまずは4桁の数字を解析しつつPythonツールを作ってみた。

import serial
import time

PORT = "COM4"
BAUDRATE = 9600
FRAME_LENGTH = 13
HEADER = b'\x5A\xA5'

DECODE_TABLE = {
    0x7B: "0", 0x0A: "1", 0x5D: "2", 0x4F: "3", 0x2E: "4",
    0x67: "5", 0x77: "6", 0x4A: "7", 0x7F: "8", 0x6F: "9",
    0x31: "L", 0x00: " ", 0x13: "V", 0x75: "E"
}

UNIT_TABLE = {
0x02: "V",0x04: "Hz",0x10: "nF"
} def parse_seven_segment(frame): digits = [] for i in range(2, 6): hi, lo = frame[i], frame[i+1] raw7 = ((hi >> 1) & 0x70) | (lo & 0x0F) digits.append(DECODE_TABLE.get(raw7, "0")) return digits def get_decimal_info(frame): dots = [(frame[i] & 0x10) != 0 for i in range(3, 7)] dot_bin = "".join(["1" if d else "0" for d in dots]) pos = None if True in dots: pos = dots.index(True) + 1 return pos, dot_bin def get_secondary_value(frame): val = (frame[11] << 8 | frame[12]) * 0.01 is_neg = (frame[10] & 0x40) != 0 return -val if is_neg else val def process_frame(frame): digits = parse_seven_segment(frame) dec_pos, dot_bin = get_decimal_info(frame) is_neg = (frame[2] & 0x10) != 0 unit_code = (frame[7] & 0xF0) | (frame[8] & 0x0F)
unit = UNIT_TABLE.get(unit_code, f"?{unit_code:02X}") value_str = "".join(digits) if dec_pos: value_str = value_str[:dec_pos] + "." + value_str[dec_pos:] if is_neg: value_str = "-" + value_str

prefix = ("", "AC", "DC", "")[frame[2] & 0x03] value_str = prefix + value_str dual_a = get_secondary_value(frame) print(f"[{frame.hex(' ')}] | Dots:{dot_bin} | {value_str:>9}{unit} | Sub:{dual_a:6.2f}") def main(): try: ser = serial.Serial(PORT, BAUDRATE, timeout=0.1) print(f"Listening on {PORT}...") buffer = bytearray() while True: if ser.in_waiting: buffer.extend(ser.read(ser.in_waiting)) while len(buffer) >= FRAME_LENGTH: if buffer.startswith(HEADER): frame = bytes(buffer[:FRAME_LENGTH]) process_frame(frame) del buffer[:FRAME_LENGTH] else: del buffer[0] time.sleep(0.01) except KeyboardInterrupt: print("\nStopped.") finally: if 'ser' in locals(): ser.close() if __name__ == "__main__": main()

やはり7セグのデータが来ているようなんだけど、1バイトに全部収まってるわけではなくて3bit+4bitで分かれて入ってる上に1bit分は小数点なので少し面倒。でも4桁とも規則性があったので7bit分で取り出してテーブルから読み込む形にしてみた。小数点は場所に応じて計算であとから追加する形に。

あとV-Aボタンを長押しすると電圧と電流を同時に取得してWが出せるモードがあるんだけど、そのときは4桁の数字が電圧になって、12バイト目と13バイト目がuint16_tで100培値の電流データが出てくることがわかった。電流値がマイナスの場合は11バイト目の0x40が1になる。

他にも色々ありそうだけどとりあえず4桁の7セグデータと符号が分かればだいたいデータが取れそうなのでPythonツールでのテストはこのぐらいかな。とりあえず電流か電圧かの判別は単位のところでできそう。(9バイト目)

BLEとか仕込んでスマホでデータ取れるようにしたら便利かも。OpenLogとか仕込んでログ変換ツールをPythonで作っても便利かもしれない。Hiokiのテスターみたいに光通信で外部と通信できるようにするとアイソレーションもできるし良さそう。MCP2120とか使えば簡単にIrDAで光通信できるのかな?

ADC付きのマイコンでアナログ出力しても面白いかも。DCが測れるタイプのクランプ式電流プローブとは意外と高いのでこれは破格かも。

ちなみにHOLDとV-Aボタンを同時に押しながら起動をするとキャリブレーションモードで起動できるらしい。これはSD7502の機能っぽい?けどもOTPの関連で5回しか出来ないっぽいので注意が必要かもしれないけど。まぁこんな感じでデータが取れるようになったことだし、ツール側でキャリブレーションする仕組みをつけても良さそうな気がするけど、これでキャリブレーションすれば生値が修正できそうななのでよっぽどズレてる場合はやってみても良いかな。

2026年3月21日土曜日

Seeed Studio XIAO nRF52840を試してみる

 ESP32は便利なんだけど地味に消費電力が高いので、消費電力が少なそうなSeeed Studio XIAO nRF52840を買ってみた。昔nRF52840をいじってみたときはこういったボードの値段が高かったんだけど、Seeed Studio XIAO nRF52840は結構お安く手に入った。

昔はSeeed Studioのマイコンキットはお菓子の袋みたいなやつに入っていたのに、プラスティックのケースになってる。

ケースの緩衝材を取ると下からピンヘッダも出てきた。

ちゃんと技適が通ってる。小型のRGB LEDがついてる。

リポまで取り付け可能。このサイズで充電器まで入っているとは…。

Arduino IDEのボードマネージャでは2種類のコアが出てくるけど、今回はSeeed nRF52 Boardsを使用してみた。これだとBLEを使うときはAdafruitのbluefruitライブラリが使えるみたい。mbedの方はArduino BLEを使う形になるっぽい。

USBで接続するとSeeed Studio XIAO nRF52840 Senseとして認識される。おそらくSenseとの違いはセンサーが実装されてるかどうかの違いなのでこういう認識になるんだろうな…(アンテナの隣に未実装の部品が…)

とりあえずBLEのサンプルプログラムを書いてみて動かしてみたけど、青色LEDも自動で制御されてるっぽくて接続待ちは青点滅、つながったら消灯みたいな感じになっていた。

ちなみに途中で書き込めなくなって焦ったんだけど、USBシリアルアダプタを抜いたら書き込めるようになったので、COMポートがたくさん出ている場合は試してみるといいかもしれない。

どうやって消費電力を測定しようかな。

2026年2月7日土曜日

iPhoneのバッテリを純正互換バッテリに交換してみた。

 しばらく使っているiPhone 12 miniだけども、この前暑い地域に海外出張に行ってモバイルバッテリで充電していたりしたらバッテリの最大容量が79%を切ってしまった。暑いところで充電しながら使うともろにバッテリに悪いよねぇ…

最近はかなりバッテリが切れるのが早くなってしまったので、重い腰を上げて修理アシスタント対応のバッテリを購入してみた。修理アシスタント対応だと互換バッテリをつけたときに出る不明な部品のポップアップが出ないらしい。iOS18.1以降ならバッテリの最大容量もちゃんと表示できるらしいし。TI製のBMS搭載でも修理アシスタント対応とか診断対応ってなってるやつじゃないとだめらしい。アリエクとかだとJCIDからも出ていたりするけどお値段があまり変わらなかったのですぐに来るiFactory製の修理アシスタント対応バッテリにしてみた。

工具付きであんまり値段変わらなかったので工具付きにしてみた。

意外と分解が大変で、結構温めるのが重要かも。iFixitの手順を見てやったんだけど、コネクタ側温めて吸盤で引っ張ってもエッジがなかなか浮かなくて…

スクリーンオープナーも買っておけばよかったかな…手が痛い。

最終的には消毒用アルコールを買ってきて隙間から垂らしたら開けることができた。本当は無水エタノールとかのほうがいいかも。(結構水分が残ってしまう。)

バッテリの取り外しもアルコールを隙間から垂らしていたらバッテリの接着剤が柔らかくなって簡単に外れた。

バッテリ取り付けのときはコネクタとバッテリの位置関係に注意して貼り付け。コネクタが刺さる位置を確認しておかないと行けないかも。
バッテリ取り付け位置少しミスったかも。もう少し下だったかなぁ

バッテリの交換をすると修理アシスタントを走らせるように促される。これを走らせるとバッテリがちゃんと認識されて、Apple純正バッテリが取り付けられた認識になった。Appleでちゃんと交換したバッテリはシリアルが本体と紐づけされるらしいけど、本体と紐づけされていないバッテリが搭載されると中古表示になるのかな?

とりあえずこれでバッテリの容量が100%になったー。
そして不明な部品がついているというポップアップも出ない。ちなみにiOS26.2.1で確認。

ちなみに、純正バッテリからBMSを移植する方法も考えたんだけど結局一旦修理アシスタント対応バッテリを繋いで中古表示になってから、Lanrui V1とかで純正BMSをリセットしてから移植して戻さないといけないみたいなので、今回は修理アシスタント対応バッテリでいいやという結論に。中古表示が嫌な場合はLanrui V1で純正BMSをリセットしたあとにこのバッテリに付け替えればよいのだろうけども…

次回交換するときはこの純正BMSを取っておいて、Lanrui V1でリセットしてから戻してみようかな。

2026年1月16日金曜日

Windows 11でiPhoneのUSBテザリングを使ってみた。

 iPhoneでテザリングって言うとよくWiFiを使っているんだけど、バッテリが持たないのでUSBでWindows PCに繋いでテザリングしてみることに。まぁUSBで充電しながらWiFiテザリングでもいいけど、せっかくUSBで繋いでるんだからということで。

通常Windows PCにiPhoneを接続するとMTPデバイスとして認識して写真の取り込みぐらいにしか使えないんだけど、Appleのドライバを入れるとテザリングの際にEthernetデバイスとして認識するようなので試してみた。

iTunesをインストールしているとAMDSドライバが入って、テザリング用のドライバも入るみたいなんだけど、今回はiTunesインストールなしでドライバだけを入れてみた。

まずはiTunesのダウンロード版をダウンロードしてくる。

ダウンロード版はiTunesのダウンロードページをスクロールすると「ほかのバージョンをお探しですか?」という項目が下の方にあるのでそちらのWindowsをクリックするとダウンロードできる。今回はWindows 11を使用しているのでiTunes64Setup.exeがダウンロードされた。

このiTunes64Setup.exeはそのまま実行するのではなくて、WinRARや7Zipなどの解凍ツールを使用して開く。そうするとAppleMobileDeviceSupport64.msiというファイルが中に入っているのでこれを解凍する。

AppleMobileDeviceSupport64.msiをそのままインストールしてみてもMTPドライバのままだったので手動でのインストールを試してみた。

AppleMobileDeviceSupport64.msiをさらにWinRARや7Zipなどで解凍する。今回はWinRARではエラーが出てしまったため、7Zipを使用した。

デバイスマネージャーを開いて、ポータブル デバイスのApple iPhoneをダブルクリック。

ダブルクリックするとプロパティーが開くのでドライバのタブを開く。
ドライバの更新をクリック。
コンピューターを参照してドライバーを検出をクリック。
先程AppleMobileDeviceSupport64.msiを解凍したフォルダを指定して次へを押すとApple Mobile Device USB Driverに変わる。そしてiPhone側でインターネット共有をオンにすると更にデバイスが認識される。
iphoneをダブルクリックして先ほどと同じ手順でドライバを適応するとEthernetデバイスとして認識して、テザリングが使えるようになる。

MacBookとかだとそのまま使えるっぽいけどWindowsだとドライバのインストールが多少面倒な気がする。

これでバッテリ残量を気にせずにテザリングが使えるぞ。