ラズベリーパイピコのPIOの実用的な観察


The Raspberry Pi Pico それが2021年初期にリリースされたとき、嵐によってマイクロコントローラ世界をとりました.ラズベリーパイ財団によって開発されて、リリースされる最初のMCUとして、世界はすぐに通知をしました(特にシングルボードコンピュータのラズベリーパイ線の否定できない成功を考慮して).
ピコの上でカバーを引っ張って、我々はすぐにそれがちょうどもう一つのMCUでなかったとわかりました.特に、プログラマブルI/O(PIO)と呼ばれる機能をサポートしています.
ラズベリーパイピコでピオに飛び込む前に、一歩大きくしましょう.

何がラズベリーパイピコですか?


ときにAppleの導入といくつかのノイズを作った覚えてApple Silicon ? 私が仮定するところでは、頬の動きの舌であったとして、ラズベリーパイ基盤はアップルを「ラズベリーシリコン」の下で彼ら自身の内部開発されたチップの最初のリリースと一致させました.そのチップはRP 2040です、そして、ピコはラズベリーパイ財団からRP 2040のための公式Devキットです:

イメージ信用ラズベリーパイ基盤.
予算レベル$ 4米ドルで売られて、ピコは同様に初心者と専門家のための大きなマイクロコントローラです.公式に知られていて、RP 2040として配布されて、Picoにはハードウェアやファームウェア機能が含まれます.
  • デュアルコアアームCortex - M 0 +プロセッサ;
  • オンチップRAMの264 KB
  • microPythonの組み込みサポート;
  • プログラマブルI/O(PIO)と呼ばれるこのことを含む広範囲のI/Oオプション.
  • Curious about using the Raspberry Pi Pico with cellular connectivity? Check out this Hackster tutorial on Adding Cellular to the Raspberry Pi Pico.


    あなたがそれを考慮するかもしれないとき、そして、最終的にあなたが実際にそれを使うだろうとき、PIOが何であるかについて、高いレベルの観察をしましょう.

    プログラマブルI/O(PIO)とは何か?


    すべてのMCUとSBCSはI 2 CとSPIのような通信プロトコルのサポートを含みます.RP 2040は、2つのX UART、2つのX SPIと2つのX I 2 Cコントローラで異なります.これは、ピコが簡単に一般的な周辺機器の多種多様な通信することができます.
    しかし、我々の多くは、我々がレガシー技術のまわりで解決策を構築しているか、単一のMCUで複数のSPI装置を使用しようとさえしているシナリオに遭遇しました.これはRP 2040のPIOサポートが助けに来るところです.
    PIOを使用すると、ゼロから独自のインターフェイスを作成することができます.理論では、あなたも、まだ想像されていない完全に新しいインターフェイスを構築することができます!
    もう少し技術的なレベルでは、PIOのインスタンスは主なCortex - M 0 +から別のコードを実行する小さなプロセッサに匹敵する.それで、以前に「bitbanging」プロトコル(CPUサイクルを消費する)によって成し遂げられたものは、PIOはCPUと独立しています.
    以下に、単一のPIOブロックについて説明します.

    イメージ信用RP 2040データシート.
    RP 2040では、各PIOのインスタンスには4つのステートマシンが含まれており、それぞれの命令は共有命令メモリに格納されている.このメモリは32命令を保持することができ、各ステートマシンはこれらの命令のいずれかを利用することができる.各状態マシンはピコのGPIOピンのいずれかを制御することもできます.
    PIOインスタンスのプログラミングは、期待するより簡単です.特別なアセンブリ命令に依存しているので、任意のエディタでコードを書くことができます.
    PIOインスタンスをプログラムするためにコードを書くことについて言えば、PIO言語は9つ、9つだけの命令から成ります.
  • IN ()
  • out ()
  • push ()
  • pull ()
  • move ()
  • irq ()
  • wait ()
  • jmp ()
  • set ()
  • 一見、これは多くのように見えることはありませんが、実際には、さまざまな機能を提供します.
    もっと実用的な問題にギアを切り替えましょう:いつ、私は実際にPIOを使用しますか?ほとんどのメーカーのプロジェクトのように、I 2 C、UART、およびSPIのオンボードのサポートがたくさんあるように、それは有効な質問です.しかし、PIOが重要な利点である場合があります.

    私はいつピオを使用しますか?


    これまでのボード上で利用可能なより多くのUART接続が必要なシナリオに遭遇?DVIビデオに直接出力する方法は?それとも、可能な任意のサポートライブラリを使用せずにハードウェア上の遺産の一部と通信しようとしている.
    これらは、ラズベリーパイピコにピオに深くダイビングのためのすべての有効なシナリオです.
    ラズベリーパイピコとは無関係だが、ピコを使用せずに上記を達成するハッカーのプロジェクトがあります🤔). Remotely control the Nintendo R.O.B. robot over cellular.

    イメージ信用ザックフィールド.

    どのように、私はピコの上でPIOを使いますか?


    私のような場合は、すべての日のブログの記事を読むことができる本当に何も多くを学ぶことはできません.そして、私はこのコメントは非常にメタ😅.
    個人的には、私は最善を学ぶことによって、私はコードをコピーして貼り付けることによって“行う”を開始し、行ごとにそれを介して作業.
    ピコとマイクロパイソンと共に働いているとき、私はPico MicroPython Examples repository Githubについて
    点の場合はpio ディレクトリには比較的簡単なPIOの例があります.
  • シングルGPIOをバインドするset() インストラクション
  • LEDを点滅させるために遅延を使用します
  • ステートマシンを実行して命令を実行し、オンボードLEDを点滅させます.
  • 完全な例はここで利用可能です(コメントを削除するために軽く編集されます).
    import time
    import rp2
    from machine import Pin
    
    @rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
    def blink():
        wrap_target()
        set(pins, 1)   [31]
        nop()          [31]
        nop()          [31]
        nop()          [31]
        nop()          [31]
        set(pins, 0)   [31]
        nop()          [31]
        nop()          [31]
        nop()          [31]
        nop()          [31]
        wrap()
    
    sm = rp2.StateMachine(0, blink, freq=2000, set_base=Pin(25))
    
    sm.active(1)
    time.sleep(3)
    sm.active(0)
    

    このコードサンプルは何ですか?


    PIOプログラムはblink() 関数と@rp2.asm_pio デコレータ.
    The wrap_target() and wrap() メソッドはループを作成します.The set() 関数はターゲット(pins ) and 1 はピンをハイに設定する0 後はLOWです).
    The nop() 関数は、人工的な遅延を20サイクルずつ作ります.
    それで、我々はGPIO PIN HIGH(LEDを照らす)をセットして、若干のサイクルのために休止して、それからピンを低く設定します(LEDをオフにして).これは人間の目にすばやく点滅します.

    結論


    あなたが非標準的な周辺機器に接続しているとき、ラズベリーパイピコの上のピオは非常に役に立つことがありえます.それは皆のためではありませんが、あなたが知られていないか、利用できない通信プロトコルを介して接続する必要がある場合は、すぐに恋に落ちるよ!
    チェックアウトしてくださいRP2040 datasheet より詳細な学習とこれのためにPIO emulator より高度な開発とデバッグシナリオ.
    ラズベリーパイピコでハッピーハッキング!👩‍💻