モジュール買って届いてサンプル動かしてハッピー! って時は気づかなかったんですけど、サンプルスケッチってだいたいが「その部品・モジュールがとりあえず動くよ」という用途で作られています。つまりその後、「いろいろなモジュールを組み合わせるところまで面倒みるとは言ってない」わけです。
使っている・使いたいモジュールが I2C 接続なら 98% 困りません。SPI 接続でもまぁ大丈夫なはずです。問題はパラレル接続のモジュールです。これがだいたい困ります。
サンプルスケッチ動かすだけでほぼ IO ポート使いつくされてるので、I2C デバイスなんかたったの 2 ピン(Arduino 328P なら A4, A5 固定)が空いてさえいればいいのですが使えない時があります。もはやパラレル接続のモジュールを選ぶのは避けたほうがよいくらいは言っていいと思います。でもグラフィック液晶はだいたいパラレル接続なんですよね。
I/O エキスパンダ
そこで便利なのが I/O エキスパンダ IC。
これは MCP23017 という I2C 接続のものです。秋月で 110 円。SPI のは MCP23S17 で 120 円。単純に「Arduino は 1 バイトのレジスタを 3 つ持っている」と言えるのであれば、この IO エキスパンダは 1 バイトのレジスタを 2 つ持っているということができます。つまり入出力ピンを 16 本増やす事ができるということです(もちろん各々のピンについて I/O を選ぶ事ができます)。
※一応:328P でいう 3,5,6,9,10,11 ピンのようにハードウェア PWM は出ません。ので analogWrite はできません。あくまでも digitalRead / digitalWrite できるポート(ピン)が増やせるという IC です。
これを使えば原理的にはおそらく I2C →シリアル接続ゥ~なアダプタが作れると思うのです。”できる” 事が可能なのかすら分からないのですが、いまエネルギー高まってるので頑張ってみます。
完成するまでしばらく時間かかると思うので、あまりもので簡単接続ボードを作っておきました。これで煩わしさ、おっくうさがかなり少なくなるはずです。
部品取りとか基板眺め中にたまに見かける、このハンバーガーショップみたいなのいったいなんだろうと思っていたのですが、マイクロチップ社のロゴというのをようやく知れました。またひとつ賢くなったよ(´~` )
テスト
Arduino で MCP23017 IC を使うにはピンとか耐圧とか見ておきたいのでデータシート参照は大切ですが、探すとライブラリがありますね。モジュールどころか IC のライブラリまであるのか!イタレリツクセリですな! と思いましたが実体はモジュールの IC を動かしてるわけで、「モジュールのライブラリがある」という認識が間違っていたんですね。
I2C のアドレスをピンの HIGH / LOW で選択できますが1石しか使わないので、すべて GND につなげておきます。
出力
このモジュールを使ってまず出力ができるのかを体験しておきます。
Adafruit_MCP23017 mcp;
mcp.begin();
mcp.pinMode( 0, OUTPUT);
的な要素を
mcp.digitalWrite( 0, ピカピカ );
みたいにしてブレッドボード上の L をチカさせてワーイ(^o^) を済ませておき IC が通信できているかをサラッと確認しておきます。ここで動かないと運が悪いです。
また、こういう IC の出力は電源ピンではないので 10mA は引っ張りすぎ、のj、引っ張りすぎなのじゃ~ という感覚を持つのも大事ですね。
で、問題は入力です。インピーダンスがどうのこうので思ったようにいかない事がたまにあります。
入力
入力のテストとして考えたのが「2、3 ピンを使って 0 ピンをスイッチする」です。こうしたのは深く考えたわけではなく、操作が楽で結果がわかりやすくかつノイズ乗りそうと思ったからです。
で、mcp.pinMode( 2, INPUT ) とすると案の定ノイズ乗って判定できませんでした。here is Sapporo-city なので 50Hz 攻撃みたいなやつ食らって常時点滅してます。
機械的にオープンになる回路では INPUT ではダメという事です。
でごちゃごちゃを飛ばして、setup 部が
mcp.pinMode( 0, OUTPUT );
mcp.pinMode( 2, INPUT_PULLUP );// this is it
mcp.pinMode( 3, INPUT_PULLUP );
こんな感じで、loop() 部が
if ( mcp.digitalRead( cur )== HIGH ) {
if (cur==2) {
cur= 3;
mcp.digitalWrite( 0, HIGH );
} else {
cur= 2;
mcp.digitalWrite( 0, LOW );
}
};//cur は byte のグローバル変数で初期値 2 です。
こんな感じ。
で 5V に 30kΩ をシリーズしてワイヤをちょん、ちょんとしてもハーイ何も起こりません接触不良を疑ってぐにぐにしたり指で触れてみたりしても点きません
これ、抵抗噛ませるとうまくいかないんですね。1kΩ はもちろん 100Ω でもダメでした(見えない速度で点灯→消灯してるのではと思ってシリアルに println してみて、無反応だったのを確認済みです)。
プルアップしてるんですけど電圧測ると 90mV 付近になってて詳しくはよくわからないんですがまぁ壊れないでしょう、大丈夫でしょう(ツメ甘いなぁ~)
無抵抗 5V で接触させてみるときちんとスイッチできました。
モジュールに接続しているときはロジックの HIGH / LOW になるはずなのでここは INPUT のほうが良いかもしれませんが、それはまた次の段階の実験で判断します。
これで入出力のチュートリアルは終了ということで良いでしょう。
これからこの IC を使ってコードを書き、グラフィック LCD をドライブしていきます。
ebay は見ちゃだめです。
0コメント