自分で設計するRP2040基板

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています

これは何?

RP2040は、Raspberry Pi PicoのメインのICです。 Raspberry Pi Picoは安価で入手性も良い開発ボードですが、形状が固定されており、製品に組み込むことを考えると柔軟性に欠けます。

ということで、自分で基板を設計して、自由な形状のRaspberry Pi Pico的なものを作ってしまおうというのが今回の作例です。

もう一つの目的として、Raspberry Pi Picoへの理解を深めるというのもあります。

資料

RP2040は公式のリファレンスがとても親切で、なんと日本語のハードウェア設計のための資料が存在します。

https://datasheets.raspberrypi.com/rp2040/hardware-design-with-rp2040-JP.pdf

この資料の中でも「最小設計例」として、Raspberry Pi Picoとは違う独自の開発ボードを設計する例が紹介されています。

以前の挑戦

実は、これ以前にもRP2040を使った基板を作る前準備として、以下のボードを使ったことがありました。

github.com

これは https://x.com/nonnoise さんが設計された、RP2040搭載の開発ボードです。

RP2040を搭載した開発ボードを作るにあたり、心配だったのはRP2040をどうやってはんだ付けするかということです。 パッケージははQFN56ということで、小さなパッケージでかつ、ICの足が出ていないので、手ではんだ付けする難易度は高そうでした。

幸い我が家にはホットエアーガンがあるので、QFN56の足を1本ずつ手ではんだ付けするのではなく、はんだペーストを端子に塗布して、ホットエアーガンで基板とICを熱することで実装できるだろうという目論見はあったのですが、こういうのはやってみないと安心できません。

ということで、自分で基板を設計する前に、このボードで実装の難易度を確認しました。 必要な部品はAliExpessで購入したRaspberry Pi Pico風のボードから剥がすことで入手しました。(不要な基板から必要な部品を取り出して流用することを、界隈では【羅生門】などと言うみたいです)

結果としては、何とか実装できる!という感じでした。

設計

前述の2つの資料を参考にしつつ回路図を作成します。

この基板独自の特徴としては・・

  • I2C接続のOLED取付用の端子
  • USB Type-C
  • AMS1117による3.3V供給
  • Flash ICはW25Q16JVSSIQ
  • コンデンサ・抵抗のサイズは0603

設計と並行して、必要な部品を調達します。

家に無い部品に関しては https://www.lcsc.com/ で購入しました

Type-C端子のフットプリントに関しては UARTで書き込みできるCH32V003開発ボードを作った - inajob's blog で実験したものを活用しました。

RP2040のGND端子はICの真ん中にパッドがあるので、そこを裏からはんだ付けするためのスルーホール穴の開いたフットプリントを利用しました。(GitHub - 74th/rp2040-dev-boardを利用しました)

今回からKiCAD8を使うようにしたので白抜き文字のシルクや、日本語のシルクなども試しに入れてみました。

実装

今回はホットエアーガンを使った実装をしましたが、はんだペーストの塗布はメタルマスクを使用せずにシリンジ型のはんだペーストを手で乗せていきました。

まぁ、実装が難しいのはUSB Type-Cの端子と、QFN56のRP2040だけなので、まずはチャチャっとほかの部品を実装してしまいます。

全部実装して、少しテスターで確認したのちに、USBケーブルでパソコンにつなぐと・・・

パソコンにRP2040のストレージが現れました。成功か?!

と思って、適当なuf2ファイルを転送して書き込んでみたが・・ なぜかここからうまく動かず・・、リセットするとまたストレージが見えるのですが、uf2ファイルを書き込むと無反応に・・の繰り返しです。

果たして基板が悪いのか、周辺部品が悪いのか、RP2040が壊れたのか・・こうなると暗中模索です。

RP2040の不良を疑い(この疑いは間違いでした、後述)、手元にあった、動作しているRaspberry Pi Pico互換ボードから、RP2040を取り外しこのボードに取り付けてみたところ・・

動きました!!

RP2040不良だったのか・・と思いつつ、その怪しいRP2040を今度は逆にRaspberry Pi Pico互換ボードに実装してみたところ、こちらも問題なく動きました・・・

ということで、RP2040には問題がなく、再度はんだ付けしたら動いたということで、おそらくはんだ付け不良による動作不良だったようです。

ということで、基板、周辺部品、RP2040のすべてが問題ないことがわかりました。

動作確認

ここまでくればあとはRaspberry Pi Picoと同じように利用できます。 適当にCircuitPythonのuf2をダウンロードして、パソコンからRP2040のストレージに転送します。

その後Thonnyを使ってプログラミングを行いました。

I2C接続のOLEDを接続して動作確認してみます。

LibrariesからOLED制御用のライブラリをダウンロードします。 CircuitPythonのバージョンによってライブラリのバイナリが異なるので注意が必要です。

ダウンロードしたzipファイルのlibの中の以下のファイルをCircuitPythonのドライブのlib以下にコピーします。

  • dafruit_framebuf.mpy
  • adafruit_ssd1306.mpy

さらに、examples/framebuf/font5x8.bin をCircuitPythonのドライブのルートにコピーします。

そして、以下のプログラムをCircuitPythonのドライブのルートのcode.pyに書き込みます。

import board
import busio

import adafruit_ssd1306

i2c = busio.I2C(board.GP17, board.GP16)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

print("start")
display.fill(0)
display.text('hello world', 0, 0, 1)
display.show()

普通に動きました。

(関係ないけど、MicroPythonやCircuitPythonでさっと画面に日本語を表示するデファクトスタンダードな方法が欲しいなと思いました)

まとめ

RP2040を使った基板を設計して、実装し、動作確認ができました。

この経験を活用することで、自分のオリジナルのガジェットにRaspberry Pi Picoの形状や仕様にとらわれない、オリジナルのRP2040制御回路を構成できるようになりました。

最近使っているマイコンは、ATMega328, CH32V003, ESP32, ESP8266, RP2040ということで、ずいぶんと多くのマイコンを扱えるようになりました。まぁどれもちょっと触った程度なので、いろいろと活用していく中で理解を深めていきたいと思います。