| 1 | == I2C接続 GPIOエクスパンダ PCAL9555APWの使い方 == |
| 2 | |
| 3 | [https://www.switch-science.com/catalog/2352/ PCAL9555APW I2C GPIOエクスパンダ]の |
| 4 | 使い方の説明と、Aruduino向けのサンプルスケッチのページです。 |
| 5 | |
| 6 | PCAL9555APWは、マイコンとI^2^C通信によって接続される、汎用I/Oポート拡張モジュールです。 |
| 7 | |
| 8 | == 特徴 == |
| 9 | |
| 10 | 商品ページより一部抜粋したものを載せます。 |
| 11 | |
| 12 | * 動作電圧 1.65V~5.5V |
| 13 | * 16ポート(8ポート×2グループ)の汎用I/Oのコントロールが可能 |
| 14 | * 各ポートは独立に入力・出力の設定が可能 |
| 15 | * I^2C^用プルアップ抵抗用のパターンあり(抵抗は未実装) |
| 16 | * I^2^Cアドレス設定用はんだジャンパ×3あり |
| 17 | * ICからの割り込み出力信号あり |
| 18 | |
| 19 | == 使い方 == |
| 20 | |
| 21 | 本製品はI^2^C通信によって制御されます。 |
| 22 | 下に実体配線図を示します。 |
| 23 | |
| 24 | [[Image(PCAL9555APW-line.png,500)]] |
| 25 | |
| 26 | 本製品にはI^2^C通信時のプルアップ用抵抗は実装されていません。 |
| 27 | |
| 28 | ピンヘッダと合わせて各自で実装してください。 |
| 29 | |
| 30 | プルアップ抵抗は基板裏面のR1とR2に1608サイズの10kΩ程度のチップ抵抗をはんだ付けしてください。 |
| 31 | |
| 32 | また、ArduinoのWireライブラリを使用する場合は内蔵プルアップが有効になりますので、プルアップ抵抗を省略してもかまいません。 |
| 33 | |
| 34 | === 通信方法 === |
| 35 | |
| 36 | デバイスアドレスは、本製品における標準ではArduino向けの7bit表記で0x20です。 |
| 37 | |
| 38 | [[Image(image-1438315045486.JPG,500px)]] |
| 39 | |
| 40 | これは、基板上のジャンパA0,A1,A2を加工することで変更可能です。 |
| 41 | 販売時は3つともGND(0のシルク側)に接続されています。 |
| 42 | |
| 43 | ==== 送信 ==== |
| 44 | |
| 45 | デバイスアドレスを送信した後にコマンドバイトを送信します。 |
| 46 | このコマンドバイトは、後続のデータをどのレジスタが受け取るのかを決定づけます。 |
| 47 | コマンドバイトは、連続したレジスタアドレスではないので少し注意が必要です。 |
| 48 | |
| 49 | また、本デバイスには22個のレジスタが存在していますが、2個を1組とした11個の組として動作します。 |
| 50 | 11個のレジスタは後述する機能欄にて簡単に説明します。 |
| 51 | |
| 52 | ある一つのレジスタにデータを送信した場合、次のデータはペアとなっているもう一つのレジスタに書き込まれます。 |
| 53 | |
| 54 | 例えば、OUTPUT port registor1(コマンドバイト:0x03)にまずデータを送信した場合、 |
| 55 | 次のデータは、同じOUTPUT port registorであるOUTPUT port registor0(コマンドバイト:0x02)に書き込まれます。 |
| 56 | |
| 57 | データを書き込み続けると、同じレジスタ種内部でロールオーバーします。 |
| 58 | |
| 59 | 例えば、先述の例に追加して更にデータを書き込むと、書き込み対象のレジスタに相当するコマンドバイトは |
| 60 | 0x03->0x02->0x03->...という風にになります。 |
| 61 | |
| 62 | ==== 受信 ==== |
| 63 | |
| 64 | 読みだす際にも、同様にコマンドバイトを設定する必要があります。 |
| 65 | |
| 66 | また、送信の時と同様に2個をペアとしたレジスタを読み込みます。 |
| 67 | |
| 68 | 例えば、INPUT port registor1(コマンドバイト:0x01)からデータを読んだ場合、 |
| 69 | 次は、同じINPUT port registorであるINPUT port registor0(コマンドバイト:0x00)のデータを読みます。 |
| 70 | |
| 71 | データを読み込み続けると、同じレジスタ種内部でロールオーバーします。 |
| 72 | |
| 73 | 通信を行うときは以上の点について注意する必要があります。 |
| 74 | |
| 75 | |
| 76 | |
| 77 | === 機能 === |
| 78 | |
| 79 | 簡単な説明をします。詳細についてはデータシートを参照してください。 |
| 80 | |
| 81 | ==== INPUTレジスタ(0x00,0x01) ==== |
| 82 | |
| 83 | ICのピンの状態が反映されます。これはピンの入出力設定に左右されません。 |
| 84 | |
| 85 | ==== OUTPUTレジスタ(0x02,0x03) ==== |
| 86 | |
| 87 | Configrationレジスタによって出力に設定されたピンは、このレジスタの内容が反映されます。 |
| 88 | このレジスタから読みだした内容は、設定内容であり、実際の出力状態ではありません。 |
| 89 | |
| 90 | ==== Polarity inversionレジスタ(0x04,0x05) ==== |
| 91 | |
| 92 | 1にセットされたビットに対応するピンに関して、入力に設定されたピンの状態を反転してINPUTレジスタに反映させます。 |
| 93 | |
| 94 | ==== Configurationレジスタ(0x06,0x07) ==== |
| 95 | |
| 96 | 1にセットされたビットに対応するピンをハイインピーダンス入力に設定します。 |
| 97 | 0にセットした場合は出力です。 |
| 98 | |
| 99 | ==== Output drive strengthレジスタ(0x40,0x41,0x42,0x43) ==== |
| 100 | |
| 101 | 1ポートあたり2ビットの設定があります。出力に設定されたピンをドライブするために利用する回路の数を変更します。 |
| 102 | |
| 103 | ==== Input latchレジスタ(0x44,0x45) ==== |
| 104 | |
| 105 | 指定した入力ピンの状態変化を割り込みピンに反映させたり、INPUTレジスタに反映させたりします。 |
| 106 | |
| 107 | ==== Pull-up/pull-down enable(0x46,0x47) ==== |
| 108 | |
| 109 | 各ピンに対してプルアップ・プルダウンの有効・無効設定をします。 |
| 110 | |
| 111 | ==== Pull-up/pull-down selection(0x48,0x49) ==== |
| 112 | |
| 113 | プルアップ・プルダウンが有効なピンに対して、プルアップかプルダウンを設定します。 |
| 114 | |
| 115 | ==== Interrupt maskレジスタ(0x4A,0x4B) ==== |
| 116 | |
| 117 | 割り込みを検出するかどうかの設定です。 |
| 118 | |
| 119 | ==== Interrupt statusレジスタ(0x4C,0x4D) ==== |
| 120 | |
| 121 | 割り込みが検出されたかどうかの状態を示します。 |
| 122 | |
| 123 | ==== Output port configurationレジスタ(0x4F) ==== |
| 124 | |
| 125 | 出力に設定されたポート(0,1ごと)に対して、オープンドレイン回路を利用するかプッシュプル回路を利用するかを設定します。 |
| 126 | |
| 127 | == サンプルプログラム == |
| 128 | |
| 129 | PORT0,1の状態をArduinoIDEのシリアルモニタに表示し続けます。 |
| 130 | {{{ |
| 131 | /******************************************************************************* |
| 132 | // SWITCHSCIENCE wiki -- http://trac.switch-science.com/ |
| 133 | // PCAL9555APW Arduino Sample |
| 134 | *******************************************************************************/ |
| 135 | #include <Wire.h> |
| 136 | |
| 137 | #define PCAL9555APW_ADDR 0x20 // in 7bit for Arduino |
| 138 | |
| 139 | #define INPUT_REG 0x00 |
| 140 | #define OUTPUT_REG 0x02 |
| 141 | #define INVERS_REG 0x04 |
| 142 | #define CONFIG_REG 0x06 |
| 143 | #define OUTPUT_DRIVE 0x40 |
| 144 | #define INPUT_LATCH 0x44 |
| 145 | #define PULLUP_EN 0x46 |
| 146 | #define PULLUP_SEL 0x48 |
| 147 | #define INTRRPT_MASK 0x4A |
| 148 | #define INTRRPT_STAT 0x4C |
| 149 | #define OUTPUT_CONFIG 0x4F |
| 150 | |
| 151 | |
| 152 | void datasend(int,int,int *,int); |
| 153 | void dataread(int,int,int *,int); |
| 154 | |
| 155 | void setup() |
| 156 | { |
| 157 | Serial.begin(9600); |
| 158 | Wire.begin(); |
| 159 | } |
| 160 | |
| 161 | void loop() |
| 162 | { |
| 163 | int port_input[2]; //入力状態を取得する変数 |
| 164 | dataread(PCAL9555APW_ADDR, INPUT_REG, port_input, 2); |
| 165 | Serial.print("port0:"); |
| 166 | Serial.print(port_input[0], BIN); |
| 167 | Serial.print("\tport1:"); |
| 168 | Serial.println(port_input[1], BIN); |
| 169 | } |
| 170 | |
| 171 | void datasend(int id,int reg,int *data,int datasize) |
| 172 | { |
| 173 | Wire.beginTransmission(id); |
| 174 | Wire.write(reg); |
| 175 | for(int i=0;i<datasize;i++) |
| 176 | { |
| 177 | Wire.write(data[i]); |
| 178 | } |
| 179 | Wire.endTransmission(); |
| 180 | } |
| 181 | |
| 182 | void dataread(int id,int reg,int *data,int datasize) |
| 183 | { |
| 184 | Wire.beginTransmission(id); |
| 185 | Wire.write(reg); |
| 186 | Wire.endTransmission(false); |
| 187 | Wire.requestFrom(id, datasize, false); |
| 188 | for(int i=0;i<datasize;i++) |
| 189 | { |
| 190 | data[i] = Wire.read(); |
| 191 | } |
| 192 | Wire.endTransmission(true); |
| 193 | } |
| 194 | }}} |
| 195 | |