Rasberry Pi OS がすでに動作している前提で、LEDを接続して点滅させ、ネットワーク経由で制御します。この実験は Raspberry Pi OS (Buster) で確認しました。Bullseye では問題発生して動きませんでしたが、関連情報が出揃えば対策も見つかる可能性があります。
Lチカ
まずLチカを行います。回路は単純なので手抜きで書きますが、この通り。
GPIO 16 → LED → 200Ω程度の抵抗 → GND
抵抗を介してLEDを接続することを忘れないでください。これを忘れると回路が(Raspberry Pi そのものも)壊れてしまう可能性があります。LEDの極性にも気をつけてください。LEDの2本のピンの長いほうが正極です。プログラムのファイル名は led.py としました。
led.py
1 2 3 4 5 6 7 8 9 10 11 |
import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # BCM(GPIO番号)でピン指定する GPIO.setup(16, GPIO.OUT) # GPIO16を出力に設定 while True: GPIO.output(16, 1) # GPIO16の出力を1に (LEDオン) time.sleep(0.5) # 0.5秒待つ GPIO.output(16, 0) # GPIO16の出力を0に (LEDオフ) time.sleep(0.5) # 0.5秒待つ |
これをターミナルで実行します。
1 |
$ python3 led.py |
LEDが点滅したはずです。もし “ModuleNotFoundError: No module named ‘RPi'” というエラーが表示されたら、次のコマンドで RPi をインストールすればエラーは出なくなります。
1 |
$ pip3 install RPi.GPIO |
動作が確認できたら Ctrl+C で終了します。
WebIOPi
WebIOPiというライブラリを使って、LEDのオン・オフをネットワーク経由で制御してみます。
WebIOPiのセットアップ
WebIOPi のページからダウンロードして(wgetコマンド)、解凍し(tarコマンド)、解凍したフォルダに移動してください。wgetコマンドに渡しているURLを見るとわかりますが、2015年以降現在2022年1月まで 0.7.1 が最新なのでコマンドは次のようになります。
1 2 3 |
$ wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz $ tar xvzf WebIOPi-0.7.1.tar.gz $ cd WebIOPi-0.7.1 |
このバージョンの WebIOPi にはパッチ(修正プログラム)があるのでそれをダウンロードして適用します。
1 2 |
$ wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch $ patch -p1 -i webiopi-pi2bplus.patch |
これで準備が整いましたので WebIOPi をセットアップします。
1 |
$ sudo ./setup.sh |
セットアップには、数分かかります。セットアップ画面が “Do you want to access WebIOPi over Internet ? [y/n]” で止まったら、”n” を入力し、エンターキーを押します。(”y” を入力し、エンターキーを押すと、Weaved IoT Kit がインストールされます。)
WebIOPi をサービスとして実行するために必要なファイルを、システムフォルダにダウンロードします。
1 2 |
$ cd /etc/systemd/system/ $ sudo wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi.service |
WebIOPi の開始・終了
WebIOPi を開始したり終了したりするには systemctl コマンドを使います。
起動
1 |
$ sudo systemctl start webiopi |
停止
1 |
$ sudo systemctl stop webiopi |
状態確認
1 |
$ sudo systemctl status webiopi |
再起動
1 |
$ sudo systemctl restart webiopi |
WebIOPi のサービスを自動開始(Raspberry Pi 起動時に開始)するには次のようにします。
1 |
$ sudo systemctl enable webiopi |
WebIOPi の自動開始を解除するには次のコマンドを使います。
1 |
$ sudo systemctl disable webiopi |
動作確認
Raspberry Pi のIPアドレスを調べます。次のコマンドでIPアドレスが表示されます。
1 |
$ hostname -I |
Raspberry Pi と同じネットワークで接続しているパソコン、スマホ等から上記のIPアドレスのポート8000にアクセスします。
1 |
http://172.22.65.1:8000 |
認証画面が表示されるので次のように入力します。
ユーザー名:webiopi
パスワード:raspberry
次の画面がブラウザ上に表示されますので “GPIO Header” をクリックしてください。
Raspberry Pi のピンヘッダーの図が表示されます。
グレーの白抜き文字は、それぞれのGPIOピンの入力(IN)・出力(OUT)を示します。クリックすると入力/出力の設定が変わります。中央の数字は、それぞれのGPIOピンの状態を示し、黒背景:LOW、オレンジ背景:HIGH です。クリックすると、HIGH/LOWの状態が変わります。
LEDが接続されているのは GPIO16 なのでその表示を探してください。物理ピン番号の36番がそれです。ピンが “OUT” のモードになっていることを確認して、数字の “36” をクリックすると表示がオレンジ/黒と変化するのと同時にLEDもオン/オフするはずです。
ngroks
ngrok を使って、インターネット経由で webiopi にアクセスできるようにしてみましょう。

(1)ngrokのページにアクセスしてアカウントを作り、ログインします。
(2)自分のアカウントのダッシュボードの Setup & Installation から対応OSのngrokアプリをダウンロードします。ラズパイの場合、Download for Linux(ARM) からダウンロードします。
(3)ファイルを展開したらすぐに実行できます。トークンはダッシュボードの Your Authtoken の画面からコピペします。
1 |
$ ./ngrok authtoken 自分のトークン |
(4)次のコマンドでローカルサーバーを公開します。
1 |
$ ./ngrok http 8000 ←今回はポート番号は8000番を指定 |
(5)次のような内容が表示されるので、”Forwarding” に表示されたURLにアクセスできるようになります。ローカルサーバーがトンネルされて、外部インターネットからもアクセス可能です。しかも https までサポートされています。
1 2 3 4 5 6 7 8 9 |
ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Account Xxxx Xxxx (Plan: Free) Version 2.3.40 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://xxxxxxxx.ngrok.io -> http://localhost:80 Forwarding https://xxxxxxxx.ngrok.io -> http://localhost:80 |
(6)外部のインターネット(例えばスマホのモバイル通信)から上記に表示されたURLにアクセスすると WebIOPi が表示されます。