64
Raspberry Pi PicoでWi-Fiとインターネットを利用する方法
ピコWiFi
(画像提供:Tom's Hardware)

Raspberry Pi Picoは素晴らしいキットですが、重要な機能が一つ欠けています。それはWi-Fiです!Raspberry Pi PicoにWi-Fiを追加するというアイデアを初めて思いついたのは、 ESP8266バリアントボード用のESP-01インターフェースを備えたCytron Maker Pi Picoをレビューしていた時でした。しかし、その機能はかなり限られていました。 

CircuitPython の主任開発者 Scott Shawcroft が、毎週 Pi をテーマにした番組 The Pi Cast に出演した後、Adafruit には基本的な Wi-Fi 接続を提供する ESP32 ベースのアドオン ボードがあることを知り、1 日かけて調整した後、Raspberry Pi Pico をオンラインにする方法を示すこのチュートリアルを作成しました。

  • ラズベリーパイ ピコ
  • Adafruit Airlift WiFi Featherwing コプロセッサ
  • 8 x オス-オスジャンパーワイヤー
  • ブレッドボード

このチュートリアルの目標は、Raspberry Pi PicoをWi-Fi経由でインターネットに接続し、OpenWeatherサービスAPIにアクセスして、選択した場所の天気情報を取得することです。この生データはPythonシェルに送信されますが、OLEDスクリーンやLCDに簡単に送信したり、一連のイベント発生をトリガーするために使用したりすることもできます。

Raspberry Pi Pico を Wi-Fi 用に配線する

このチュートリアルでは、Raspberry Pi PicoとFeatherwing Airliftにヘッダーピンをはんだ付けする必要があります。両方のボードをブレッドボードで使用するため、付属のオスヘッダーで十分です。FeatherwingをAdafruit Featherボード(Feather RP2040など)で使用する場合は、マイクロコントローラの上部にメスヘッダーをはんだ付けする必要があります。図では、FeatherwingのMISO、MOSI、SCKの位置が正しいことに注意してください。これらのピンを必ず確認し、実際のボードではFeatherwingに追加のGPIOピンがあるため、ピン数を数えることに頼らないでください。

画像

1

3

ピコWiFi
(画像提供:Tom's Hardware)

ピンマッピング

Raspberry Pi PicoをAdafruit Airlift WiFi Featherwingに接続

(画像提供:Future)

スワイプして水平にスクロールします

ラズベリーパイ ピコAdafruit Airlift WiFi Featherwing コプロセッサ
VSYSUSB
GND任意のGNDピン
GPIO 10SCK
GPIO 11モシ
GPIO 12味噌
GPIO 13ESPCS
GPIO 14ESPビジー
GPIO 15ESPRST

Raspberry Pi PicoにCircuitPythonをインストールする 

CircuitPython を Raspberry Pi Pico にフラッシュするのは簡単です。 

  1. Pico 用の CircuitPython の最新バージョンをダウンロードしてください。
  2. Pico のBOOTSEL ボタンを押したまま、USB ケーブルを Pico とコンピューターに挿入します。
  3. CircuitPython UF2ファイルをRPI-RP2ドライブにコピーします。コードの書き込み中はドライブがアンマウントされ、消えます。新しいドライブ「CIRCUITPY」が表示され、書き込みが成功したことを確認できます。
  4. ダウンロードしたCircuitPythonのバージョンに応じたライブラリアーカイブをダウンロードしてください。今回の場合は6.2.0をダウンロードしたので、バンドルバージョン6をダウンロードする必要があります。
  5. ダウンロードの内容をフォルダーに抽出します。
  6. 次のファイル/フォルダをCIRCUITPY ドライブのlib フォルダにコピーします。

adafruit_bus_device
adafruit_minimqtt
adafruit_io
adafruit_esp32_spi
Adafruit_requests

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

OpenWeatherアカウントの作成 

このチュートリアルでは、OpenWeather APIを使用して、世界中のあらゆる場所の天気データを取得します。APIを使用するには、無料アカウントに登録する必要があります。 

  1. OpenWeatherサイトでアカウントを作成し、ログインします。 
  2. ユーザー名のドロップダウン メニューにある [My API Keys]に移動します。
  3. [キーの作成] で [TomsHardware] と入力し、[生成] をクリックします。
  4. 後で API キーが必要になるので、このページを開いたままにしておきます。

CircuitPythonコードの記述

CircuitPythonはPythonやMicroPythonと同じ構文と操作性を備えていますが、MicroPythonではThonnyのみしか使用できません。CircuitPythonでは、Thonny、Mu、あるいは上級者向けにVisual Studio Codeを使用できます。このチュートリアルではVisual Studio Codeを使用しましたが、テキストファイルを編集するだけなので、どのエディタを使用しても問題ありません。

1. CIRCUITPY にあるcode.py を開き、ファイル内のすべてのテキストを削除します。

2.このプロジェクトの動作に必要な一連のCircuitPythonライブラリをインポートします。board、busio、digitalioライブラリは、SPIインターフェースなどのGPIOとの通信を処理します。requests、sockets、esp32spiは、ESP32を介したネットワーク接続を処理します。最後のライブラリであるsecretsはまだ存在しません。後で作成します。

import board
import busio
from digitalio import DigitalInOut
import adafruit_requests as requests
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
from adafruit_esp32spi import adafruit_esp32spi
from secrets import secrets

3.   Python シェルにメッセージを出力する行を追加します。これは、プロジェクトが実行する内容を簡単に記述します。 

print("Raspberry Pi Pico WiFi Weather Station")

4.  新しいオブジェクト JSON_URL を作成します。このオブジェクトには、検索したい場所を含むURLと、先ほど生成したOpenWeather APIキーが格納されます。LOCATIONを市区町村名に、API KEYをOpenWeather APIキーに置き換えてください。 

JSON_URL = "http://api.openweathermap.org/data/2.5/weather?q=LOCATION&appid=API KEY&units=metric"

5.   SPIインターフェース経由でESP32に接続するために使用する3つのオブジェクトを作成します。チップセレクト(CS)、レディ、リセットは、ESP32コプロセッサの有効化とレディ状態の読み取りに使用されます。 

esp32_cs = DigitalInOut(board.GP13)
esp32_ready = DigitalInOut(board.GP14)
esp32_reset = DigitalInOut(board.GP15)

6. Pico 上の SPI インターフェイスがどこにあるかをコードに伝える オブジェクト spi を作成します。

spi = busio.SPI(board.GP10, board.GP11, board.GP12)

7.   SPI 上の ESP32 の場所と、ESP32 を制御するために必要なピンをコードに伝えるために使用するオブジェクト esp を作成します。

esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)

8.  ソケットを使用するコードを設定します。ソケットは、ネットワーク上の 2 つのデバイスを接続する手段です。この例では、Raspberry Pi Pico を Airlift WiFi Featherwing に接続します。 

requests.set_socket(socket, esp)

9.   Wi-Fi接続用のループを作成します。次の6行は、Wi-Fi APへの接続を処理します。このループは、ESP32への接続を確認することによって機能します。接続されていない場合は、接続が確立されるまでループを続けます。このループ内には例外ハンドラがあり、secretsライブラリ(後ほど作成します)にあるSSIDとパスワードを使用してWi-Fiへの接続を試みます。接続が確立されない場合は、エラーが表示されます。 

while not esp.is_connected: try: esp.connect_AP(secrets["ssid"], secrets["password"]) except RuntimeError as e: print("could not connect to AP, retrying: ", e) continue

10. 3行追加します。1行目は、コードが天気データを取得していることを通知するメッセージを表示し、2行目はOpenWeather API呼び出しから返されたデータを格納するオブジェクトrを作成します。3行目はデバッグ用のHTTPステータスコードを出力します。200番台はすべて正常に動作していることを意味しますが、400番台はAPIに問題があることを意味します。

print("Fetching weather data")
r = requests.get(JSON_URL)
print(r.status_code)

11.マイナス文字「-」を 40 回印刷する行を追加し、Python 出力に区切り文字を作成します。

print("-" * 40)

12.返されたJSONオブジェクト内の温度データをprint関数で出力します。r.json() 関数を使うことで、データ内の2つのキーワード「main」と「temp_max」を検索し、print関数に直接配置することができます。返された温度データは摂氏なので、行末に「C」を追加します。

print("The current temperature is",r.json()['main']['temp_max'],"C")

13.最後の 2 行を追加して、リクエスト オブジェクトを閉じる前に別の区切り線を出力します。

print("-" * 40)
r.close()

14.  コードを code.py としてCIRCUITPY ドライブのルートに保存します。 

Raspberry Pi Pico の Wi-Fi の完全なコード 

import board
import busio
from digitalio import DigitalInOut
import adafruit_requests as requests
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
from adafruit_esp32spi import adafruit_esp32spi
from secrets import secrets print("Raspberry Pi Pico WiFi Weather Station")
JSON_URL = "http://api.openweathermap.org/data/2.5/weather?q=LOCATIONl&appid=APIKEY&units=metric" esp32_cs = DigitalInOut(board.GP13)
esp32_ready = DigitalInOut(board.GP14)
esp32_reset = DigitalInOut(board.GP15) spi = busio.SPI(board.GP10, board.GP11, board.GP12)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) requests.set_socket(socket, esp) while not esp.is_connected: try: esp.connect_AP(secrets["ssid"], secrets["password"]) except RuntimeError as e: print("could not connect to AP, retrying: ", e) continue
print("Fetching weather data")
r = requests.get(JSON_URL)
print(r.status_code)
print("-" * 40)
print("The current temperature is",r.json()['main']['temp_max'],"C")
print("-" * 40)
r.close()

Wi-Fiログイン用のシークレットファイルの作成 

secrets.py ファイルは、Wi-Fi の SSID、ユーザー名、パスワードを保存できる場所です。メインコードでは、ライブラリをインポートし、SSID とパスワードを含む辞書を呼び出すため、Python ライブラリと同じように動作します。これらの処理を実行する前に、secrets.py ファイルを作成する必要があります。 

1.テキスト エディターで新しいファイルを作成します。

2.ルーターのSSIDとパスワードを含む辞書「secrets」を作成します。タイムゾーンはお住まいの地域に合わせて設定してください。

secrets = { 'ssid' : 'YOUR WIFI AP', 'password' : 'YOUR PASSWORD', 'timezone' : 'Europe/London', # http://worldtimeapi.org/timezones }

3.ファイルを code.py と同じ場所にsecrets.pyとして保存します。

Raspberry Pi PicoでWi-Fiのコードを実行する 

コードは自動実行されますが、出力はPythonシェルに接続した時にのみ表示されます。これを実現する最も簡単な方法は、PuTTYなどのターミナルエミュレータを使用することです。

1. PuTTY をダウンロードしてインストールします。

2. Pico をコンピューターに接続します (まだ接続されていない場合)。

3. PicoのCOMポート番号を確認します。Windowsでは、デバイスマネージャーを開き、「ポート」のドロップダウンメニューをクリックして、Picoのエントリを見つけます(エントリは明確に表示されていないため、どのエントリが消えるかを確認するには、プラグを抜き差しする必要があるかもしれません)。私たちの場合はCOM4でした。 

ピコWiFi

(画像提供:Tom's Hardware)

4. PuTTYを開き、「シリアル」をクリックして、デバイスマネージャーで見つかったCOMポートに合わせてシリアルラインを設定します。速度を115200に設定し、「開く」をクリックします。 

ピコWiFi

(画像提供:Tom's Hardware)

PuTTYが接続し、Pythonシェルが表示されます

5. Ctrl+Dを押してシェルを再起動し、コードを実行します。数秒後、現在地の最新の天気が表示されます。

ピコWiFi

(画像提供:Tom's Hardware)

レス・パウンダーは、トムズ・ハードウェアのアソシエイトエディターです。クリエイティブテクノロジストとして、7年間にわたり、老若男女を問わず、教育と啓発のためのプロジェクトを手がけてきました。Raspberry Pi Foundationと協力し、教師向けトレーニングプログラム「Picademy」の執筆・提供にも携わっています。