要旨
Raspberry Pi PicoとLTE通信モジュールBG96を使い、LTE回線経由でインターネット接続するまでの流れを確認しました。
本記事では、その検証内容を全3回に分けて整理します。最終的には、温湿度センサーSHT31の値をMQTTで送信し、Node-REDやLINEと連携する環境センシングの仕組みへ発展させます。
- 第1回:ATコマンドでPing疎通まで確認する
- 第2回:Raspberry Pi Pico + BG96 + TinyGSMでMQTT通信する
- 第3回:LTE対応の環境センシングシステムを作る:MQTT・Node-RED・LINE連携
今回は第1回として、Raspberry Pi PicoとBG96をUARTで接続し、ライブラリを使う前にATコマンドでLTE接続の流れを段階的に確認しました。
- BG96とのUART通信確認
- SIMカードの認識確認
- 電波強度の確認
- LTEネットワークへの登録状態確認
- APN設定
- TCP/IP Contextの有効化
- IPアドレス取得
- インターネット疎通確認
最終的に、BG96がLTE回線経由でインターネットに接続できる状態になることを確認しました。
次回以降では、TinyGSMを利用してMQTT接続を行い、最終的にはLTE対応の環境センシングシステムへ応用します。
English Summary
This article describes a basic LTE connectivity test using Raspberry Pi Pico and the Quectel BG96 LTE module.
Before using libraries such as TinyGSM, I verified each connection step with AT commands: SIM recognition, signal quality, network registration, APN configuration, Context activation, IP address acquisition, and Ping connectivity.
This is the first article in a series toward building an LTE-enabled agricultural IoT system using MQTT, Node-RED, and LINE integration.
背景
農業IoTや遠隔監視システムでは、Wi-Fiが届かない場所にセンサーや制御装置を設置したい場面があります。
たとえば、ビニールハウス、離れた圃場、作業場などでは、既設のWi-Fi環境を前提にできないことがあります。
そのような場合、LTEルーターを使用する構成も考えられます。しかし、LTEルーターを使うと機器構成が大きくなり、設置コストが上がることがあります。
また、制御コマンドやセンサー値を少量送信するだけの用途では、構成や通信容量が過剰になる場合もあります。
そこで、LTE通信機能を持つ小型デバイスを構成できると、単体のセンサーノードとしても、複数機器を外部通信につなぐゲートウェイとしても利用できます。
これにより、設置場所や通信方式の選択肢を広げることができます。
今回は、Raspberry Pi PicoとBG96を使い、LTE通信に対応した小型IoTデバイス構成を検証します。
最終的には、以下のような構成を目指しています。
- LTE回線でMQTT Brokerに接続する
- センサー値をMQTTで送信する
- Node-REDでデータを受け取る
- 必要に応じてLINEやGrafanaと連携する
ただし、いきなりTinyGSMなどのライブラリを使うと、内部で何が起きているのか分かりにくくなったり、問題の切り分けが難しくなったりします。
そのため、まずはATコマンドを使ってBG96の動作を確認し、LTE接続の流れを段階的に整理します。
※ TinyGSM:Arduino環境などでLTEモジュールを扱うためのライブラリ。内部ではATコマンドを使って通信モジュールを制御しています。
目的
本記事の目的は、Raspberry Pi PicoからBG96へATコマンドを送り、LTE通信モジュールがインターネットへ接続できる状態になるまでの流れを確認することです。
具体的には、以下を確認します。
- Raspberry Pi PicoとBG96がUARTで通信できること
- BG96がSIMカードを認識していること
- LTEネットワークに登録できること
- APNを設定し、TCP/IP Contextを有効化できること
- IPアドレスを取得できること
- 外部サーバーへの疎通確認ができること
今回はMQTT通信までは行いません。
MQTT接続は次回、TinyGSMを使って実装します。
BG96について
BG96は、Quectel社のLTE通信モジュールです。
LTE Cat.M1、NB-IoT、GPRSなどに対応しており、IoT機器向けの通信モジュールとして利用できます。
マイコンからはUART経由でATコマンドを送信し、SIMの状態確認、ネットワーク登録、APN設定、TCP/IP通信などを制御できます。
今回は、Raspberry Pi PicoからUARTでBG96へATコマンドを送り、LTE回線経由でインターネット疎通確認を行いました。
使用したもの
今回使用したものは以下です。
| 種類 | 内容 |
|---|---|
| マイコン | Raspberry Pi Pico |
| LTE通信モジュール | BG96搭載ボード |
| SIM | LTE通信用SIM |
| 開発環境 | Arduino IDE |
| 通信方式 | UART |
| 電源 | USB給電、または外部電源 |
| 確認方法 | シリアルモニタ(ArduinoIDEまたはtera termなど) |
※Raspberry Pi PicoとBG96をUARTで接続できるように配線しました。
※ BG96搭載ボードは秋月電子で販売されているBG96搭載ボードを使用しました。
※ SIMはMEEQ SIMを使用しました。
※ Arduino IDEでRaspberry Pi Picoにスケッチを書き込める状態になっている前提です。
※ Raspberry Pi PicoのArduino環境セットアップ方法は、本記事では詳しく扱いません。Web上に解説記事が多くありますので、そちらを参考にしてください
開発環境
Raspberry Pi Picoのボード設定
今回、Raspberry Pi PicoにはArduino IDEを使ってスケッチを書き込みました。
ボードマネージャのインストール手順は省略しますが、スケッチを書き込む際の主な設定は以下の通りです。
| 項目 | 設定 |
|---|---|
| ボード | Raspberry Pi Pico |
| 使用ボードパッケージ | Raspberry Pi Pico/RP2040 5.4.3 |
| USB Stack | Pico SDK |
| CPU Speed | 200 MHz |
| Flash Size | 2MB |
| Upload Method | Default(UF2) |
| シリアルモニタの改行設定 | Both NL & CR |
| シリアルモニタの速度 | 115200 bps |
UARTは、スケッチ内で指定したピンを使用しています。
今回の例では、PicoのGPIO 8をTX、GPIO 9をRXとして使用しました。
方法
1. Raspberry Pi PicoとBG96をUARTで接続する
Raspberry Pi PicoとBG96はUARTで接続します。
今回試した基本的な接続は以下の通りです。
| Raspberry Pi Pico | BG96 |
|---|---|
| TX GPIO 8 | RX |
| RX GPIO 9 | TX |
| GND | GND |
実際のピン番号は、使用するボードやプログラムに合わせて変更してください。
UARTでは、TXとRXをクロスして接続します。
つまり、PicoのTXはBG96のRXへ、PicoのRXはBG96のTXへ接続します。
また、BG96はLTE通信時に比較的大きな電流を必要とします。
電源が不安定だと、ATコマンドには応答しても、ネットワーク登録や通信時に失敗することがあります。
今回は、使用したBG96ボードの仕様に従い、PCからUSB給電を行いました。
BG96の電源は、使用するボードの仕様に合わせて、USB給電または外部電源を使用してください。
2. Raspberry Pi Picoに中継用のプログラムを書き込む
Raspberry Pi PicoとPCをシリアルで接続し、PCのシリアルコンソールからATコマンドを入力します。
入力したATコマンドは、Raspberry Pi Picoを経由してBG96に送られるようにします。
そのため、PicoにはUSBシリアルとUARTを中継するためのプログラムを書き込みます。
ここでは、PCから入力した文字列をPico経由でBG96へ送り、BG96から返ってきた応答をPC側に表示する構成にしました。

BG96が起動していない場合は、PWRKEYボタンを1秒以上押して起動します。
ATコマンドに応答しない場合は、BG96が起動しているかも確認してください。
ArduinoIDEを利用してRaspberry Pi Picoに書き込んでください。
こちらが実際に使用したプログラムです。
// Raspberry Pi Picoでシリアル通信を中継するプログラム
#define U1_TX 8
#define U1_RX 9
#define UART_BAUDRATE 115200
#define SerialMon Serial
#define SerialModem Serial2
void setup() {
SerialMon.begin(UART_BAUDRATE);
// GPIO UART
SerialModem.setTX(U1_TX); // Pico GPIO8 = UART TX
SerialModem.setRX(U1_RX); // Pico GPIO9 = UART RX
SerialModem.begin(UART_BAUDRATE);
delay(2000); // PCとの通信が確立するまで待つ
SerialMon.println("USB <-> UART bridge start");
}
void loop() {
// PC USB -> GPIO UART
while (SerialMon.available()) {
int c = SerialMon.read();
SerialModem.write(c);
}
// GPIO UART -> PC USB
while (SerialModem.available()) {
int c = SerialModem.read();
SerialMon.write(c);
}
}
ATコマンドはArduinoIDEからこちらに打ち込むようにします。

※改行設定と、通信速度は間違えると想定した通りに動作しませんので、設定を忘れないようにする必要があります。
3. ATコマンドの応答を確認する
まずは、BG96がATコマンドに応答するか確認します。
送信するコマンド:
AT
期待する応答:
OK
この応答が返れば、Raspberry Pi PicoとBG96のUART通信は最低限できていると判断できます。
応答が返らない場合は、以下を確認します。
- TX/RXの接続が逆になっていないか
- GNDが共通になっているか
- ボーレートが合っているか
- BG96に十分な電源が供給されているか
- BG96が起動しているか
- BG96のPWRKEYを押したか
4. SIMカードの認識を確認する
次に、SIMカードが認識されているか確認します。
送信するコマンド:
AT+CPIN?
期待する応答例:
+CPIN: READY
OK
AT+CPIN? は、SIMがPIN入力を必要としているか確認するコマンドです。
+CPIN: READY が返れば、SIMカードは認識されており、PIN入力待ちではない状態と判断できます。
SIMが認識されていない場合や、SIMが正しく挿入されていない場合は、エラーが返ることがあります。
5. 電波強度を確認する
LTE通信を行う前に、電波強度を確認します。
送信するコマンド:
AT+CSQ
応答例:
+CSQ: 20,99
OK
+CSQ の1つ目の値が電波強度の目安です。
2つ目の値はビットエラーレートです。
電波強度は、20〜30程度であれば比較的良好な状態と考えられます。
値が 99 の場合は、電波強度が取得できていない可能性があります。
その場合は、アンテナの接続状態や設置場所を確認します。
6. ネットワーク登録状態を確認する
LTEネットワークに登録できているか確認します。
送信するコマンド:
AT+CEREG?
応答例:
+CEREG: 0,1
OK
または、
+CEREG: 0,5
OK
1つ目の値が通知設定、2つ目の値がネットワーク登録状態を表します。
一般的には、2つ目の値が 1 または 5 であれば、ネットワークに登録できている状態と考えられます。
-
1:ホームネットワークに登録 -
5:ローミングネットワークに登録
0 や 2 の場合は、未登録または登録処理中の可能性があります。
7. APNを設定する
LTE回線でデータ通信を行うには、契約しているSIMに対応したAPNをBG96に設定します。
今回は、BG96のTCP/IP機能を使用するため、Quectel独自の AT+QICSGP コマンドでAPN情報を設定しました。
送信したコマンドは以下です。
AT+QICSGP=1,1,"meeq.io","meeq","meeq",2
今回はMEEQ SIMを使用する前提で設定しています。
さくらのSIMやSORACOMのSIMを使用する場合は、APN名、ユーザー名、パスワード、認証方式を使用するSIMの情報に合わせて変更してください。
このコマンドは、TCP/IP Contextに対して、APN名、ユーザー名、パスワード、認証方式を設定するためのものです。
| パラメータ | 値 | 意味 |
|---|---|---|
<contextID> |
1 |
使用するContext ID。範囲は1〜16 |
<context_type> |
1 |
IPv4を使用 |
<APN> |
"meeq.io" |
アクセスポイント名 |
<username> |
"meeq" |
ユーザー名 |
<password> |
"meeq" |
パスワード |
<authentication> |
2 |
CHAP認証 |
<authentication> の値は、0 が認証なし、1 がPAP、2 がCHAP、3 がPAPまたはCHAPを意味します。
正常に設定できると、以下のように OK が返ります。
OK
なお、AT+QICSGP は3GPP標準の AT+CGDCONT とは異なり、QuectelのTCP/IP機能で使用するAPN設定コマンドです。
そのため、通常のATコマンドマニュアルではなく、BG96 TCP/IP AT Commands Manual を参照します。
8. TCP/IP Contextを有効化する
APNを設定したら、TCP/IP Contextを有効化します。
送信するコマンド:
AT+QIACT=1
期待する応答:
OK
ここで指定している 1 は、先ほど AT+QICSGP で設定したContext IDです。
LTE通信では、単に電波をつかんだだけではIP通信ができるとは限りません。
APNを設定し、TCP/IP Contextを有効化することで、LTE回線上でIP通信を行う準備が整います。
なお、標準ATコマンドとしては AT+CGACT=1,1 でPDP Contextを有効化する方法もあります。
今回はBG96のTCP/IP機能を使用するため、AT+QIACT=1 を使用しました。
9. IPアドレスを確認する
TCP/IP Contextを有効化できたら、IPアドレスが取得できているか確認します。
送信するコマンド:
AT+QIACT?
応答例:
+QIACT: 1,1,1,"10.xxx.xxx.xxx"
OK
この応答では、Context ID 1 に対してIPアドレスが割り当てられていることが確認できます。
なお、PDP Contextに割り当てられたIPアドレスを確認する標準的なコマンドとして、以下の AT+CGPADDR もあります。
AT+CGPADDR=1
応答例:
+CGPADDR: 1,"10.xxx.xxx.xxx"
OK
一方、AT+CGDCONT? は、IPアドレスを確認するというより、PDP Contextに設定されているAPNやPDP Typeなどの設定内容を確認するためのコマンドです。
そのため、以下のように使い分けます。
- APNなどの設定内容を確認する:
AT+CGDCONT? - TCP/IP Contextに割り当てられたIPアドレスを確認する:
AT+CGPADDR=1 - BG96のTCP/IP Contextとして状態とIPアドレスを確認する:
AT+QIACT?
IPアドレスが取得できていれば、LTE回線経由でIP通信を行う準備が進んでいると考えられます。
10. Pingでインターネット疎通を確認する
最後に、外部サーバーへの疎通確認を行います。
送信するコマンド例:
AT+QPING=1,"8.8.8.8"
応答例:
+QPING: 0,"8.8.8.8",32,100,255
OK
Pingの応答が返れば、BG96がLTE回線経由でインターネットに接続できていることを確認できます。
結果
今回の確認では、Raspberry Pi PicoからBG96へATコマンドを送り、以下の項目を確認できました。
- BG96がATコマンドに応答すること
- SIMカードが認識されていること
- 電波強度を取得できること
- LTEネットワークに登録できること
- APNを設定できること
- TCP/IP Contextを有効化できること
- IPアドレスを取得できること
- Pingによる疎通確認ができること
これにより、Raspberry Pi PicoとBG96を使って、LTE回線経由でインターネット接続できることを確認できました。
考察
ATコマンドで確認する意味
TinyGSMなどのライブラリを使うと、LTE接続処理を比較的簡単に実装できます。
一方で、接続に失敗した場合には、どの段階で問題が起きているのかを切り分ける必要があります。
例えば、以下のような原因が考えられます。
- マイコンと通信モジュールがUARTで接続できていない
- SIMカードが認識されていない
- 電波を取得できていない
- LTEネットワークに登録できていない
- APN設定が間違っている
- IPアドレスが取得できていない
- MQTT接続だけが失敗している
ライブラリを使うと、これらの処理をまとめて実行できる一方で、失敗したときに原因が見えにくくなることがあります。
そのため、大きなライブラリを使う前に、ATコマンドを使って最小限の構成で動作確認をしておくことは有効だと感じました。
LTE接続は段階ごとに確認した方がよい
LTE通信では、「電波をつかんでいること」と「インターネット通信ができること」は別の段階です。
今回の確認では、以下のように段階を分けて確認しました。
- モジュールと通信できる
- SIMカードを認識している
- 電波状態を確認できる
- LTEネットワークに登録できる
- APNを設定できる
- TCP/IP Contextを有効化できる
- IPアドレスを取得できる
- Pingが通る
このように順番に確認することで、問題が起きたときに原因を切り分けやすくなります。
例えば、AT+CSQ で電波強度が取得できていても、AT+CEREG? でネットワーク登録できていなければ、まだLTE回線として通信できる状態ではありません。
また、ネットワーク登録ができていても、APN設定やContextの有効化ができていなければ、IP通信はできません。
このように、LTE通信は複数の段階を順番に確認することが重要だとわかりました。
APNとContextの理解
今回調べた範囲では、APNはモバイル通信網でデータ通信を行うための接続先や経路を決める設定に近いものだと理解しました。
Wi-FiでいうSSIDと完全に同じものではありませんが、「どのネットワークサービスに接続するかを指定する情報」と考えると、最初の理解としてはイメージしやすいです。
また、モバイル通信では、単に電波をつかんだだけではIP通信ができるわけではありません。
APNを設定し、Contextを有効化することで、LTE回線上でIP通信を行う準備が進みます。
なお、標準ATコマンドではPDP Contextという考え方が使われます。
一方、今回使用した AT+QICSGP や AT+QIACT は、QuectelのTCP/IP機能で使用するContextを設定・有効化するコマンドです。
厳密には標準ATコマンド側のPDP Contextと、Quectel独自のTCP/IP Contextは区別して考える必要があります。
ただし、今回のような接続確認の段階では、「LTE回線上でIP通信を行うための設定と有効化を行っている」と理解すると、全体の流れをつかみやすいと思います。
実運用で考えるべきこと
今回の確認では、ATコマンドを使ってインターネット接続までを確認しました。
しかし、実際のIoTシステムとして使う場合には、さらに以下のような点を考える必要があります。
- 起動時の自動接続処理
- 接続失敗時のリトライ
- 通信断からの復帰
- 電源の安定性
- 通信量
- MQTTの再接続
- 死活監視
- ログ取得
- 屋外設置時のケースやアンテナ配置
特に農業現場などで使う場合、1回通信できることだけでなく、長時間安定して動作することが重要になります。
そのため、今回の確認はあくまで「LTE通信が成立することの確認」であり、実運用に向けては、再接続処理や電源設計、ログ取得なども含めて検証していく必要があります。
結論
Raspberry Pi PicoとBG96をUARTで接続し、ATコマンドを使ってLTE通信の基本的な接続確認を行いました。
今回の確認により、以下の流れを把握できました。
- ATコマンドでBG96と通信する
- SIMカードの状態を確認する
- 電波強度とネットワーク登録状態を確認する
- APNを設定する
- TCP/IP Contextを有効化する
- IPアドレスを取得する
- Pingでインターネット疎通を確認する
これにより、TinyGSMなどのライブラリを使う前に、LTE接続に必要な確認手順を段階的に理解しやすくなりました。
また、ATコマンドで1つずつ確認しておくことで、今後ライブラリを使った実装で接続に失敗した場合にも、SIM認識、電波状態、ネットワーク登録、APN設定、IPアドレス取得のどこで問題が起きているのかを切り分けやすくなります。
次回は、TinyGSMを使ってBG96を制御し、MQTT Brokerへ接続してデータ送信を行います。