BC-11AH-S1 の使い方

Posted by: otsuka

BC-11AH-S1発売しました。

この BC-11AH-S1 は nrc7394 をホストモードでなく
スタンドアローンモードで使用することを前提にした 11ah 通信用モジュールです。

ホストモードは Raspberry Pi HAT 形式の BC-11AH-A/A2 のように
Raspberry Pi OS から spi 経由でファームウェアを nrc7394 chip 上にダウンロードして使用する状態のことで、
スタンドアローンモードはボード上に登載されている eeprom に書き込んだファームウェアを
nrc7394 SoC に登載されている ARM Cortex-M3 で実行し、
あらかじめ設定しておいた動作を行う状態を指します。


この単体で起動して動作するスタンドアローンモード用のファームウェアをビルドするためには
nrc7394_sdk を使用する必要があります。
詳細は
nrc7394_sdk のドキュメント
NRC7394 Evaluation Kit User Guide (Standalone)
をご覧ください。

FreeRTOS で起動した上で用意された様々な API を利用したアプリケーションが動作する
ファームウェアバイナリをビルドして使用することになります。
どのような API が利用できるかは、
NRC7394 Evaluation Kit User Guide (Standalone SDK API)
をご覧ください。
https://github.com/newracom/nrc7394_sdk/tree/v1.3.4/package/sdk/apps
に、用意された API を使用したファームウェアのサンプルのソースコードがあります。
例えば、
「定期的に 11ah の AP に接続してセンサーから取得した値をアップロードする動作を繰り返す」
といったファームウェアを作成することができます。


自分でビルドしたファームウェアは nrc7394_sdk に同梱の
FirmwareFlashTool.exe
で eeprom に書き込みます。
.exe となっていますが、java アプリケーションなので Linux 上でも動作します。
ファームウェアの書き込み方法は
BC-11AH-S1 への FirmwareFlashTool.exe によるファームウェア書き込み手順のページ をご覧ください。


出荷段階では UART から ATコマンドを送信することでユーザーが操作ができる
nrc7394_standalone_xip_ATCMD_UART_2M.bin
を書き込んであります。

使用できる ATコマンドは
NRC7394 Evaluation Kit User Guide (AT Command)
UG-7394-006-AT_Command.pdf

をご覧ください。


BC-11AH-S1 を使用する際の接続は、ハードウェアに関する説明書
BC-11AH-S1 説明書
に従って 3.3V の給電と2系統の RX、TX への配線を行なってください。

以下の例では秋月電子の AE-FT2322 シリアル2ch変換モジュールを使って作成したブレイクアウトボードで
USB シリアル化して Raspberry Pi に接続して操作しています。




BC-11AH-S1 のコネクタ2にピンヘッダをハンダ付けして
写真のようにブレイクアウトボードに接続し、
USB ケーブルを操作用 PC に接続すると2つの UART が見えます。
(Windows であれば仮想 COM ポートが二つ増えます。Linux などであれば /dev/ttyUSB* が二つ増えます。)
片方が ATコマンドの入力を待ち受けるコンソール、
もう片方が FreeRTOS のコンソールになっています。

それぞれをターミナル(Windows なら TeraTerm、Linux や Mac なら minicom や screen など)で開いて
ブレイクアウトボード経由で BC-11AH-S1 電源を投入すると
FreeRTOS のコンソールの方に以下のように nrc7394_standalone_xip_ATCMD_UART_2M.bin の起動ログが表示されます。

FW is OK.
Jump to 0x10000
Cold Boot!! Clear all info in retent Info (Total: 3908 Byte Cleared)
[POR]Initial CAL is done
Selecting the first valid RF calibration data.
RF calibration flash sector data index 0 chosen.
wim: 0 MAC ADDR: a0:8a:06:35:03:67
wim: 0 sta type (STA)
wim: 0 Delete All Key
wim: 0 S1G agent successfully initialized(type: 0)
wim: 0 RF: on
pb : PreallocBuffer is not activated
wim: 0 supported ch width: 1/2/4MHz
wim: 1 MAC ADDR: a0:8a:06:35:03:68
wim: 1 sta type (STA)
wim: 1 Delete All Key
wim: 1 S1G agent successfully initialized(type: 0)
wim: 1 RF: on
pb : PreallocBuffer is not activated
wim: 1 supported ch width: 1/2/4MHz
[ATCMD] FLASH: 2M, profile1
[ATCMD] BUILD: NRC7394,CM3,IPv4 (15:21:06, Apr 30 2025)
[ATCMD] VERSION: 1.26.11 (SDK-1.3.4)
[ATCMD] TASK_PRIORITY: 2 (3)
[ATCMD] MSG_LEN: min=2 max=128
[ATCMD] DATA_LEN: max=4096
[ATCMD] BUFFER_SIZE: tx=4096 rx=4096
[ATCMD] PROMPT_OFF
[ATCMD] ECHO_OFF
[ATCMD] LINEFEED_ON
[ATCMD] EVENT_SOCKET_SEND
[ATCMD] MAX_SOCKET_OPEN: lwip=10 atcmd=10
[ATCMD] RF_CAL_INFO: cal_use=1 country=JP id=1
Target RF calibration data country code = JP, ID = 1
RF calibration flash sector data index 0 chosen.
Target RF calibration data country code = JP, ID# 32KHz external XTAL is working  [592]
 = 1
RF calibration flash sector data index 0 chosen.
[ATCMD] wifi_init: JP 12
 1M_BW: 9210 9230 9240 9250 9260 9270
 2M_BW: 9235 9245 9255 9265
 4M_BW: 9245 9255
[ATCMD] UART Open: channel=1 baudrate=115200 hfc=off
[ATCMD] UART FIFO: rx=65536, tx=0
[ATCMD] UART Enable: channel=1 badurate=115200 data=8 stop=1 parity=none fifo=2,0 hfc=off
[ATCMD] UART Enable: rx_irq=off tx_irq=off
[ATCMD] DMA_ENABLE
[ATCMD] UART_RX_DMA: mem_addr=0x1045eb90 mem_size=65536 slot_size=128
[ATCMD] DMA_CONFIG: channel=0 type=P2M
[ATCMD] DMA_START: channel=0
[ATCMD] UART Open: success
[ATCMD] Boot_Reason: POR (0x1)

起動したらもう一方の、 ATコマンドを待ち受ける方のコンソールでATコマンドを入力します。
(改行は CR+LF なので Linux や Mac で実行する場合は注意してください。
例えば minicom で開いていたら "AT" と改行を入力後 Ctl+J で CR を送出)
OK
と反応が返ってきたら正常に動作しています。
(ローカルエコーがないので自分の入力した ATコマンドも確認したい場合は
ターミナルソフトの側でローカルエコーを有効にしておかないと
上記のように ATコマンドの実行結果しか表示されません。

ATコマンドでの操作を試すには上記のように直接ターミナルから入力することもできますが、
自身の入力とそれに対する反応を確認しやすくする Tool として
Raspberry Pi OS など Linux 上で動作する CLI アプリケーション raspi-atcmd-cli が用意されています。
https://github.com/newracom/nrc7394_sdk/tree/master/package/atcmd/host/raspi-atcmd-cli

インストールや使用法の詳細は
NRC7394 Evaluation Kit User Guide (AT Command)

p.108〜
「8 Test Application」
をご覧ください。

ここからはこの raspi-atcmd-cli で AT コマンドによって操作する実行例を紹介します。
STA として動作させてみるので接続先として BC-11AH-A2 で AP を立ち上げておきます。

以下のように raspi-atcmd-cli を起動します。
$ sudo ./raspi-atcmd-cli -U -D /dev/ttyUSB1 -b 115200 
 
 [ UART ]
  - device: /dev/ttyUSB1
  - baudrate : 115200
 
 
入力待ち受け状態になっているので AT コマンドに正しく反応するか確認します。
# AT
 SEND: AT
 RECV: OK

反応しているので AT コマンドの Version を確認してみます。
# AT+VER?
 SEND: AT+VER?
 RECV: +VER:"1.3.4","1.26.11"
 RECV: OK

接続できる 11ah の AP をスキャンします。
# AT+WSCAN
 SEND: AT+WSCAN
 RECV: +WSCAN:"08:33:ed:e7:93:a1",923.5@2,-91,"[ESS]","halow_demo"
 RECV: OK
ssid を指定して AP に接続します。
# AT+WCONN="halow_demo"
 SEND: AT+WCONN="halow_demo"
 RECV: OK
接続状態を確認します。
# AT+WCONN?
 SEND: AT+WCONN?
 RECV: +WCONN:"halow_demo","08:33:ED:E7:93:A1","open","","connected"
 RECV: OK

このとき接続した AP 側で AP を起動するため start.py 1 0 JP を実行したコンソールのログを見ると
以下のように接続したことを確認できます。
Dec 16 18:29:08 raspberrypi python3[1172]: wlan0: STA a0:8a:06:35:03:67 IEEE 802.11: authenticated
Dec 16 18:29:08 raspberrypi hostapd[1172]: wlan0: STA a0:8a:06:35:03:67 IEEE 802.11: authenticated
Dec 16 18:29:08 raspberrypi hostapd[1172]: wlan0: STA a0:8a:06:35:03:67 IEEE 802.11: associated (aid 1)
Dec 16 18:29:08 raspberrypi python3[1172]: wlan0: STA a0:8a:06:35:03:67 IEEE 802.11: associated (aid 1)
Dec 16 18:29:08 raspberrypi python3[1172]: wlan0: AP-STA-CONNECTED a0:8a:06:35:03:67
Dec 16 18:29:08 raspberrypi python3[1172]: wlan0: STA a0:8a:06:35:03:67 RADIUS: starting accounting session 426F9B6BBC64D985
Dec 16 18:29:08 raspberrypi hostapd[1172]: wlan0: STA a0:8a:06:35:03:67 RADIUS: starting accounting session 426F9B6BBC64D985

dhcp で IP アドレスを取得します。
# AT+WDHCP
 SEND: AT+WDHCP
 RECV: +WDHCP:"192.168.0.162","255.255.255.0","192.168.0.254",43200
 RECV: OK
dhcp アドレスを払いだした AP の先のルーターに ping を打ってみます。
# AT+WPING="192.168.0.254",5
 SEND: AT+WPING="192.168.0.254",5
 RECV: +WPING:64,"192.168.0.254",1,255,87
 RECV: +WPING:64,"192.168.0.254",2,255,22
 RECV: +WPING:64,"192.168.0.254",3,255,24
 RECV: +WPING:64,"192.168.0.254",4,255,23
 RECV: +WPING:64,"192.168.0.254",5,255,39
 RECV: OK
AP との接続を切断します。
# AT+WDISCONN
 SEND: AT+WDISCONN
 RECV: OK

AP 側のログを見ると確かに切断されています。
Dec 16 18:44:59 raspberrypi python3[1172]: wlan0: AP-STA-DISCONNECTED a0:8a:06:35:03:67

raspi-atcmd-cli を抜けます。
# exit

拡張された ATコマンドで 11ah のアクセスポイントに接続し ping を送れることが確認できました。

毎回このように一つ一つ ATコマンドを入力して操作していては大変なので
raspi-atcmd-cli では -s オプションで上記のような一連の動作を記述したスクリプトを指定して
AT コマンドを実行することができます。

scripts ディレクトリの中にサンプルスクリプトが55ファイル用意されていますが、
日本国内向けのものがないので wifi-connect-open-dhcp-auto-us をコピーし
日本向けに編集して実行します。

pi@raspberrypi:~/raspi-atcmd-cli/scripts $ cp wifi-connect-open-dhcp-auto-us wifi-connect-open-dhcp-auto-jp

script 内の COUNTYR を JP に、
ssid を AP で設定しているもの(ここでは halow_demo)に変更し、
以下のようにします。
pi@raspberrypi:~ $ vim raspi-atcmd-cli/scripts/wifi-connect-open-dhcp-auto-jp
AT+WCOUNTRY="JP"
AT+WCOUNTRY?
AT+WTXPOWER?

AT+WDISCONN

ECHO "Run an AP in OPEN."
ECHO " - SSID : halow_demo"
ECHO " - IP : 192.168.0.150"
HOLD

AT+WSCAN
AT+WDHCP=1
AT+WCONN="halow_demo"
AT+WCONN?

変更した script を指定して rasp-atcmd-cli を実行します。

pi@raspberrypi:~/raspi-atcmd-cli $ sudo ./raspi-atcmd-cli -U -D /dev/ttyUSB1 -s scripts/wifi-connect-open-dhcp-auto-jp 
 
 [ UART ]
  - device: /dev/ttyUSB1
  - baudrate : 115200
 
 
 CALL: scripts/wifi-connect-open-dhcp-auto-jp
 
 SEND: AT+WCOUNTRY="JP"
 RECV: OK
 SEND: AT+WCOUNTRY?
 RECV: +WCOUNTRY:"JP"
 RECV: OK
 SEND: AT+WTXPOWER?
 RECV: +WTXPOWER:13,0,"auto",30
 RECV: OK
 
 SEND: AT+WDISCONN
 RECV: OK
 
 ECHO: Run an AP in OPEN.
 ECHO:  - SSID : halow_demo
 ECHO:  - IP : 192.168.0.150
 HOLD: Press ENTER to continue.
enter を入力すれば接続を開始するところまで設定が行われて
入力待ち受け状態になりました。

enter を入力します。

 SEND: AT+WSCAN
 RECV: +WSCAN:"08:33:ed:e7:93:a1",923.5@2,-86,"[ESS]","halow_demo"
 RECV: OK
 SEND: AT+WDHCP=1
 RECV: OK
 SEND: AT+WCONN="halow_demo"
 RECV: OK
 SEND: AT+WCONN?
 RECV: +WCONN:"halow_demo","08:33:ED:E7:93:A1","open","","connected"
 RECV: OK
 
 DONE: scripts/wifi-connect-open-dhcp-auto-jp

#  RECV: +WEVENT:"DHCP_START"
AP への接続と dhcp による IP 取得・設定までが実行されました。


BC-11AH-S1 をマイコンから操作する方法は
ESP32 + 11ah モジュールを用いた Wi-Fi HaLow 通信デモ
で紹介しています。
こちらも併せてご覧ください。