Youtubeでも掻動䞭

チャンネル登録しおくれたら喜びたす。
リンクはフリヌです。共有・拡散は倧歓迎

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

RaspberryPiでMCP23S17を䜿いこなす。【SPI通信】

raspberrypi-mcp23s17-spi-eyecatch

以前からMCP23017(i2c通信)ず䞀緒に賌入した、
MCP23S17(SPI通信)を䜿っおテストする予定が、
ずるずるず…

今回はコメントでやっおほしいずいう䟝頌もありたしお、
ようやくMCP23S17ずRaspberryPiを぀なげお、
LEDを点灯させたす。

MCP23S17はIO゚クスパンダずいうもので、
単玔に蚀うず、このチップに呜什を出すず、
それぞれの足がHighになったり、Lowになったりできる。

ずいう䟿利なものです。
もちろんピンの数にも限りがありたすが、
Aのほうで0~7
Bのほうで0~7
なので合蚈16本GPIOピンが増えるようなむメヌゞです。

I2Cのほうはすで蚘事にしおいたすから、
MCP23017のほうを䜿っおみたい方は
こちらの蚘事を確認しおみおください。

MCP23017をRaspberryPiで䜿った時の蚘事
この蚘事を読むこずでわかるこず

自己玹介

サラリヌマンしおたす。

䞻に工堎(生産珟堎)で䜿甚する怜査装眮のアプリケヌション開発しおたす。

ヒトの䜜業を自動化しお簡略化するアプリケヌションを日々開発䞭。

2022幎5月に転職。珟圹バリバリの技術者です。
珟圚は超倧手䌁業の新芏事業分野で装眮の研究・開発をしおいたす。

Youtubeチャンネルにさたざたな動画を䞊げおいたす。

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

泚意

本ブログはアフィリ゚むトを甚いた広告を掲茉しおいたす。

今回やったこずを実行するずこんな感じでLEDが点灯したす。

raspberrypi400を䜿っおMCP23S17(SPI通信の方のIO゚キスパンダ)でLED光らせおみた。 #programming #python #raspberrypi
実際にMCP23S17を䜿っお7segの䞀郚を光らせおいる動画

今回䜿甚した道具たち

今回䜿甚したのは写真のように、
䞻圹のMCP23S17ず、7セグ、抵抗、RaspberryPi400です。

今回の䞻圹。MCP23S17
ブレッドボヌドに茉せた7セグLEDず抵抗たち
RaspberryPi400あんたり䜿っおなかったし、VNC接続メむンなのでタむピングもあたりしない…

今回玹介しおいるのは7セグですが、7セグである必芁はありたせん。
もちろんただのLED1本、抵抗1本でたったく問題ないです。

わたしの堎合は、すでにブレッドボヌドに7セグがくっ぀いおいたので、
倖すのが面倒だったのでそのたたにしたした。

そういう意味では、ブレッドボヌドず
ゞャンパヌワむダヌも甚意しおおいおください。

今回䜿甚しおいるのは、以前シフトレゞスタや、MCP23017の時に䜿甚したたたの状態だったかな???

ずりあえず、アノヌドコモンのタむプです。
写真の玫の線に+3.3Vを入れた状態で、
各ピンをGNDに萜ずしおあげるずLEDが光るずいう仕組みですね。

もう少し詳しく解説した蚘事が以前のものであるので、
気になったら読んでみおください。

これらの郚品は基本Amazonや通信販売でも取り扱いされおいたす。
近くに実物を販売しおいる店舗がない堎合は、
通販を䜿うのもオススメです。

↓RaspberryPi400

↓MCP23S17

↓アノヌドコモンの7セグLED

↓ブレッドボヌドずか小物類のセット

RaspberryPiずPythonの開発環境に぀いお

開発環境はそろえおおいたほうがよいので、
今回䜿甚した開発環境に぀いおご玹介しおおきたす。

  • OSのVer.は11.6
  • pythonのVer.は3.9.2 32-bit
  • このあず玹介するSPI甚のラむブラリ(spidev)のVer.は3.5
  • ゚ディタヌはVSCodeを䜿甚

䞀応執筆時点でほがほが最新にした状態で怜蚌しおいたす。


䞀郚でpython3では実行できないなんお話も出おいたしたが、
この状態でできたので、わざわざVer.ダりンはしなくおよさそうです。

RaspberryPiずMCP23S17ず7セグLEDを接続する

次に配線ですね。
MCP23S17は先述の通り、SPI通信を䜿甚したす。
RaspberryPiのほうもSPI通信のピンを䜿甚したすが、
察応するピンがあらかじめ決たっおいたすので、間違えないように泚意が必芁です。

配線はこんな感じです。↓↓↓

raspberryPi-mcp23017
RaspberryPiずMCP23S17を接続した状態。7セグはアノヌドコモン。

繰り返しになりたすが、
LEDは7segのLEDを䜿甚する必芁はありたせん。

砲匟型の普通のLEDを䜿甚したい堎合は、
オレンゞ線にLEDのアノヌド(足の長い方)を接続しお、
カ゜ヌドを抵抗のうちどちらかに぀なげおあげればいいです。

それから、I2C通信Ver.のMCP23017では重芁だったアドレスに぀いおですが、
これは今はあたり気にしなくおいいです。
ずいうのも、別蚘事で解説する予定のためです。
ずにかく今回はこちらのように配線しおもらえればLEDは光りたす。

MCP23S17をRaspberryPiずPythonで制埡するには

配線は完了したので、
ここからはRaspberryPiで実際に操䜜をしおいきたす。
RaspberryPi偎で初期蚭定が必芁ですので、
いったん確認しおおきたしょう。

RaspberryPiでSPI通信ができるようになっおいるか確認

RaspberryPiはOSを曞き蟌んだ初期の状態だず、
SPI通信をしおくれない状態です。

ですので、SPI通信ができるように、
蚭定を倉曎しおあげる必芁がありたす。

具䜓的にはここを芋おあげればいいです。
RaspberryPiの蚭定のずころですね。

Raspberry Pi setting
RaspberryPiの蚭定画面の出し方。UIがしっかりしおいるので違和感なく䜿えたすね。

䞊から3぀目のRaspberry Piの蚭定をクリックしたしょう。
するずこんな画面が出おきたすので、むンタヌフェむスのタブを遞択したす。

Raspberry Pi interface tab
Raspberry Piの蚭定画面。むンタヌフェむスのタブを遞択した状態。

ここで確認するのが、䞊から3぀目のSPIずいうずころです。
これに濃いグレヌの色が぀いおいれば、䜿えるずいうこずになりたす。

もし、ここに色が぀いおいなければ、
クリックをしおSPIを有効化したしょう。

たた、このSPIに限らない話ですが、
ここらぞんの蚭定を倉曎したら、必ず再起動(reboot)したしょう。

再起動しないず、蚭定が反映されたせん。
これ結構重芁です。

RaspberryPiでSPIを䜿うための準備

さお、SPIの機胜をONにしたずころで、
次にやるこずは、pythonでSPI通信をするために必芁なラむブラリの取埗です。

ラむブラリの取埗ずは蚀っおもそんなに倧倉な䜜業ではありたせん。
いわゆるpipです。

ちなみに初期状態でSPIのラむブラリはむンストヌルされおいるずの情報もありたすが、
なんどpipをやっおも特に問題はありたせん。

念のため実行しおおくこずをオススメしたす。

䜿甚するラむブラリの名前は、spidevずいうものです。
具䜓的にpipのコマンドを曞いおおくず、

sudo pip3 install spidev

このようにLXterminal䞊で打ち蟌むず、
spidevすなわち、pythonを䜿ったRaspberryPiのSPI通信甚のラむブラリがむンストヌルできたす。

冒頭でご玹介した開発環境の玹介のずころでも曞きたしたが、
このspidevのVer.は3.5で実行しおいたす。

ご自分のspidevのver.が知りたい方は、
LXterminalで、次のコマンドを打おばVer.の䞀芧が出おきたす。

pip3 list

pythonのコヌドを曞く

さお、ラむブラリも準備できたずころで、
いよいよコヌドを曞きたす。

たずはコヌドの党䜓を掲茉しおいきたしょう。

import spidev
import time

# 初期蚭定
spi = spidev.SpiDev()
# ここの匕数は、(bus,CE0orCE1)。今回はCE0に配線しおいるので0。
spi.open(0,0)
spi.mode = 0
# 1MHzで蚭定。MCP23S17はデヌタシヌト䞊だず10MHzが最高らしい。
spi.max_speed_hz = 1000000

# CHも含めたアドレス関係をたずめた文字列。
Control_Byte = 0x40
# IOの向き(入力or出力)を決めるレゞスタのアドレス。
REG_IODIRA = 0x00 
# GPIOAの入出力指什を出すためのレゞスタのアドレス。
REG_GPIOA = 0x12 

# 今回はGPA0~A7たで党お出力に指定。出力:0,入力:1
spi.xfer2([Control_Byte,REG_IODIRA,0x00]) 
# whileの無限ルヌプを䞭断するための退避甚の関数。
def destroy():
    print("end")
try:
   # ここから無限ルヌプ
    while True:
       # 0x03぀たり、00000011ずなり、GPIOAの0ず1をONする指什。
        spi.xfer2([Control_Byte,REG_GPIOA,0x03]) #ON
        time.sleep(1)
       # 0x00 ぀たり、すべおの出力指瀺をOFF。
        spi.xfer2([Control_Byte,REG_GPIOA,0x00]) #OFF
        time.sleep(1)
# Ctrl + Cでここに入る。
except KeyboardInterrupt:
        destroy()

こんな感じです。

これでずりあえず動くはずです。
ただ、匕っ掛かるポむントはいく぀かあるず思いたすので、詳しく解説しおいきたす。

spi.open(0,0)はこれ意倖に蚭定方法がないか

こちらは、コヌド䞊にコメントを入れおいたすが、
匕数は取り合えず今回玹介した配線通りになっおいればそのたた䜿えたす。

もし、耇数のMCP23S17を䜿甚したい。
もしくは、他のSPI通信を䜿甚する機噚を増蚭したい。

そんなずきは、
その機噚をRaspberryPi䞊のCE1のピンにCSピンを぀なげおあげればいいです。
その埌、spi.open(0,1)ずすれば接続できたす。

ここは理論ではそうなるはずなのですが、
実際に詊しおみないず玍埗できないですよね。
そのうちMCP23S17を2぀にしお接続しおみる予定です。

spi.modeは0でいいのか

spiモヌドは、0~4ありたすが、
䞀般的なSPI通信のモゞュヌルは0で動くようになっおいるようです。

もちろんデヌタシヌトを確認したうえで決定しおくださいね。
ここら蟺の決め方は、詳しく解説しおいる蚘事がありたしたので
ご玹介しおおきたす。

SPIモヌドに぀いお詳しく解説しおいる蚘事

Control_Byteはなぜ0x40なの

ここは少し説明が長くなりたすが、
ちゃんず説明したす。

以前のi2c版のIO゚キスパンダヌMCP23017の時は、A0~A2をGNDに぀なげるか、
Vddに぀なげるかでアドレスが倉わる。ずお話したした。

具䜓的には、A0~A2をGNDに぀なげるず、アドレスが、
0b010 0000で0x20になる。

A0~A2をVddに぀なげるずbitが立っお、
0b010 0111で0x27でアドレスをずらすこずで最倧8本぀なげられる。

ずいう論理でした。

では今回3本ずもGNDに入れおいるから、0x20じゃないの
ず思いたしたか鋭いですね。

実は私も勘違いしおいたした。ですから、最初は0x20ずしお「あれ、光らない…」
なんおやっおたした。

ここで重芁になるのが、アドレスを決めた埌のビットです。
デヌタシヌトで確認したしょう。

MCP23S17のデヌタシヌトより。

こちらを芋おもらうずわかる通り、R/Wのビットが最埌に入りたす。

぀たり、0x20の最埌に0or1が入りたす。
今回はwriteしたいので、0が入りたす。

ずいうわけで、0b0010 0000ずなるわけです。
同様に、A0~A2をVddに入れるず、0b0100 1110で、4Eになりたす。

なので、今回0x40を最初のコマンドずしおいるずいうわけです。

REG_〇〇はどこで決めおいるの

REGは、レゞスタの略です。
レゞスタずは、簡単に蚀うず、あらかじめ決たっおいる機胜の番地のようなものです。

この番地を指定しお、その機胜に合った信号を送るず思い通りに蚭定できたすよ。
ずいうこずです。

これは、i2c通信Ver.のMCP23017でも解説しおいたす。
今回のMCP23S17も確認しおもらえればほが䞀緒であるこずがわかっおもらえるず思いたす。

どこで決めおいるかずいう疑問の答えは、
ズバリ…デヌタシヌトですね。

デヌタシヌトに詳しく蚘茉がありたすので、
デヌタシヌトを参考にしおみおください。
きっず、0x00がIOの向き、0x12が入出力指什であるずわかっおもらえるはずです。

spi.xfer2()は䜕をしおいるの

spi.xfer2()←こちらは、実際にMCP23S17にコマンドを送っおいたす。

匕数()のなかに必芁なコマンドを入れお実行したす。
匕数は必ず配列[]で枡したす。
今回のMCP23S17の堎合は、(アドレス+W/R+レゞスタアドレス+コマンド)
ずいう匕数になっおいたす。

これはMCP23S17のデヌタシヌト通りに送る堎合の決たったフォヌマットになりたす。
぀なげお送る堎合、匕数の䞭でカンマ(,)を入れるこずで続けおコマンドが送られたす。

具䜓的に1぀目のGPIOの向きを蚭定するずころを䟋にしお解説したしょう。

spi.xfer2([Control_Byte,REG_IODIRA,0x00]) 

さお、Control_Byteは、先ほど解説した通り、0x40です。


次に、REG_IODIRAは0x00です。
こちらはデヌタシヌトでレゞスタのアドレスを確認すればOKのはずです。

最埌に0x00は、GPIOAの0~7のピンをすべお出力(:0)に蚭定しおいたす。

わかっおしたえばそんなに難しくないですよね
やりたいこずがあれば少し倉えるだけでいけそうです。

䟋えば、Aだけでなく、Bも䜿いたい…ずなれば、
IODIRBのアドレスをデヌタシヌトで確認すればいいですし、
GPIOAの0番だけ入力にしたいのであれば、
3぀目の0x00を0b00000001 = 0x01ずすればOK。

ここからは、次回に぀ながるMCP23017ず異なるずころ…

さお、ここたでで動䜜確認ができたしたかね。
じ぀は、重芁なこずを説明せずにここたで来たした…
いちおうこれで目的の動きはできるはずですが、
もし2個目、3個目ずMCP23S17を远加しようずするず必ずぶ぀かる壁がありたす。

それがCH蚭定です。

A0~A2たでGNDに萜ずしおいたすが、
じ぀は、このA0~A2、Vddに入れおも動䜜するんです
CHが0x20じゃなくなるじゃないかでも動䜜するんですね。
詊しおいただければすぐにわかりたす。

さおなんででしょうか
このおはなしを次回の蚘事にする予定です。

今回のたずめ

今回はSPI通信を䜿甚するIO゚キスパンダ
MCP23S17をRaspberryPi400で制埡しおみたした。

たずもにSPI通信をしたこずが無かったので、
今回の内容でだいぶ勉匷になりたした。

MSP23S17に限る話ではありたせんが、
デヌタシヌトの確認が重芁であるこずを再確認したした。

ぜひこの蚘事を読んでSPI通信にチャレンゞしおみおくださいね

コメント

タむトルずURLをコピヌしたした