うしこlog
公開: 2023/03/31

ラズベリーパイPico Wのセットアップと使い方

今回の内容

 ラズベリーパイPico W(ラズパイPico W)は、MicroPythonと呼ばれるマイコン用Pythonで開発できるマイコンです。ラズパイよりもさらに小型であり、GPIOにセンサやLEDなどの電子部品を接続して制御できます。 従来のPicoに対してWiFiを搭載したモデルのため、小型ながらネットワークに繋ぐことも可能です。ただし、ラズパイとは異なりOSもなくGUIもありませんのであくまでマイコンという点に注意が必要です。

 ラズパイPico Wはラズパイよりも高精度にクロックが動作するため、より正確なタイマ制御やPWM制御ができる他、OSレスなので起動が非常に早いです。
Pico Wの活用例として、私は熱帯魚用のライトや自動餌やり機などを作っております。また、WiFiを使用できるのでネットワークIoTや、ChatGPTなどのAI連携などもできます。
ここでは、ラズパイPico Wのセットアップや使い方について、サーバ構築とLチカを例に説明していきます。


[目次]

ラズパイPico Wについて

 ラズベリーパイPico WはARMのデュアルコアを積んだマイコンで、値段は1100~1300円ほどです。

[CPU, メモリ]
コアはARM CortexM0+プロセッサ、最大周波数は133MHz、SRAMは256KB、フラッシュメモリは2MBです。

[プログラム言語]
C/C++の他、MicroPythonと呼ばれるマイコン用のPythonで開発できます。

[GPIO]
電子部品等を接続できるGPIOは、下記画像のように26ピンあります。 PICやAVRと同様、SPIやI2C、ADC、PWMの機能を利用できます。
(画像はhttps://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.htmlより引用)

[ネットワーク]
WiFi 4 (802.11n)、Single-band(2.4 GHz)が使用できます。セキュリティプロトコルはWPA3対応です。

[電源]
電源は1.8~5.5Vのため低電圧で駆動できます。そのためACアダプタの他、電池駆動も可能です。ただし、WiFi接続時は最大200mAが消費されるため、長時間の電池駆動は難しいかもしれません。

[その他]
注意としてはPico W自体にはピンがついていないため、GPIOを使用する場合には、別売りの「20ピン」を2つ、あるいは「40ピンを1つ」を購入し、半田付けする必要があります。 また、ラズパイ等との接続のためのmicroUSBケーブルも必要となります。

ラズパイPico Wのピン配置
ラズパイPico Wのピン配置

Pico Wの開発環境構築

 MicroPythonで開発する上で必要なものは下記です。ラズパイは、MicroPythonで記述したプログラムをPico Wに書き込むために必要となります。 WindowsPCでも開発はできますが、ドライバのインストールやSDKのインストール等が必要となりますので少々大変です。 そのため、より簡単なラズパイでの開発方法を紹介します。

 ラズパイを持っていない方は、この際に購入しておいて損はないと思います。どんなことができるか興味がある方は記事「ラズベリーパイ」をご覧ください。

必要なもの一覧

  1. ラズベリーパイ Pico W
  2. ラズベリーパイ (1,2,3,4どのモデルでも良い)
  3. micro-USB変換ケーブル x 2 (Pico Wとラズパイの接続用、ラズパイの電源用)
  4. ACアダプタ5V (ラズパイ電源用)
  5. USB端子のついたマウスとキーボード (ラズパイ用)
  6. HDMI対応のディスプレイ (ラズパイ用)
Pico W開発に必要なもの
Pico W開発に必要なもの

 ラズパイを起動後に左上の地球ボタンを押してブラウザを開き、Pico WにMicroPythonを扱うためのUF2ファイルを公式サイトからダウンロードしておきます。
公式サイト: https://www.raspberrypi.com/documentation/microcontrollers/micropython.html

公式ページのMicroPythonページ
公式ページのMicroPythonページ
UF2ファイルのダウンロード
UF2ファイルのダウンロード

プログラムの開発と書き込み

ラズパイにpicoを接続

 Pico WのBOOTSELボタン(白いボタン)を押しながら、ラズパイのUSBポートに接続します。 BOOTSELボタンを押しながら接続することで、Pico Wを書き込みモードにすることができます。 なお、押さない場合はプログラム実行モードとなります。 ただし、購入時のpicoにはプログラムは書き込まれていないため、自動的に書き込みモードになります。

BOOTSELを押しながらラズパイに接続
BOOTSELを押しながらラズパイに接続

 Pico Wをラズパイに接続すると、ラズパイの画面に「リムーバブルメディアが挿入されました」というウィンドウが出るため、「ファイルマネージャで開く」を選択しOKを押します。
もしウィンドウが表示されない場合は、picoを外して再度BOOTSELを押しながらラズパイに接続します。

「ファイルマネージャで開く」を選択しOK
「ファイルマネージャで開く」を選択しOK

 先ほどダウンロードしたUF2ファイルを、ドラッグ&ドロップでPico Wにコピーします。

Pico WへのUF2ファイルのコピー
Pico WへのUF2ファイルのコピー

プログラミング

 MicroPythonでプログラミングするために、開発環境IDEであるThonnyを起動します。
ラズパイ画面の左上「ラズパイマーク」、「プログラミング」、「Thonny Python IDE」の順で起動できます。

Thonny起動
Thonny起動

 Thonnyを起動した後、右下が「MicroPython(Raspberry Pi Pico)」であることを確認します。 「MicroPython(Raspberry Pi Pico)」以外の場合には、その箇所をクリックして選択して下さい。

MicroPythonの確認
MicroPythonの確認

 +ボタン(Newボタン)を押して、プログラミングしていきます。 Pico Wにサーバを立てて個別のURLにアクセスすることでPico W基盤上のLEDをオンオフする、いわゆるLチカをするプログラムを記述してみます。

# This software is based on https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf

import network
import socket
import time
from machine import Pin

led = Pin("LED", Pin.OUT) # use on-board LED 

ssid = 'A Network'        # ネットワークのSSID名を記載する
password = 'A Password'   # ネットワークのパスワードを記載する

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

wlan.connect(ssid, password)

# Pico Wにアクセスした際に表示するWebページのHTML
html = """<!DOCTYPE html>
<html>
  <head> <title>Pico W</title> </head>
  <body> <h1>Pico W</h1>
    <p>%s</p>
  </body>
</html>
"""

# 接続できるまで待機する
max_wait = 10
while max_wait > 0:
  if wlan.status() < 0 or wlan.status() >= 3:
    break
  max_wait -= 1
  print('waiting for connection...')
  time.sleep(1)

# 接続エラーのハンドリング
if wlan.status() != 3:
  raise RuntimeError('network connection failed')
else:
  print('connected')
  status = wlan.ifconfig()
  print('ip = ' + status[0])
print('if you turn led on, access to ' + status[0] + '/led/on')
print('if you turn led off, access to ' + status[0] + '/led/off')

# ソケットを開く
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

# HTTPリクエスト, レスポンス処理
while True:
  try:
    cl, addr = s.accept()
    print('client connected from', addr)
    request = cl.recv(1024)
    print(request)

    # HTTP Request Header
    request = str(request) # ex) b'GET /led/on HTTP/1.1\r\nHost:....

    # リクエストが、LED onあるいはLED off用のパスかチェックする
    led_on = request.find('/led/on')
    led_off = request.find('/led/off')
    print('led on = ' + str (led_on))
    print('led off = ' + str (led_off))

    if led_on == 6:
      # LED on
      print('led on')
      led.value(1)
      stateis = "LED is ON"
    elif led_off == 6:
      # LED off
      print('led off')
      led.value(0)
      stateis = "LED is OFF"
    else:
      stateis = "LED is KEEPING"

    # コンテンツ作成
    response = html % stateis

    # レスポンス送信
    cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
    cl.send(response)
    cl.close()

  except OSError as e:
    cl.close()
    print('connection closed')

Thonnyでのプログラミング
Thonnyでのプログラミング

 RUNボタンを押して、ラズパイに接続されているPico Wにプログラムを書き込みます。

RUNボタンによる書き込み
RUNボタンによる書き込み

 保存先を聞かれるので、「Raspberry Pi Pico W」を選択します。
もし、ラズパイにも保存したい場合には「This computer」を選択して保存することもできます。

保存先としてPico Wを選択
保存先としてPico Wを選択

 保存ファイル名を聞かれるので、Pico Wに保存する際には必ず「main.py」を選択します。
理由としては、picoでは電源投入後に「main.py」という名前のファイルが自動実行される仕組みだからです。 また、直接起動する必要がないクラスファイル等の場合には、main.py以外の名前に下さい。

main.pyとして保存
main.pyとして保存

 無事にPico Wへのプログラムを書き込み完了すると、下記のメッセージが表示されサーバが立ち上がります。
もし、エラーが表示されたらプログラムの記述が正しいか、Pico Wと接続されているかを確かめて下さい。

Pico Wのサーバ起動
Pico Wのサーバ起動

 たまにEADDRINUSEエラーが表示されることがあります。その場合には、ラズパイと接続しているmicroUSBケーブルを一旦抜いたあと、再接続してThonnyの「STOP」ボタンを押しプログラムを停止して、再度Runボタンを押して下さい。

EADDRINUSEエラー
EADDRINUSEエラー

 サーバが起動したら、"コンソールに表示されたIPアドレス/led/on"をブラウザに入力してアクセスしてみて下さい。LEDが点灯したら成功です。
次に、"コンソールに表示されたIPアドレス/led/off"にアクセスしてみて下さい。点灯していたLEDが消灯するはずです。

Pico WのLチカ
Pico WのLチカ

 無事にプログラム書き込み完了したら、Thonnyの「STOP」ボタンでPico Wが実行しているプログラムを停止した後にラズパイとPico Wを接続しているmicroUSBケーブルを抜いて下さい。 これで、Pico Wのプログラム開発は完了です。

実際に使う場合にはラズパイは必要なく、Pico Wに電源を直接供給するだけで先程と同様にサーバが立ち上がります。

では、楽しいラズパイPico Wライフを!

<<ラズパイPicoのセットアップと使い方 ラズベリーパイPico Wの消費電力へ >>