Upgrade to Pro — share decks privately, control downloads, hide ads and more …

nRF9160_sakura_io_transplanting

shinrinakamura
August 30, 2021
460

 nRF9160_sakura_io_transplanting

さくらのマイクロコミュニティでの登壇資料です。
「sakura.ioをnRF9160を使ってセキュアモバイルコネクトに移植してみた」

shinrinakamura

August 30, 2021
Tweet

Transcript

  1. 中村 真理 Nakamura Shinri 株式会社 B&B La. ハードウェア開発 ファームウェア作成 IoTデバイス・アプリケーション作成

    ・診療放射線技師 経験 バーテンダー 病院勤務 https://www.facebook.com/nakamura.shinri/ ハイパーメディアフリーター 自己紹介
  2. 純正の開発ツール nRF Connect SDKを利用して必要な開発ツールをインストールできる GUIで操作できるので簡単に使用できる デスクトップアプリとしてインストールした https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/gs_assistant.html#gs-assistant Programmerというツールでファームウェアの書き込みを行い LTE link

    monitorというツールで通信の確認を行う 通信試験を行うだけであればこの2つのツールがあればよい Teratermなどのターミナルエミュレータを使用してATコマンドでやり取りすることが可能 ※ファームエアには種類があるので書き込む際にはよく確認する必要がある nRF Connect SDK document
  3. 接続テスト手順 programmerを利用してファームウェアの書き込みを行い ATコマンドでやり取りを行う 実際に確認したコマンド 接続が確認出来たらMQTTの送受信ができるか確認 AT+CFUN =1 モジュールをオンにするコマンド AT+CGDCONT=1,"IP","sakura.io" AT+CGAUTH=1,"PAP","sakura","sakura"

    APNの設定 AT+COPS=? ネットワークのマニュアルサーチ AT+CGDCONT? 接続情報の確認 ※使用するATコマンドの詳細についてはappendixに入れている 実際に接続テストを行って気になったこと ネットワークのマニュアルサーチには時間がかかるので気⾧に待つ必要がある httpはデフォルトではオフになっているので、httpがつながらない場合は関連オプションが有効になったコンパイル済 のファームウェアを書き込み必要がある ※詳細はqiitaにかいています nRF9160DKを動かしてみたよ https://qiita.com/shinfrom/items/3b31549ddd1b7525416e
  4. ライブデモ システム全景 (H/W) 5V 2A AC アダプタ ※リンク先の情報は 2021.8.20 現在のもので

    変更になる可能性があります。 電源入力 制御出力 × 4 DCジャック付 ケーブル I2C / 電源 ステータス表示 CO2センサ LTEアンテナ Raspberry Pi Pico Sakura.io 互換モジュール 延⾧ケーブルを 切断して使用 ※ACアダプタ側を加工 するとPSE法非適合 となるので注意ください 開発用PC USB ケーブル 書き込み / デバッグに使用 ※動作時は不要 デモ用負荷 USB扇風機 電源をコードに加工 SSR (ソリッドステートリレー) 本物の換気扇を制御したい 場合SSRを使えば可能です 参考 ユーロブロック2P ケーブルの接続はユーロ ブロックが便利です
  5. ライブデモ システム構成 (1/3) ▪基板本体 ① ② ①マイコン基板 Raspberry Pi Pico

    ③ ④ ③Sakura.io 互換 nRF9160通信モジュール ※本プレゼンの内容 ⑤ ②レベルシフトIC FXMA108 ④Sakura.io ブレークアウトボード ⑤さくらのモノプラットフォーム DIP 型LTE モジュール基板 SCM-LTEM1NRF ※DIP型モジュール を使う場合は不要 ※DIP型モジュール を使う場合は不要 ※Chip one stop に多数在庫あり ※非売品 βテスト参加で入手可能 さくらのモノプラットフォーム βテスト無料申し込み(URLリンク先) ※リンク先の情報は 2021.8.20 現在のもので 変更になる可能性があります。 入手はこちら 制御 / 通信 ※今回未使用
  6. ライブデモ システム構成 (2/3) ▪基板本体 ⑧ センサ / 表示 / IO

    / 測定 ▪センサ / 表示部 ⑥ ⑦ ⑦16文字x2行液晶 AQM1602Y-RN-GBW 商品リンク ⑥CO2センサ Sensirion SCD30 ※ 6500円 と高価ですが 安価なセンサだと精度に 問題があることが 問題提起されています。 紹介の商品は実績が あるものです。 (参考) 5千円以下のCO2センサー、 過半数は粗悪品。電通大が警告 SparkFun SCD30 Arduino Library 使用方法 ArduinoでAQM1602Yを 触ってみる ⑨ 商品リンク ⑧ 16bit I/O エキスパンダー microchip MCP23017 使用方法 商品リンク 使用方法 Adafruit MCP23017 Arduino Library ⑨ I2Cディジタル電流・電圧・電力計 INA260 ※リンク先の情報は 2021.8.20 現在のもので 変更になる可能性があります。 商品リンク 使用方法 Adafruit INA260 Library
  7. ライブデモ システム構成 (3/3) 電源 / 電力 制御 ⑩ ⑩電源モジュール Aliexpress

    などで非常に安価なものが購入できます。 基板上のボリュームを調整し出力が5Vになるように あらかじめ調整しておきます。 品質が怪しい場合があるので、可能であれば出力 5V固定のものを購入することをお勧めします。 ⑪ ⑪ユーロブロック レセプタクル Aliexpress https://ja.aliexpress.com で DCDC で検索すると 左図のようなものが出てきます。 配送方法は指定できるので、 送料が高めな手段を選択すると 比較的早く(2週間程度) 入手できます。 2P 4P ケーブルの脱着に 便利です ⑫ ⑫スイッチ回路 P型 MOS-FETを使ったハイサイドスイッチと呼ばれる回路になります。 オープンドレイン回路と組み合わせて使用します。 電源入力 電源制御出力 P型MOS-FET 複数回路を制御する場合はトランジスタアレイが便利です。 (下図参照) 上図CTRL 端子へ LED 動作モニタLED ツェナーダイオード 電源が12V 以下の場合は不要 バリスタ (過電圧保護) フライホイール ダイオード (コイル負荷の 高電圧発生防止) 制御入力 I/Oエクスパンダ より トランジスタ アレイ 制御入力 バリスタ フライホイール ダイオード Pch MOS FET ツェナー ダイオード 参考リンク S G D 以下に構成例を示します ※動作を保証するものではありません。 抵抗は 1/4 W型を使用 ※リンク先の情報は 2021.8.20 現在のもので 変更になる可能性があります。 このタイプだと24V程度まで 対応しているようです。 ※仕様は要確認 LEDは赤または 緑、黄色を 想定しています。 青及び白は 回路の見直し が必要です。
  8. ライブデモ H/W ブロック図 5V 2A 電源 + 逆接保護 ダイオード ※1

    INA260 電力測定 モジュール I2C / 3.3V電源へ VIN+ I IN- I IN+ VIN- VIN ー ※1: 接続の極性を間違えた場合電源をショートさせる方向に ダイオードに電流が流れ、電源側の短絡保護回路を動作させ 図中の回路を保護する。 出来るだけ大電流(ACアダプタの能力以上) のものを使うのが望ましい。 GND GND側の 電流を測定 DC 5V ~ 24V 電源モジュール ※あらかじめ 5Vに調整 DC 5V RESET VSYS 3.3V (out) GND配線は 図中省略 VIO (1.8V) VIO (1.8V) DC 5V UART_RX UART_TX VIN 3.3V LTE_TX LTE_RX Sakura.io 側 RaspberryPi Pico 側 レベル変換IC ※レベル変換IC 部分でクロス 配線とする G D S Nch MOS-FET 例 2N7000 LTE_RESET LTE_RESET RESET Sakura.io ブレークアウトボード LTE_TX LTE_RX (UART0) この結線でUSB経由でデバッグ時にブ レークアウトボードにも給電されます。 (ラズパイ pico のドキュメント参照) I2C_SDA I2C_SCL I2C / 3.3V電源へ 表示 / CO2センサ (I2C0) 3.3V 10k でI2Cバスを3.3Vで プルアップ Raspberry Pi Pico I2C / 3.3V電源 MCP23017 I2C エクスパンダー I/O 制御信号 (4ch使用) スイッチ回路x4 制御対象 電源供給 VIN
  9. ライブデモ:クラウド / 通信 / ファームウェア ユーザー端末 携帯 キャリア LTE通信モジュール(nRF9160) Raspberry

    Pi Pico ※三密モニタ/解消システム エッジデバイス MQTT(uplink) 制御指令 MQTT(downlink) 稼働ステータス 稼働データ 保存(DB) 稼働状況 可視化 クラウドの 同一仮想サーバー に構築 クラウド
  10. スタート 初期化 モジュールと の通信確認① APN設定⑤ USER,PASS設定⑥ 通信接続⑦ LTEの接続確認 モジュールモード切替② 接続試行③

    LTEの接続確認 ④ No MQTTサーバー接続 タイマーセット MQTT受信モードに入る⑧ MQTT受信 Payload分析 メッセージに応じた処理 タイマーフラ グ確認 受信モードを止める 送信処理 フラグの回収 ①モジュールとの通信確認 AT ②モジュールモード切替 AT+CFUN=1 ③接続試行 AT+CGDCONT? ④LTEの接続確認 AT+COPS? ⑤APN設定 AT+CGDCONT=1,"IP","sakura.io" ⑥USER,PASS設定 AT+CGAUTH=1,"PAP","sakura","sakura" ⑦通信接続 AT+COPS=? ⑧MQTT受信モードに入る AT#XMQTTCON=1,"MyMQTT-Client- ID","","","test.mosquitto.org",1883 ※詳しくはappendixに資料をつけています ファームウェア フローチャート No
  11. 製品概要 nRF9160 ブレークアウトボード Sakura.io (ブレークアウトボード側) 赤枠の部分が差異部分 Sakura.io の物理寸法 / ピン配置

    / インターフェイスの電気的仕様を踏襲し nRF9160 を搭載した基板モジュール ・エッジデバイスのファーム改修 ・クラウド側の改修 を行えばエッジデバイス側の改修 や改版の対応が不要となる。
  12. Appendix RaspberryPi pico 固有の設定について (Arduino) #include <Wire.h> // 通常のwire ライブラリを使用

    …. #define I2C_SDA_PIN 0 // ピン設定は割り当て可能なピンが #define I2C_SCL_PIN 1 // 限定されるのでH/Wリファレンス参照のこと … Wire.setSDA(I2C_SDA_PIN); // begin の前に Wire.setSCL(I2C_SCL_PIN); // ピン設定関数でピン番号 Wire.begin(); // begin 後は他の環境と同様に使える 参考サイト Raspberry Pi PicoでI2C/SPI通信 https://garchiving.com/i2c-spi-communication-with-pico/ ▪ I2Cの使用方法 ▪ シリアルポートの活用方法 #define SAKURA_IO_BAUD_RATE 115200 // ボーレート(nRF9160 ファームに依存) #define Serial_LTE Serial1 // デバックコンソール(USB)は Serial // UART0 はSerial1 に割り当てられる // 可読性の高い変数にマクロ定義 #define UART_LTE_TX 12u // ピン配置は割り当て可能なピンが #define UART_LTE_RX 13u // 限定されるので H/Wリファレンス参照のこと ... Serial_LTE.setTX(UART_LTE_TX); //ピン設定関数で begin 前にピン番号 Serial_LTE.setRX(UART_LTE_RX); // を設定する Serial_LTE.begin(SAKURA_IO_BAUD_RATE); // 初期化 while (!Serial_LTE); // 初期化終了待ち 参考サイト Raspberry Pi Picoでシリアル通信する方法 https://garchiving.com/how-to-use-uart-with-pico/ ▪ リセット操作(サンプルコード) #define SAKURA_RESET 3 // HWに合わせて定義(GPIO 番号) … pinMode(SAKURA_RESET,OUTPUT); // リセットピンを出力モードに設定 digitalWrite(SAKURA_RESET,LOW); // LOW (非アクティブ)にセット Serial.print(F(“resetting module ”)); // デバッグメッセージ digitalWrite(SAKURA_RESET,HIGH); // HIGH (アクティブ)にセット delay(50); // 50msec リセット状態を保持 digitalWrite(SAKURA_RESET,LOW); // LOW (非アクティブ)にセット delay(50); // 安定するまで待機 ESP32の場合 Arduino-ESP32 Serial通信 https://qiita.com/T-YOSH/items/0ce41136c535c723affb
  13. スタート 初期化 モジュールと の通信確認① APN設定⑤ USER,PASS設定⑥ 通信接続⑦ LTEの接続確認 モジュールモード切替② 接続試行③

    LTEの接続確認 ④ No MQTTサーバー接続 タイマーセット MQTT受信モードに入る⑧ MQTT受信 Payload分析 メッセージに応じた処理 タイマーフラ グ確認 受信モードを止める 送信処理 フラグの回収 ①モジュールとの通信確認 AT ②モジュールモード切替 AT+CFUN=1 ③接続試行 AT+CGDCONT? ④LTEの接続確認 AT+COPS? ⑤APN設定 AT+CGDCONT=1,"IP","sakura.io" ⑥USER,PASS設定 AT+CGAUTH=1,"PAP","sakura","sakura" ⑦通信接続 AT+COPS=? ⑧MQTT受信モードに入る AT#XMQTTCON=1,"MyMQTT-Client- ID","","","test.mosquitto.org",1883 ファームウェア フローチャート
  14. ATコマンドリファレンス モジュールとの通信確認 AT AT+CFUN=1 接続パラメータを確認する AT+CGDCONT? AT+COPS? AT+CGDCONT=1,"IP","sakura.io" nRF91 AT

    Commands (nordicsemi.com) モジュールとうまく接続されていればATと入力したらOKが帰ってくる モジュールのモード切替 ATコマンドリファレンス p14 ATコマンドリファレンス p67 ネットワークの検索 ATコマンドリファレンス p87 APNの設定 類似のATコマンドから流用 ネットワークをマニュアルサーチ AT+COPS=? サーチには時間がかかる ATコマンドリファレンス p88 MQTTとの接続 MQTTとの切断 MQTTとの送信 MQTTの待ち受けに入る MQTTの待ち受けの終了 AT+CGAUTH=1,"PAP","sakura","sakura" AT#XMQTTCON=1,"MyMQTT-Client-ID","","","test.mosquitto.org",1883 AT#XMQTTCON=0,"MyMQTT-Client-ID","","","test.mosquitto.org",1883 AT#XMQTTPUB="ltetest",1,"Test123 message with QoS 0",0,0 AT#XMQTTSUB="ltetest",0 AT#XMQTTUNSUB="ltetest_sub" https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.4.0/nrf/applications/serial_lte_modem/doc/MQTT_AT_commands.html 参考
  15. Payload送信処理 スタート ①センサーの測定 ①センサーの測定値はfloat型のデータが3つ取れると仮定する ②float型のデータを HEXに変換する ③文字列として繋げて Payloadを作成 ④実際に使用する ATコマンドを作成

    //IEEE 単精度浮動小数点を4バイトのバイナリにする関数 //第一引数 ペイロードで送信したい値(単精度浮動小数点数) //第二引数 ペイロードの保存先(4byteで8文字+のnullで9バイト確保) void makePayLoad(float value, char *buff){ // IEEE 754形式の浮動小数点のメモリイメージを32bit整数にコピー // メモリ上のバイト順は浮動小数点、整数それぞれ共通 uint32_t SendValue; memcpy( &SendValue, &value, sizeof(SendValue)); // sprintf(buff, "%08X", SendValue); } {FFFFFFFFFFFFFFFFFFFFFFFFF} ③ 8 * 3=24Byte + nullの25Byteの文字列ができる AT#XMQTTPUB="ltopic_name",1," FFFFFFFFFFFFFFFFFFFFFFFFF ",0,0 ④実際にはこのATコマンドを使用してMQTTを送信する ※処理系のバイトオーダーには注意が必要 ②データタイプの変換
  16. Payload受信処理 ①受信モードに入る MQTT受信 ②想定内の 受信か確認 ③内容を確認 sw_status == 0 sw_status

    == 1 OFFにする ONにする O : OFFの信号(0x00) 1 : ONの信号(0x01)を受信すると仮定する NO ②正しい受信か確認 正しい受信であれば、#XMQTTMSG:コマンドが 受信内容の中に入っているはずなので、このコ マンドが入っているか確認する ③内容を確認 paylodに0xというヘッダーをつけることにより、 0x以降が命令だとわかるようにした 実装例
  17. モジュールからの返り値を読む方法 モジュールからの受信開始 ①時間の計測開始 タイムアウトまで繰り返す ②データの読み込み Serial != -1 ④受信データを文字列 に入れる

    受信データ出力 タイムアウトの時間を決めて受信するので、開始時間の把握が必要になる ②モジュールから信号を受信したら、メッセージの受信開始と判断する ③受信信号のみ使用する 受信したデータは文字列としてひとまとめにして出力する
  18. 受信クラウドでの処理 受信 ①payloadの取り出し ②HEX文字列をデータサ イズととに切り分ける ③切り分けたHEX文字列 を浮動小数に逆変換 ゲージやグラフなど必 要な形で出力する ②Javascriptのsubstr関数を使用して必要な⾧さに切り分けます

    Node-Redを使用すれば線をつなぐだけで簡単に取り出せます substr(start, length) ③切り分けた文字列を浮動小数に逆変換する //浮動小数に逆変換する関数例 function ComvertFloat(valueHEX) { var valueDEC = parseInt(valueHEX, 16); //入ってきた16進数を10進数に変換する let buffer = new ArrayBuffer(4); //領域の確保:float 4byte let dv = new DataView(buffer); //クラスの初期化 dv.setInt32(0, valueDEC); // data offset:0 var value_f = dv.getFloat32(0); // data offset:0 return value_f; //変換した浮動小数を返す } ビジュアルプログラミングツールのNode-Redを使用することで、簡単に 可視化、UIの作製まで行う