第1

PythonPythonI/O制御プログラミングの前に章

IoT のシステムはマイコンの I/O（入出力端子）にセンサやスイッチ，モータなどをつないだ複数の機器で構成されます．本章では，Python を用いて I/O を遠隔制御するシステムの機器構成について説明します．

1 IoT 向けインターネット時代に■インターネットは，1995 年に商用の運用が始まりました．当初，パソコンやワークステーションなどが接続され，2000 年に入ると，常時インターネット接続や，モバイル・インターネット接続といったサービスが登場し，携帯電話や PDA，テレビなどの情報機器がインターネットに接続されるようになりました．
限られた PC（パソコン）でインターネットが利用されていた時代から，スマートフォンなど１人１台の情報機器で利用されるようになり，非 PC での利用の割合が相対的に上回るようになりました．
IoT 元年と言われる 2017 年からは，情報機器に限らず，さまざまな機器がインターネットに接続されるよ

うになり，今後，さらに多くのモノがインターネットに接続されるようになりつつあります（図 1-1）．将来
的には，人によるインターネット利用よりも，モノによるインターネット利用のほうが上回ると予想されています．

■ IoT の機能が満載
2
ラズベリー・パイ
IoT のシステムに使うハードウェアには，少なくとも通信機能とマイコンなどによる演算機能が必要です．
汎用性や開発効率を考慮すると，IP（インターネット・プロトコル）に対応したネットワーク機能を内蔵し，Linux が動作するハードウェアが便利です．そこで，本書では，教育向けコンピュータとして登場したラズ

インターネット対応
テレビ

2017年

常時接続

2000年

パソコンや
ワークステーション
1995年

モバイル
接続

インターネットの
商用化
図 1-1

ⅠoT化

インターネットへ接続される機器の変化

ⅠoT対応家電

インターネット対応
携帯電話
PDA

スマート・
スピーカ

ⅠoTセンサ

当初は PC（パソコン）やワークステーションが接続されていたが，技術進歩とともにさまざまな機器が接続されるようになってきた8

章

ラズベリー・パイの使い方

1

2

第

2
本章では，Linux が動作するラズベリー・パイを IoT システムのサーバや IoT 機器として利用します．本章では，本書の解説で使用するラズベリー・パイの仕様や周辺機器について説明します．すでにラズベリー・パイ
を使いこなしている方も一読して仕様や周辺機器を確認してください．

3

1 ラズベリー・パイをはじめるのに必要なもの■①ラズベリー・パイ本体

45

表 2-1 に，おもなラズベリー・パイの仕様を示します．本体は，ラズベリー・パイ 3 以降の Model B シリ
ー ズ が 良 い で し ょ う． 廉 価 版 の ラ ズ ベ リ ー・ パ イ
Zero や Zero W は，消費電力が低いことや，サイズが小さいことが特長です．しかし，本体以外に準備しな
くてはならないものが多く，プロセッサの処理能力も開発用としては貧弱です．最初の開発はラズベリー・
パイ 3 以降の B シリーズで行い，2 台目以降の追加時にラズベリー・パイ Zero W 等を検討すれば良いでしょう．
なお，筆者はおもにラズベリー・パイ 3+ で開発および動作確認を行いました．サンプル・プログラムは，
ラズベリー・パイ 3，3+，4 で動作します．Pi カメラ
については，ラズベリー・パイ Zero W でも動作確認
済みです．

6
7
8

写真 2-1

IoT のシステムに必要な機能が満載のラズベリー・パイ 4 Model B（左）とラズベリー・パイ 3 Model B+（右）IoT サーバや IoT 機器を簡単に製作することができ，汎用的な IoT システムの実験が行える

9

表 2-1

ラズベリー・パイシリーズのおもな仕様比較
RAM

ラズベリー・パイ
4 Model B

2019 年
6月$35〜$75〇〇
Gigabit

64bit ARM
Cortex-A72

7,080

570mA 〜 3A
1GB〜
Micro
4 ports
OFF 時：22mA
8GB
2 ports［USB Type C］〇

ラズベリー・パイ
3 Model B+

2018 年
3月

$35

〇

〇
Gigabit

64bit ARM
Cortex-A53

3,200

1GB

4 ports

標準

420mA 〜 2.5A
OFF時：100mA〇

ラズベリー・パイ
3 Model B

2016 年
2月

$35

〇

〇
10/10064bit ARM
Cortex-A53

2,763

1GB

4 ports

標準

300mA 〜 2.5A
OFF 時：80mA△

ラズベリー・パイ
2 Model B

2015 年
2月

$35

×

〇
10/10

32bit ARM
Cortex-A7

1,710

1GB

4 ports

標準

250mA 〜 1.8A
OFF 時：70mA△

ラズベリー・パイ
Zero W2017 年
2月

$10

〇

×

32bit ARM
1176

1,250

512MB

Micro
1 portMini

130mA 〜 0.3A
OFF 時：40mA−

ラズベリー・パイ
Zero2015 年
11 月

$5

×

×

32bit ARM
1176

1,250

512MB

Micro
1 portMini

80mA 〜 0.2A
OFF 時：20mA

〇

USB

HDMI

消費電流※
（平均〜最大）※平均消費電流と OFF 時消費電流は筆者による実測値（接続機器なし・GUI なし）

17

12

Ethernet プロセッサ DMIPS

11

無線
LAN

モデル名

10

発売時期 発売価格

推奨

第3章

3

章

ラズベリー・パイでPython入門
ラズベリー・パイでPython入門

〜基礎編〜

1

第

ラズベリー・パイでPython入門〜基礎編〜
ラズベリー・パイでPython入門〜基礎編〜

2
Python のプログラムをラズベリー・パイ上で作成する方法について説明します．Python 言語は他の言語に比べて少ないルールでプログラムが書けます．また，1 つのプログラムを他用途のプログラムに簡単に応用することもできます．少ないルールを使いこなしてプログラムを作成するコツを解説します．

3

1 学習用プログラムをダウンロードする■5

pi@raspberrypi:~ $ cd
pi@raspberrypi:~ $ git clone

一般的に，プログラムを開発するには IDE（統合開7

git clone https://github.com/bokunimowakaru/iot ⏎pi@raspberrypi:~ $6

https://github.com/bokunimowakaru/iot

Cloning into 'iot'...
remote: Enumerating objects: xxxx, done.
remote: Counting objects:
100% (xxxx/xxxx), done.
remote: Compressing objects:
100% (xxxx/xxxx), done.
〜〜 詳細表示内容を省略 〜〜

cd ⏎

4

本書でおもに使用するハードウェアは，（前章でセットアップした）ラズベリー・パイです．IoT システ
ムなる機器を想定すると，Linux 上で学習／開発した
ほうが，活用範囲が広がるからです．ラズベリー・パ
イがない場合は，Microsoft Windows が動作する PCに Cygwin をインストールして学習／開発することもできます．
はじめに，ラズベリー・パイの LXTerminal 上で下記のコマンドを入力し，本書で解説する学習用プログ
ラムをダウンロードしてください（図 3-1）．なお，前章でダウンロード済みであれば再実行する必要はありません．

発環境）を使用します．まずは試しに，ラズベリー・
パイ上にあらかじめインストールされている Thonny
Python IDE を，Raspbian の［メニュー］→［プログラ
ミング］→［Thonny Python IDE］の順に選択して起動
してみてください．起動後，［Load］アイコンをクリックし，ダウンロードしたサンプル・プログラム iot/
learning/example01_print.py を選択して開きます．プ

図 3-1 LXTerminal から git clone コマンドを使い，サンプ
ル・プログラムを GitHub からダウンロードする

8
9

Run

10
11

実行結果

12

図 3-2

ラズベリー・パイで Thonny Python IDE を起動し，プログラムを実行したときのようすプログラムを作成する際に IDE（統合開発環境）を使用すると便利

25

第

4

章

ラズベリー・パイ用
ラズベリー・パイ用Pythonプログラム〜GPIO制御編〜
Pythonプログラム

この章ではラズベリー・パイでデータを送受信をする Python プログラムを解説します．Wi-Fi の UDP 通信
や TCP 通信を使ったスイッチ ON/OFF 情報の送信，温度値送信，リモート L チカ，チャイム制御，UDP 通信の受信，TCP 通信の受信方法について，サンプル・プログラムを使って解説します．次の章では，ESP マイコ
ンと組み合わせたシステムの Python プログラムを解説します．
プログラムの解説前に，ハードウェアの準備をします．ブレッドボードで「GPIO 実験ボード」を作り，ラズベ
リー・パイの GIPO 端子に接続します．
この章で解説するPythonプログラムは，このラズベリー・パイとGPIO 実験ボードの組み合わせで動作します．

ハードウェアの準備

ラズベリー・パイ用 GPIO 実験ボード
Python のプログラムで，ラズベリー・パイの I/O
ポートを制御するプログラムを解説します，プログラ
ム解説の前に，ラズベリー・パイの I/O ポートを制御しやすいように，ブレッドボードを使ってスイッチ，
圧電スピーカ，フルカラー LED を配線します，本書
で は， こ れ を「GPIO 実 験 ボ ー ド 」と 呼 び ま す（ 写 真
4-1），
ラズベリー・パイの GPIO（General-purpose input/
output; 汎用入出力）端子は，汎用的に利用可能なディジタル入出力端子です．この端子は 3.3V の CMOS ディジタル入出力仕様で入力時は 0V で Low，3.3V でHigh が 得 ら れ， 出 力 時 は Low で 約 0V，High で 約
3.3V を出力します．出力時の最大電流は 16mA です．
高効率タイプの LED であれば，電流を絞ることで直接接続して発光させることができます．複数の端子から出力するときは，出力の合計電流を 50mA 以内にし写真 4-1

ラズベリー・パイに接続した GPIO 実験ボード

ラズベリー・パイの GPIO 端子にフルカラー LED，圧電スピーカ，
タクト・スイッチを接続している

ます．
図 4-1 のラズベリー・パイの 40 本の端子には，17本の GPIO 端子と，I2C，UART，SPI 専用インターフ
ェース端子，電源用端子が備わっています．GPIO 端
子が 17 本で足りないときは，他の端子を使用するこ7

11 9 15 13 ラズパイの
端子へ
ジャンパ

37

470
560

1k

タクト・
スイッチ

圧電
スピーカ

写真 4-2GPIO 実験ボードの配線

ブレッドボードの縦のラインは内部で導通している．タクト・スイッチを挿す向きに
注意

46

4 3

2 1
向きに注意

フルカラーLED

第5章

ラズベリー・パイ宅内サーバ用
ラズベリー・パイ宅内サーバ用
データ受信プログラム

IoT 機器が送信するデータをラズベリー・パイで受信，表示，保存する宅内サーバ用の Pythonプログラムを解説します．本章共通で使用する送信機は，章の後半で概説するESP32マイコンで製作します．

IoTサーバ（親機）で受信（ラズベリー・パイ）

図 5-1
IoT 温度計が送信する温度値をラズベリー・パイで受信し表示する

IoTセンサ（子機）で送信（ESP32マイコン）

ESP32 マイコン内蔵の温度セン
サの値を送信するIoT 温度計から温度値を，ラズベリー・パイで受信表示したり，ファイルを保存したりするプログラムを作る

Python プログラム 9

ラズベリー・パイで温度を UDP 受信
ESP32 マイコン（子機）が Wi-Fi 送信した温度値を受信して表示するラズベリー・パイのサーバ（親機）用Python プログラムを作成します（図 5-1）．
● データ送信側 ESP32 マイコン（子機）
温度の値を Wi-Fi 送信する送信機を本稿では IoT 温度計と呼ぶことにします．ESP32 マイコン開発ボード
T-Koala の電池端子にアルカリ乾電池 3 本を直列に接続して製作しました．ESP32 マイコンのボードなら他のものも使用できます．ただし端子番号は違うことがあるので気をつけてください．
送信用 ESP32 マイコンとプログラムの詳細はこの章の後半 p.74 〜を参照してください．
ESP32 マイコンにインストール後，PC やスマートフォンでアクセスして，ブラウザ画面の［Wi-Fi 設定］
から AP＋STA モード（または STA モード）で LAN に接続すると送信した温度値を同じ LAN に接続したラズベリー・パイで受信できるようになります．初期設
定では，温度値を 30 秒ごとに受信します．
62

LAN

温度値
表示

pi@raspberrypi:~/iot/learning$ ./example21_rx_temp.py
Listening UDP port 1024 ...
device = temp0_2 , temperature = 28.0
device = temp0_2 , temperature = 27.0
device = temp0_2 , temperature = 28.0

● 受信側ラズベリー・パイ用 Python プログラム
example21_rx_temp.py（ リ ス ト 5-1）は， ラ ズ ベ リー・パイで動作する Python のプログラムです．UDPを受信するプログラム p.92 リスト 4-7 の example16_
udp_logger.py に，IoT 温度計のデータであることを確認する関数 check_dev_name と，UDP データの中から値を抽出する関数 get_val を追加しました．プロ
グ ラ ム example21_rx_temp.py の 処 理 の よ う す を 図
5-2 に示します．
プログラムの処理の流れを解説します．
① IoT 温度計のデバイス名があらかじめ設定したものと一致するかどうかを確認する関数 check_dev_
name を定義します．定義だけなので，起動時は実行されず，後の手順⑧から呼び出されたときに実行します．
② 関数 check_dev_name の引き数 s が，表示可能な文
字列かつ 7 文字，かつ先頭 4 文字が temp，かつ 6 文
字目が「 _ 」のとき，IoT 温度計からのデータであると判断し，手順③を実行します．条件を変更すれば，他のデータを受信することもできるようになります（例：example21_rx_temp_m.py）．
③ 処理②のデバイス名が IoT 温度計と合致したこと

第6

ラズベリー・パイでBluetooth
ラズベリー・パイでBluetoothLEを受信するPythonプログラム

章

本章では，Bluetooth LE のビーコン（アドバタイジング）
送信に対応した IoT センサを用い，センサ値データをラズベリー・パイ内蔵の Bluetooth モジュールで受信して表示するプログラムや，CSV 形式での保存方法，クラウド・サービスに転送してグラフ化表示する方法について紹介します（図6-1）．
先にBLE の送信機を準備し，その後で受信側のラズベリー・パイのPythonプログラムを説明します．

センサ

Arduinoプログラム

Ambient
ⅠoTクラウド・サービス

センサ値をアップロード

センサ値

ESP32

ble̲logger̲sens̲scan.py
ラズパイ

BLE

センサ

センサ値

センサ・メダル（ローム）

図 6-1
Bluetooth LE で温度値をワイ
ヤレス通信

BLE

センサ値

Pythonプログラム
ble̲logger.py

Arduinoプログラム

ESP32マイコン内蔵温度センサ
やローム製センサ・メダル，センサ・シールド・キットから送信したセンサ値をラズベリー・
パイ内蔵 Bluetooth で受信する

送信機の準備 1

BLE

ESP32
＋センサ・シールド・キット

iPhoneでセンサ値を表示

iPhone（動作確認）
RHRawDataMedal2

ESP32

ESP32 マイコンで BLE 送信● BLE 送信は ESP32 マイコン
Espressif Systems 製 ESP32-DevKit C，TTGO 製
T-Koala，CQ 出版社製 IoT Express など ESP32 マイコンを搭載するマイコン・ボードに，プログラム（iottemp-ble-esp32）を書き込むことで，温度センサ値をBLE で送信できます（写真 6-1）．
ESP32 マイコンにプログラムを書き込むには，ESP32
マイコン開発ボードをラズベリー・パイに接続し，フォルダ iot/iot-temp-ble-esp32/target/ 内の iot-temp-bleesp32.sh を実行します．
※・内 蔵温度センサの測定精度は良くないので実験用として使用．できれば外付けセンサの利用がベター．

82

写真6-1 ESP32マイコン内蔵の温度センサを使いBluetooth
LE で温度値を送信する
あらかじめ，プログラム iot_exp_temp_ble を書き込んだ TTGO
T-Koala第7章

MicroPythonプログラム（micro:bitで試す）

MicroPythonは，Python をベースにしつつ，ARM Cortex-Mシリーズ等のマイコン向けに開発されたプログ
ラミング言語です．Python の主要な機能に加え，マイコンのハードウェアを制御する機能が搭載されており，IoT
機器向け言語として注目されています．
本章では，BBC micro:bitV1または V2を使ってMicroPythonによるワイヤレス通信を試します．

ウェブサイト micro.bit
インターネット
接続プログラムを書き込む

USB
micro:bitV1 または V2

ラズベリー・パイ● micro:bit で MicroPython をはじめる
マイコン・ボード BBC micro:bit（以下 micro:bit）を使えば，とても簡単に MicroPython によるプログラミ
ングをはじめることができます（写真 7-1）
．micro:bit
をラズベリー・パイ（または Windows/macOS/Linux を搭載した PC）の USB 端子に接続すると，USB メモリのようにドライブとして認識されます（図 7-1 ①）．ド
ライブ名 MICROBIT を確認し，フォルダを開くとファームウェアの情報が書かれた DETAILS.TXT と，
Web サイトへのリンク MICROBIT.HTM（図 7-1 ②）の2 つのファイルが入っています．リンクのほうを開きます．
Web サイト micro:bit にアクセスするので，言語メ
ニューで［日本語］を選んでから（図 7-1 ③），［はじめよう］を選択すると，説明書が日本語で表示されます（図 7-1 ④）．
MicroPython を始めるには，図 7-2 の［ステップ 2：
プログラムする］で［Python エディタ］を選択してから（図 7-2 ⑤），［プログラムする］を選択してください（図7-2 ⑥）．
Python エ デ ィ タ（ 図 7-3）に は， 機 能 ア イ コ ン とPython プログラムのソースリストが表示されます．
機能アイコンは Python エディタのバージョンによって，表示が異なります．V1.1 と V2.0 のボタンの違い
を p.98 のコラムに記します．V2.0 のほうが多機能ですが，基本的な使い方は同じです．プログラムを編集し，機能アイコンの一番左にある［download］
をクリッ94

ウェブ上の Python エディタ

写 真 7-1 プ ロ グ ラ ミ ン グ 言 語 MicroPython に 対 応 し たmicro:bit

micro:bit は イ ギ リ ス の 放 送 局 BBC が 教 育 用 に 開 発 し た ARM
Cortex-M0 を搭載するオープン・ソース・ハードウェア．イギ
リスの 7 年生（中等教育の初年度）の子供たちに無償で配布され
ている

クすると
（ 図 7-4 ⑦ ），BBC micro:bit 用 の フ ァ イ ル
microbit.hex をダウンロードすることができます．一度，ラズベリー・パイまたは PC にダウンロードしてから，ドライブ MICROBIT にコピーします．ブラウ
ザの［名前を付けて保存］機能（図 7-4 ⑧）でドライブ
MICROBIT に直接ダウンロードすることもできます

第

8

章

STM32マイコン用
STM32マイコン用
MicroPythonプログラム

ST マイクロエレクトロニクス製 STM32F767ZI は，LAN 接続が可能な Ethernet インターフェースを内蔵した 32 ビット ARM Cortex-M7 ベースの STM32 マイコンです．LAN 経由でインターネットに接続できる
ので，IoT 搭載マイコンと言っても良いでしょう．また，同マイコンを搭載した STM32 マイコン開発ボード
NUCLEO-F767ZI には，写真 8-1のように LAN 接続用 Ethernet コネクタが標準装備されているので，手軽にMicroPythonを使ったIoT 機器を製作することができます．

1 NUCLEO-F767ZI へ MicroPython■のファームウェアを書き込む
STM32 マイコンの Ethernet 対応ファームウェアは，公式配布されている MicroPython のソースに含まれています．しかし，今のところビルドしたものは配布されておらず，またビルド手順も複雑なので，筆者が準備したスクリプトを使用してインストールしてください．
フ ァ ー ム ウ ェ ア を STM32 マ イ コ ン 開 発 ボ ー ド
NUCLEO-F767ZI に書き込むには，CN11 の 7 番ピン（BOOT0）と CN8 の 7 番ピン（3V3）をジャンパ・ワイ
ヤで接続した状態で，CN13 の Micro USB をラズベリ
ー・パイの USB 端子に接続し，CN1 の電源用 Micro
USB 端子へ 5V を供給します（写真 8-2）．
ダウンロードした iot フォルダ内の micropython/
nucleo-f767zi/install.sh を実行すると必要なファイル

ラズベリー・パイ

CN1 電源用
Micro USB

3V3
CN11（7 番ピン）BOOT0

CN13
マイクロ
USB

写真 8-2 MicroPython のファームウェアを書き込むための構成例
STM32 マイコン開発ボード NUCLEO-F767ZI の BOOT0 を H レベルに設定し，CN1 から電源を供給すると STM32 マイコンがファームウェア書き換えモードで起動する

3V3

CN11（7 番ピン）BOOT0

写真 8-1 LAN 接続用 Ethernet インターフェース内蔵のSTM32 マイコンを搭載した NUCLEO-F767ZILAN 接続用 Ethernet コネクタを装備しているので，手軽に Micro
Python を使った IoT 機器が製作できる

102

写真 8-3 ファームウェア書き換えモードに変更するための BOOT0 部の拡大図

STM32マイコンNUCLEO-F767ZIのCN11の7番ピン（BOOT0）のスルー・ホールから，CN8 の 7 番ピン（3V3）をジャンパ・ワ
イヤで接続する

9

第章

ラズベリー・パイPicoでラズベリー・パイPicoで
BLEワイヤレス・センサを作る

本章では，BLE 通信でセンサ・データを送信するプログラムをMicroPythonで作成します．
ラズベリー・パイPico に内蔵された温度センサや温湿度センサ・モジュールから取得したセンサ値を BLE モ
ジュール RN4020 で送信します．
プログラム開発やBLE の受信には従来のラズベリー・パイ4（または，400，3+，3）を使用します．
ラズベリー・パイPico でBLE 送信した測定値をラズベリー・パイ4 で受信して表示します．

ラズベリー・パイ
ble̲logger̲rn4020.py
BLE受信器

pi@raspberrypi:~/iot/micropython/raspi-pico$ sudo ./ble_logger_rn4020.py
Device 00:1e:c0:xx:xx:xx (public), RSSI=-60 dB, Connectable=True
1 Flags = 06
9 Complete Local Name = RN4020_TEMP

BLE
送信器

温度値

表示

Device 00:1e:c0:xx:xx:xx (public), RSSI=-63 dB, Connectable=False
1 Flags = 04
255 Manufacturer = cd0037a3
isRohmMedal = RN4020_TEMP
ID= 0xcdTemperature = 20.49 ℃
RSSI= -63 dB

温度＝20.49℃

RN4020 ＋

図 9-1

ラズベリー・パイPico
example03̲rn4020.py

本章で製作する BLE ワイヤレス・センサの一例

ラズベリー・パイ Pico で測定した温度値を BLE で送信し，ラズ
ベリー・パイで受信・表示する

ラズベリー・パイ Pico RP2040
2021 年に発売されたラズベリー・パイ Pico は，従来のシングルボード・コンピュータのラズベリー・パイとは異なり，ユーザ・インターフェースやモニタ出力を使った OS 機能に対応していない組み込み用のマ
イコン・ボードです．より小型化，低価格化，省電力化が求められる組み込み向けに，ラズベリー・パイ財団が独自に開発したデュアルコア ARM Cortex M0+
マイコン RP2040 を搭載しています．
同じラズベリー・パイのシリーズですが，使い方は大きく異なります．プログラムを作成するには従来の通常のラズベリー・パイ 4（または，400，3+，3，2，1）
またはパソコンが必要です．
114

BLE モジュール RN4020
本章で製作する BLE 通信部には，マイクロチップ・
テクノロジー社（Microchip Technology Inc.・米国）の RN4020 を搭載した Bluetooth（BLE）
モジュール AERN4020-XB（秋月電子通商製）を使用し，図 9-2 のようにUARTと電源をラズベリー・パイPicoに接続します．

必要な機器
表 9-1 にワイヤレス・センサの実験に必要な機器を示します．細ピンヘッダは，ラズベリー・パイ Picoをブレッドボードに接続するのに使用します．
BLE モジュール用のピンヘッダは，AE-RN4020-XBに付属しています．マイクロ USB ケーブル（microBタイプ）は，ラズベリー・パイ Pico をプログラム作成
用のラズベリー・パイ（またはパソコン）に接続するのに使用します．ピンヘッダの取り付けにはハンダ付け作業が必要です．

第

10

章

ラズベリー・パイとPythonでラズベリー・パイとPythonで
IoTシステム開発入門

本章では，ラズベリー・パイが IoT 機器を管理する IoT システムを紹介します．これまでは，IoT 機器単体を説明してきましたが，本章では IoT 機器を組み合わせて，IoT のシステム化を図ります．ラズベリー・パイは，
IoT サーバとして各 IoT 機器を管理します．

1■ IoT ボタンでチャイム音．
呼び鈴のシステム例
図 10-1 の例は，IoT ボタンでチャイム音を鳴らす呼び鈴システムです．IoT サーバが IoT 機器からの情報を取り扱う実験を行います．IoT サーバ（親機）は，複数の IoT ボタン（子機）が送信した通知を，Wi-Fi アク
セス・ポイント経由で受信してピンポン音を出力します．第 4 章で製作した example20_iot_notifier.py でも同様のことが行えます．
子機となる IoT ボタンは，GPIO 実験ボード（第 4 章で製作）を搭載したラズベリー・パイ上で example14_
iot_btn.py を実行する，もしくは IoT Sensor Core を書き込んだ ESP32 マイコンにタクト・スイッチを追加し，［センサ入力設定］の［押しボタン］で，［PingPong］
を選択したものなどを使用することができます．
親機となるチャイム音を出力する IoT サーバは，第4 章の GPIO 実験ボードを搭載したラズベリー・パイ

上で example28_chime_btn.py を実行します（あるいは，1 台のラズベリー・パイ上で 2 つの LXTerminalを起動し，それぞれの LXTerminal 上で子機と親機のプログラムを動かすことで，開発時のハードウェアの台数を減らすこともできる）．各 LXTerminal での実行例を図 10-2 に示します．
以下に，リスト 10-1 の IoT 版チャイム呼び鈴のサ
ンプル・プログラム example28_chime_btn.py の主要な処理内容について説明します．
① チャイム音を鳴らすための関数 chime を定義します．定義だけなので，起動しただけでは実行されません．実行するには後述の処理⑥などから呼び出す必要があります．
② 変数 key に Ping が代入されていたときに 554Hz の音を 1 秒間，鳴らす処理です．
③ 変数 key に Pong が代入されていたときに 440Hz の音を 0.3 秒間，鳴らす処理です．
④ UDP 受信用のソケットへの接続に成功した場合に，

ⅠoTボタン（子機）
LAN

ESPマイコンラズベリー・パイ

ping
pong

ボタン

GPIO実験ボード
GPIO実験ボード

ラズベリー・パイ

ピンポン
ボタン
ⅠoTボタン（子機）
example14̲iot̲btn.py

図 10-1

IoT ボタンでチャイム音を鳴らす呼び鈴のシステム例

ⅠoTサーバ（親機）
example28̲chime̲btn.py

第 4 章で製作した GPIO 実験ボード搭載のラズベリー・パイと親機となるチャイム呼び鈴サーバでシステ
ムを構成する

128

第

11

章

ラズベリー・パイとPythonでラズベリー・パイとPythonで
IoT音声認識入門

スマート・スピーカは，一般家庭に普及した IoT 機器のひとつです．「OK，Google」や「Alexa」などウェイ
ク・ワードに続いて話した音声は，クラウド上のサーバに送信され，音声認識と AI で回答が生成され，スマート・スピーカで返事が再生されます．
本章では，ラズベリー・パイ上で動作する音声認識ソフトと，クラウド上で動作する音声認識エンジンを使う 2 種類の方法で，スマート・スピーカ・ライクな IoT 音声ユーザ・インターフェースを製作します．

1 Google AIY Voice Kit と■Julius の違い
音声認識にはクラウド・サービスを利用する方法と，手元の PC 上で認識する方法があります．ここでは，
ク ラ ウ ド・ サ ー ビ ス「Google Cloud Speech-to-Text」を使用する方法と，オープン・ソースの「大語彙連続
音声認識エンジン Julius」を使用する方法を説明します．それぞれの特徴の違いを表 11-1 で比較し，要件に合った方法を選択すると良いでしょう．

SD カードが付属しない Version 1 と，それらが付属する Version 2 が販売されています．組み立てや設定に関する説明書（ウェブ）
は英文ですが，写真を多用しているので，英語があまり得意でなくても製作できるでしょう．
Google AIY Voice Kit V1
https://aiyprojects.withgoogle.com/voice-v1/
Google AIY Voice Kit V2
https://aiyprojects.withgoogle.com/voice/● 大語彙連続音声認識エンジン Julius
USB マイクロホンを接続したラズベリー・パイに
Julius をインストールすることで，Google AIY Voice
Kit よりも安価に音声認識を行うことができます．イ
ンターネットに接続していない状態でも使用することができるので，クラウド・サービス料が不要なうえ，
プライバシーの確保も可能です．例えば，一般的なクラウド・サービスを利用するスマート・スピーカでは，ユーザはウェイク・ワードで呼びかけ，ウェイク・ワ
ードを認識したときだけ音声をクラウドへ送信することで，ユーザが意図しない音声をクラウドへ送信してしまう頻度を低減しています．Julius であれば，ウェ
イク・ワードなしで運用することもできるでしょう．

● Google Cloud Speech-to-Text
クラウド・サービスを使った音声認識の利点は，膨大な音声辞書を利用し，また利用者から得た学習結果
か ら， 確 度 を 高 め る こ と が で き る 点 で す．Google
Cloud Speech-to-Text を 始 め る に は， 例 え ば，写 真
11-1 の よ う な Google AIY Voice Kit を 使 用 し ま す．
SD カード用イメージ・ファイルも提供されているので，インストールは簡単です．ただし，クラウドに接続するには，Google Cloud Platform への登録や認証キーの設定が必要です．どちらかといえば，IoT 機器
側よりもクラウド・サービス側の開発に興味のある人に向いています．
執筆時点では，ラズベリー・パイ本体やマイクロ

ラズベリー・パイ
音声解析

図 11-1
ラズベリー・パイ上で動作する音声認識
エンジンを使用して IoT ユーザ・インタ
ーフェースを作成する

USB マイクロホンに入力した音声の認識結果から音声に応じた処理を行う

142

音声に
応じた
処理

音声

USBマイクロホン
ラズベリー・パイ

第

12

章

Pythonで広がるIoT応用システムの構築の構築
〜IoTシステム応用編〜

IoT の世界では，単にモノがネットワークに接続できれば良いというものではありません．さまざまなモノが連携して動作することにより，新しいモノの価値が生まれます．
本章では，ラズベリー・パイが複数の機器やインターネットと連携して動作する実用的な IoT システムを製作
します．ここで紹介した Python プログラムを少し修正すれば，さまざまな IoT 応用システムへと展開することができるようになります．

1 インターネット照る照る坊主で■LED を制御
インターネットと連携したシステムの第一歩として，
インターネットから得た天気情報に応じて，カラー
LED の発光色を制御してみましょう．プログラムを実行すると，インターネットから天気情報を取得し，予報が晴れのときは赤色に，曇りのときは緑色に，雨や雪のときは青色に LED を光らせます．また，晴れ
のち曇りだと，赤色と緑色を混ぜた黄色に制御します．
ハードウェアは，図 12-1 のようにインターネット接続されたラズベリー・パイに，第 4 章で製作したIoT 実験用 IO ボードを接続して作成します．
ラズベリー・パイ上で実行するソフトウェアは，リ
スト 12-1 の example34_led3_wea.py です．iot フォル
ダの learning フォルダ内に収録しました．以下にプログラムの主要な動作を説明します．
① 変数 city_id に天気情報向けの地域 ID（1 次細分区定義表）を代入します．
② カラー LED を接続したラズベリー・パイの GPIOを初期化し，出力に設定します．

③ 天気情報をインターネットから JSON 形式で取得
し，辞書型変数 res_dict に代入します．
④ 変数 telop へ天気の内容（晴れ，曇りなど）を代入す
る 処 理 部 で す． 辞 書 型 変 数 res_dict か ら 項 目
forecasts を抽出し，forecasts 内の配列の先頭に含まれる項目 telop を抽出し，変数 telop に代入します．
⑤ 変数 telop 内の文字列内に［晴］が含まれるときに変数 color に赤色を混合します．演算子「|」は論理 OR
演 算 を 行 い ま す． 赤 の 色 番 号 は 1 な の で， 変 数
color の最下位ビットを 1 にします．同様に［曇］だ
と緑，
［雨］
または
［雪］
だと青を混合し，光の 3 原色の混合を行います．
⑥ 変数 color の値に応じた LED の制御を行います．最下位ビットの赤色，次のビットの緑色，その次の青色に合わせて GPIO の出力を設定します．
ここでは，カラー LED を制御しましたが，プログ
ラムを改造すれば，天気情報を利用した機器の制御も可能です．例えば，変数 telop 内の文字列内に「雨」が含まれていない状態から，［雨］が含まれるように変化したときに［もうすぐ雨になります］とアナウンスを音声出力する応用が考えられます．

インターネット

HTTP
GET

天気情報

ラズベリー・
パイ

図 12-1
インターネット照る照る坊主で LED の発光
色を制御

インターネットから天気情報を取得し，予報が晴れのときは赤色に，曇りのときは緑色に，雨や雪のときは青色に LED を光らせる

152

IoTサーバ（親機）
example34̲led3̲wea.py

天気情報をLED
表示
赤：晴れ
緑：曇り
青：雨または雪