ตัวอย่างโปรแกรมการใช้งานบอร์ด EXI-16IO Series ซึ่งเป็นบอร์ดขยาย IO จำนวน 16 บิต ด้วยชิพ MCP23017 โดยจัดวงจรให้ขยาย Input แบบ Opto-Isolator ขนาด 8 ช่อง และ Output relay ขนาด 8 ช่อง ผ่านการสื่อสารแบบ I2C Bus ด้วยสานสัญญาณเพียง 2 เส้น (SDA,SCL) และยังสามารถกำหนด Address ให้กับบอร์ดได้ เพื่อให้สามารถใช้งานบอร์ดได้พร้อมกันถึง 8 บอร์ด
Hardware Interface , I2C Bus
ตัวอย่างการเชื่อมต่อกับบอร์ดไมโครคอนโทรลเลอร์ รุ่น AVR-AP2 กับ EXO-16IO
Hardware I/O assignment
- GPA 0..7 = Relay output
- GPB 0..7 = Input opto-isolator
Arduino Sample Code
โดยในตัวอย่างนี้เป็นโค็ดสำหรับ Arduino ร่วมกับไลบรารีของ Adafruit_MCP23017
Library download link :
https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
ตัวอย่างโปรแกรม
1. Toggle_GPA0 , โปรแกรมควบคุมให้ Relay output ช่องแรก ON/OFF สลับกัน ทุกๆ 1 วินาที
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/****************************************************************************** Project Toggle_GPA0 Description Toggle GPA bit-0 , Blink LED Programmer Mr.Ukrit Tantasutanon Date 2015-08-22 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 Wire , Adafruit_MCP23017 ****************************************************************************** MICRO RESEARCH TECHNOLOGY LTD.,PART , www.micro-research.co.th ******************************************************************************/ #include <Wire.h> #include "Adafruit_MCP23017.h" Adafruit_MCP23017 mcp; void setup() { mcp.begin(); // Use default address 0 mcp.pinMode(0, OUTPUT); // Set pin to output mode } void loop() { delay(1000); mcp.digitalWrite(0, HIGH); delay(1000); mcp.digitalWrite(0, LOW); } |
2. GPA_Moving_Relay , โปรแกรมควบคุมให้ Relay ทำงานทีละตัว แบบเรียงกันไปจนครบทั้ง 8 ตัว และวนซ้ำเรื่อยไป
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/****************************************************************************** Project GPA_Moving_Relay Description 8 Bit LED moving on GPB-IO port Programmer Mr.Ukrit Tantasutanon Date 2015-08-22 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 Wire , Adafruit_MCP23017 ****************************************************************************** MICRO RESEARCH TECHNOLOGY LTD.,PART , www.micro-research.co.th ******************************************************************************/ #include <Wire.h> #include "Adafruit_MCP23017.h" Adafruit_MCP23017 mcp; unsigned int GPIO_BA; unsigned char Output_GPA=0x01; unsigned char Input_GPB; void setup() { unsigned char i; mcp.begin(); // Use default address 0 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. GPB_input_to_GPA_output , โปรแกรมอ่านสัญญาณอิพุตจาก Opto-Isolator แล้วส่งค่าออกไปยัง Relay output ทันที
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/****************************************************************************** Project GPB_input_to_GPA_output Description Read input from GPB port then send output to GPA port Programmer Mr.Ukrit Tantasutanon Date 2015-08-22 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 Wire , Adafruit_MCP23017 ****************************************************************************** MICRO RESEARCH TECHNOLOGY LTD.,PART , www.micro-research.co.th ******************************************************************************/ #include <Wire.h> #include "Adafruit_MCP23017.h" Adafruit_MCP23017 mcp; unsigned int GPIO_BA; unsigned char Output_GPA; unsigned char Input_GPB; void setup() { unsigned char i; mcp.begin(); // Use default address 0 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); } |