EXI-16IO Update Arduino sample

Date : 2022-10-17

1. Overview

อ้างอิงจากตัวอย่างโปรแกรมซึ่งได้เขียนไว้ก่อนหน้านี้ จาก Link https://micro-research.co.th/mrtblog/exi-16io-series-arduino-sample-code/ ซึ่งเป็นตัวอย่างการใช้ Arduino ร่วมกับไลบรารี่ของ Adafruit_MCP23017 เป็น Version 1.x โดยปัจจุบันผู้พัฒนาไลบรารี่ ได้อัพเดทเป็น V2.x และมีบางส่วนที่เปลี่ยนแปลงได้จากเดิม จึงต้องปรับแก้ไขโปรแกรมโค้ดบางส่วน เพื่อให้ใช้งานได้

2. การติดตั้งไลบรารี่ Adafruit MCP23017 Arduino Library

2.1. เลือกที่เมนู Sketch >> Include Library >> Manage Libraries… ดังรูป

2.2. พิมพ์ชื่อ MCP23017 ที่ช่องค้นหา และกดปุ่ม Enter จะปรากฏรายชื่อ Adafruit MCP23017 Arduino Library ให้คลิกปุ่ม Install เพื่อติดตั้ง ดังรูป

ไลบรารี่ที่ใช้งานนี้อาจต้องใช้งานร่วมกับไลบรารี่อื่นๆ ที่เกี่ยวข้องซึ่งอาจแสดงหน้าต่างขึ้นมา ให้คลิกปุ่ม Install all ดังรูป

3. การปรับแก้ไขตัวอย่างโปรแกรมเดิมให้สามารถใช้งานร่วมกับไลบรารี่ใหม่

สังเกตจากโปรแกรมให้ยกเลิกโปรแกรมเดิมในตำแหน่งบรรทัดที่ทำสีแดงไว้ และในที่นี้ทำเป็น Comment ไว้ แล้วแก้ไขเป็นโค้ดใหม่ในบรรทัดสีเขียวแทน เพียงเท่านี้ก็สามารถใช้งานได้แล้ว ดังตัวอย่างโปรแกรมต่อไปนี้

3.1.ตัวอย่างโปรแกรม Toggle_GPA0 : เอาต์พุตรีเลย์ Y0 ON/OFF ทุกๆ 1 วินาที


/******************************************************************************
 Project      Toggle_GPA0
 Description  Toggle GPA bit-0 , Blink LED

 Programmer   Mr.Ukrit Tantasutanon
 Date         2022-08-24

 Hardware     AVR-AP2 (MCU=ATmega328, XTAL=16.0Mhz, Vcc=5.0V)
 I/O interface
    LED      = GPA-0
    SDA,SCL  = I2C Bus interface to MCP23017
    
 Libraries    Adafruit MCP23017 Arduino Library
******************************************************************************       
 MICRO RESEARCH TECHNOLOGY LTD.,PART , www.micro-research.co.th    
******************************************************************************/
//#include <Wire.h>               // [1] Old library
//#include "Adafruit_MCP23017.h"  // [1] Old library
#include <Adafruit_MCP23X17.h>    // [2] Update new library

//Adafruit_MCP23017 mcp;          // [1] Old library
Adafruit_MCP23X17 mcp;            // [2] Update new library
  
void setup() {  
//  mcp.begin();                  // [1] Old library
  mcp.begin_I2C();                // [2] Update new library
  mcp.pinMode(0, OUTPUT);         // Set pin to output mode
}

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

3.2. ตัวอย่างโปรแกรม GPA_Moving_Relay : เอาต์พุตรีเลย์ Y0-Y7 ทำงานทีละตัวเรียงกันไป


/******************************************************************************
 Project      GPA_Moving_Relay
 Description  8 Bit LED moving on GPB-IO port

 Programmer   Mr.Ukrit Tantasutanon
 Date         2022-08-24

 Hardware     AVR-AP2 (MCU=ATmega328, XTAL=16.0Mhz, Vcc=5.0V)
 I/O interface
    Output Relay= GPA-IO , 8 Bit
    SDA,SCL     = I2C Bus interface to MCP23017
    
  Libraries    Adafruit MCP23017 Arduino Library
******************************************************************************       
 MICRO RESEARCH TECHNOLOGY LTD.,PART , www.micro-research.co.th    
******************************************************************************/
//#include <Wire.h>               // [1] Old library
//#include "Adafruit_MCP23017.h"  // [1] Old library
#include <Adafruit_MCP23X17.h>    // [2] Update new library

//Adafruit_MCP23017 mcp;          // [1] Old library
Adafruit_MCP23X17 mcp;            // [2] Update new library

unsigned int GPIO_BA;
unsigned char Output_GPA=0x01;
unsigned char Input_GPB;
  
void setup() {  
  unsigned char i;
//  mcp.begin();                  // [1] Old library
  mcp.begin_I2C();                // [2] Update new library

  for (i=0;i<=7;i++) mcp.pinMode(i, OUTPUT);      // Set pin to output mode for GPA
}

void loop() {
  GPIO_BA = (unsigned int)(Input_GPB)<<8 | Output_GPA; 
  mcp.writeGPIOAB(GPIO_BA);
  if (Output_GPA==0x80)  Output_GPA=0x01;
  else Output_GPA<<=1;  
  delay(500);
}
        

3.3. ตัวอย่างโปรแกรม GPB_input_to_GPA_output : รับสัญญาณอินพุต (IN0-IN7) แล้วส่งค่าออกไปยังเอาต์พุตรีเลย์ (Y0-Y7)


/******************************************************************************
 Project      GPB_input_to_GPA_output
 Description  Read input from GPB port then send output to GPA port

 Programmer   Mr.Ukrit Tantasutanon
 Date         2022-08-24

 Hardware     AVR-AP2 (MCU=ATmega328, XTAL=16.0Mhz, Vcc=5.0V)
 I/O interface
    Input port  = GPB-IO , 8 Bit
    Output Relay= GPA-IO , 8 Bit
    SDA,SCL     = I2C Bus interface to MCP23017
    
  Libraries    Adafruit MCP23017 Arduino Library
******************************************************************************       
 MICRO RESEARCH TECHNOLOGY LTD.,PART , www.micro-research.co.th    
******************************************************************************/
//#include <Wire.h>               // [1] Old library
//#include "Adafruit_MCP23017.h"  // [1] Old library
#include <Adafruit_MCP23X17.h>    // [2] Update new library

//Adafruit_MCP23017 mcp;          // [1] Old library
Adafruit_MCP23X17 mcp;            // [2] Update new library


unsigned int GPIO_BA;
unsigned char Output_GPA;
unsigned char Input_GPB;
  
void setup() {  
  unsigned char i;
//  mcp.begin();                  // [1] Old library
  mcp.begin_I2C();                // [2] Update new library
  for (i=0;i<=7;i++) mcp.pinMode(i, OUTPUT);      // Set pin to output mode for GPA
}

void loop() {

  // Read a single port, A or B, and return its current 8 bit value.
  // Parameter b should be 0 for GPIOA, and 1 for GPIOB.
  Input_GPB = mcp.readGPIO(1);

  // Invert active low input signal to active high relay output
  Output_GPA = ~Input_GPB;
  
  GPIO_BA = (unsigned int)(Input_GPB)<<8 | Output_GPA; 
  mcp.writeGPIOAB(GPIO_BA);
  delay(10);
}