ラズパイ PICO W でWEBサーバを作ろう

ラズベリーパイPICO W を使って、簡単なウェブサーバのようなものを作りましたので、それの紹介をしたいと思います。

Raspberry Pi PICO W とは

ラズベリーパイPICO Wとは、小型で低価格なマイコンボードです。つまりちっちゃいコンピュータです。大きさは親指ほどのサイズで、お値段はなんと1500円程度で購入できます。それでいて、ワイファイとブルートゥースを内蔵しています。メモリが少なく、処理速度も遅いので、高度な事はできませんが、ちょっとした電子工作、例えばLEDの点灯ですとか、モーターの制御などには十分使えます。ワイファイ内蔵なので、スマホをリモコンとしてそれらの機器を制御できる夢のようなコンピュータなのです。

開発言語はパイソンとC++が使えます。

今回は、ラズベリーパイPICO W用に最適化されたパイソンである、マイクロパイソンを使って開発します。

PICO W でWEBサーバを作る

今回、このラズベリーパイPICO Wのワイファイ機能を使って、ホームページを作りたいと思いました。

しかし、専用のウェブサーバや、フレームワークを、探しましたが、私の環境では上手く動作しませんでした。

そこで、自作することにしました。

MicroPythonに標準で付いているネットワーク通信機能を使って、基本的なウェブサーバを作ります。これにより、ピコをインターネットに接続して、ホームページを表示できるようになります。

作ったホームページの紹介

まずは、どんなホームページができたのか、動きを見てみましょう。

urlを入力するとトップページが開きます。

左のメニューからLEDのオン、オフをやってみましょう。

LEDオンでピコ上のLEDが点灯します。

LEDオフでピコ上のLEDが消灯します。

現在の温度を選択するとピコに搭載された温度センサーから温度を測定し、表示してくれます。

トップをクリックすると、トップ画面に戻ります。

ポスト通信のテストもしたかったので、ポストテストというメニューを儲けました。

クリックすると、名前の入力欄が出てきます。

ここに名前を入力して送信ボタンを押すと、ポスト通信がされて画面上に名前が表示されるというページです。

今回はあえて、高速で動くホームページを、作りたかったので、このようなシンプルなページになりました。

HTMLファイル上にCSSやJavaScriptを組み込んであげることで、もっと華やかな画面のページも作れると思います。

作ったプログラムの解説

https://github.com/tanep3/pico_w_webserver

では作ったプログラムの解説に入ります。

画面に表示されているHTMLは、各ページ、HTMLファイルを作り構成しました。内容は非常にシンプルなものですので説明を割愛させて頂きます。

MicroPythonのプログラムに関して説明させていただきます。

WEB通信部分の説明

まず基本となるWEB通信部分について解説します。

作法自体は公式ホームページに載っている非同期通信のものと同様のものです。

必要なライブラリをインポートします。WEBサーバに必要なライブラリは、networkとasyncioの2つでつ。

9行目、10行目でみなさまの環境のワイファイルータのSSIDとパスワードを設定してください。

11行目でポート番号80番を指定しています。

ピコをワイファイと接続する部分を、コネクトアンドリターンアイピー関数で定義します。

これを呼び出すことで、ピコがワイファイと接続し、接続したときのIPアドレスを取得し、返却してくれます。

アシンクサーバー関数は、WEB通信のメインとなる処理をまとめて関数化しました。

ブラウザからのリクエストを受信して、結果を加工して次のページをブラウザに出力する部分を定義した関数です。

この関数は非同期で処理させるため、アシンク宣言をしています。

引数のリーダーはストリームリーダーというオブジェクトで、ここにブラウザからのリクエスト情報。つまり、ゲットなのかポストなのかとか、それに付随する情報などが入ってきます。

引数のライターはストリームライターというオブジェクトで、ブラウザに対して出力するための機能を持ったオブジェクトです。

166行目でリードすることで、ブラウザからのリクエスト情報を取得できます。

これを受けて、169行目のget_content_and_page関数でコンテントタイプとホームページのhttpデータ等を取得します。この関数は自作関数です。この関数から先の処理は迷宮のようになっておりますので、説明は割愛いたします。興味のある方は概要欄にプログラムのリンクを掲載しておきますのでそちらを参照して下さい。

170行目でコンテントタイプつまりhttpデータのヘッダを出力します。

171行目でデータ本体を出力します。

172行目で出力し終わるまで処理を待って、173行目で出力をクローズしています。

つづいてメイン処理部分です。

177行目で先程作ったコネクトアンドリターンアイピー関数をコールして、ピコをWifiに接続し、IPアドレスを取得します。

179行目から181行目で非同期でWEB通信を起動させます。これは公式に載っている作法通りです。

180行目のスタートサーバー関数の第一引数で、先程作ったアシンクサーバー関数を登録していることに注意して下さい。

183行目のランフォーエバーメソッドをコールすることにより、クライアントとの通信が永続的に行われるようになります。このメソッドのおかげでwhile文を書かなくて済むのですね。

以上がWEB通信についての説明になります。

カスタマイズ部分の説明

このプログラムはある程度汎用的に作りましたので、全部を説明すると大変ですので、皆様に活用して頂けるよう、カスタマイズが必要な部分に関して説明いたします。

カスタマイズが必要なのは、以下に説明する4つのテーブルの登録と、それに付随する関数の登録です。

ルーティングテーブル、コンテントタイプテーブル、アクションテーブル、ポストアクションテーブル、の4つをカスタマイズします。それぞれの中身を見ていきます。

ルーティングテーブルでは、ルーティングすなわち、URLの末尾の部分と、それに対応したhtmlファイルを登録します。

上記例でいくと、IPアドレス/top とURLを入力すると、right.htmlが表示される仕組みです。

GETメソッドのページでしたら、このテーブルに登録するだけで完了です。

POSTメソッドの場合は、このテーブルの他にもう一つポストアクションテーブルの登録が必要になります。

ちなみに、ホームページに埋め込まれた画像に関しては、画像ファイルをピコに置いておくだけで読み込んで表示してくれます。このテーブルへの登録は不要です。

コンテントタイプテーブル。

ファイルの拡張子とコンテンツタイプをここで紐づけています。基本的にはこのままです。特にテキストタイプについては手抜きをして作っていますので、テキストhtml以外は上手く動かないと思います。

アクションテーブル。

ラズベリーパイピコWは、マイコンですので、各入出力ピンに外部のデバイス、例えばLEDやモーターなどを接続してあげることで制御することができます。

その制御のための関数とルーティングを紐付けるのがこのテーブルになります。

必要に応じてルーティングと関数をここに登録して下さい。

デバイスへの制御処理は、短いものであれば、直接ラムダ式の中に書いて登録し、長いものであれば、外部に関数定義して、それを登録して下さい。

この例では、URLが/ledonの場合は、オンボードLEDが点灯します。

URLが/getTemperatureの場合は、get_temperature関数が呼び出され、オンボードの温度計により気温を測定して返却するように動きます。

ポストアクションテーブル。

POST通信がされたときは、大抵、何がしかのデータが渡され、それを受けての処理がなされますので、その処理を登録するのがこのテーブルになります。

ルーティングとそれに対する処理が記述された関数をここに登録して下さい。

関数は2つの引数を受け取るようにして下さい。

1つ目はページデータ。これは表示するHTMLファイルのデータになります。最初に登録したルーティングテーブルのhtmlファイルのデータがここに転送されます。

2つめはポステドデータ。HTMLのポスト時にnameとvalueで指定した情報が辞書型データとしてここに転送されて来ます。

そして、この関数は、加工したあとのHTMLデータを戻り値で返却するようにして下さい。

この例ではURLに/inputNameが指定されてPOSTされたら、54行目で定義したpost_name関数が実行されます。

以上がカスタマイズ部分の説明になります。

この簡易WEBサーバでできること

この簡易WEBサーバでできることをまとめます。

基本的なGET、POSTリクエストに対応しました。

埋め込み画像も表示できるようにしました。

マイコンとしてのデバイス制御に対応しました。

Raspberry Pi PICO W を使うことのメリット

ラズパイピコWでWEBサーバを立てることのメリットです。

  • 第1に低コストで作れる。
  • 第2に、消費電力が少ない。24時間フル稼働していてもスマホの20分の1程度しか電気を食いません。
  • 第3に、スマホをリモコンにしてデバイスを操作できるということ。
  • 第4に、Pythonで記述されているため拡張性が高いということです。例えばChatGPTのAPIなどをコールして、オリジナルなチャットボットを作ったりもできるでしょう。

以上、ラズベリーパイピコWを使って、簡易的なWEBサーバの作り方について解説をいたしました。