Sigfox とは?
IoT 用途の LPWA(Low Power Wide Area network)の一つで、とにかく通信料金が安く、多数の IoT 機器に使用しても運用可能コストで使用できます。
詳しくは、Sigfox の 日本でのオペレーターを務められている KCCS 様の Web サイトをご覧ください。
本記事の特徴
Sigfox 通信のサンプルプログラムをググってもらうと、Arduino Uno に Sigfox Shield を接続したサンプルがたくさん出てきます。
下記リンクは、KCCS 様の Web サイトで、筆者の日比さんは、Qiita にも Sigfox 関連記事を多数投稿されています。
KCCS Sigfox メッセージ送信方法 - Sigfox Shield for Arduino
この記事は、非常に素晴らしいサンプルで、Arduino にセンサーを付けて Sigfox 経由で IoT データをクラウドに上げたいというご要望であれば、これだけで十分な参考資料です。
本記事は、Arduino ではなく、もう少しリッチなシステムでも Sigfox を試してみたいという方向けの資料となっており、
- Raspberry Pi
- Python
でのSigfox 通信のサンプル記事となっております。
今回の機材・構成・環境
マイコンボード
Raspberry Pi をマイコンボードと呼んでよいかは甚だ疑問ですが、ベースとなるコントローラーは、Raspberry Pi 4 です。(以降 RPi4)
詳細には、Raspberry Pi 4 Model B 8GB RAM です。
Raspberry Pi 自体は、Qiita でも多くの人が紹介されているので、本稿での説明は割愛いたします。
Sigfox モジュール
Sigfox モジュールは、Sigfox Breakout board BRKWS01 RC3 を使用します。
こちらは、スイッチサイエンスの Web サイトから購入可能で、執筆時点(2021/06/15)では、5,194円/pcs となっています。
Sigfox Breakout board BRKWS01 RC3
実際に Sigfox を使用して IoT システムを運用する場合、日本では KCCS と回線契約を結ぶ必要がありますが、本製品は "Development Kit" という位置づけで、Activation から1年間無料で通信できる「無償回線付き」となっていますので、購入して手に入れたら即日実験開始できます。
こちらも、KCCS - 日比さんが、紹介記事を掲載されております。
Sigfox Breakout Board (BRKWS01)の利用方法
RPi4 と Sigfox モジュールの通信
RPi4 と Sigfox は、UART を使用したシリアル通信で制御を行います。
RPi4 側からシリアル通信で制御コマンドを送ることで、Sigfox モジュールに LPWAの通信を行わせたり、モジュールのHWの設定を変更したりします。
RPi4 の UART
RPi4 では以下の UART が使用できます。
- UART1 Tx(GPIO14) Rx(GPIO15)
- UART2 Tx(GPIO0) Rx(GPIO1)
- UART3 Rx(GPIO5)
- UART4 Tx(GPIO8) Rx(GPIO9)
- UART5 Tx(GPIO12) Rx(GPIO13)
これは、RPi4 より前の型(Raspberry Pi3 とか)では異なるようなので、使用する Raspberry Pi の型に沿って適宜読み替えてください。
今回は、UART4 を使用します。
そのための設定として、/boot/config.txt を以下のように変更してリブートします。
[pi4]
# Enable DRM VC4 V3D driver on top of the dispmanx display stack
dtoverlay=vc4-fkms-v3d
max_framebuffers=2
dtoverlay=uart4,ctsrts
Sigfox モジュールとRPi4 の接続
UART4 は、Tx(GPIO8) Rx(GPIO9) にアサインされています。
この二つおよび 3V3 power/Ground と、Sigfox モジュール側の 3.3v power, Ground を接続します。
Sigfox モジュールとのシリアル通信
import serial
port = '/dev/ttyAMA1'
s = serial.Serial(port, 9600, timeout=10)
# Device ID を取得する AT コマンドを送付
s.write(b'AT$I=10\r');
# Sigfox Module からのレスポンスを読み込む
resp = s.readline()
print('Device ID : {}'.format(resp))
RPi4 から 'AT$I=10' というコマンドを Sigfox モジュールへシリアル送信すると、その Sigfox モジュールの Sigfox ID が返されます。
Device ID : b'007XXXX6\r\n'
この時点では、RPi4 と Sigfox モジュール間だけの 通信で、Sigfox 通信網を使った通信は発生しません。
ここで、レスポンスとして、Sigfox ID が取得できるのであれば、RPi4 と Sigfox モジュール間の接続は確立できていることが確認できます。
ちなみに、この Sigfox モジュールは、購入後自力ではんだ付けが必要になります。
私のはんだ付けスキル不足により、最初に接続したときは Sigfox モジュールからの応答がありませんでしたが、再度、はんだを溶かしたりして接触を浴したり(その辺もよくわかってないですが)した結果、正常に動作するようになりました。
Sigfox 通信の実行
接続済の Sigfox モジュール から実際にデータを送信するためには、そのモジュールのアクティベーションの作業が必要となります。
こちらは、先ほどの KCCS - 日比さんの記事にも説明がありますので、そちらを参考に Activation してください。
[Sigfox Devkit(開発キット)を1年間の無償回線で利用する] (https://www.kccs-iot.jp/20181119-technical/ "Sigfox Activation")
デバイスが Activation されると、Sigfox Backend の方にこんな形で現れます。
Device Type と Device Name は自動で付与されますので、後で自由に変更してください。
この状態で、RPi4 から メッセージ送信の AT コマンドを Sigfox モジュールに送信してみます。
import serial
port = '/dev/ttyAMA1'
s = serial.Serial(port, 9600, timeout=10)
# 送信するメッセージを指定(12byte(注))
message = '0123456789abcdef01234567'
# AT コマンドにコンバート
at_command = 'AT$SF={0}\r'.format(message)
# AT コマンドを Sigfox モジュールへ送信
s.write(at_command.encode())
# Sigfox モジュールから Sigfox ネットワークにデータを送信完了するまで待つ
while True:
resp = s.readline()
if resp != b'':
break
print('Response: {}'.format(resp))
(注) Sigfox で送信可能なデータ量は、12 Byte です。ですが、ATコマンドで送るデータは、数値を16進数で文字列に変換したデータなので、python 上は 24 Byte になります。
送信が完了すると
Response: b'OK\r\n'
というメッセージが返ってきます。
Sigfox Backend で、このデバイスの受信メッセージを見ると Sigfox Cloud 上でメッセージが受信できていることが確認できます。