การควบคุมบอร์ด 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
ชุดคำสั่งในไลบรารี่ 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(); // หยุดการสื่อสาร }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น