EXI-0404 Arduino sample

Date : 2023-02-13

1. Overview

บอร์ดขยาย Input/Output รุ่น EXI-0404 มีคุณสมบัติดังนี้
  • บอร์ดขยาย I/O ด้วยชิพ MCP23008 สื่อสารผ่าน I2C bus ขยายพิ่ม I/O จำนวน 8 บิต
  • อินพุตขนาด 4 ช่อง (Bit 4-7) รับสัญญาณผ่านอ็อปโตไอโซเลเตอร์ ขนาดแรงดัน 12V-24V
  • กำหนดเลือกสัญญาณอินพุตแบบ NPN หรือ PNP ได้
  • รีเลย์เอาต์พุต พิกัดกระแส 3A จำนวน 4 ช่อง
  • สามารถปรับตั้งค่า Address ได้ด้วยจั๊มเปอร์ ภายในบอร์ด ต่อขยายได้สูงสุด 8 บอร์ด
  • เทอร์มินัลแบบถอดได้ เพื่อความสะดวกต่อการติดตั้งใช้งาน

2. MCP23008 GPIO assignment

3. ตัวอย่างวงจรการต่อใช้งาน

3.1. การต่อใช้งานกับ Arduino UNO

3.2. การต่อใช้งานกับบอร์ด AVR-AP3 (https://micro-research.co.th/avr-ap3-series.html)

4. การติดตั้งไลบรารี่ สำหรับ MCP23008 ภายในโปรแกรม Arduino IDE ดังนี้

4.1. เปิดหน้าต่าง Library Manager และพิมพ์ชื่อ mcp23008 ที่ช่องค้นหา ให้เลือกติดตั้ง (Install) ที่รายการ Adafruit MCP23008 Library ดังรูป

4.2. คลิกที่ปุ่ม INSTALL ALL เพื่อติดตั้งไลนรานรี่อื่นๆที่เกี่ยวข้องด้วยทั้งหมด

4.3. ติดตั้งไลบรารี่เสร็จเรียบร้อย จะสังเกตเห็นจัวอย่าง Example ดังรูป

5.ตัวอย่างโปรแกรม Arduino โดยกำหนดค่า Address = 0 หรือใส่ Jumper ที่ตำแหน่ง A0-A2 และจั๊มเปอร์ใช้งาน SDA, SCL pull-up resistor ดังรูป

5.1. โปรแกรม toggle เอาต์พุต Y0 ติด-ดับสลับกันทุก 1 วินาที


#include <Wire.h>
#include "Adafruit_MCP23008.h"

Adafruit_MCP23008 mcp;

void setup() {  
  mcp.begin();      		// use default address 0

  mcp.pinMode(0, OUTPUT);
}

void loop() {
  delay(1000);
  mcp.digitalWrite(0, HIGH);

  delay(1000);
  mcp.digitalWrite(0, LOW);
}
    

5.2. โปรแกรมควบคุมรีเลย์อาต์พุตให้ทำงานเป็นลำดับ เรียงจาก Y0 – Y3 และวนรอบต่อเนื่องกันไป


  /*********************************************************************
  Project     Sequence_Output_Y0_Y3
  Description Step sequence output relay Y0-Y3

  Programmer  Ukrit  Tantasutanon

  Hardware
    EXI-0404  MCP23008 , 4 Input / 4 Output expansion I/O
              Address 0 : A2-A0 = 000 => 0x20 (default)
              Address 1 : A2-A0 = 001 => 0x21
              ...              
              Address 7 : A2-A0 = 111 => 0x27

  Library
    Adafruit MCP23008 library  
********************************************************************
  MICRO RESEARCH TECHNOLOGY CO.,LTD. , https://micro-research.co.th
********************************************************************/

#include <Wire.h>
#include "Adafruit_MCP23008.h"

Adafruit_MCP23008 mcp;

char Output_State = 0x00;

void setup() {  
  // Use default address 0
  mcp.begin(0x20);              

  // Define output pin 
  mcp.pinMode(0, OUTPUT);
  mcp.pinMode(1, OUTPUT);
  mcp.pinMode(2, OUTPUT);
  mcp.pinMode(3, OUTPUT);
}

void loop() {
  // Check data boundary and initial value
  if ((Output_State & 0x0F)==0)
  { Output_State=1;
  }else {
    Output_State<<=1; 
  }

  // Update data to output
  mcp.writeGPIO(Output_State);
  delay(1000);
}
        

5.3. โปรแกรมอ่านสถานะอินพุต IN4-IN7 และ อัพเดทออกไปยังรีเลย์อาต์พุต Y0 – Y3


  /*********************************************************************
  Project     Input_To_Output
  Description Read input status then update to output relay

  Programmer  Ukrit  Tantasutanon

  Hardware
    EXI-0404  MCP23008 , 4 Input / 4 Output expansion I/O
              Address 0 : A2-A0 = 000 => 0x20 (default)
              Address 1 : A2-A0 = 001 => 0x21
              ...              
              Address 7 : A2-A0 = 111 => 0x27

  Library
    Adafruit MCP23008 library  
********************************************************************
  MICRO RESEARCH TECHNOLOGY CO.,LTD. , https://micro-research.co.th
********************************************************************/
#include <Wire.h>
#include "Adafruit_MCP23008.h"

Adafruit_MCP23008 mcp;

char Output_State = 0x00;
char Input_State;

void setup() {  
  // Use default address 0
  mcp.begin(0x20);             

  // Define output pin 
  mcp.pinMode(0, OUTPUT);
  mcp.pinMode(1, OUTPUT);
  mcp.pinMode(2, OUTPUT);
  mcp.pinMode(3, OUTPUT);
}

void loop() {
  // Read input status
  Input_State = mcp.readGPIO() & 0xF0;    	// Input : Active low
  Output_State = (~Input_State >> 4);     	// Output : Active high

  // Update data to output
  mcp.writeGPIO(Output_State);
  delay(10);
}