このPDFは，CQ出版社発売の書籍「エレキジャックIoT No.4」の一部見本です．
内容・購入方法については，下記のWebサイトをご覧ください．
内容：https://shop.cqpub.co.jp/hanbai/books/MTR/MTRZ202012.html

見本Python プログラム 5

ラーをDンサADPA

1a

1 の example15_iot_temp.py を起動すると，ラズベリー・パイ内蔵の温度センサの値を LAN 内へUDP で送信します．Python プログラム で紹介する
受信プログラムで温度を表示できます．
2 台のラズベリー・パイで通信するプログラムですが，1 台のラズベリー・パイで，送信プログラムと受信プログラムを別々の LXTerminal で実行して実 することができます．プログラムの停止は［Ctrl］＋［C］です．
以下に，送信側となる
1 の example15_iot_temp.py のおもな処理の流れについて説明します．
変数 interval に送信間隔（秒）を代入します．
変 数 temp_offset に CPU の内部発熱による温度上昇値を代入します．例えば，室温が 20 ℃で，内部発熱が 17.8 度だった場合，温度センサは 37.8 ℃を示します．内部発熱の 17.8 度を減算することで，室温の目安値を得ることができます．
1サンプルププ
5値aプ

 蔵温度センサから温度値を取得するための処理
内部です．
変数 temp_f に代入された 動小数点数型の温度値を整数型に変換します．整数に変換する関数としては，他にも小数点以下を切り てる int があります．測定値を丸めるときは round を使用することで，0.5 よりも大きな値が切り上げられます．ただし，ちょうど 0.5 のときは，結果が 数になるように丸めます（四入と比べ，丸め処理による差を減らすことができるため）．
「temp._3, 温度値」の書式で，UDP のブロードキャスト送信を行います．複数の IoT 温度センサを設置するときは，temp._3 の末 の数字を書き換えることで，受信側でセンサを特定することができます．
変数 interval の秒数の間，sleep 命令で待ち時間処理を行い，送信を待機します．
プログラム実行のようすを 1 1 に示します，

1# Example 15 ラズベリー・パイを使った IoT 温度計
filename = '/sys/class/thermal/thermal_zone0/temp'
udp_to = '255.255.255.255'
udp_port = 1024
device_s = 'temp._3'
interval = 30
temp_offset = 17.8

# 温度ファイル
# UDP ブロードキャスト# UDP ポート番号# デバイス識別名# 送信間隔（秒）# CPU の温度上昇値 ( 要調整 )import socket
from time import sleep# ソケット通信ライブラリ# スリープ実行モジュール

while True:try:
fp = open(filename)except Exception as e:
print(e)sleep(60)continue# 例外処理の監視を開始# 温度ファイルを開く# 例外処理発生時# エラー内容を表示# 60 秒間の停止# while に戻る# 温度値 temp の取得# 整数に変換して temp_i へ# ファイルを閉じる# 温度値を表示する

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# ソケット作成
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1) # ソケット設定
udp_s = device_s + ', ' + str(temp_i)# 表示用の文字列変数 udp
print('send :', udp_s)# 受信データを出力
udp_bytes = (udp_s + '¥n').encode()# バイト列に変換
try:
# 作成部
sock.sendto(udp_bytes,(udp_to,udp_port))# UDP ブロードキャスト送信
except Exception as e:# 例外処理発生時
print(e)# エラー内容を表示
sock.close()# ソケットの切断
sleep(interval)# 送信間隔の待ち時間処理

14

DP
DPt t

#!/usr/bin/env python3

temp_f = float(fp.read()) / 1000 - temp_offset
temp_i = round(temp_f)
fp.close()print('Temperature =',temp_i,'('+str(temp_f)+')')

値をン（IoT 温度計・子機・送信側プログラムの実行）
pi@raspberrypi:~ $ cd ~/iot/learning
pi@raspberrypi:~/iot/learning $./example15_iot_temp.py
Temperature = 30 (29.974)
send : temp._3, 30
Temperature = 29 (29.435999999999996)
send : temp._3, 29
Temperature = 30 (29.974)
send : temp._3, 30
Temperature = 31 (30.511999999999997)
send : temp._3, 31（親機・受信側プログラムの実行）
pi@raspberrypi:~ $ cd ~/iot/learning
pi@raspberrypi:~/iot/learning $./example16_udp_logger.py
Listening UDP port 1024 ...
2019/06/01 16:45, temp._3, 30
2019/06/01 16:46, temp._3, 29
2019/06/01 16:46, temp._3, 302019/06/01 16:47, temp._3, 31

11

サンプル プ

1

各プログラムを実行した状態でタクト・スイッチを操作すると，Ping または Pong のメッセージの送受信が行える見本

P thon で /O

特プログラミング

Python プログラム 6

ラーDの ーA

値を1DPDPン

表示Aプ
プ

aa

5t tt tDP

値

Python プログラム から送ったデータなどをネットワーク経由で受信して LXTerminal 上に表示します．
1 の example16_udp_logger.py がプログラムです．LAN 内の温度値やボタン押下通知などの UDPデータを受信し表示します．
プログラムを起動すると，送信された UDP データを受信し， 1 11 のように受信日時とともに表示します．プログラムを停止するには，LXTerminal 上で，［Ctrl］＋［C］の操作を行います．
以下に，1 のプログラム example16_udp_logger.py のおもな処理にを説明します．
受 信日時を表示するために，日時を扱うライブラ
リ datetime を組み込みます．
ライブラリ socket から通信ソケット用の変数（オブジェクト）sock を生成します．
生 成 し た ソ ケ ッ ト sock に，UDP ポ ー ト 1024 を1プ

DMaプ

ター

ルabind 命令で接続します．引き数はタプル型の接続先のアドレスとポート番号です．ここでは，アドレスを指定せずに，すべてのアドレスを対象にしpi@raspberrypi:~ $ cd ~/iot/learning
pi@raspberrypi:~/iot/learning $./example16_udp_logger.py
Listening UDP port 1024 ...
2019/06/01 17:24, temp._3, 30
2019/06/01 17:24, Pingタン
2019/06/01 17:24, Pong
2019/06/01 17:25, temp._3, 29
2019/06/01 17:26, temp._3, 30
2019/06/01 17:26, Ping
2019/06/01 17:26, Pong

1 11

サンプルプ

1

プログラムを実行した状態で，IoT ボタンや，IoT 温度センサからの UDP データを受信すると，受信時刻とともに表示出力する

1#!/usr/bin/env python3# UDP を受信する
import socket
import datetime
print('Listening UDP port', 1024, '...', flush=True)# ポート番号 1024 表示
try:sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# ソケットを作成
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# オプション
sock.bind(('', 1024))# ソケットに接続
except Exception as e:# 例外処理発生時
print(e)# エラー内容を表示
exit()# プログラムの終了
while sock:# 永遠に繰り返す
udp = sock.recv(64)# UDP パケットを取得
udp = udp.decode()# 文字列へ変換する
udp = udp.strip()# 先頭末尾の改行削除
if udp.isprintable():# 全文字が表示可能
date=datetime.datetime.today()# 日付を取得
print(date.strftime('%Y/%m/%d %H:%M'), end='') # 日付を出力
print(', ' + udp, flush=True)# 受信データを出力

No.4

見本
15

P thon で /O

特送信機の準備 3

Sン

ーSン

ドト

SensorShield-EVK-003（ ローム）は，8 つのセンサ・モジュールと Arduino 用シールド基板（部品実装済み）が付属するセンサ評価用キットです．センサ・モジュールは個別に仕切られた小さなケースに収納されており，まるで私たちが れ親しんだ日本の 当のように，いろいろなセンサを試用（味見）することができます（3 3）．
ここでは，5 つのセンサ・モジュールを取り付けたセ33
ンサル
3ル（左・基板）
ル（右・小型ケース）

電源回路などが実装された Arduino 用シールド基板と 8 個のセンサ・モジュールのキット．センサ・モジュールは，個別に仕切られた小さなケースに収納されている

3ンサル

（左）

ンサ・シールド基板を，Wi-Fi と Bluetooth内蔵 ESP32マイコンを搭載した IoT Express（CQ 出版社）に取り付け，スマートフォンやラズベリー・パイでセンサ値を表示する方法について紹介します
（3 ）．
ンサ
ル
センサ・シールド・キットに付属するセンサ・モジ
ュールの中から，加速度センサ KX224-1053，気圧センサ BM1383AGLV，地磁気センサ BM1422AGMV，近接センサ RPR-0521RS，カラー・センサ BH1749NUCの 5 個を選び，3 のように取り付けました．こ

3ンサ

（右）

プログラミング

ンサル

ンサ

ル

I2C インターフェース搭載センサ・モジュールは，センサ・シー
ルド基板上の端子 J5，J6，J7，J9，J10 のどこに接続してもかまわないが，GPIO 接続用の J11 と，アナログセンサ用の J8 とJ12 は空けておく見本

Arduino 用シールドに対応した I/O 端子を使って，センサ・シールド基板（左）と IoT Express（右）を接続することができる

No.4

43

特ittemperature 命令を使用します．取得した数値をン

今度は，温度センサ送信機のプログラムを制作します．のように，micro:bit 内蔵の温度センサから値を読み取り，約 5 秒ごとにワイヤレスで送信します．
送信された温度値は，前節の簡単ワイヤレス通信実を行う Python プログラムで受信します．
3 に示すワイヤレス温度センサのプログラム example03_temp.py の温度センサの処理内容を以下に示します．
構文 while を使って，以下の処理 〜 を繰り返し実行します．

atプログラミング

内 蔵 温 度 セ ン サ か ら 温 度 値 を 取 得 す る に は，MicroPython プログラム 3ic o

P thon で /O

astr 命令で文字列に変換し，変数 tx に代入します．
ワ イヤレス送信を行う radio.send 命令を使って変数 tx の内容を送信します．
待ち時間処理を行う命令 sleep を使って 5 秒間待機します．
他にも，明るさが変化したときに照度値を送信するプログラム example03_illum.py や，本体が傾いたときに 力加速度を送信するプログラム example03_accem.py も同じフォルダに収録しました．各プログ
ラムの機能は p.60 の1 を参照してください．

t3
3

プ

本体の 5 × 5 LED 表示画面に［Temp］を表示後，5 秒ごとに温度値を送信する

値
内蔵5ン

ンサ

送信側の内蔵温度センサから取得した温度値を送信し，受信側で表示する

コラム 2

ic o

it 用t omicro:bit 用 Python エディタの機能アイコンは，バージョンによって表示が異なります．
バージョン 1.1（図 A）では，左から順に Download，Save，Load と続き，大小合わせて 7 個のアイコンでしたが，バージョン 2.0（図 B）では，Download，Connect，Load/Save，Open Serial の 9 個 に な りました．
micro:bit にプログラムを書き込むには，本稿で説明した使い方に加え，あらかじめ Connect アイコンで micro:bit に接続しておけば，Download アイコンが Flash ボタンに変わり，Flash ボタンの押下で直接プログラムを micro:bit に書き込むことができます．
バージョン 2.0 では，Open Serial のアイコンでシリアル通信用ターミナル・ソフトが開きます．の ーン1 1ン2No.4ンの見本
57

特■
4CSTM

マ-コン

D

ル
Arduino 用シールドと同じピン配列の拡張端子が搭載されているので，Arduino 用 LCD Keypad Shield（DF ROBOT 製，SainSmart 製など）を取り付けることができる

度センサなどから UDP データを受信すると，LCD の 1行目に送信元 IP アドレスが，2 行目に受信データが表示されます．LCD なしの udp_logger.py の場合は，動作ログとして受信データをシリアル出力します．serial_logger.py などでシリアル・データを確認できます．
以 下に，3 の udp_logger_lcd.py のおもにLCD 表示部の処理内容について説明します．
LCD 制御用ドライバ（ライブラリ）lcd.py 内の HD
44780 を組み込みます．
処 理 で組み込んだ HD44780 の変数（オブジェクト）
lcd を生成します．
処理 で生成した変数 lcd 内で使用される配列変数
PINS に，LCD のピン割り当て番号を代入します．
LCD を初期化する命令 init を実行します．
表 示位置を指定する命令 set_line を使い，1 行目の位置 0 を指定します．2 行目の場合は，1 です．
LCD へ文字列を表示する命令 set_string を使って，「UDPLoggerLCD」を表示します．

PPtt tt

プログラミング

作する

これまでに製作した STM32 マイコン版 IoT ボタンが送信するボタン操作情報や，IoT 温度センサが送信する温度値を受信し，Arduino 用 LCD シールドに表示する「UDP モニタ」を，STM32 マイコン開発ボード
NUCLEO-F767ZI で製作します（）．
ラズベリー・パイ用の udp_logger.pyを基に，STM32マイコン版 udp_logger.py（LCD 不要）と，LCD 表示機能を追加した3 の udp_logger_lcd.py（要 LCDシールド）を作成しました（）．
STM32 マイコン開発ボード NUCLEO-F767ZI にはArduino 用シールドと同じピン配列の拡張端子が搭載されているので，Arduino 用 LCDKeypadShield（DFROBOT 製，SainSmart 製など）を取り付けることができます．LCD Keypad Shield の動作電圧は 5V で，開発ボードの信号レベルは 3.3V のため，本来は信号レベル変換が必要ですが，実力的には装着するだけで使用できます．
LCD 制御用ドライバ lcd.py は，MicroPython のファームウェアを書き込む install.sh を実行したときに，ラズベリー・パイ内にダウンロードされています．のようにコピー・コマンドを使い，ファイル名を変更せずに，STM32 マイコンへ書き込み，続けてサンプル・プログラム udp_logger_lcd.py を書き込みます．両方のファイルの書き込みが完了（緑色の LED が消えてから 5 秒以上）してから，黒色の RESET ボタンを押してください．
製作した UDP モニタを起動後，IoT ボタンや IoT 温ン

P thon で /Oタンンサc

32

ン

見本

製作した STM32 マイコン版 IoT ボタンと IoT 温度センサが送信するボタン操作情報や温度値を受信して LCD に表示する

No.4

67

特別企画

Bluetooth Low Energy でn 対 n 無線通信ネットワークを構築

BLEメッシュ・ネットワークのすべて
使用機材

樋口 光彦
（ルネサス エレクトロニクス）

Bluetooth 5.0 評価ボード Target Board for RX23W（ルネサス）2 枚Android スマートフォン

低消費電力の Bluetooth Low Energy（LE）を使って，n 対 n の無線通信ネットワークを構築
できる Bluetooth Mesh Networking を解説します．
Bluetooth Mesh Networking の仕様，基本概念，動作の概要を見たあと，組み込み向けマイコンを使用して，Bluetooth Mesh 通信の評価手順を解説します．の照明制御があげられます（Bluetooth Mesh とは？

1）．

BluetoothMesh に対応した照明機器を各部屋に設置することで，スマートフォンのアプリケーシ
ョンから各照明の制御が実現できます．また照明

BluetoothMesh の想定するアプリケーションや制御のための無線パケットがスマートフォンから特徴について紹介します．

直接届かない場合でも，各照明機器が無線パケッ● Bluetooth Meshの想定するアプリケーショントをリレーすることで最終的にすべての照明機器まで到達できます．

BluetoothMesh はホーム・オートメーション，ビルディング・オートメーション，ファクトリ● Bluetooth Mesh の特徴

ー・オートメーションなどの分野で活用が期待さ

BluetoothLE の基本トポロジー（1 対 n のブローれています．例としてホーム・オートメーション

メ1

No.4

ン

シ・

メー

で

シ・ー

で見本
73

ン・ー・ンー・メ

シ・ー2メーーリリ● Bluetooth Mesh の基本動作ーリ

メッシュ・ネットワークに参加しているデバイー

スはーと呼ばれます．
リ

リ，ノード同士がやり取りする信号はメッシュ・ネットワーク内のあるノードがメッー

ー メーー

3

セージを送信すると，周囲のノードは次々とメッセージをリレーします．リレーが繰り返されることでメッセージがネットワーク全体に伝搬し，最ドキャスト，または 1 対 1 のポイント・ツー・ポ

終的にメッセージの宛て先ノードに到達しますイント）を組み合わせてメッシュ・ネットワーク（を構築します．

ることはなく，各ノードが移動した場合でもメッBluetoothMesh は，BluetoothLE を応用して n対 n デバイス間での無線通信を実現します（2）．

・n 対 n デバイス間での無線通信
・データを暗号化するセキュアな通信・スマートフォンとの親和性

3）．またメッセージのリレー経路が固定されセージはリレーされます．
さらに BluetoothMeshNetworking 仕様はプロキシ機能，フレンド機能などノードのオプション機能を定義しており，多様なメッシュ・ネットワークを形成できます．オプション機能の詳細は次節の「ノードのオプション機能」の項目で解説します．

BluetoothMesh の通信はネットワーク・キーと呼ばれる暗号鍵で暗号化されます．これによりネットワークに参加していないデバイスはネットワ

Bluetooth Mesh 仕様の基本概念と通信動作ークの通信を盗聴することができません．さらにネットワークに参加している限定されたデバイス

本節では BluetoothMesh 仕様の基本的な概念やでアプリケーション・キーと呼ばれる暗号鍵を共どのように n 対 n のデバイス間での通信を実現し有することでデバイス間でのセキュアな通信が可ているかについて解説します．

能です．
BluetoothLE に対応した PC やスマート・スピ● ノードを構成するエレメント，モデル，ステーカ，スマートフォンであれば，ネットワーク内ートのデバイスを制御するためのコントロール・パネ

メッシュ・ネットワークに参加しているデバイ

ルやリモート・コントローラとして活用すること

スは「ノード」と呼ばれ，ノードはエレメント，モもできます．

デル，ステートで構成されます（74見本）．

ESP32 マイコンで作る電圧計

M5Stack/M5StickC のA-Dコンバータ
応用プログラミング
使用機材
M5Stack BASIC / M5Stack GRAY / M5Stick C × 1
ミニ・ブレッドボード× 1 可変抵抗器（10k Ω）× 1
ジャンパ・ワイヤ（オス - オス）× 3

国野 亘

A-D コンバータはアナログ値をディジタル値に変換するデバイスです．マイコンでアナログ値が利用できるようになり，IoT プログラミングの応用範囲がグッと広がります．
液晶ディスプレイを搭載した ESP マイコンとして注目されている M5Stack に搭載されている A-Dコンバータを使った電圧計のプログラムを紹介します．プログラムは 3 本あり，ステップアップしながら機能を追加していきます．ぜひ A-D コンバータ応用プログラミングを実際に試してみてください．

〈サンプル1〉PC

M5Stack

シリアル・モニタで表示〈サンプル2〉
電圧値を表示M5Stack

電圧

内蔵A-Dコンバータ
で測定電圧〈サンプル3〉電圧M5Stack
電圧をメータ表示
13

サンプル ププン

ン

1（左）

2ン

ン

プ

（右）

液晶ディスプレイに表示します．
液晶ディスプレイを搭載した ESP マイコンとして注目されている M5Stack と M5StickC には A-D〈サンプル 3〉は電圧値を液晶ディスプレイにアナログ・メータ風にして表示します．

コンバータが搭載されています．
本稿では，A-D コンバータの利用方法を学びながら液晶ディスプレイに電圧を表示する電圧計を作ります（1）．

〈サンプル1〉はA-Dコンバータで得た値とその値プログラミング前の準備● ハードウェアは，ESP マイコン内蔵 M5Stackから得た電圧値をシリアル・モニタに出力します．と M5Stcick C を使う〈サンプル 2〉は電圧値を M5Stack，M5StickC のM5Stack と M5StickC は，Wi-Fi 機能，ディスプ98見本

ラズパイ互換の拡張コネクタ /ラズパイ・カメラや HDMI が使える Mbed ボード

がじぇっとるねさす
GR-MANGO をサンプル・プログラムで使ってみる
岡宮 由樹（ルネサス エレクトロニクス）
使用機材

マイコン・ボード GR-MANGO

ピンク色の基板が特徴的な「がじぇっとるねさす」ブランドから，マイコン・ボード GRMANGO が発売されました．
マイコン・ボード GR-MANGO の特長とサンプル・プログラムを動かして GR-MANGO の動作概要を簡単に紹介します．

● ラズベリー・パイとレイアウト互換
ラズベリー・パイ 4 の形状，拡張コネクタのピン・レイアウトに互換性があり（1），ラズベリー・パイ用のケースや，PoEHAT などの拡張基板をそのまま装着できます．
マイコン・ボード GR-MANGO の OS は Linux 系
ではなく，MbedOS を使用します．CMSIS による GPIO 制御によって，センサやモジュールが使用できるほか，A-D コンバータによってアナログ信号を扱うこともできます（1）．

● 画像処理が得意な Mbed ボード
プログラム開発は，Arm 社が提供する Mbed 環
境で行います．
一般的な Mbed ボードは Cortex-M，動作周波数は 100MHz 程度が多いなか，GR-MANGO の CPU

1（上）

（下）

は Cortex-A9 コアで動作周波数が 528MHz の RZ/
A2M（ルネサスエレクトロニクス）を使った Mbedボードに仕上がっています（1）．

ラ（MIPICSI-2）による画像入力，MicroHDMI による画像と音声の出力が可能です．その他に USB

● GR-MANGO の I/O
比較的安く入手できるラズベリー・パイ・カメ

112TypeA，USBTypeC，MicroSD，オーディオ・見本

ジャック（4 極 ），Ethernet，CAN，Grove コ ネ ク

クラウド・サービス ThingSpeakとメッセージ・アプリSlack を活用する

obniz を用いた温度測定 / 通知システム

使用機材
Obniz Board（マイコン・ボード）
MCP9701（温度センサ）

吉澤 巧，松本 佳宣（慶應義塾大学大学院 理工学研究科）

マイコン・ボード obniz を IoT システムに応用してみました．obniz の特徴は，Wi-Fi 経由の双方向通信が可能でディジタル端子に電流を多めに流せる点です．
obniz で温度を測定し（MCP9701），測定した温度をクラウド・サービス ThingSpeak にアップロードすることにより，遠隔地でも容易に測定値を確認することができます．さらに，温度が設定値を超えたときに，メッセージ・アプリ Slack でユーザに通知するシステムを試作しました．
● obniz を IoT に応用

ュエータなどもネットワーク経由で制御できます．

近年，IoT（InternetofThings）と呼ばれる，さまた，クラウド上のシステムを利用して obniz

まざまなモノをインターネットに接続する技術がBoard にプログラムを書き込むため，開発後のア盛んに応用されています．

ップデートは簡単に行うことができます．

センサ技術や通信技術の発展により，IoT の対obniz は公式デバイスの購入，もしくは既存の象となっているものは身の回りに広がっており，マイコンに obnizOS をインストールすることでパソコンやスマートフォンといった通信端末だけobinzCloud を使用することができます．今回は公でなく，工場における状態監視センサや医療現場式デバイスの obnizBoard を使用して開発を行いにおけるウェアラブル・センサなど，さまざまなます．補足をすると，obnizOS は 1 ユーザあたり場所で活躍するようになりました．

1 台まで無料で使用することができます（以降今回の試作したシステムは，スマートフォンかobnizBoard を obniz と表記）．

らマイコンを制御してセンサの測定と Slack でユーザに通知ができることです．これまでスマートフォンからマイコンを制御することは，比較的手● obniz のセットアップ
obniz を電源に接続すると，1 のようになり間のかかるものでした．しかし，obnizBoard はそます．obniz が起動したら接続したい Wi-Fi の SSID

れを容易に実現できるマイコン・ボードです．

を選択して，パスワードを入力指定します．ディ
スプレイに QR コードと 8 桁の番号が表示されたら● マイコン・ボード obniz

接続完了です．なお，最新 OS の場合は画面が異obnizBoard とは，obnizCloud 上のライブラリの仕組みを使い，測定や制御ができます．アクチ

No.4

プ

なる可能性がありますが，SIMPLEMETHOD を見本選択すると同様の手順になります．

ン

121