今までにもMCP23017というIOエキスパンダーの使い方についてご紹介してきました。
今回はRaspberryPiPico(通称:ラズパイピコ)でIOエキスパンダーを使用する方法です。
RaspberryPiの時にも入力側のIOを増やす方法と、
出力側のIOを増やす方法で分けたので、
今回も出力側をとりあえずご紹介します。
入力側のIOを増やす方法については量が多くなるので別記事で掲載予定です。
今回使用するIOエキスパンダーは、I2C通信で動くICですから、
Arduinoと同様にI2C通信が可能なRaspberryPiPicoでも
使用可能!ということになります。
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
それでは早速RaspberryPiPicoの出力点数をIOエキスパンダー(MCP23017)で増やしましょう。
今回使用したもの
今回必要なものはこちらです。
RaspberryPiPicoは最近では転売価格ではあるものの、
Amazonでも取り扱いがあります。
↓↓↓↓
急ぎで必要な場合や送料を考えると選択肢の一つになりそうです。
正規ルートで購入したい場合は、秋月電子、SwitchScienceあたりが有名どころです。
MCP23017に関しても、RaspberryPiPicoと同様で、
秋月電子なんかで購入したほうが安くて確実です。私は1個150円くらいで購入しました。
ちなみに実際に制御している様子をYoutubeにアップしています。↓↓↓
RaspberryPiPicoとMCP23017(IOエキスパンダー)の配線
それでは用意出来たら配線です。
こちらのようにRaspberryPiとMCP23017とLED、抵抗を接続してください。
ポイントとしては、今回は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するので、
楽しみに待っていてくださいね。
コメント
いつも有益な情報、ありがとうございます。
実体配線図ですが、コードと一致していないようです。
GP8(I2C0SDA),GP9(I2C0SCL)なので、ピンアサインは11Pinと12Pinではないでしょうか?
コメントいただきありがとうございます。
ご指摘いただいたところ、おっしゃる通り間違っていましたので、
修正してアップいたしました。
ご指摘ありがとうございました。