15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi Pico を有線LANにつないで通信する

Posted at

Raspberry Pi Picoは激安で素晴らしいのですが、通信機能がありません。Wi-FiもBluetoothもないので、せいぜいUART機能を使って、PCとRS-232Cで通信するくらいしかできません。安いのでとりあえず買ってはみたけど、使い道が思いつかないという声を聞きます。センサーで読み取った値をサーバーに送るくらいのことはしたいので、通信機能がほしいです。

本記事では、Raspberry Pi PicoにENC28J60というLANコントローラーを接続して、UDPパケットを送受信し、NTPサーバーから日時のデータを取得します。

▼全体像

image.png

プログラムは、10年くらい昔にATmega328PでENC28J60を制御したときのコードを再利用しています。

▼昔作ったやつ

image.png

ENC28J60は高機能なLANコントローラーではありませんので、TCP/IPの様な高度な機能は搭載されていません。イーサネットの生パケットを送受信することしかできません。上位のプロトコルはホストのマイコン側に実装します。少なくとも次のような機能がRaspberry Pi Pico側に必要です。

  • ARP…IPアドレスからMACアドレスを問い合わせる。および応答する
  • DHCPクライアント…ルーター等からIPアドレスを割り当ててもらう
  • リゾルバ…インターネットホスト名をDNSサーバに問い合わせてIPアドレスを得る
  • パケット通信…UDPパケットをイーサネットフレームの中に入れて送受信する

本記事ではNTPサーバに問い合わせして、データを取得するだけなのでUDP通信を使います。もし、ウェブサーバーなどを作りたかったら、TCPの通信機能を実装する必要があり、かなり大がかりなプログラムになってしまいますので、TCPは本記事では扱いません。今後の挑戦課題となっています。

動画は次のツイートにあります

ソースコード

ENC28J60とホストのマイコンはSPIで通信します。クロック(SCK)は平常時はLowレベルで、立ち上がりエッジで信号線の読み書きを行うというフォーマットなので、次のフォーマット指定が必要でした。これに気付くまで数時間はまりました。

.c
spi_set_format(SPI_PORT, 8, SPI_CPOL_0, SPI_CPHA_1, SPI_MSB_FIRST);
15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?