'18年の春頃、「最近流行のIoT(猫も杓子もインターネット)の波に乗って何か面白いプロジェクトができないものだろうか」ということで、IoTデバイスについて少し調べてみました。その頃電子工作において流行していたのはEspressif SystemsのESP32というWi-Fiマイコンを使ったモジュールでした。でも、Wi-Fiモノは既にFlashAirを試食済みだったのと、Wi-Fiの利用範囲が狭い(実質的に屋内限定)こともあり、どこでも携帯電話の手軽さで使えればもっと可能性が広がるだろうと、セルラー回線での接続を考えてみました。セルラー回線を使えれば屋外でも(山奥や海上でない限り)インターネットが利用可能になります。そこで手軽に使えそうなのを探してみて見つけたのがu-BloxのセルラーモジュールTOBY-L2シリーズです。今回のジャンクリポートでは、このu-Blox製のセルラーモジュールTOBY-L220(LTE Cat.4)、LARA-R220(LTE Cat.1)、LARA-R6801(LTE Cat.1)とSARA-R500S(LTE Cat.M1)を試食してみます。
ところで、TOBY-L2の試食を一通り終えた頃、奇しくも仕事でIoT案件(移動体通信)が舞い込みました。そして既に試食が済んでいたこのセルラーモジュールが採用されることになり(LARA-R2で十分だったかも...)、多少の調整と確認だけでいきなり量産に持ち込めました。偶然って意外とあるんですねぇ...。
2019.10.10:「LARA-R2で十分だったかも...」などと言っていたら、どこからともなくLARA-R220-62Bが送り付けられてきました:-)。仕方ないので、これも試食してみることにします。ただ、使い方は殆ど同じなので、差異についてのみ記載としました。
2023.3.3:「なんか動かんのだけど。」との問い合わせに話を聞いてみると、LARA-R220がディスコンになったので、コンパチのLARA-R6801を実装したらしい...「そりゃ動かんわな!」。ハードウェア的にコンパチとは言ったけど、制御まで変わらないとは限りません。最近、別プロジェクトでSARA-R500Sを使う機会があったので、これらについても差異についてのみ記載としました。
u-BloxのTOBY-L2シリーズは、LTE/3G/2Gに対応したセルラーモジュールで、世界各地域に対応するためいくつかのバリエーションが存在し、日本仕様は TOBY-L220-62S となります。当然ですが、日本国内での使用に必要な技適証明の取得とキャリアIOT(NTT DoCoMo)は完了しているので、組み立ててすぐに使用できます。
これ以外のモジュールについては、それぞれデータシートを参照してください。モジュールの入手性は良く、Digi-KeyやMouserに取り扱いがあります。これとマニュアルの出来の良さが選んだ最大の理由でもありますが。u-Bloxは今回のセルラーモジュールに限らず、むしろ高性能なGNSSモジュールで定評のあるメーカーですね。所在地はスイスですが、モジュールの製造はオーストリアとなっていました。
購入したモジュールを右の写真に示します。トレーかスポンジに挟まって来ると思いきや...テープでした:-)。こんな太いテープを見たのは初めてです(一番太いのはどれくらいだろうか?)。さて、TOBY-L2のモジュール形状はLGAなので、はんだごてでは付けられません。いつもならおもむろにひっくり返してプロト基板に載せて...とやるところですが、放熱が問題になりそうだし、かっこいいロゴ(と〒マークも)が隠れてしまうので、この際DIP化基板を起こしてみました。単純なピン変換ではなく、必須機能(アンテナ端子とSIMソケット)はDIP化基板上に載せてあるので、外部からはほんの数本つなぐだけで動かすことができます。
基板はFR-4(t=1.0)として設計していますが、1.6mmでも特に問題はないでしょう。それと、どこかで見たようなロゴが付いていますけど、SparkFunとはあまり関係ないと思います:-)。モジュールのピン数は152本もありますが、有効信号線数は40本そこそこで、2/3以上がGNDとRSVD(予約)となっています。使わない機能ピンは基本的にオープンでOKです。RSVDについてはひとつ気をつける必要があり、そのうちの一本にモード選択機能が割り当てられているということです。これをGNDに接続しないとUARTに内蔵OSのシェルがマップされて、UARTをモデムI/Fとして使えなくなってしまいます。シェルをいじると何かハックできるかもしれません:-)。
BGA/LGAパッケージや一部のコネクタ類のようにはんだごてで付けられない表面実装部品は、リフロー方式(必要箇所にはんだをセットし、全体を加熱して溶かす)ではんだ付けすることになります。電子工作でもリフローはんだが避けられなくなる中、各人工夫を凝らしてテクニックを開発しているようです。そこで、私も現在行っている方法を紹介してみましょう。
はんだのセットは普通はステンシル印刷で行います。でも、これに使うはんだペーストの扱いが面倒なので、私の場合ははんだごてと糸はんだでパッドに一つひとつ乗せています。LGAのように平面接続の場合は、全てのパッドに均等にはんだを乗せないとブリッジしたり接続しなかったりといった失敗の原因になります。そのため、例えば0.3mmのはんだで1.4mm/mm³などと長さを決めて乗せるようにし、量にバラツキがないかチェックしておきます。はんだペーストに比べて部品に熱が伝わりにくいのを補うため、部品の端子にはフラックスを多めに塗布してから乗せます。
加熱処理は歩留まりや信頼性を保つため、専用の炉で管理された温度プロファイルの下で行わなければなりません。でも、電子工作ではそこまではせずホットプレートやオーブンで代用することが多いようです。いやぁ、料理好きにはたまらないですね(今日は基板焼き、明日はお好み焼き♪)。私の場合は、右の写真に示す焼き魚方式(ヒートガンで下から炙る)で調理しています。大きな基板には対応できません(数cm角程度まで)が、ダイナミックな温度調整がしやすく、何より手軽なので:-)。
ヒートガンの噴気温度は300℃にセットし、1分ほど遠火(10cm程度)で均等に予熱したあと、近火(3cm程度)にしてさらに温度を上げます。やがてはんだが溶けはじめると部品がジワっと沈んでくるので、タイミングがよく分かります。全体が溶け終わったら火から下ろし徐冷したあと出来具合をチェックします。この基板では、モジュール、U.FLコネクタ、SIMソケットをリフローはんだし、それ以外は手はんだとしています。
右の図にUARTインターフェースで接続する場合の回路を示します。UARTインターフェースの信号名は、RS-232C本来の定義(モデム側)で付けられているため、TXDが入力、RXDが出力となっています。モジュールのインターフェース電圧は一部の信号を除き1.8V系なので、マイコンとの接続にはレベル変換が必要になります。電源ON状態ではモジュールのI/F電源がVINTに出力されているので、これをレベル変換ICの電源に使うことができます。UARTはあまり高速な信号ではないので、図中に示すような簡易変換でも十分でしょう。
RESET_NとPWR_ON入力だけは内部でプルアップされていて、押しボタンスイッチまたはオープンドレインで駆動されることになります。TOBY-L2のRESET_Nは普通のリセット信号とは異なり、リセットパルス幅で信号の意味が変わってきます。18~800msで電源ON、2.1~15秒でリセット、16秒以上保持で強制OFF(※)となります。LARA-R2では単なるシステムリセット(および電源ON)となります。(※)電源OFFは通常、コマンドで行います。
LARA-R6801とSARA-R500Sでは、電源ONとリセットはそれそれPWR_ONとRESET_Nでのみ行い、強制OFFはこれらを特殊なシーケンスで入力することでで行います。
DIP変換基板上には、アンテナ端子とMicro SIMソケットが載っています。アンテナには左の写真に示すような使用するバンドに対応したものを使います。これらは何でも良いわけではなく、モジュールのスペックでバンド毎に最大ゲインが設定されていて、それを越えるようなハイゲインアンテナを使ったりすると電波法に触れる場合があるので注意が必要です。実際にアンテナを選定する際は、メーカーなどに確認をとったほうがよいでしょう。ケースが金属の場合は、右のSMAコネクタ付きケーブルでケースの外にアンテナを取り付けます。フィルムアンテナは、ケースがプラの場合にケースの内側に貼り付けて使用しますが、アンテナが基板に近接するときは、RFIの問題を避けるため適宜シールドや信号ラインのデカップリングが必要になるかもしれません。アンテナはANT1が送受信、ANT2が受信となっていて、受信ダイバーシティを構成できます(デフォルトではANT1のみ使用)。SARA-R500Sではアンテナは1本だけです。
ATコマンドは、モデム制御コマンドのデファクトスタンダードとしてよく知られています。これはヘイズコマンドセットといい、アナログモデムの制御を行うため'80年代にモデムメーカーのヘイズ社によって開発されたものです。その後、民生分野ではブロードバンド環境の普及によりアナログモデムもろ共滅んだと思っていたので、現在になってATコマンドを使うことになるとは思ってもいませんでした。
ATコマンドは、全てのコマンドが"AT"で始まるためそのように呼ばれるようになりました。このように全てのコマンドが必ず同じビットパターンで始まることで、どのコマンドでもシリアルフォーマット(ビットレートとパリティ)を自動設定できる仕組みになっています。次にATコマンドの例を示します。モデムへのデータは黒、モデムからのデータは赤で示しています。なお、これ以降の解説では改行文字を省略します。
ATQ0V1E1<CR> コマンド
<CR><LF>OK<CR><LF> リザルト
ATコマンドはキーボード入力が前提となっているので、コマンドラインはCR(\r)で終端します。コマンドは小文字でもかまいません。送信したコマンドはモデムからエコーバックされますが、自動で制御する場合は、コマンドのエコーバックを停止(ATE0)しておいた方がよいでしょう。コマンドの処理が終わると、その結果を示すリザルトコードがCRLF(\r\n)で挟まれた文字列として返されます。リザルトコードは、コマンドの処理の結果として送られるほか、着信や各種機能のステート変化などの通知のため、非同期的に発生するタイプ(URCという)もあります。URCはアナログモデムではRINGとかNO CARRIERくらいでしたが、セルラーモデムでは多機能になった分多くの種類のURCがあります。
電源ONまたはリセットによるモジュール再起動のあと、モデムインターフェースが使用可能になるまで十数秒を要します。このため、何か適当なコマンド(何も作用もない"AT"など)を定期的に送りながら"OK"が返されるまで待つ必要があります。ATコマンドではビットレートの自動設定が可能です。TOBY-L220では、9600,19200,38400,57600,115200,230400,460800,921600のうち任意のビットレートが選べます。ただし、最初のコマンドでビットレートが設定されたあとは固定されて変えられません。
単にSIMカードをセットしただけではネットワークに接続できません。アクセスポイントに関する情報(APN、ユーザ名、パスワード、認証方式)をモデムに設定する必要があるのです。これらはそのSIMカードで指定されいるものを使用します。たとえば、
APN | hogeapn.jp |
ユーザ名 | user |
パスワード | pass |
認証方式 | CHAP |
なら、下のリストに示すようになります。
初期設定(TOBY-L220の場合) 通信機能OFF(機内モード) AT+CFUN=4 OK イニシャルEPSベアラー登録 AT+UCGDFLT=0,"IP","hogeapn.jp",0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,"user","pass","" OK 通信機能ON(フル機能) AT+CFUN=1 OK
初期設定(LARA-R220/LARA-R6801/SARA-R500Sの場合) 通信機能OFF(機内モード) AT+CFUN=4 OK イニシャルEPSベアラー登録 AT+CGDCONT=1,"IP","hogeapn.jp" OK AT+UAUTHREQ=1,2,"user","pass" OK 通信機能ON(フル機能) AT+CFUN=1 OK
機内モード状態は電源OFF状態でも保持されるので、念のため通信機能をONに切り換えておきます。通信機能ONの状態では自動で基地局の信号を探してセルラーネットワークに登録するので、これが完了するのを待ちます。電界強度が十分にもかかわらずステータスが登録済にならなかったら、SIMが無効かSIM情報の設定が間違っていることが考えられます。
通信機能ON AT+CFUN=1 OK EPSネットワーク登録状態の確認 AT+CEREG? +CEREG: 0,0 0:未登録(停止中), 1:登録済, 2:未登録(検索中), 3:登録拒否 OK (ポーリング) AT+CEREG? +CEREG: 0,1 登録済になるまで待つ OK
うまくいかないときは、SIMカードが正しく読めているか、また電界強度は十分か次に示すようにして確認できます。AT+CNUMでERRORが返る場合は、SIMカードが読めていません。SIMカードが正しく接続されていない可能性があります。なお、Cat.M1対応のIoT向けSIMなど加入者番号の設定されていないSIMでは、番号がブランクになります。IMSIの読み出しは、AT+CIMIです。受信レベルは条件が良ければ-70dBm程度、-100dBm以下でも通信可能ですが、極端に低い場合はアンテナが正しく接続されていない可能性があります。
加入者番号の確認 AT+CNUM +CNUM: "","07040719301",129 OK 受信レベルの確認 AT+CESQ +CESQ: 99,99,255,255,22,58 n==0: <-140dBm, 0<n<97: (n-141)dBm, n==97: >-45dBm OK
セルラーネットワークにつながったあと、PSD機能を有効化することでインターネットが利用可能になります(※)。パケット通信の種類とパラメータのセット(PDPコンテキスト)は、いくつか登録しておいて切り換えて利用することができます。先に設定したイニシャルEPSベアラーがPDPコンテキストID.4(TOBY-L220)またはID.1(それ以外)にマップされるので、これを適当なPSDプロファイル(この例ではID.0)に設定し、それを使ってPSD機能を有効化します。PSD機能の有効化/無効化が発生するとそれがURCで通知されます。PSD機能の無効化は、明示的な無効化以外でも機内モードへの設定や通信圏外によるネットワーク登録解除によっても発生します。
(※)LARA-R6801ではPSD機能の有効化はEPSネットワーク登録が済むと自動で行われるので、ここで示す処理は必要ありません。URC等はありませんが、PSD機能が有効になっているかどうかはAT+CGACT?で確認できます。
PSDプロファイルID.0にPDPコンテキストID.4(TOBY-L220以外では1)を設定 AT+UPSD=0,100,4 OK PSDプロファイルID.0のIPモードをIPv4に設定(SARA-R5のみ) AT+UPSD=0,0,0 OK PSDプロファイルID.0でPSD機能を有効化 AT+UPSDA=0,3 OK +UUPSDA: 0,"100.77.159.35" [URC] PSD機能が有効化された (このIPアドレスはグローバルではない) DNSを使ってアドレス変換してみる(順引き) AT+UDNSRN=0,"elm-chan.org" +UDNSRN: "211.13.196.134" OK ... PSD機能を無効化 AT+UPSDD=0,4 OK +UUPSDD: 0 [URC] PSD機能が無効化された
右の図にTOBY-L220とLARA-R220の消費電流プロファイルを示します。TOBY-L220では電源ONからEPSサービスの開始まで20秒ほどで、この間のピーク電流は300mA程度となっていました。アイドル状態では40mA程度に落ち、1.3秒毎に200mA余りの電流パルスが見られます。
LARA-R220ではEPSサービスの開始まで15秒ほどで、ピーク電流は150mA程度でした。アイドル状態では10mA程度に落ち、1.3秒毎に130mA程度の電流パルスが見られます。このように、LTE Cat.1モジュールは LTE Cat.4モジュールに比べて消費電流が少ないことが分かります。
TOBY-L2/LARA-R2/LARA-R6/SARA-R5には内蔵のUDPやTCPを使って手軽に通信できる機能があります。次のリストにUDPでデータ送信する例を示します。まず、UDPソケットを作成するとソケットIDが返されるので、それを使って続くコマンドでソケットを操作します。送信コマンドのパラメータは順に、ソケットID、"ホスト名(IPアドレス)"、ポート番号、バイト数、"文字列"となります。文字列には不可視文字は使えず、文字列の長さはバイト数に一致しなければなりません。"文字列"を省略した場合はバイナリモードとなるので、プロンプト(@)が来たらバイト数分のバイナリデータを送信(常にエコーバックなし)します。どういうわけか、TOBY-L220ではソケット作成後の一発目のUDPパケットが必ず失われるのですが、理由は分かりません。
UDPソケット作成 AT+USOCR=17 +USOCR: 0 ソケットID=0 OK UDPソケット0でデータ送信(テキストモード) AT+USOST=0,"sv1.hoge.net",1900,22,"=22 bytes of data....=" +USOST: 0,22 OK UDPソケット0でデータ送信(バイナリモード) AT+USOST=0,"sv1.hoge.net",1900,22 @=22 bytes of data....= +USOST: 0,22 OK UDPソケット0クローズ AT+USOCL=0 OK
次にTCPソケットを使ったデータ送受信の例を示します。
TCPソケット作成 AT+USOCR=6 +USOCR: 0 ソケットID=0 OK TCPソケット0でホストのポート1900に接続 AT+USOCO=0,"sv1.hoge.net",1900 OK TCPソケット0でデータ送信(テキストモード) AT+USOWR=0,12,"Hello world!" +USOWR: 0,12 OK TCPソケット0でデータ送信(バイナリモード) AT+USOWR=0,12 @Hello world! +USOST: 0,12 OK +UUSORD: 0,6 [URC] TCPソケット0に6バイトの未読あり AT+USORD=0,6 TCPソケット0から6バイト読み出し +USORD: 0,6,"Hello!" OK TCPソケット0クローズ AT+USOCL=0 OK
ピアからTCPソケットにデータが届くとURC(+UUSORD: <sock_id>,<len>)で通知されます。データ読み出しで注意しなければならないのが受信ストリームがバイナリのまま""の間に挿入されるということです。+USORD:をパースするときは、"に続く読み出しバイト数分は制御コードを無視する必要があるかも知れません。
ソケットは同時に6個まで作成できるようです。また、ソケットのクローズは、接続の失敗(TCP)、ピアによる切断(TCP)、あるいは圏外などによるPSD機能の無効化に伴い非同期に発生することがあり、この場合はURC(+UUSOCL: <sock_id>)によって通知されます。
モジュールは内部にストレージを持っていて、単純なファルシステムによってある程度のデータ管理をすることができます。これ単独ではあまり用途はありませんが、以降の節で紹介する機能で必要になる場合があるので、ここで簡単に解説しておきます。
ファイルのダウンロード(書き込み)は、ソケット書き込みと同様にテキストモードとバイナリモードがあります。バイナリモードのプロンプトはソケットとは異なり、">"となります。
ファイルに書き込み/追記 (バイナリモード) AT+UDWNFILE="newfile",12 >Hello world! OK ファイルリスト AT+ULSTFILE=0 +ULSTFILE: "newfile","resp1","resp2" OK ファイルの読み出し AT+URDFILE="newfile" +URDFILE: "newfile",12,"Hello world!" OK ファイルの消去 AT+UDELFILE="newfile" OK
内蔵プロトコルの一つとして、HTTPがあります。この機能はコマンドひとつでリモートHTTPサーバに対してリクエストを行い、データの送信/取得といったwebサービスが利用できるものです。
item | 意味 |
---|---|
0 | サーバIPアドレス(1と排他) |
1 | サーバ名(0と排他) |
2 | ユーザ名(Basic認証) |
3 | パスワード(Basic認証) |
4 | 認証タイプ(0:なし,1:Basic認証) |
5 | ポート番号(1~65535) |
6 | セキュア オプション(0:HTTP, 1:HTTPS) |
サーバ情報は予め決まっていることが多いので、これをAT+UHTTPコマンドでサーバプロファイル(4つまで)として登録しておきます。サーバプロファイルの設定項目<item>は右の表に示すようなものがあり、このうちサーバ名だけ設定しておけば通常のHTTPリクエストができます。ポート番号はデフォルトでは80か443が使用され、それ以外の項目も必要に応じて設定すればOKです。
個々のHTTPリクエストではサーバプロファイル、メソッド、URIなどを指定するだけです。ここではGET/POSTメソッドの使用例について解説しておきます。AT+UHTTPCコマンドでHTTPリクエストを開始するとコマンドはすぐに完了し、リクエストの結果はその後URCで通知されます。URCの結果コードが1ならHTTPリクエストは成功、0なら失敗です。失敗した場合は、AT+UHTTPERコマンドで詳細を確認することができます。しかし、HTTPステータスが404とかでもリクエスト自体は成功と見なされるので、必要に応じてファイルに保存されたサーバレスポンスも確認する必要があります。
GETメソッドでデータを送る場合は、クエリ文字列を設定することになりますが、<req_uri>の文字列長は最大128バイトなので、長い文字列やバイナリデータを送るときはPOSTメソッドを使う必要があります。POSTメソッドではメッセージボディをストレージ上のファイルとして指定できます(コマンドラインでは128バイトまで可)。また、リクエストヘッダのContent-Typeの値はいくつかの中から指定できます(この例では(1:text/plain))。
サーバプロファイル0の設定 AT+UHTTP=0,1,"elm-chan.org" <prof>,<item>,<value>[,<value>] OK GETメソッド開始 AT+UHTTPC=0,1,"/tmp/hello.txt","resp" <prof>,<method>,<req_uri>,<resp_file> OK +UUHTTPCR: 0,1,1 [URC] <prof>,<method>,成功(1) レスポンス確認 AT+URDFILE="resp" +URDFILE: "resp",145,"HTTP/1.1 200 OK Date: Thu, 15 Aug 2019 05:14:10 GMT Server: Apache Connection: close Content-Type: text/plain; charset=utf-8 Hello world! " OK POSTメソッド開始(ファイル) AT+UHTTPC=0,4,"/tmp/upload.cgi","resp","datafile",1 <prof>,<method>,<req_uri>,<resp_file>,<body_file>,<content_type> OK +UUHTTPCR: 0,4,1 [URC] <prof>,<method>,成功(1) POSTメソッド開始(ダイレクト) AT+UHTTPC=0,5,"/tmp/upload.cgi","resp","Hello!",1 <prof>,<method>,<req_uri>,<resp_file>,<body_text>,<content_type> OK +UUHTTPCR: 0,5,1 [URC] <prof>,<method>,成功(1) レスポンス確認(部分読み出し) AT+URDBLOCK="resp",0,12 +URDBLOCK: "resp",12,"HTTP/1.1 200" OK
ついでにテストに使ったサーバプログラムも置いておきます。