トップページ > 製品案内 > PiOnAir : LTE-M for Raspberry Pi

製品案内 - PiOnAir : LTE-M for Raspberry Pi

最新のIoT向けLTEサービス (LTE-M: Category M1, NB-IoT)に対応した Raspberry Piの拡張ボードです。日本国内で使えます。
2020年10月 販売開始!
 

(*) 本体価格: 14,800円(税別)。アンテナは別売り(2,980円)です。
  また、SIMカードはご自身でご用意ください。

特徴

SIMCOM社の最新LTE-MモジュールSIM7000JCを搭載し、SORACOM社さくらインターネット社などのnanoサイズのSIMカードを用いることで、Raspberry Piをインターネットに接続することができます。

GPIO制御によるハードウェア・リセットや電源のON/OFFが可能なため、長期安定稼働を目指す方にお勧めです。

多くのRaspberry Piケース内に収めることが可能です。

動作確認済みRaspberry Pi:
 Raspberry Pi 3 (Model B+)
 Raspberry Pi 4
 Raspberry Pi Zero WH

SIM7000の詳細はこちら
SIM7000 ATコマンド データシート

組み立て例

I. 使用準備編

1. シリアルの有効化

最初にRaspberry Piに対して下記設定を行い、シリアルコンソールをソフトウェアから操作できるようにします。

pi$ sudo raspi-config


を実行すると、設定メニューが現れます。「5 Interfacing Options」を選択し、さらに「 P6 Serial 」を選択します。「Would you like a login shell to be accessible over serial?」と問われるのでYesを選択し、Finishします。

その後、再起動します。

pi$ sudo reboot


再起動後 /dev/serial0 のデバイスが作成されます。
確認方法
pi$ ls /dev/serial*
/dev/serial0  /dev/serial1

次に、/boot/cmdline.txt から 「console=serial0,115200」 を削除します。

編集後の/boot/cmdline.txtの例
pi$ cat /boot/cmdline.txt
console=tty1 root=PARTUUID=a426a53f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

再び再起動します。
pi$ sudo reboot

2. PPPのインストール

下記を実行して、pppconfig をインストールしてください。
pi$ sudo apt-get install pppconfig

3. PPPの設定

以下では、SORACOM社のKDDI SIM plan-K を使った場合の設定例を示します。

まず、pionair-soracomという接続名でpppconfigを呼び出します。

pi $ sudo pppconfig pionair-soracom


3.1. 最初に、Createを選びます


3.2. DNS設定では、Dynamicとします


3.3. 認証方法は PAPとします。


3.4. ユーザ名とパスワードはsoraとします。



3.5. 速度は115200とします。


3.6. Toneを選びます。


3.7. ダイヤル先の電話番号は *99# を指定します。


3.8. モデムの設定方法は「いいえ」(=自分で設定)を選びます


3.9. /dev/ttyS0 と入力します。ttyS0 は 上記のserial0の実体となります。


3.10. 内容を確認したら「Finished - ファイルを書き出して…」を選びます


3.11. 完了画面です


3.12. Quit してコンソールに戻ります


上記により、
/etc/chatscripts/pionair-soracom
/etc/ppp/peers/pionair-soracom

の二つのファイルが作られます。

3.13. チャットスクリプトの編集

pi $ sudo nano /etc/chatscripts/pionair-soracom 
などの方法で、チャットスクリプトを編集します。
具体的には、# modeminit の部分を、書き換えます。
最終的に以下のようになれば正解です。
# This chatfile was generated by pppconfig 2.3.18.
# Please do not delete any of the comments.  Pppconfig needs them.
#
# ispauth PAP
# abortstring
ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
# modeminit
'' ATH
OK AT+CFUN=1
OK ATZ
OK ATE1
OK AT+CGDCONT=1,"IP","soracom.io"
# ispnumber
OK-AT-OK "ATDT*99#"
# ispconnect
CONNECT \d\c
# prelogin

# ispname
# isppassword
# postlogin

# end of pppconfig stuff


(*) /etc/ppp/peers/pionair-soracomについては修正の必要はありません。 以下のようになっていれば大丈夫です。

pi $ sudo cat /etc/ppp/peers/pionair-soracom
# This optionfile was generated by pppconfig 2.3.18.
#
#
hide-password
noauth
connect "/usr/sbin/chat -v -f /etc/chatscripts/pionair-soracom"
debug
/dev/ttyS0
115200
defaultroute
noipdefault
user "sora"
remotename pionair-soracom
ipparam pionair-soracom

usepeerdns


以上で、準備完了です。

II. インターネット接続編

1. モジュールの電源をONにする

まず、sim7000_onoff.pyというファイルを作ります。

 $ nano sim7000_onoff.py

その中身は、以下のようにします。

import RPi.GPIO as GPIO
import serial
import time

# SIM7000JC Interface Configuration
s=serial.Serial(
        port='/dev/serial0',\
        baudrate=115200,\
        parity=serial.PARITY_NONE,\
        stopbits=serial.STOPBITS_ONE,\
        bytesize=serial.EIGHTBITS,\
        timeout=5);

# GPIO Configuration
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

# GPIO17 -- SIM7000 CTS Port
GPIO.setup(17,GPIO.IN)

# GPIO18 -- SIM7000 RTS Port
GPIO.setup(18,GPIO.OUT)
GPIO.output(18,GPIO.LOW)

# GPIO22 -- SIM7000 Power ON/OFF Trigger Port
GPIO.setup(22,GPIO.OUT)
GPIO.output(22,GPIO.LOW)

# GPIO27 -- SIM7000 Hardware Reset Signal Port
GPIO.setup(27,GPIO.OUT)
GPIO.setup(27,GPIO.LOW)

# Power ON the module
#  active duration should be more than 1 second.
GPIO.output(22,GPIO.HIGH)
time.sleep(1.5)
GPIO.output(22,GPIO.LOW)

# Wait for booting (more than 4.5 second)
time.sleep(5)

# Read messages from SIM7000
for line in s.readlines() :
  print (line)

# Check response, expecting OK by AT command.
s.write('AT\r\n')
time.sleep(1)
print (s.readline())

# Read messages from SIM7000
for line in s.readlines() :
  print (line)

ファイルを作成できたら、

$ python sim7000_onoff.py 
を実行してください。

20秒間くらいの間に以下のようなメッセージが出れば起動に成功したことを意味します。
.

RDY



+CFUN: 1



+CPIN: READY



SMS Ready

AT

OK


もし、

NORMAL POWER DOWN

とのメッセージが出た場合には、モジュールの電源が落ちたことを意味するので、
再度 sim7000_onoff.pyを実行して、起動させてください。

2. pppd を起動する

pppdを使って、pionair-soracom 接続を呼び出します。
ここではログを/tmp/ppp.logに書き出すことにします(長期運用ではログを定期的に削除するなどしてください)。

$ sudo pppd call pionair-soracom debug logfile /tmp/ppp.log


1分くらい待つとログが/tmp/ppp.logに書き出されます。

$ cat /tmp/ppp.log
Script /usr/sbin/chat -v -f /etc/chatscripts/pionair-soracom finished (pid 679), status = 0x                                                                                                    0
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyS0
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x55528fb5> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0xd0780516> <pcomp> <accomp>]
sent [LCP ConfNak id=0x0 <auth pap>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x55528fb5> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth pap> <magic 0xd0780516> <pcomp> <accomp>]
sent [LCP ConfAck id=0x1 <asyncmap 0x0> <auth pap> <magic 0xd0780516> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0x55528fb5]
sent [PAP AuthReq id=0x1 user="sora" password=<hidden>]
rcvd [LCP DiscReq id=0x2 magic=0xd0780516]
rcvd [LCP EchoRep id=0x0 magic=0xd0780516 55 52 8f b5]
rcvd [PAP AuthAck id=0x1 ""]
PAP authentication succeeded
sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.                                                                                                    0.0>]
rcvd [LCP ProtRej id=0x3 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 <addr 0.0.0.0>]
rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfNak id=0x2 <addr 10.215.179.23> <ms-dns1 100.127.0.53> <ms-dns2 100.127.1.53>                                                                                                    ]
sent [IPCP ConfReq id=0x3 <addr 10.215.179.23> <ms-dns1 100.127.0.53> <ms-dns2 100.127.1.53>                                                                                                    ]
rcvd [IPCP ConfAck id=0x3 <addr 10.215.179.23> <ms-dns1 100.127.0.53> <ms-dns2 100.127.1.53>                                                                                                    ]
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing default route to eth0 [192.168.1.1]
local  IP address 10.215.179.23
remote IP address 10.64.64.64
primary   DNS address 100.127.0.53
secondary DNS address 100.127.1.53
Script /etc/ppp/ip-up started (pid 697)
Script /etc/ppp/ip-up finished (pid 697), status = 0x0
このようなログが出たら、接続できたことを確認します。

3. ppp0 インタフェースの確認

ifconfigコマンド等を使って、ppp0 インタフェースが作成されたことを確認します。
$ ifconfig

eth0, lo, wlanなどのインタフェースも見えると思いますが、

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.215.179.23  netmask 255.255.255.255  destination 10.64.64.64
        ppp  txqueuelen 3  (Point-to-Pointプロトコル)
        RX packets 5  bytes 62 (62.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 101 (101.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

のように ppp0 のインタフェースが作られていれば成功です。

4. 疎通性の確認

pingコマンドを使って、ppp0からインターネット上のホストと通信ができるかどうかを確認します。

デフォルト・ルートを変更していないので、ここでは -I オプションでppp0を指定してください。

DNS解決を行うため、最初の表示まで少し時間がかかりますが、

$ ping -I ppp0 www.futaba-kikaku.jp
PING www.futaba-kikaku.jp (157.7.107.146) from 10.215.179.23 ppp0: 56(84) bytes of data.
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=1 ttl=55 time=612 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=2 ttl=55 time=119 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=3 ttl=55 time=152 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=4 ttl=55 time=86.9 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=5 ttl=55 time=164 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=6 ttl=55 time=86.1 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=7 ttl=55 time=131 ms
64 bytes from 157-7-107-146.virt.lolipop.jp (157.7.107.146): icmp_seq=8 ttl=55 time=87.7 ms
^C
--- www.futaba-kikaku.jp ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 645ms
rtt min/avg/max/mdev = 86.099/179.749/612.131/165.814 ms


のように結果が得られれば成功です。

5. 切断方法

pppd プロセスを終了すると、インターネット接続が切断されます。
psコマンドを使ってpppdのプロセスIDを調べると、
pi $ ps auxwww | grep pppd
root      1431  0.0  0.2   6520  2364 ttyS0    Ss+  19:01   0:00 pppd call pionair-soracom debug logfile /tmp/ppp.log

のように表示が得られます。この場合は、1431がプロセスIDなので、
pi $ sudo kill 1431 

を実行すれば、終了します。その後、ログ(/tmp/ppp.log)を確認すると、

Terminating on signal 15
Connect time 5.4 minutes.
Sent 2436 bytes, received 2436 bytes.
Script /etc/ppp/ip-down started (pid 1588)
sent [LCP TermReq id=0x2 "User request"]
rcvd [LCP TermAck id=0x2]
Connection terminated.
Script /etc/ppp/ip-down finished (pid 1588), status = 0x0

といった内容が記録されていると思います。

(*)上記以外に、

pi $ sudo killall pppd

を実行する方法もあります。

(*) 最後に、sim7000_onoff.py を使って、モジュールの電源を落としてください。

6. デフォルト・ゲートウェイの変更

「2. pppd を起動する」が成功した段階では、eth0(LANポート)がインターネット接続のための
デフォルト・ゲートウェイとして設定されています。
(*) Raspberry Pi Zeroでは wlan0(WiFiポート)が設定されています。

ルーティングテーブルを確認するため、

pi $ sudo route -n

を実行してみると

pi $ sudo route -n
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.1.1     0.0.0.0         UG    202    0        0 eth0
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0

のように得られると思います。

この例では、受信先サイト0.0.0.0 (ネットマスク 0.0.0.0) は、192.168.1.1を経由すること、
またそのためにはeth0を使用すること、が記されています。

これを以下の二つのコマンドを実行することで変更します。
pi $ sudo route del -net 0.0.0.0/0 gw 192.168.1.1
pi $ sudo route add -net 0.0.0.0/0 gw 10.64.64.64

その結果、
pi $ sudo route -n
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         10.64.64.64     0.0.0.0         UG    0      0        0 ppp0
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0

のようになります。

これで、受信先サイト0.0.0.0 (ネットマスク 0.0.0.0) は、10.64.64.64を経由すること、
またそのためにはppp0を使用すること、となります。

この状態では、すべてのインターネット上のホストとの通信は、ppp0 を使用するようになります。例えば、
pi $ wget https://www.futaba-kikaku.jp/
--2020-10-21 10:40:24--  https://www.futaba-kikaku.jp/
www.futaba-kikaku.jp (www.futaba-kikaku.jp) をDNSに問いあわせています... 157.7.107.146
www.futaba-kikaku.jp (www.futaba-kikaku.jp)|157.7.107.146|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 4842 (4.7K) [text/html]
`index.html' に保存中

index.html                      100%[=======================================================>]   4.73K  3.72KB/s 時間 1.3s

2020-10-21 10:40:29 (3.72 KB/s) - `index.html' へ保存完了 [4842/4842]

は、ppp0を使用して行われます。

7. 付録

SIM7000は、ATコマンドによるTCP/UDPソケット通信も可能です。
興味のある方は参考にしてみてください。

HTTPサーバとの通信例:sim7000_sample_code1.py
NTPサーバとの通信例:sim7000_sample_code2.py