EasyEDA で Raspberry Pi Pico/Pico2 Logic Level Shifterの設計と制作

Raspberry Pi Picoの最大の欠点はI/Oが3.3Vなところ。

さて、Arduinoは5Vの電源に5VのI/Oを持っていて使いやすいのですが、Raspberry Pi Picoは5Vの電源に3.3VのI/Oとなり、5Vを使うには変換回路を付けなければいけません。
(いや、厳密にはTTLデバイスとして動くけど信頼性は無いですよ。5V入力も危ないと思います。)
解決方法は
  1. 専用レベルコンバーターIC
  2. 高速MOSFETと抵抗
  3. 一方向だけなら高速トランジスターと抵抗
このくらいでしょうか。
秋月電子でもレベルコンバーターICやモジュール基板は売られています。
これをRaspberry Pi Picoに付けるわけですが大量のI/Oを使いたい場合、面積がどんどん大きくなってしまい、Arduino R3基板と同じくらい大きくなってしまいます。
PICOが電源5Vで5Vが使えないってなんだそれ。(誰だ設計者出てこい!)

これはどげんかせんといかん。


まず考えたのはNchMOSFET(BSS138)ですね。基本回路は1ビット単位で設計できるので配置さえ工夫すれば小さく設計できそうです。
  • SPIは1,2,4,5ピン
  • I2Cは1,2ピン
  • UARTは1,2ピン
  • A/Dは31,32,34ピン
pdfの画像に追記しました。





ピン番号とラベル名とで混同しそうなので注意してください。
つまりですね。
全26本のGPIOピンそれぞれにBSS138を1個搭載し、GP0~3, 26~28はジャンパーでバイパス(3.3V直通)可能
とすればArduino UNO R3からRaspberry PI PICOの性能を補完する計画となります。(詳しくは後述)

PICO
DIP40

  • GNDが8本ありますが周辺のピンは3.3Vなので「きっと3.3Vを短距離で吸うためのGND」と勝手に解釈して3.3Vとの間に積層セラミックコンデンサーを配置しました。
  • 電源は5Vで39番ピンです。SDカード書き込みで不安定にならないように100uFを入れています。ここにアルミ電解コンデンサーを使うとR社の様に故障するので導電性高分子アルミ固体電解コンデンサーを使いましょう。


  • 40番ピンはUSBからの電源なのでUSB給電のセンサーや充電系回路用なので39番ピンと関係なくスルーしています。
  • 37番ピンの3V3_ENはLowで36番ピンから3.3Vが出力されます。3.3Vにも不安定にならないように100uFを入れています。
  • 35番ピンはA/Dの基準電圧として3.3Vを使用します。これはセオリー通りの使用法です。
  • 30番ピンのRUNはRESETとして使用できますが、通電で動作する使い方しかしないので必要ありませんしPICOにはRESETスイッチが付いています。ここに5Vを流すと壊れる可能性があるのでレベル変換を用意しています。
これが27回路あるのです。すべてプルアップ状態に要注意
  • ジャンパーは中心がDIP40への信号でPICOからの信号線は3~で5V用は5~となっていて3.3Vを繋げるか5Vを繋げるかしないと信号は切断されています。必ずご自身で設定してください。このジャンパー3端子が全て半田でショートすると3.3Vと5VがショートすることになるのでおそらくPICOが壊れます。
  • 別の説明をするとジャンパーにはPICOの信号を5Vに変換した線が用意され、DIP40にはどちらの電圧を使うか選択する必要があります。中心と左のショートは5V、中心と右のショートは3.3Vです。OK?



39.1 mm* 55.9mm ヘッダー無しPico未半田付けの状態。5Vは39pinかターミナルブロック左。右はGND。


Arduino Uno R3とこの基板を搭載したPICOとの機能比較

出でよAI
ここから
-----------------

1. コアスペック比較表

項目Arduino Uno R3Pico + 全ピンBSS138基板
5V対応I/O数20本 (デジタル14 + アナログ6)26本すべて (全GPピンを5Vレベル変換可能)
うち3.3V専用ピンなし4本 (GP0~3) + 3本 (26~28) ※ジャンパー切替で選択可能
レベル変換回路不要 (ネイティブ5V)BSS138×26個 (チャンネル独立・双方向)ただし強制プルアップ状態なので要注意
変換方向自動双方向 (I2C / UART / 1-Wire すべて対応)
変換速度の上限BSS138: 2MHzまで (I2C 400kHz/ SPI 2MHz 問題なし)
アナログ入力6ch (10bit, 0-5V)3ch (12bit, 0-3.3V) ※5Vセンサーは抵抗分圧が必要
出力電流能力ピンあたり40mAPico側から見て: 3.3Vで8mA程度
変換後5V側: 非常に小さい(信号レベルのみ。負荷は別電源で駆動)
最大動作周波数16MHz133MHz (デュアルコア)

2. 接続・使用性比較表

項目Arduino Uno R3Pico + 全ピンBSS138基板
5Vセンサー接続直結OK変換基板を経由してOK (自動双方向)
3.3Vセンサー接続レベル変換が必要 (←逆変換が必要)ジャンパーで直接接続可能 (GP0~3, 26~28を選択)
I2Cデバイス (例: LCD, BME280)直結 (5V版デバイスなら)自動双方向変換で両電圧対応可能 (一番の強み)
UART (例: GPS, Bluetoothモジュール)5V版モジュールなら直結5V版 / 3.3V版 両方対応可能 (ピンごとに電圧選択可)
5Vサーボモーター制御信号ピン直結 (電源は別)変換基板経由で信号のみ送信 (問題なく動く)
5V LED (WS2812など)直結変換基板経由で送信 (3.3Vでは不安定な5V版LEDも駆動可能)

3. 特別な注目ポイント

■ あなたの基板の最大の強み

26ピンすべてを5V系か一部3.3V系に割り当て直せる

Arduinoではできません。例えば:

GP0(3.3V直通)→ 3.3V SPIフラッシュメモリ
GP1(変換後5V)→ 5V超音波センサー HC-SR04
GP2(変換後5V)→ 5Vサーボ信号
GP26-28(3.3V直通)→ 3.3Vアナログセンサー(圧力、照度など)

このような異電圧デバイスの混在を、抵抗や追加基板なしで実現できる唯一無二の利点です。

■ Arduinoに対して勝っている点: I/Oピン数・処理性能・電圧選択の柔軟性

Arduinoに劣っている点: 5V出力電流の小ささ(負荷駆動は別途必要)・高速SPI通信の限界・初心者向け情報の多さ



4. 結論:この基板で何ができるのか?

使用シーンArduino R3あなたのPico + 基板
5Vセンサーだけのシステム◎ (そのまま)◎ (変換経由)
3.3Vセンサーだけのシステム△ (変換基板が必要)◎ (ジャンパーで直結)
5V / 3.3V 混在システム△ (複数の変換基板が必要)◎ (1枚で完結)
高速処理が必要なプロジェクト△ (16MHzで遅い)◎ (133MHzデュアルコア)
教育・学習向け (教材が多い)○ (ドキュメントは自分で用意)

5. 一言でまとめると

「Arduinoの『5Vネイティブの手軽さ』を捨ててでも、Picoの『処理性能』と『電圧混在システムへの柔軟性』を手に入れる」ための極めて合理的な自作基板

Arduinoは「5Vだけで良い」という制約の中で最も楽。
あなたの基板は「5Vも3.3Vも自由に扱いたい上級者」のためのツールです。

プルアップ抵抗がすでに実装済みとのことですので、これで安心してI2CやUARTの混在システムを構築できます。特にI2C接続のマスターとして、この基板は非常に強力です。

-----------------
ここまで

133MHz,26ポート16bitPWMは使いたい所です。ただしA/Dが3つだったり26ポート3.3Vだったりと弱点を克服しないと面白い物を作れませんよ。
こだわりではないですがわざと厚みがあります。薄いと物理的に強度不足になります。
極めて横線が多く2種類の電源線が立てに必要なので2層に収まりませんでした。
4層と厚みはメリットばかりでデメリットが値段位しか無いので問題ありません。GHzオーダーでもないですし。

作ってみてテストに問題発生?

ヘッダーなしPicoだとテストが困難です。Pico Hを使いました。
ほぼ接触しているとはいえヘッダーなしPicoではヘッダーを半田付けするしかない。
自分用に1枚半田付けした。

from machine import Pin
import time

ledx = Pin(25, Pin.OUT)# オンボードLED
led0 = Pin(0, Pin.OUT)# テストするGPIOピンのリスト(実際に存在するピンのみ)
led1 = Pin(1, Pin.OUT)
led2 = Pin(2, Pin.OUT)
led3 = Pin(3, Pin.OUT)
led4 = Pin(4, Pin.OUT)
led5 = Pin(5, Pin.OUT)
led6 = Pin(6, Pin.OUT)
led7 = Pin(7, Pin.OUT)
led8 = Pin(8, Pin.OUT)
led9 = Pin(9, Pin.OUT)
led10 = Pin(10, Pin.OUT)
led11 = Pin(11, Pin.OUT)
led12 = Pin(12, Pin.OUT)
led13 = Pin(13, Pin.OUT)
led14 = Pin(14, Pin.OUT)
led15 = Pin(15, Pin.OUT)
led16 = Pin(16, Pin.OUT)
led17 = Pin(17, Pin.OUT)
led18 = Pin(18, Pin.OUT)
led19 = Pin(19, Pin.OUT)
led20 = Pin(20, Pin.OUT)
led21 = Pin(21, Pin.OUT)
led22 = Pin(22, Pin.OUT)
led26 = Pin(26, Pin.OUT)# 26-28はADCピン
led27 = Pin(27, Pin.OUT)
led28 = Pin(28, Pin.OUT)

while True:
#     print("Hello, World!")
    time.sleep(2)
    ledx.toggle()
    led0.toggle()
    led1.toggle()
    led2.toggle()
    led3.toggle()
    led4.toggle()
    led5.toggle()
    led6.toggle()
    led7.toggle()
    led8.toggle()
    led9.toggle()
    led10.toggle()
    led11.toggle()
    led12.toggle()
    led13.toggle()
    led14.toggle()
    led15.toggle()
    led16.toggle()
    led17.toggle()
    led18.toggle()
    led19.toggle()
    led20.toggle()
    led21.toggle()
    led22.toggle()
    led26.toggle()
    led27.toggle()
    led28.toggle()
    
これを動かして3.3Vと5Vを確認。
USBからの給電で5Vも出力されています。
もちろん5V給電で5Vも出力されています。
最初に5V部分にEMIフィルターを付けようか迷ったのですがUSB給電の回路もあるので諦めました。

もしキットにしたら必要な追加部品は?

ターミナルブロック2P緑タテ小 @35
OS-CON SEPC100uF16V @40 x2
ピンヘッダー1x40 @35
分割ロングピンソケット(メス) 1x40 @100 色によっては@80

やはりコネクターは高額なのです。
Picoと電源線とUSBケーブルは別途必要。


コメント