あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Raspberry Pi Picoに有線LANポートを生やしてみる

Raspberry Pi Advent Calendar 3日目です。多分そろそろネタが間に合わなくなる。というか薄い本書いてないのどうしよ。

adventar.org

Pico×ネットワーク

Picoを触っていると、やはりというか、ネットワークに繋ぎたい欲求がわきがちです。以前はPico Wireless PackでESP32を通じてネットワークに接続したりWebサーバーを立てたりしましたが、安定性を求めるなら有線LANのほうが嬉しいこともあるような気がして、試してみたかった次第です。

akkiesoft.hatenablog.jp

いろいろな有線LANモジュール

有線LANを使うためのモジュールは世の中には色々ありますが、自分でデータシートを読みながら実装するほどの技量はないので、できればすでに先駆者が開拓済みのものをありがたく使わせてもらえるとありがたいです。そして、できればCとかC++よりはCircuitPythonかMicroPythonで扱えるものがほしいです。

まずは昔に遊んでみたことがあるSPI接続のENC28J60モジュール。Picoで使う例はいくつか出てくるので、頑張れば動くようですが、Python系はなさげでした。

akkiesoft.hatenablog.jp

同じくSPI接続のLAN8720というモジュールでの実装例もありますが、これもC系っぽいです。買ってからPython系のモジュール実装がないことに気づきました……。

www.raspberrypi.com

じゃあPython系で使えるものはないかというとちゃんとあって、やはりSPI接続のWIZnet W5500(W5000シリーズのいずれか)が、CircuitPythonで利用可能です。先日のブラックフライデーでポチって昨日届いたので、これを触っていきます。

f:id:Akkiesoft:20211202232304j:plain

W5500モジュールをつなぎこむ

上の写真の一番右がW5500モジュールなのですが、裏返すとチップ類がまとまっていてコンパクトです。

f:id:Akkiesoft:20211202232655j:plain

配線は電源に3.3V接続を利用する以外は、MOSI,MISO,CS,SCLKとリセット用ピンを使う普通のSPIって感じです。今回はなんとなくTiny2040を引っ張り出してきました。

モジュール Tiny2040
G GND
V 3.3V
RST GP7
MI GP0
MO GP3
SCK GP2
CS GP1

配線の参考サイトはこちら。

f:id:Akkiesoft:20211202233414j:plain

何か動かす

とりあえずDHCPでアドレスを取得してもらうスクリプトを動かしてみます。以下のページの手順に従ってやってみました。

www.hackster.io

CircuitPython環境を用意して、ライブラリはadafruit_bus_device、adafruit_requests.mpy、adafruit_wiznet5kの3点を放り込みます。

スクリプトの方はリポジトリをたどったらIPアドレス固定になっていたので、adafruit_wiznet5kライブラリを見てDHCPを有効にしました。

github.com

# SPI接続先の指定をTiny2040に合わせた
SPI1_SCK = board.GP2
SPI1_TX = board.GP3
SPI1_RX = board.GP0
SPI1_CSn = board.GP1
W5500_RSTn = board.GP7

(中略)

# コメントアウトの切り替え
# Initialize ethernet interface with DHCP
eth = WIZNET5K(spi_bus, cs)
# Initialize ethernet interface without DHCP
#eth = WIZNET5K(spi_bus, cs, is_dhcp=False, mac=MY_MAC)

# Set network configuration
# コメントアウト
#eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER)
|<<

動かしてみると、以下の通り出力が得られました。MACアドレスは指定しないとde:ad:be:ef:fe:edになるようで、どうもW5500自体にはMACアドレスは含まれてないみたいです(参考: [http://nopnop2002.webcrow.jp/Arduino_Networking/Network-2.html])。ので、家の中で重複しないランダムなものを作って使えば良さそうな気がします。

>||
Wiznet5k Ping Test (no DHCP)
Chip Version: w5500
MAC Address: ['0xde', '0xad', '0xbe', '0xef', '0xfe', '0xed']
My IP address is: 192.168.29.127

取得されたIPアドレスpingを打って帰ってくることも確認できました。よさげ。 

Webサーバーを立ててみる

冒頭に貼ったPico Wireless Packを使ったWebサーバーをW5500用に移植してみました。と言ってもそれほど手間ではなく、Wi-Fi的な部分をW5500の初期化に置き換えて、wsgiserverモジュールをesp32spiからwiznet5kに変える程度でした。

github.com

これで、Pico Wireless Packで作ったときと同じようにWebページにアクセスできるようになりました。なお、ページを開く速度も同じだった模様。ちょって調べてみた感じSPI接続の限界説がありそうです。

消費電力……

W5500+Tiny2040で作って、消費電力はどんなものかと興味がわいたので計測してみたところ、接続中はアイドルでも通信中でも0.15Aとなりました。W5500モジュールを引っこ抜いた状態が0.03Aなので、W5500モジュールがまあまあ電気を食うようです……。ちなみにPico Wireless Pack+Picoはアイドル0.04A、使ってる間は0.1Aでした。

Raspberry Pi Zero Wをカリカリにチューニングするとアイドル時0.09Aで動くことを考えると、それならPiZero使いますわ……という気持ちになります。でも、PiZeroにUSB-LANアダプターをつないだらその分消費電力もプラスになるから、一応Picoのほうが省エネとも考えられて、悩ましいところです。

まとめ

Raspberry Pi Picoに有線LANをはやしてみるネタでした。例えばもし、Raspberry Piでセンサーから値を取ってどこかに送りつけるだけの工作みたいなのがあるとしたら、そいつを置き換えるのに有用そうです。そんな贅沢な例があるのかは知りませんが……いやあるぞ、弊社のサーバールームでPi 1B+を使って温度をZabbixに投げるだけのやつがあったぞ……🤔!?

モジュールをケーブル配線するのが面倒!という人には、なんとWIZnetからRP2040と統合されたボードが発売されているので、これを買うとヨサゲです。Picoに乗せて使えるタイプもあるようなので、お好みで選ぶと良いでしょう。

あと、タイムリーなことにWIZnetのTwitterが、RP2040と統合されたボードがAWS IoT Coreで使えるデバイスとしてAWSのカタログに載ったというツイートをしたのをEbenがRTしているところを見かけたので、AWS IoT Coreでなんかやってる人にもおすすめのようです。AWSなんもわからんので私は知らないのですが……。