2019年3月10日 星期日

[Arduino] 實做 PCF8574 模組的輸出入功能(二)

本文在說明前文提到可以串聯多個 PCF8574 模組作為多個輸出入端口,這裏只實做 2 個模組串聯。模組端部留有公排針與母排針,串聯時只要將公排針插入母排針即可,記得還需要調整跳線帽重新定址,如下圖。


如果您對 PCF8574 模組還不熟悉,建議您先參閱
「實做 PCF8574 模組的輸出入功能(一)」 http://pizgchen.blogspot.com/2019/03/arduino-pcf8574.html


接線

Arduino       PCF8574 模組
VCC            VCC
GND           GND
A4               SDA
A5               SCL

將 2 個 PCF8574 模組串接,並調整第二個模組的跳線帽,第一個模組的位址是 0x38,第二個模組的位址是 0x39,如下圖。

第一個模組

第二個模組

兩個模組串接


實作範例一

這個實驗用 Arduino 讓第一個模組的 pin0 腳位和第二個模組的 pin7 腳位 LED 每秒閃一次,所以您還應該在那 2 個腳位設置 LED 電路,然後您可以看到閃爍的 LED,並在 Arduino 的序列視窗看到腳位的輸出狀態。

程式碼

#include "HCPCF8574.h"      //Include the HCPCF8574 library

#define I2C_ADD1 0x38       //I2C address of the first PCF8574 device
#define I2C_ADD2 0x39       //I2C address of the second PCF8574 device

HCPCF8574 Port1(I2C_ADD1);  //Create an instance of the library to control the first device
HCPCF8574 Port2(I2C_ADD2);  //Create an instance of the library to control the second device

void setup()
{
  Serial.begin(9600);
  Port1.init();             //Initiliase the first PCF8574 (all pins are set to high)
  Port2.init();             //Initiliase the second PCF8574 (all pins are set to high)
  Port1.pinMode(0, OUTPUT); //Set digital pin 0 on the first device to an output
  Port2.pinMode(7, OUTPUT); //Set digital pin 7 on the second device to an output
}


void loop()
{
  Serial.println("Port1 pin0 & Port2 pin7 is HIGH");
  Port1.pinWrite(0, HIGH);  //Set digital pin 0 on the first device high
  Port2.pinWrite(7, HIGH);  //Set digital pin 7 on the second device high
  delay(1000);                       //Wait 1 second

  Serial.println("Port1 pin0 & Port2 pin7 is LOW");
  Port1.pinWrite(0, LOW);   //Set digital pin 0 on the first device low
  Port2.pinWrite(7, LOW);   //Set digital pin 7 on the second device low
  delay(1000);                       //Wait another second
}


實作範例二

這個實驗用 Arduino 讀取 2 組 PCF8574AT 模塊的 P0~P7 腳位信號,所以您還應該在那些腳位總共設置 16 個按鈕電路,然後可以在 Arduino 的序列視窗顯示按鈕的開關狀態。

程式碼

#include "HCPCF8574.h"      //Include the HCPCF8574 library

#define I2C_ADD1 0x38       //I2C address of the first PCF8574 device
#define I2C_ADD2 0x39       //I2C address of the second PCF8574 device

HCPCF8574 Port1(I2C_ADD1);  //Create an instance of the library to control the first device
HCPCF8574 Port2(I2C_ADD2);  //Create an instance of the library to control the second device

void setup()
{
  Serial.begin(9600);
  Port1.init();             //Initiliase the first PCF8574 (all pins are set to high)
  Port2.init();             //Initiliase the second PCF8574 (all pins are set to high)
  for (int i=0; i<8 ; i++) {
    Port1.pinMode(i, INTPUT); //Set digital pin 0 on the first device to an output
    Port2.pinMode(i, INTPUT); //Set digital pin 7 on the second device to an output
  }
}

void loop()
{
   boolean State10 = Port1.pinRead(0);  //Read the port1 of digital pin 0
   boolean State11 = Port1.pinRead(1);  //Read the port1 of digital pin 1
   boolean State12 = Port1.pinRead(2);  //Read the port1 of digital pin 2
   boolean State13 = Port1.pinRead(3);  //Read the port1 of digital pin 3
   boolean State14 = Port1.pinRead(4);  //Read the port1 of digital pin 4
   boolean State15 = Port1.pinRead(5);  //Read the port1 of digital pin 5
   boolean State16 = Port1.pinRead(6);  //Read the port1 of digital pin 6
   boolean State17 = Port1.pinRead(7);  //Read the port1 of digital pin 7

   boolean State20 = Port2.pinRead(0);  //Read the port2 of digital pin 0
   boolean State21 = Port2.pinRead(1);  //Read the port2 of digital pin 1
   boolean State22 = Port2.pinRead(2);  //Read the port2 of digital pin 2
   boolean State23 = Port2.pinRead(3);  //Read the port2 of digital pin 3
   boolean State24 = Port2.pinRead(4);  //Read the port2 of digital pin 4
   boolean State25 = Port2.pinRead(5);  //Read the port2 of digital pin 5
   boolean State26 = Port2.pinRead(6);  //Read the port2 of digital pin 6
   boolean State27 = Port2.pinRead(7);  //Read the port2 of digital pin 7

   Serial.println("Port1="); 
   Serial.print(State10); Serial.print(State11); Serial.print(State12);   Serial.print(State13);
   Serial.print(State14); Serial.print(State15); Serial.print(State16);   Serial.print(State17);

   Serial.println("Port2="); 
   Serial.print(State20); Serial.print(State21); Serial.print(State22);   Serial.print(State23);
   Serial.print(State24); Serial.print(State25); Serial.print(State26);   Serial.print(State27);
   
   delay(1000);                       //Wait another second
}


採購資訊

PCF8574AT I/O擴展模塊 https://goods.ruten.com.tw/item/show?21908917689628





2019年3月3日 星期日

[Arduino] 實做 PCF8574 模組的輸出入功能(一)


此模組採用 PCF8574AT 芯片,具有 8 位輸入/輸出 (I/O) 擴展功能,您可以通過串行 I2C 接口擴展微控制器的可用數字 I/O 引腳。該器件具有8位準雙向 I/O 端口 (P0~P7),包括具有高電流驅動能力的鎖存輸出,可直接驅動LED。每個準雙向 I/O 都可以用作輸入或輸出,而無需使用數據方向控制信號。

3個板載跳線允許選擇最多8個 I2C 地址,這意味著最多 8 個模組 (64個 I/O 引腳) 可以連接到同一個 I2C 接口。該模組的每一端還具有方便的輸入和輸出接頭,因此可以簡單地以菊花鏈形式連接其他模塊,而無需額外的電線等。

註:模組附帶 PCF8574T 或 PCF8574AT 芯片,它會有不同的 I2C 地址,範圍如下:

PCF8574T = 0x20至0x27
PCF8574AT = 0x38至0x3F

PCF8574AT 模組 VCC工作電壓為 2.5~6V,低待機最大電流消耗 10μA,具有漏極開路中斷輸出功能,並與 Arduino 等大多數微控制器兼容,具有高電流驅動能力的鎖存輸出,閂鎖性能超過每 JESD 78 100 mA,Class II 。


Datasheet http://pdf1.alldatasheet.com/datasheet-pdf/view/18216/PHILIPS/PCF8574AT.html



接線

Arduino        PCF8574AT 模組
VCC             VCC
GND            GND
A4                SDA
A5                SCL


實作範例一

這個實驗用 Arduino 讀取 PCF8574AT 模組的 P0 腳位信號,所以您還應該在該腳位設置一個按鈕電路,然後在 Arduino 的序列視窗顯示按鈕的開關狀態。

程式碼

#include "HCPCF8574.h"    //Include the HCPCF8574 library

#define I2C_ADD 0x38      //I2C address of the PCF8574

HCPCF8574 Port(I2C_ADD);  //Create an instance of the library

void setup()
{
  Serial.begin(9600);     //Initiliase the Arduino serial library.
  Port.init();            //Initiliase the PCF8574 (all pins are set to high)
  Port.pinMode(0, INPUT); //Set digital pin 0 to an input
}

void loop()
{
  boolean State = Port.pinRead(0);  //Read the state of digital pin 0
  // Output the state to the serial port
  Serial.print("Pin 0 = ");
  if(State)
    Serial.println("HIGH");
  else
    Serial.println("LOW");

  delay(100);
}


實作範例二

承上個實驗一樣用 Arduino 讀取 PCF8574AT 模塊的 P0 腳位信號(您仍應該在該腳位設置一個按鈕電路),然後用 PCF8574AT 模塊的 P1 腳位讓 LED 隨著按鈕開關明滅(您應該在該腳位串接一個 LED 電路)。

程式碼

#include "HCPCF8574.h"    //Include the HCPCF8574 library

#define I2C_ADD 0x38      //I2C address of the PCF8574

HCPCF8574 Port(I2C_ADD);  //Create an instance of the library

void setup()
{
  Serial.begin(9600);     //Initiliase the Arduino serial library.
  Port.init();            //Initiliase the PCF8574 (all pins are set to high)
  Port.pinMode(0, INPUT); //Set digital pin 0 to an input
  Port.pinMode(1, OUTPUT); //Set digital pin 1 to an output
}

void loop()
{
  boolean State = Port.pinRead(0);  //Read the state of digital pin 0
  // Output the state to the serial port
  // Serial.print("Pin 0 = ");
  if(State)
    // Serial.println("HIGH");
    Port.pinWrite(1, HIGH);
  else
    // Serial.println("LOW");
    Port.pinWrite(1, LOW);

  delay(100);
}


後記

1.上電後的 PCF8574 模組腳位作為輸出時,是在 HIGH 的狀態,這個需要注意一下。

2.在 PCF8574 模組腳位作為輸出時,發現串接限流電阻 220R 的白發紅 5mm LED 並不是很亮,移除限流電阻後也沒達到正常亮度,如果真要用它來點亮 LED,應加裝電晶體來驅動 LED。


相關連結

實做 PCF8574 模組的輸出入功能(二) https://pizgchen.blogspot.com/2019/03/arduino-pcf8574_10.html


採購資訊

PCF8574AT I/O擴展模塊 https://goods.ruten.com.tw/item/show?21908917689628