Flaskを使ってRaspberry Piにデータを送る方法

著者:Sparkfun Electronics

image

SparkFun提供

このチュートリアルでは、内部WiFiネットワークを介して安価なWiFiノードからRaspberry Piにデータを送信する方法を紹介します。Python用のFlaskフレームワークに依存しており、Pythonスクリプトを実行できるWebアプリケーションを比較的簡単に作成できる方法です。

image

Raspberry Pi 3とSparkFunのESP8266 Thingを使用してデモを行います。今回は、ThingボードからRasPiに非常に簡単な信号を送ります。付属のLEDをオン/オフさせるだけの信号です。この例から、より複雑な信号を送信し、受信時により複雑なスクリプトを実行する方法が明らかになることを期待します。

必要な部材

このチュートリアルを完了するには、このウィッシュリストにあるアイテムが必要です。代替品も可能です。例えば、Pi 3をRaspberry Pi Zero Wで代用することもできますし、スタータキット一式ではなく、部品単位で調達することもできます。

Raspberry Pi + Flaskのチュートリアル

ブレークアウェイヘッダ - 40ピンオス(両側に長いピン、PTH、0.1インチピッチ)

USB micro-Bケーブル - 6フィート

SparkFunのBeefy 3 - FTDIの基本ブレイクアウト - DEV-13746

ブレークアウェイヘッダ - ストレート - Digi-Keyではお取り扱いしておりません。

SparkFunのESP8266 Thing - WRL-13231

Raspberry Pi 3スタータキット- KIT-13826

必要な工具

このチュートリアルでは、特別な工具は必要ありません。必要なものは、はんだごて、はんだおよび一般的なはんだ付け用アクセサリです。

はんだこて - 30W(US, 110V) - TOL-09507

鉛フリーはんだ - 15グラム チューブ入り - TOL-09163

ハードウェアの接続

このチュートリアルの準備のために、基本的なブレッドボードを作製する必要があります。心配しないでください、私たちがすべて説明します。

Raspberry Piの接続方法

Piの接続はシンプルで、GPIOピン2にLEDを1つ接続するだけです。その方法については、下記のFritzing(フリッツィング)図を参照してください。

image

ESP8266 Thingの接続法

下記のFritzing図にあるように、2つのボタンを接続します。

image

片方のボタンでリモートのLEDを点灯させ、もう片方で消灯させます。ここでは、あなたが自分でESP8266 Thingボードにヘッダをはんだ付けできることを想定していますが、もし手助けが必要な場合は、はんだ付けチュートリアルをご覧ください。

ここにも、両側にピンが長いブレークアウェイヘッダを使用します。6ピンのグループをThingのプログラミングピンに合わせてブレッドボードに差し込むと、それが FTDIボードを差し込む場所になります。

Raspberry Piのソフトウェア

本題に入り、データ接続に使うWebアプリを使えるようにRaspberry Piにプログラミングしてみましょう。このチュートリアルは、LinuxとPythonにある程度慣れていることを前提に進めています。

Flaskのインストール

最初のステップは、RasPiに追加することです。Pythonは既にインストールされており、Pythonを介したGPIOの使用をサポートしているため、心配する必要はありません。

これらのコマンドはすべて、Raspberry Piで開いたシリアルターミナルから、Piをモニタにつないで直接実行するか、SSH接続でPiとリモートで実行することができます。しかし、モニタなしでPiをセットアップして動かす方法については、ここでは触れません。

まず最初に行うべきことは、Flaskフレームワークをインストールすることです。Flaskにはたくさんの追加パッケージがありますが、このチュートリアルでは基本的なパッケージだけを使用します。

sudo pip install flask

次に、アプリを実行するためのディレクトリを作成します。これらのコマンドは、ディレクトリを作成し、そのディレクトリの中で作業していることを確認します。

mkdir FlaskTutorial
cd FlaskTutorial

次に、「app.py」というディレクトリに空のPythonファイルを作成します。これは、これからコードを入れるファイルです。そのファイルをお好きなテキストエディタ(PiにはVI、Nanoおよびテキストパッドがあります)で開いてください。

touch app.py

そこに以下のコードを入れてください。

#!/usr/bin/python

from flask import Flask
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)  # Sets up the RPi lib to use the Broadcom pin mappings
                        #  for the pin names. This corresponds to the pin names
                        #  given in most documentation of the Pi header
GPIO.setwarnings(False) # Turn off warnings that may crop up if you have the
                        #  GPIO pins exported for use via command line
GPIO.setup(2, GPIO.OUT) # Set GPIO2 as an output

app = Flask(__name__)   # Create an instance of flask called "app"

@app.route("/")         # This is our default handler, if no path is given
def index():
    return "hello"

# The magic happens here. When some http request comes in with a path of
#  gpio/x/y, the Flask app will attempt to parse that as x=pin and y=level.
#  Note that there is no error handling here! Failure to properly specify the
#  route will result in a 404 error.
@app.route('/gpio/<string:id>/<string:level>')
def setPinLevel(id, level):
    GPIO.output(int(id), int(level))
    return "OK"

# If we're running this script directly, this portion executes. The Flask
#  instance runs with the given parameters. Note that the "host=0.0.0.0" part
#  is essential to telling the system that we want the app visible to the 
#  outside world.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

コードには、ほとんどの疑問を解決するためのコメントがありますが、ここでは3つのことを強調したいと思います。

  • まず、ここではエラーチェックは行われません。メッセージはHTTPリクエストで要求されたパスとして渡され、そのリクエスト内容はほどんど何でも可能です。例えば、GET /gpio/2/0という形式のリクエストは、ピンをローに設定します。しかし、GET /bats/are/bugs は同様に有効ですが、ただ何も作動することはなく、アプリは「404 error」を返します。
  • 次に、パラメータ「host=‘0.0.0.0’」は、アプリケーションを外部クライアントから見えるようにしたいということをアプリに知らせるために必要です。これを省略しても、Pi上のWebブラウザでlocalhost:5000にアクセスしてアプリをテストすることはできますが、外部からは見えません。
  • 3つ目は、よく使われるポート番号は5000ですが、どのポートを使っても構いません。

ESP8266 Thingのファームウェア

次にThingをプログラムする必要があります。この部分は、SparkFun ESP8266 Thingの接続ガイドに従って、ESP8266をプログラムできることを前提としています。

サンプルコード

注:この例は、デスクトップで最新版のArduino IDEを使用していることを前提にしています。初めてArduinoをお使いになる方は、Arduino IDEをインストールするチュートリアルをご覧ください。Arduinoライブラリをインストールしたことがない場合は、インストールガイドをご覧ください。

以下は、Raspberry Piに適切なページ要求を送るために書いたファームウェアです。

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>

ESP8266WiFiMulti WiFiMulti;

void setup() 
{
  Serial.begin(115200);

  // ESP8266 takes a few moments to boot, so we give it a few seconds
  for(uint8_t t = 4; t > 0; t--) 
  {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    Serial.flush();
    delay(1000);
  }

  // Add the WiFi access point information
  WiFiMulti.addAP("SSID", "PASSWORD");

  // Set our buttons pins to inputs with pullup resistors enabled
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);

}

void loop() 
{
  // wait for WiFi connection
  if((WiFiMulti.run() == WL_CONNECTED)) 
  {
    // Check if button 12 is pressed...
    if (digitalRead(12) == LOW)
    {
      //...and if so, issue a GET request of the format
      //  gpio/x/y, where x is the desired pin and y is the
      //  desired level to set the pin to. Currently the
      //  Flask app only supports pin 2.
      HTTPClient http;
      // Be sure to change this IP address and port number
      //  to match yours!!!
      http.begin("http://10.8.253.193:5000/gpio/2/0");
      int httpCode = http.GET();
      http.end();
    }
    // Repeat the process for pin 13.
    if (digitalRead(13) == LOW)
    {
      HTTPClient http;
      // Be sure to change this IP address and port number
      //  to match yours!!!
      http.begin("http://10.8.253.193:5000/gpio/2/1");
      int httpCode = http.GET();
      http.end();
    }
  }
  else
  {
    Serial.println("No WiFi");
  }
}

コードとコメントで、何が行われているのかが明らかになれば幸いです。2つの簡単な注意事項があります。

  • まず、関数 http.begin() の IPアドレスとポート番号は、開発時のものを使用しています。Raspberry Piで使用するIPアドレスとポート番号に合わせて変更する必要があります。
  • 次に、ワイヤレスネットワークのSSIDとPASSWORDを忘れずに入力してください。

ぜひお試しください。

ここまでで、すべての準備が整ったはずです。Raspberry Piでスクリプトを起動する必要があります。「app.py」ファイルを作成したサブディレクトリに、以下のコマンドを入力してください。

chmod a%2Bx app.py
./app.py

すると、以下のようなメッセージが表示されます。

image

ご覧のように、クライアントがHTTPリクエストをしたときにどのように見えるかを示すために、何度かボタンを押しました。FlaskはクライアントのIPアドレス、リクエストの日付とタイムスタンプ、リクエストの内容およびリクエストの結果(この場合は200、つまり「成功」)を報告します。これは、リクエストが実際にFlaskサーバに届いているか、どこか暗闇の中に消えてしまっていないかを確認するのに便利なツールです。

参考資料と今後について

Raspberry PiとESP8266の間でFlaskフレームワークを動かすことに成功したので、今度は自分のプロジェクトに組み込んでみましょう!

詳しくは、以下の資料をご覧ください。

  • Flask Framework - 公式のFlaskウェブサイト
  • Simple Flask Tutorial - この基本的なFlaskチュートリアルは、Flaskをここより少し踏み込んだところまで説明しています。
  • Complex Flask Tutorial - この高度なチュートリアルは、Flaskを使ってより複雑なタスクを通して、あなた自身がホストできるTwitterのクローンを作成するところまで説明します。

主要部品と構成要素

imageimage


すべてのDigi-Key部品をカートに追加してください

  • 1568-1117-ND
  • 1568-1355-ND




オリジナル・ソース(English)