Skip to content

Tosainu/bp35c0-j11-stuff

Repository files navigation

bp35c0-j11-stuff

Wi-SUN モジュール RHOM BP35C0-J11 で遊んだり、ついでに RP2040 とか Rust の組み込み開発事情を調査してるリポジトリ。

DSC_3299

  • bp35c0-j11
    • BS35C0-J11 のコマンド・レスポンスを扱うライブラリ
    • RP2040 でも動かすために no_std (要 alloc) も想定
    • 現状 B ルート接続とデータ送受信に必要なコマンドにフォーカスしていて、それ以外のコマンドは基本的に未対応
  • rp2040-log-to-cdc
    • 後述の RP2040 + BS35C0-J11 の検証環境で、スマートメーターに接続したり取得したデータを USB CDC 経由でダラダラながすやつ
    • モジュールとなにかするだけなら USB-UART 直結で済みそうだけど、いい感じの小物パーツが手元になくてリセットピンとかの制御に悩んだので RP2040 経由で動かすことにした、という経緯
    • 現時点では起動後アクティブスキャンをかけてスマートメーターがいそうなチャンネルを探索、Bルート接続 & PANA 認証、スマートメーターの時刻や瞬時電力を読み出し、という動作をする
      echonet
  • rp2040-combined
    • 後述のユニバーサル基板環境で、BP35C0-J11・温度センサー・LCD・LED を同時に扱うやつ, powered by RTIC
    • スマートメーターから取得した値や温度センサーの測定値を LCD に表示する (上の画像)
  • route-b-secrets
    • Bルート認証ID やパスワードなどを雑にバイナリに埋め込むためのライブラリ
  • rp2040-akizuki-lcd-aqm0802 (BP35C0-J11 と関係なし)
    • LCD 動作確認と制御方法確認のため実装
  • rp2040-adt7310 (BP35C0-J11 と関係なし)
    • 温度センサーの動作確認と制御方法確認のため実装
    • 測定値を RP2040 の UART0 に書き出す

ソースコードのビルドとテスト

リポジトリにあるコードはすくなくとも Rust 1.80.1 (stable) で動きます。ただし .cargo/config.toml でデフォルトのターゲットを thumbv6m-none-eabi にしているので、それを追加するか必要に応じて --target <TRIPLE> を渡します。また rp-rs/rp2040-project-template にならって flip-link を指定しているので、こちらも必要です。rustup がインストールされている場合、例えば次の手順でビルドできます。

$ rustup target add thumbv6m-none-eabi
$ cargo install flip-link
$ cargo build

テストコードはホストの環境で直接実行できます。例えば次のコマンドを実行すると、.cargo/config.toml の設定関係なしにホスト向けにテストコードがビルド・実行されるはずです。

$ cargo test --target "$(rustc -vV | grep host | cut -d' ' -f2)"

Bルート認証ID 等の埋め込み

Bルート認証ID とパスワードをバイナリに埋め込むため route-b-secrets/build.rs でゴニョゴニョしています。埋め込む値を変更するには、Bルート認証ID とパスワードを記述した route-b-secrets/src/secrets.rs を作成してビルドしなおします。

pub const ROUTE_B_ID: &[u8; 32] = b"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
pub const ROUTE_B_PASSWORD: &[u8; 12] = b"xxxxxxxxxxxx";

ターゲット RP2040 基板の変更

rp2040-log-to-cdc は、複数の RP2040 基板への対応を Cargo の features でできないか実験しています。現時点では Adafruit Feather RP2040 (デフォルト) と Raspberry Pi Pico に対応しています。 例えば次のオプションを渡してビルドすると Raspberry Pi Pico 向けになります。なお、Raspberry Pi Pico は私が未所持のため動作未確認です。

$ cargo build --features rp2040-log-to-cdc/rp-pico --no-default-features

モジュールとの接続方法等は後述します。

RP2040 で動かす

動作確認では RP2040 基板に Pink Adafruit Feather RP2040 を使っています。また、BP35C0-J11 のために SPRESENSE-WiSUN-EVK-701 を使っています。SPRESENSE-WiSUN-EVK-701 は名前の通り SPRESENSE 向け拡張ボードですが、リンク先にある回路図を見ると実質レベルシフターとチップアンテナ付きの BP35C0-J11 評価ボードなのがわかります1。ちなみに下調べが甘かったなという反省点として、この基板には 2.54mm ピッチのピンヘッダがついているものの足が短いのでブレッドボードに向かなかったというのがあります。浮いてきてしまうので写真の通りテープ固定しています。

接続

Feather RP2040 と SPRESENSE-WiSUN-EVK-70 は次のように接続しています。ユニバーサル基板実装にともない、ピン割り当てを上記画像のものから変更しています。

Feather RP2040 SPRESENSE-WiSUN-EVK-70 メモ
D24 UARTT2_TX (J-2 - 2)
D25 UARTT2_RX (J-2 - 3)
D11 GPIO1 (J-4 - 4) BP35C0-J11 の RESETN にレベルシフター TXS0108E を介して接続されている
D10 GPIO2 (J-4 - 5) TXS0108E の OE に接続されている
3.3V 3.3V (J-1 - 1) TXS0108E の VCCB (BP35C0-J11 側) の電源
3.3V 1.8V (J-4 - 2) TXS0108E の VCCA (SPRESENSE 側) の電源 (今回は RP2040 とつなぐので 3.3 V で問題なし)
GND GND (J-2 - 1) SPRESENSE-WiSUN-EVK-70 側は GND (J3 - 1) でも可

Raspberry Pi Pico 向けにビルドした場合の接続は次を想定しています。

Raspberry Pi Pico SPRESENSE-WiSUN-EVK-70
GP4 UARTT2_TX (J-2 - 2)
GP5 UARTT2_RX (J-2 - 3)
GP10 GPIO1 (J-4 - 4)
GP11 GPIO2 (J-4 - 5)
3V3V(OUT) 3.3V (J-1 - 1)
3V3V(OUT) 1.8V (J-4 - 2)
GND GND (J-2 - 1)

Bus Blaster v3 で SWD

変更したプログラムを RP2040 で動かすために毎回 USB ケーブルつなぎなおしてるのが面倒になったのと、流行りの probe-rs にあこがれて、このとき買っていた JTAG デバッガー Bus Blaster v3 を出してきました。

Bus Blaster v3 を KT-link 互換にするたんめ、このリポジトリsystem.svf を CPLD に書き込みました。Feather RP2040 の裏面パッドからひっぱってきた SWD のポートと接続するとあっさり OpenOCD で認識。GDB でロードやデバッグ、などもできました。

$ openocd --version
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html

$ openocd -f interface/ftdi/dp_busblaster_kt-link.cfg -c 'adapter speed 2500' -f target/rp2040.cfg
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 2500 kHz

Info : FTDI SWD mode enabled
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 2500 kHz
Info : SWD DPIDR 0x0bc12477, DLPIDR 0x00000001
Info : SWD DPIDR 0x0bc12477, DLPIDR 0x10000001
Info : [rp2040.core0] Cortex-M0+ r0p1 processor detected
Info : [rp2040.core0] target has 4 breakpoints, 2 watchpoints
Info : [rp2040.core1] Cortex-M0+ r0p1 processor detected
Info : [rp2040.core1] target has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections
Info : starting gdb server for rp2040.core1 on 3334
Info : Listening on port 3334 for gdb connections

と、ここで probe-rs は FTDI ベースのデバッガーの SWD に (少なくとも現時点では) 対応していないのに気づきます。残念。また GDB も、semihosting/RTT などを試していくとプログラムによっては挙動があやしい (?) ことがあり、結局このリポジトリの開発で採用するのは断念。

それでも SWD でプログラムをロードさせるのは諦めきれず、いろいろ調査のうえ OpenOCD 単体で書き込めるのがわかりました。また、.cargo/config.toml から runner を次のように設定して、cargo run で OpenOCD が立ち上がって書き込み & 実行できました。

[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = [
  "sh",
  "-c",
  """openocd \
    -f interface/ftdi/dp_busblaster_kt-link.cfg \
    -c \"adapter speed 2500\" \
    -f target/rp2040.cfg \
    -c \"program $0 verify reset exit\"""",
]

ユニバーサル基板実装

ユニバーサル基板実装に実装しました。ついでに眠らせていた LCD と温度センサーを空いたスペースに実装しました。

パーツリスト

Feather RP2040 と SPRESENSE-WiSUN-EVK-701 はリストから除いています。

パーツ 仕様 個数 メモ
ユニバーサル基板 片面 95×72mm 1 秋月 103230
ピンソケット 1x12 pin 1 秋月 110101, Feather RP2040 用 (1)
ピンソケット 1x16 pin 1 秋月 110103, Feather RP2040 用 (2)
低背ピンソケット 1x14 pin 2 秋月 100661, SPRESENSE-WiSUN-EVK-701 用にカットせず使用 少しキツかった, 理想はこれ
ピンヘッダー 1xN 適量 デバッグ用との電源や UART 引き出し用
LCD I2C 接続 8x2行 1 秋月 109109 相当, ドライバー IC として ST7032 を搭載
温度センサー SPI 接続 1 秋月 106708 相当, ADT7310 を搭載

接続

追加の LCD と温度センサー以外は前述したとおり。自分の作業メモ程度のものであるうえ、その時の都合からペイント系ソフトで描いています。ちゃんとやるならベクター形式で扱いたいところ。背景は秋月の寸法図から引用したものです2

rp2040-bp35c0-j11

今後の展望

  • ブレッドボードにテープ固定つらい → 基板おこしちゃう?
    • 基板おこすのずっとやってみたいなーとおもいつつ、初めてにちょうどいい難易度の題材がなくできていなかった これならよさそう
    • ただ簡単すぎて、2.54mm ピッチのパーツしかないしユニバーサル基板でいいのでは…? ってなりつつある
  • ECHONET Lite 関連のコード追加してエンコード・デコードする
  • 最終的にスマートメーターから読んだデータをおうち Grafana に流し込みたい

参考資料

そのほか開発にあたって参考にしたページや資料のリスト:

ライセンス

本リポジトリの内容は MIT License のもとで公開しています。

本リポジトリは rp-rs/rp2040-project-template をベースに作成しました。

MIT

MIT License

Copyright (c) 2021 rp-rs organization

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Footnotes

  1. もちろんメーカーの想定した使い方ではなく、この使い方を推奨するものではありません。自己責任でおおねがいします。

  2. 非商業的かつ個人的な目的での「使用」のため、この引用は大丈夫なはず… ただし色の変更やパターンの書き込みが「改変」にあたらないかは不安 https://akizukidenshi.com/catalog/pages/terms_of_service.aspx

About

Wi-SUN モジュール RHOM BP35C0-J11 で遊んでみる

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages