[POP-XT] with ZX-Relay16

การควบคุมบอร์ด ZX-Relay16 ด้วย POP-XT

 

ZX-RELAY16

ใช้ไอซีขยายพอร์ตเบอร์ MCP23016 ซึ่งใช้การสื่อสารแบบ I2C บัส เมื่อนำมาต่อเข้ากับรีเลย์ก็สามารถควบคุมรีเลย์ได้ถึง 16 ช่อง โดยใช้สายสัญญาณเพียงแค่ 2 เส้นประกอบไปด้วยขา SCL สำหรับส่งสัญญาณนาฬิกาและขา SDA สำหรับรับส่งข้อมูล  โดยคุณสมบัติอื่นๆ มีดังนี้

   * ขับรีเลย์ 12V ได้ 16 ตัวพร้อมไฟการทำงานของรีเลย์
  •    * ต่อพ่วงได้ 8 บอร์ด ทำให้สามารถควบคุมรีเลย์ได้สูงสุดถึง 128 ตัว
  •    * จุดต่อเอาต์พุตหน้าสัมผัสของรีเลย์เป็นเทอร์มินอลบล็อก 3 ขา มีทั้งจุด NC,NO และ COM สามารถใช้ไขควงขันเพื่อปลดหรือต่อสายได้ง่าย
  •    * พิกัดหน้าสัมผัส 220Vac 5A รองรับโหลดได้สูงสุด 600 วัตต์
  •    * ใช้งานได้กับไมโครคอนโทรลเลอร์ได้ทุกตระกูล
  •    * จุดต่อระบบบัส I2C มีทั้งแบบ IDC และใช้คอนเน็กเตอร์ JST
  •    * ใช้ไฟเลี้ยง +12V จากภายนอกเพื่อเลี้ยงรีเลย์

การเชื่อมต่อสายระหว่างบอร์ด ZX-RELAY16 กับ POP-XT

บอร์ด POP-XT ได้เตรียมขาสัญญาณสำหรับสื่อสารด้วยระบบบัส I2C ไว้แล้ว มีชื่อ 3/SCL และ 2/SDA  สามารถใช้สาย JST-8 ต่อเข้ากับบอร์ด ZX-RELAY16 ได้โดยตรง
แต่กรณีที่ต้องการใช้ไฟเลี้ยงเพียงชุดเดียว  (12V จาก ZX-RELAY16 ) จะต้องมีการปรับแต่งให้ดึงไฟเลี้ยง 5V จาก ZX-RELAY16 ส่งกลับมาเลี้ยงบอร์ด POP-XT ด้วย โดยทำการบัดกรีเชื่อมขาในตำแหน่งดังรูปเข้าด้วยกัน

ขั้นตอนการเขียนโปรแกรม

ปกติถ้าพิมพ์ “MCP23016 ARDUINO” ที่ Google เราจะเจอตัวอย่างการเขียนโค้ดติดต่อกับอุปกรณ์ตัวนี้เยอะพอสมควรเลยครับ  แต่สำหรับบอร์ด ZX-RELAY16 ไม่จำเป็นต้องรับค่าอินพุต ดังนั้นโค้ดจะค่อนข้างสั้น
หัวใจหลักที่ใช้สื่อสารด้วยระบบบัส I2C ถูกจัดการเรียบร้อยแล้วด้วยไลบรารี่ wire ดังนั้น ก่อนการใช้งาน นอกจาก #include   แล้ว จำเป็นต้อง #include “Wire.h” ด้วย
ชุดคำสั่งในไลบรารี่ Wire ที่จำเป็นต้องใช้งานประกอบไปด้วย
Wire.begin() สำหรับกำหนดค่าเริ่มต้นให้การสื่อสาร I2C บัส
Wire.beginTransmission(address) สำหรับการเริ่มต้นสื่อสาร I2C บัส โดยจะต้องระบุแอดเดรสที่ต้องการสื่อสารด้วย
Wire.endTransmission() สำหรับแจ้งการหยุดการสื่อสารข้อมูลในชุดนั้นๆ
Wire.write() สำหรับส่งข้อมูลขนาด 1 ไบต์ไปยังระบบบัส I2C

รูปแบบการสื่อสารกับ MCP23016

การสื่อสารกับไอซี MCP23016 จะมีขั้นตอนดังนี้คือ

1. ส่งแอดเดรสของไอซี MCP23016 ซึ่งในที่นี้ใช้ค่าแอดเดรสเท่ากับ 0x20
2. ส่งตำแหน่งแอดเดรสที่ต้องการเขียนข้อมูลลงไป สำหรับ MCP23016 แอดเดรสที่ใช้งานคือ
IODIR0 ,IODIR1 สำหรับกำหนดขาพอร์ตให้เป็นอินพุตหรือเอาต์พุต  โดยถ้ากำหนดค่าด้วย 0 ขาพอร์ตจะเป็นเอาต์พุต ถ้ากำหนดค่าด้วย 1 ขาพอร์ตจะเป็นอินพุต (ในที่นี้บอร์ดขับรีเลย์เป็นอุปกรณ์เอาต์พุต ต้องกำหนดด้วย 0 เท่านั้น”
GP0,GP1 เป็นแอดเดรสสำหรับกำหนดให้ขาพอร์ตมีลอจิก “1” หรือลอจิก “0”
3. ส่งค่าที่ต้องการเขียนไปยังตำแหน่งแอดเดรสที่ระบุ
4. ส่งคำสั่งปิดการเชื่อมต่อกับระบบบัส I2C โดยทั้งหมดเอามาเขียนเป็นฟังก์ชั่นได้ดังนี้

ฟังก์ชั่น relay16()

void relay16(byte CMD, byte VAL){
  Wire.beginTransmission(0x20);  // เริ่มต้นสื่อสาร
  Wire.write(CMD);   // ส่งตำแหน่งรีจิสเตอร์ที่ต้องการติดต่อ
  Wire.write(VAL);  //  ส่งค่าไปยังรีจิสเตอร์ที่ต้องการ
  Wire.endTransmission();  // หยุดการสื่อสาร
}

ตัวอย่างที่ 1 ส่งค่าให้รีเลย์ทั้ง 16 ตัวติดดับสลับกัน

#include <popxt.h>
#include "Wire.h"
#define ADDR     0x20             //seven bit address
#define GP0      0x00             // register addresses
#define GP1      0X01
#define IODIR0   0x06
#define IODIR1   0x07

void setup(){
  setTextSize(2);
   glcd(1,1,"Press OK");
   sw_ok_press();
   Wire.begin();
  relay16(IODIR0, B00000000);     // GP0 pins are outputs   
  relay16(IODIR1, B00000000);     // GP1.0 - GP1.3 are inputs   
} 
void loop(){
  relay16(GP0,0xAA);
  relay16(GP1,0xAA);
  sleep(500);
  relay16(GP0,0x55);
  relay16(GP1,0x55);
  sleep(500);
}
void relay16(byte CMD, byte VAL){
  Wire.beginTransmission(ADDR);  // เริ่มต้นสื่อสาร
  Wire.write(CMD);               // ส่งตำแหน่งรีจิสเตอร์ที่ต้องการติดต่อ
  Wire.write(VAL);               //  ส่งค่าไปยังรีจิสเตอร์ที่ต้องการ
  Wire.endTransmission();        // หยุดการสื่อสาร
}

ตัวอย่างที่ 2 ให้รีเลย์ติดทีละตัวไล่ลำดับไปและกลับ

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

#define ADDR     0x20         //seven bit address
#define GP0      0x00         // register addresses
#define GP1      0X01
#define IODIR0   0x06
#define IODIR1   0x07

unsigned int i=1;
void setup(){
   setTextSize(2);
   glcd(1,1,"Press OK");
   sw_ok_press();
   Wire.begin();
   relay16(IODIR0, B00000000);     // GP0 pins are outputs   
   relay16(IODIR1, B00000000);     // GP1.0 - GP1.3 are inputs   
} 
void loop(){
  i=0x0001;
  while(i<=0x4000){
    relay16(GP1,highByte(i));
    relay16(GP0,lowByte(i));
    sleep(200);
    i*=2;
  }
  i=0x8000;
  while(i>=0x0001){
    relay16(GP1,highByte(i));
    relay16(GP0,lowByte(i));
    sleep(200);
    i/=2;
  }
}
void relay16(byte CMD, byte VAL){
  Wire.beginTransmission(ADDR);  // เริ่มต้นสื่อสาร
  Wire.write(CMD);               // ส่งตำแหน่งรีจิสเตอร์ที่ต้องการติดต่อ
  Wire.write(VAL);               //  ส่งค่าไปยังรีจิสเตอร์ที่ต้องการ
  Wire.endTransmission();        // หยุดการสื่อสาร
}
Facebook Comments