今回は、I2C通信でIO入出力、つまりON/OFFできる接点を増やすことができる、便利なアイテム「MCP23017」を複数つなげたいときのお話です。
なんだかんだ言っても、IOエキスパンダ【MCP23017】1個で制御できる接点が16点増得るわけですが、「もうちょっと増やしたい…」なんてこともあるかもしれません。
そんな場合、MCP23017を複数個つなげたくなることもあるでしょう。そんな時ただマイコンボードに複数個のMCP23017をつなげるだけでは正しく認識されません。ポイントとなるのはI2C接続するアドレスを個別に設定してあげることです。
今回設定方法を完璧に理解できるように徹底解説しています。この記事だけ読んでもらえれば複数接続するのも簡単です。ぜひ最後まで読んでいってください。
MCP23017を複数つなげるときのI2Cアドレスの設定について理解できる。
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
まずはMCP23017のデータシート
MCP23017はMICROCHIP社が販売している、
正式名称 16-Bit I/O Expander with Serial Interface【日本語版:I/Oエクスパンダ】です。
データシートと呼ばれる取り扱い説明書のようなものがこちらにありますので、
MCP23017を使う場合は必ずダウンロードしておきましょう。
※日本語版ですが、注意書きで最新版は英語のほうを見てくださいと書いてありました。
http://ww1.microchip.com/downloads/jp/DeviceDoc/20001952C_JP.pdf↓英語版
https://ww1.microchip.com/downloads/en/devicedoc/20001952c.pdfMCP23017のアドレスの決まり方
データシートに記載されている内容を抜粋しました。
↓以下MICROCHIP社のデータシートより
3.3.1 I2Cデ バイス (MCP23017)の アドレス
指定
MCP23017 は 7 ビットのスレーブアドレス指定をサ
ポートするスレーブ I
2C インターフェイス デバイスで
す。読み出し / 書き込みビットは制御バイトに埋め込
まれます。スレーブアドレスには固定ビットが 4 ビッ
トとユーザ定義ハードウェア アドレスビットが3ビッ
ト (A2、A1、A0 の各ピン ) 含まれます。図 3-4 に制御
バイトのフォーマットを示します。
となっています。パット見てわかる人とわからない人がいると思うので、
いったん解説します。
ここでいうA2、A1、A0ピンというのは、ここのことです。
※切り欠きが上の状態でのピン配置です。
お手元のMCP23017をよく見て確認して下さい。
では、このピンをどうすればいいかというと、
3.3V入力=[HIGH:1]
GND=[LOW:0]
となるので、
例えばA0だけ3.3Vを入力、他のA1、A2はGNDに接続すると、
0100001となりますよね。
となると2進数から16進数に変換してあげると、
21となります。
なので、A0だけ3.3V入力するとI2Cのアドレスは21になる。という原理です。
表にしてみるとこんな感じですね。
A0 LOWorHIGH | A1 LOWorHIGH | A2LOWorHIGH | bin | hex |
---|---|---|---|---|
0 | 0 | 0 | 0100000 | 20 |
1 | 0 | 0 | 0100001 | 21 |
0 | 1 | 0 | 0100010 | 22 |
: | : | : | : | : |
1 | 1 | 1 | 0100111 | 27 |
ってな感じなので、20~27つまり
8個MCP23017が別々のアドレスで接続できることがわかります。
実際にアドレスをRaspberryPiで確認してみる
用意したもの
どれもネット通販で購入できるものですから、入手性は良好です。
一応念のためすぐに購入できるようにリンクを張っておきます。
ブレッドボード
今回使用するものは秋月のネット通販で購入したものですが、
もちろんAmazonや楽天などでも取り扱いがあります。
ただ注意点として、安すぎるブレッドボードは反りで失敗するので、
失敗したくない方は高品質に定評のあるサンハヤト製にしておきましょう。
↓したわたしが購入して失敗したブレッドボードの紹介を記事にしています。↓↓
RaspberryPi4B
RaspberryPi4Bは、標準的なThe・ラズパイと言える形の最新版です。
※最新版と言ってももう発売日が2019年なのでそこそこ時間が経っていますが…
特に何か特殊な事情がない限りこのモデルで大丈夫です。
ちなみにラズパイを購入した後にオススメするパーツ類などは
こちらの別記事で紹介しています。ぜひご覧ください。↓↓
MCP23017
こちらもブレッドボード同様秋月電子でネット通販で購入しました。
わたしが購入したときは1個140円だったかな…
ペットボトルの飲み物を1本我慢すれば購入できると思えば、
リーズナブルですね。
Amazonでも購入可能ですが、ちょっと値段が高いです。
いちおうAmazonのリンクは張っておきますので、
現在の値段もチェックしてみてください。
ぶっちゃけると秋月のほうが安いと思います…値段はご自身で確認してみてください…
ジャンパーワイヤー
MCP23017とRaspberryPiをつなぐ線がないと実験できませんから、
ジャンパーワイヤーを用意しましょう。そんなに本数はいりませんが、
ブレッドボードとセットであってもこまらない度で行くと上位に食い込むので、
ちょっと本数が少ないかな…と思ったら買い足しておきましょう。
ちなみに、ジャンパーワイヤー自体は自作が可能です。
実際にジャンパーワイヤーを自作してみた記事をこちらに上げているので、
興味があったら是非ご覧くださいね。↓↓↓
MCP23017とRaspberryPiを接続する
配線はこんな感じです。
注意点は3つありまして、
という感じですね。
とくにRESETピンへ3.3Vを供給し忘れないように注意です。案外忘れがち。
それから、必須ではないですが、SCLピンとSDAピンはまとめて配線可能です。
配線をスッキリさせたいならブレッドボードの±列を使用しましょう。
RaspberryPiで接続されているI2Cアドレス一覧を取得
配線図通りに配線すれば、このようにRaspberryPi上で認識されます。
一つ上のi2cdetectでアドレスが表示されていないのは、
3.3Vではなく間違えて5Vを入力していたためでした。
このアドレスの出し方ですが、
まずRaspberryPi側のI2Cを有効にして、再起動。
その後、
sudo i2cdetect -y 1
このように打ち込むと20と21が表示されたはずです。
原理がわかってしまえば、同じように3個目、4個目とつなげることもできますよね??
今回のまとめ
今回はMCP23017を複数つなげた時のアドレスについて解説しました。
MCP23017を1個繋げるごとに16点増えますから、
MAXつなげて16×8でGPIOが128点増えることになります。
そんなに使わないというか、使いきれないですよね….笑
ただ2,3個繋げたいことはあるかもしれないので、
アドレス設定の方法は覚えておいて損はないですね。
ちなみに、最後になりますが、今回I2Cアドレスとして紹介しましたが、
兄弟機種のMCP23S17(SPI通信)のアドレスの決め方も
データシート上まったく同じだったので、今回の設定方法がそのまま使えます。
というわけでアドレスの決め方の紹介でした。
コメント