WeMosを使ってみる

PCF8574


WeMos(ESP-12)にはGPIOが少ないので、PCF8574(IOエクスパンダー)を使ってGPIOを拡張してみます。
「PCF8564 arduino」のキーワードでGitHubを検索したらいくつかrepositoryが見つかりました。
それらの中で、このライブラリを使ってみま した。

PCF8574に は PCF8574 と PCF8574A があります。
どちらも非常によく似たチップですが、i2cアドレスが違います。
PCF8574   address map 0x20-0x27
PCF8574A address map 0x38-0x3f

出力ポートを拡張するスケッチは以下の通りです。
今回使用したのはPCF8574なので、i2cアドレスは0x20となります。
SDAとSCLは10Kの抵抗でPullUpしています。
/*
 * PCF8574 GPIO Port Expand
 * https://github.com/jptrsn/PCF8574
 *
 * PCF8574     -----WeMos
 
* A0          -----GND
 * A1          -----GND
 * A2          -----GND
 * VSS         -----GND
 
* P0     ----------------- OUT0
 * P1     ----------------- OUT1
 * P2     -----------------
OUT2
 * P3     -----------------
OUT3
 * P4     -----------------
OUT4
 * P5     -----------------
OUT5
 * P6     -----------------
OUT6
 * P7     -----------------
OUT7
 * VDD         -----5V
 *
 * SDA         -----D2(GPIO_4)
 * SCL         -----D1(GPIO_5)
 *
 */

#include <Pcf.h> // https://github.com/jptrsn/PCF8574
#include <Wire.h>

// Array of 8 elements corresponding to each individual pin on the PCF8574.
//const int led[] = {1, 2, 4, 8, 16, 32, 64, 128};

Pcf pcf = Pcf(0x20); // 0x20 is the default address for the PCF8574 with all three input pins tied to ground.

void setup(){
  delay(1000);
  Serial.begin(9600);
  pcf.writeData(255); // turns on all 8 pins
  delay(1000);
  pcf.clearData(); // turns off all 8 pins
}

void loop(){

  // turn on pins 0 through 7 one at a time
  for (int i = 0; i < 8; i++){
    pcf.writePin(i, 1);
    delay(500);
  }
 
  // toggle each pin on and off once
  for (int i = 0; i < 8; i++){
    pcf.togglePin(i);
    delay(500);
    pcf.togglePin(i);
    delay(500);
  }
 
}

入力ポートを拡張するスケッチは以下の通りです。
/*
 * PCF8574 GPIO Port Expand
 * https://github.com/jptrsn/PCF8574
 *
 * PCF8574     -----WeMos
 * A0          -----GND
 * A1          -----GND
 * A2          -----GND
 * VSS         -----GND
 * P0     ----------------- IN0
 * P1     ----------------- IN1
 * P2     ----------------- IN2
 * P3     ----------------- IN3
 * P4     ----------------- IN4
 * P5     ----------------- IN5
 * P6     ----------------- IN6
 * P7     ----------------- IN7
 * VDD         -----5V
 *
 * SDA         -----D2(GPIO_4)
 * SCL         -----D1(GPIO_5)
 *
 */

#include <Pcf.h> // https://github.com/jptrsn/PCF8574
#include <Wire.h>

// Array of 8 elements corresponding to each individual pin on the PCF8574.
//const int led[] = {1, 2, 4, 8, 16, 32, 64, 128};

Pcf pcf = Pcf(0x20); // 0x20 is the default address for the PCF8574 with all three input pins tied to ground.

void setup(){
  delay(1000);
  Serial.begin(9600);
}

void loop(){

  byte pcfData = pcf.readData();
  Serial.print("pcfData=");
  Serial.println(pcfData,BIN);

  // store the state of each pin in an array of booleans
  boolean pinState[8] = {0};
  Serial.print("pinState=");
  for (int i = 0; i < 8; i++){
    pinState[i] = pcf.readPin(i);
    Serial.print(pinState[i]);
    Serial.print(",");
  }
  Serial.println();
  delay(2000);

}

MCP23017やMCP23S17の様に入出力の方向を特に指定する必要はありません。

UNOやNANOの場合は、こちらのライブラ リで入力割り込み処理ができるのですが、
WeMosでは割り込みの機能が無いのでコンパイルエラーとなります。

続く...