Wi-SUN モジュール RHOM BP35C0-J11 で遊んだり、ついでに RP2040 とか Rust の組み込み開発事情を調査してるリポジトリ。
bp35c0-j11
- BS35C0-J11 のコマンド・レスポンスを扱うライブラリ
- RP2040 でも動かすために
no_std
(要alloc
) も想定 - 現状 B ルート接続とデータ送受信に必要なコマンドにフォーカスしていて、それ以外のコマンドは基本的に未対応
rp2040-log-to-cdc
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 とパスワードをバイナリに埋め込むため 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-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 基板に 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) |
変更したプログラムを 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。
- ブレッドボードにテープ固定つらい → 基板おこしちゃう?
- 基板おこすのずっとやってみたいなーとおもいつつ、初めてにちょうどいい難易度の題材がなくできていなかった これならよさそう
- ただ簡単すぎて、2.54mm ピッチのパーツしかないしユニバーサル基板でいいのでは…? ってなりつつある
- ECHONET Lite 関連のコード追加してエンコード・デコードする
- 最終的にスマートメーターから読んだデータをおうち Grafana に流し込みたい
そのほか開発にあたって参考にしたページや資料のリスト:
- BP35C0-J11 - データシートと製品詳細 | ローム株式会社 - ROHM Semiconductor
- BP35C0-J11 UART IF 仕様書
- BP35C0-J11 Bルート通信について
- SPRESENSE Add-on Boards - Wi-SUN & Sensors & Bluetooth® LE | ローム株式会社 - ROHM Semiconductor
- ハードウェア関連資料 - 回路図
- 規格書・仕様書など | ECHONET
- ECHONET Lite規格書 Ver.1.14 - 第2部 ECHONET Lite 通信ミドルウェア仕様
- ECHONET Lite のフレーム構造の解説がある
- アプリケーション通信インタフェース仕様書 - 低圧スマート電力量メータ・コントローラ間 Ver.1.10
- スマートメーター関連の情報がある
- APPENDIX ECHONET機器オブジェクト詳細規定Release R rev.2
- スマートメーター含む、ECHONET 機器から読み出せる値 (オブジェクト) の詳細について書かれている
- ECHONET Lite規格書 Ver.1.14 - 第2部 ECHONET Lite 通信ミドルウェア仕様
- rp2040_hal - Rust
- bgamari.github.com - SWD with OpenOCD and a Bus Blaster
- SWD support for FTDI adapter based debugging · Issue #2557 · probe-rs/probe-rs
本リポジトリの内容は MIT License のもとで公開しています。
本リポジトリは rp-rs/rp2040-project-template をベースに作成しました。
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
-
もちろんメーカーの想定した使い方ではなく、この使い方を推奨するものではありません。自己責任でおおねがいします。 ↩
-
非商業的かつ個人的な目的での「使用」のため、この引用は大丈夫なはず… ただし色の変更やパターンの書き込みが「改変」にあたらないかは不安 https://akizukidenshi.com/catalog/pages/terms_of_service.aspx ↩