2019年2月23日土曜日

Raspberry PiでBluetoothファイル転送してみる

Raspberry Pi 3BにはBluetoothがついているんだけども、標準状態でペアリングしてもあんまりできることがなかった…
設定次第でいろんなプロファイルが使えるようになるみたいだけど今回はBluetoothでファイルを送受信してみることに。
まぁ同じネットワークに繋がっていてWinSCPとか使えばファイル転送はもっと楽なんだけど、スタンドアロンでGUIで使用しているときとかに地味に便利なので。
ということで今回はGUIで起動しているラズパイとWindows 10のPCとのファイル転送という想定で設定してみた。

とりあえずBluemanをインストール。
sudo apt-get install blueman
そしてラズパイを再起動するとLXPanelのBluetoothアイコンの隣にもう一つアイコンができる。

LXPanelのBluetoothアイコンよりメニューが増えてる!
ということでまずはBluemanのBluetoothアイコンをクリックして、Make Discoverableを選択してラズパイがPCから認識できるようにする。


そしたらWindows側から発見できるようになるのでペアリングする。
ちなみに60秒以内にやらないと見つけられなくなってしまうのでそのときはまたMake Discoverableを押すと良い。

Pin番号を確認されるのでWindows側は接続ボタンを、ラズパイ側はConfirmボタンを押す。

まずはラズパイからファイルを送信してみる。

Windows側はBluetoothアイコンを右クリック→ファイルの受信

これでWindows側はファイル受信待ちになった。

あとはまたラズパイのBluemanのメニューから今度はSend Files to Deviceを選択。
ファイル選択画面になるので送信するファイルを選ぶ。

ファイルを選ぶと送信先を選ぶ画面になるので先程ペアリングしたPCを選択してOKを押す。

すると自動でファイル転送が始まる。

逆にラズパイ側でファイルを受信する場合は何も準備はいらないので、Windows側でBluetoothアイコン右クリック→ファイルの送信でファイルを選択して送信するだけ。
ラズパイ側で自動で受信してくれる。

受信フォルダを変更したい場合はBluemanのアイコンをクリック→Local Servicesを開いてTransferタブで設定を変更できる。

Bluemanが高性能過ぎてLXPanelのBluetoothアイコンはもう使わなくて良さそうなので消しても良いかも。Bluetoothアイコン2つもいらないしね…

2019年1月19日土曜日

ESP-WROOM-32でCAN BUSを使ってみる

ESP-WROOM-32にはSJA1000互換のCANコントローラーが内蔵されているのでCANトランシーバーだけ用意すればCAN BUSが使えるっぽい。
ArduinoでCANって言うとMCP2515っていうCANコントローラーのライブラリがとても情報量が多くて使いやすいんだけど、MCP2515とSJA1000の両方に対応しているライブラリがあったのでそちらを使ってみた。

使用させてもらったライブラリはこちら。
どうやらESP32で使うとSJA1000、Atmega328pなどのArduinoだとMCP2515を使えるようになっているライブラリっぽい。サンプルも入っているので助かった。
関数がほぼ同じなのでESP32以外に移植するときもかんたんに移植できそう。

あとはCANトランシーバーが必要なんだけど、ESP-WROOM-32は3.3V駆動なので3.3V駆動のSN65HVD232Dを用意した。本当はスタンバイ端子とかあったほうがいいらしいんだけど面倒なので…
このICはD(1番ピン)をGPIO5、R(4番ピン)をGPIO4につないであとは電源をESP32と共通の3.3VにつなぐだけでOK。

Raspberry PiにMCP2515つないでCANのデータを見れるようにしたかったんだけどまたMCP2515が届いてないので本当にCAN BUSでデータ送受信できてるかの検証がいまだできず…
とりあえずInnovate LC-2をAEMnetにつなげそうなサンプルプログラムを書いてみた。ただしデータの送信頻度はMTS依存だし足りないデータがあるからだめかも?


#include <CAN.h>

#define LED_BUILTIN 2

int Lambda[4];
int Func[4];
byte CanData[8]={0x00,0x00,0x00,0x00,0x0C,0x0C,0x82,0x02};
boolean isSend = true;

void setup() {
  Serial.begin(115200);
  Serial2.begin(19200, SERIAL_8N1, 16, 17);//RX 16, TX 17
  pinMode(LED_BUILTIN,OUTPUT);

  CAN.setPins(4, 5);
  CAN.begin(500E3);
}

void loop() {
  serialEvent2();
  if (!isSend){
    if(Func[0] == 0){
      int lambda = ((Lambda[0]+500)*10);//Lambda x10000
      CanData[0] = highByte(lambda);
      CanData[1] = lowByte(lambda);
      can_send();
    }
  }
}

void serialEvent2() {
  while (Serial2.available() > 0) {
    byte mtshead[2];
    Serial2.readBytes(mtshead,1);
    if((mtshead[0] & 0xA2) == 0xA2){
      //debug
      mtshead[1] = mtshead[0];
      Serial2.readBytes(mtshead,1);
      if((mtshead[1] & 0x80) == 0x80){
        digitalWrite(LED_BUILTIN, HIGH);
        int stream_len = int(((mtshead[1] & 0x01) << 7) | (mtshead[0] & 0x7F));
        int sense_cnt = 0;
        for (int i=1; i <= stream_len; ++i){
          byte mtsdata[2];
          Serial2.readBytes(mtsdata,2);
          if((mtsdata[0] & 0x42) == 0x42){
            isSend = false;
            Lambda[sense_cnt] = int(((mtsdata[0] & 0x01) << 7) | (mtsdata[1] & 0x7F));
            Func[sense_cnt] = int((mtsdata[0] & 0x34) >> 2);
            sense_cnt++;
            Serial.println(Func[sense_cnt]);
          }
        }
        return;
      }else{
        return;
      }
    }else{
      return;
    }
  }
}

void can_send(){
  CAN.beginExtendedPacket(384);
  for (int i=0; i <= 7; i++){
    CAN.write(CanData[i]);
  }
  CAN.endPacket();
  isSend = true;
  digitalWrite(LED_BUILTIN, LOW);
}

今回は送信だけのテストプログラムだけど、ライブラリでは受信もできるのでソフト次第でELM327を使わずにOBD2でECUと通信できるかも。
オープンソースのELM327互換デバイスとかもあるみたいだし、ここらへん移植できたらBluetoothとかWiFi接続のアダプタが作れちゃったり。

MCP2515のボードいつ届くのかなぁ
安いのでArduino用買ってしまったから5V品っぽいんだけど、Raspberry Piで使うためにCANトランシーバー張り替えるかパターンカットでCANトランシーバーにだけ5V入れるかか…
3.3V対応のCANトランシーバもう少し買っておくんだった…
続きはテスト環境が届いてからかな

ちなみにESP32にCANトランシーバをつけずにこのライブラリを使用するとフリーズするというか無限ループに入ってしまうみたい。タイムアウトとか設定できるといいんだけども…

2018年12月5日水曜日

KZ ZSNを買ってみた

11/11のAliexpressのセールでKZ ZSNを買っていたのがようやく届いた。
16ドルぐらいだったのでついポチってしまった。

パッケージは割と小さめ。箱があまり潰れていなかった。


パッケージがなかなか良い感じ。金属プレートのおかげで高級感がある。


付属品はいたってふつうのイヤーピースとケーブル。
ケーブルはマイク無しタイプにした。


色でちょっと迷ったけど、思ったとおりのきれいな緑色だった。


ケーブルの質感も良好。
BA1+DD1のハイブリッドとしてはやはりお安いなぁ
音質もなかなか良い。

2018年12月1日土曜日

ヘッドホンにブームマイクを付けてヘッドセットにしてみた

友人が普通のヘッドホンにブームマイクを取り付けられる、ModMicという製品を使っているらしい。たしかにボイチャしてみると声もクリアに聞こえるし良さそう。
ヘッドセットのマイクって意外と音質が悪かったりするものもあるし…
しかし値段を調べると代理店で8000円ぐらいする。マイクにここまで出せないなぁ~
ということで作ってみることに。

まずはドナーとなるフレキシブルなブームマイクを探してみた。
おなじみのeBayで87円で売っていたので試しに買ってみた。
まずは音質チェック。Windows 10の"このデバイスを聴く"機能を使って試した結果、まぁノイズは乗るけどサウンドカードのノイズ除去を有効にすれば問題なさそう。
友人とDiscordで試したけど今使ってるマイクより断然良いという回答をもらった。

ほしいのはこのマイクブームだけなのでとりあえず分解してみる。

マイクの風防を外すとこんな感じ。

裏側の蓋は接着されてないのでそのまま外すことができた。
マイクのサイズ的に秋月で売ってるXCM6035(WM-61A相当品)にも交換できそう。

マイクは接着されてないのでケーブル引っ張ったら外れた。

お次はマイクと反対側を分解。スポンジを剥がしてラジペンでUの時の金具をつまむと外れる。

フレキシブルマイクブームはインサートモールドされてるようなので樹脂部分を破壊して取り外した。
とりあえずこれで必要な部品取りが終了。
ケーブルも短いので交換する。

次に3Dデータをこしらえて3Dプリント。

マグネット部分にはダイソーのネオジム磁石を使用した。
接着剤で固定して台座は完成。


マイクブームを台座に接着。台座はModMicみたいに90度ずつ回せるようにしておいた。
台座に接着するタイプなのでマイクブームの長さは固定。


配線して風防を取り付けて完成!


あとはヘッドホンに台座を取り付けてマイクをセットすると完成!
ネオジム磁石で取り外せるのは便利だ…
台座側はネオジム磁石じゃなくて普通の鉄とかでも良かったかも。ダイソーのネオジなめてたけど結構強い。

2018年11月25日日曜日

WHR-G300NをJTAGで修理してみる。

だいぶ前にOpenWRTとかDD-WRTのファームウェアをいじっていたWHR-G300Nを書き込みミスで破壊してしまったのでJTAGで修理してみることに。FlashがCFIなのでライターが無いし…
u-bootすら起動しないのでシリアルコンソールも無反応で、電源をいれると電源LEDは光るんだけど、DIAGランプが薄く赤く光ってる感じ。

WHR-G300Nを検索するとv1とv2があるようなんだけど日本だとWHR-G300Nといえばv1らしい。CPUがRalink RT3052Fのタイプ。
Flash ROMはMaxim 29LV320DBTI-70G(4MB)で、RAMはESMT M12L128168Aが2つで32MBっぽい。

JTAGは上の写真で言う右側の真ん中より少し下にある14PinのSMDピンヘッダのパットがある辺りがそれっぽい。RT3052FはMIPSアーキテクチャなのでMIPSの14PinのJTAGっぽい。
周りに1005サイズの抵抗のパッドも残っていたけど、とりあえずR28だけ装着すればJTAGが使えそう。(TDOの部分)
本当は100Ωとかをつけておくべきなんだろうけどとりあえずジャンパした。
SMDのピンヘッダをつけたかったんだけど、とりあえずJTAGで行けるのか試したかったのでまずはケーブルをハンダしてみた。

とりあえずUSB BlasterでPCとつないでurjtagで接続してみることに。Windows版がうまく動かせなかったのでLinux版をラズパイ上で動かしてみた。
jtag> cable usbblaster
jtag> detect
IR length: 5
Chain length: 1
Device Id: 00010011000001010010001001001111 (0x1305224F)
  Unknown manufacturer! (00100100111) (/usr/local/share/urjtag/MANUFACTURERS)
detectコマンドを送る直前ぐらいにWHR-G300NのACアダプタを差したらうまく認識するようになった。0x1305224FはRalink RT3052FのIDらしい。urjtagにRalinkの情報が入っていないからUnknownになってるけど。
とりあえず認識できたんだけどurjtagにRalinkのコンフィグがないので海外フォーラムを参考に適当なコンフィグを使用することに。MIPS系ならエンディアンが同じとか。
jtag> include admtek/adm5120/adm5120
ImpCode=01100000010000010100000000000000 60414000
EJTAG version: 3.1
EJTAG Implementation flags: R4k ASID_8 MIPS16 NoDMA MIPS32
Processor entered Debug Mode.
jtag> readmem 0x1f000000 0x30000 uboot
address: 0x1F000000
length:  0x00030000
reading:
CFIのフラッシュメモリはJTAGで書き込めるみたいなんだけど、現状どうなってるのか見るためにuboot領域だけ読み出してみることに。
しかしどうやらubootが動いてないので初期化処理がされてないためか全然読み出せない…
OpenOCDでやらないとだめかも。あちらはコンフィグファイルでフラッシュの初期化とか色々できるみたいだし。

ubootを焼いてTFTPでファームを流し込めばいいんだけど、とりあえず純正のubootをdumpしてくれてる人がいたのでこれをもらってきて書き込めば良さそう。
JTAGで全部焼くと時間がかかるので、ubootだけ焼いてTFTPでdd-wrtを流し込んだらそこから純正ファームウェアに戻してみるとか…
BuffaloのRalinkのubootは暗号化されたファームウェアを受け付けないらしいのでDD-WRTから純正ファームウェアに戻す用のファームウェアを焼かないといけないという面倒なやつ。フォーラムの方からWHR-G300N-webrevert.rarをダウンロードしておく。(ログオンしないと添付ファイルが見えない仕様になってるので、登録してログオンすると見つけられると思う。)