Youtubeでも活動中

チャンネル登録してくれたら喜びます。
リンクはフリーです。共有・拡散は大歓迎!

このボタンで簡単にチャンネル登録!
PR

RaspberryPiPico【ラズパイピコ】のIO出力を増やすIOエキスパンダー

raspberrypipico-mcp23017

今までにもMCP23017というIOエキスパンダーの使い方についてご紹介してきました。

今回はRaspberryPiPico(通称:ラズパイピコ)でIOエキスパンダーを使用する方法です。

RaspberryPiの時にも入力側のIOを増やす方法と、

出力側のIOを増やす方法で分けたので、

今回も出力側をとりあえずご紹介します。

入力側のIOを増やす方法については量が多くなるので別記事で掲載予定です。

今回使用するIOエキスパンダーは、I2C通信で動くICですから、

Arduinoと同様にI2C通信が可能なRaspberryPiPicoでも

使用可能!ということになります。

この記事を読むことでわかること

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

2022年5月に転職。現役バリバリの技術者です。
現在は超大手企業の新規事業分野で装置の研究・開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

それでは早速RaspberryPiPicoの出力点数をIOエキスパンダー(MCP23017)で増やしましょう。

今回使用したもの

今回必要なものはこちらです。

  • RaspberryPiPico
  • MCP23017(IOエキスパンダー)
  • 配線関係
  • LEDと抵抗

RaspberryPiPicoは最近では転売価格ではあるものの、

Amazonでも取り扱いがあります。

↓↓↓↓

急ぎで必要な場合や送料を考えると選択肢の一つになりそうです。

正規ルートで購入したい場合は、秋月電子、SwitchScienceあたりが有名どころです。

MCP23017に関しても、RaspberryPiPicoと同様で、

秋月電子なんかで購入したほうが安くて確実です。私は1個150円くらいで購入しました。

ちなみに実際に制御している様子をYoutubeにアップしています。↓↓↓

ラズパイピコでIO点数を増やす【IOエキスパンダ】
RaspberryPiPicoとMCP23017でIOピンを使わずにLED制御

RaspberryPiPicoとMCP23017(IOエキスパンダー)の配線

それでは用意出来たら配線です。

こちらのようにRaspberryPiとMCP23017とLED、抵抗を接続してください。

mcp23017-raspberryPico-connect
RaspberryPi picoとMCP23017の配線。※2023年8月14日修正済み。

ポイントとしては、今回はGPピンの8番と9番を使用します。

また、MCP23017のI2Cのアドレスは0x20となるような配線になっています。

配線ができたら確認してみよう

ここまで配線できたら、まずMCP23017が正しくRaspberryPiPico側で

認識できているかテストする必要があります。

テストするためにはPythonで次のようなコードを書いて実行します。

import machine
import time
sda_pin=machine.Pin(8)
scl_pin=machine.Pin(9)
i2c=machine.I2C(0,sda=sda_pin, scl=scl_pin, freq=400000)
print(i2c.scan())

これで[32]と表示されていれば問題なくMCP23017を認識しています。

ちなみに、先ほどアドレスは0x20になるように配線している。と言いましたが、

このi2c.scan()は10進数でアドレスを返します。ですから、

0d32=0x20というわけでアドレスは20ということです。

ここら辺のI2Cのアドレス関係は記事にしているので、

今後のためにも一度ご覧ください。

RaspberryPiPicoで実行するPythonのコード

さて、RaspberryPiPicoでIOエキスパンダーが正しく認識されているということで、

最後にIOエキスパンダーに接続したLEDを点灯させましょう。

今回使用しているIOエキスパンダー(MCP23017)は、

16点の入出力を増やすことができます。

ですから、LEDも16個繋げて制御可能ではあるのですが、

さすがにすべてつなげるのは面倒なので、

とりあえず増加させたIOピンの一つを制御してみることにします。

それではこちらのコードをRaspberryPiPicoに書いて実行してみましょう。

import machine
import time
sda_pin=machine.Pin(8)
scl_pin=machine.Pin(9)
i2c=machine.I2C(0,sda=sda_pin, scl=scl_pin, freq=400000)
print(i2c.scan())
def loop():
    while True:    
        i2c.writeto_mem(0x20,0x00,b'\x00')
        i2c.writeto_mem(0x20,0x12,b'\x01')
        time.sleep(0.1)
        i2c.writeto_mem(0x20,0x12,b'\x00')
        time.sleep(0.1)

def destroy():
    print('endloop')
if __name__=='__main__':
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

0.1Sec刻みで点滅を繰り返すコードです。

実用性については?ですが、制御としてはこれで理解できると思います。

i2c.writeto_mem

という関数がありますが、こちらはI2C通信用にあらかじめ準備されている関数です。

import machineをした時点で使用可能になります。

また、(0x20,0x00,b~~)という引数は、

MCP23017のレジスタアドレスに関連した情報を書き込むことになります。

具体的なレジスタアドレスなどはデータシートを見ればわかりますが、

面倒という場合には、以前わたしが書いたこの記事をご覧ください。

こちらの記事に各レジスタで使用するところについて詳しく解説しています。↓↓

まとめ

今回はRaspberryPiPicoの出力側のIOピンを増やす方法について解説しました。

MCP23017の使い方についてはRaspberryPiで使用したときの記事に詳しく書いているので、

今回は大幅に省略しています。

入力側のIOピンを増やす方法についてもそのうちUPするので、

楽しみに待っていてくださいね。

コメント

  1. 匿名 より:

    いつも有益な情報、ありがとうございます。
    実体配線図ですが、コードと一致していないようです。
    GP8(I2C0SDA),GP9(I2C0SCL)なので、ピンアサインは11Pinと12Pinではないでしょうか?

    • hobbyhappy hobbyhappy より:

      コメントいただきありがとうございます。
      ご指摘いただいたところ、おっしゃる通り間違っていましたので、
      修正してアップいたしました。
      ご指摘ありがとうございました。

タイトルとURLをコピーしました