หน้าเว็บ

วันจันทร์ที่ 18 พฤศจิกายน พ.ศ. 2556

POPXT 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();        // หยุดการสื่อสาร


















วันอังคารที่ 12 พฤศจิกายน พ.ศ. 2556

IPST-MicroBOX with Arduino 1.05

ใช้งาน IPST-MicroBOX ด้วยซอฟต์แวร์ Arduino พร้อมการดาวน์โหลดผ่าน PX-4000

 
บทความก่อนหน้านี้ แนะนำวิธีการใช้งาน ซอฟต์แวร์ Wiring กับบอร์ด IPST-MicroBOX ไป ผลตอบรับก็มีระดับนึงครับ แต่มีคนใช้งาน Arduino จำนวนมาก อยากให้ IPST-MicroBOX ใช้งานได้กับ Arduino บ้าง  มาลองดูกันเลยครับ





 IPST-MicroBOX ( IPST++ )หรือ IPST-SE ใช้งาน Arduino ได้

ก่อนอื่น ต้องไปดาวน์โหลดซอฟต์แวร์ Arduino เวอร์ชั่นที่รองรับ IPST++ กันก่อน ที่นี่ ครับ  หรือถ้าใครมี DVD หรือ CDROM ของ inex เวอร์ชั่นตั้งแต่เดือนตุลาคมเป็นต้นมา ก็จะมีซอฟต์แวร์ ArduinoIPST_SE_1.0.5_Setup130819.exe อยู่ในแผ่นให้ติดตั้งได้เลยครับ

แผ่น DVD รวมโปรแกรมของ inex

หลังจากนั้นก็ติดตั้งโปรแกรมตามขั้นตอนปกติ สำคัญตอนเลือกบอร์ด ถ้าใช้ IPST-MicroBOX อยู่ก็ให้เลือก Tools> Board > IPST-PlusPlus , ATMega16 @ 16MHz

เลือกบอร์ดที่ต้องการใช้งานจากเมนู Tools

ตอนนี้ก็สามารถเขียนโปรแกรม โดยใช้ซอฟต์แวร์ Arduino ได้แล้ว โดยบรรทัดบนสุด อย่าลืม
#include ไว้ด้วยนะครับ

การดาวน์โหลดโปรแกรมผ่านเครื่องโปรแกรม PX-4000

  ซอฟต์แวร์ Arduino ไม่มีคำสั่ง Build เหมือน Wiring ดังนั้นถ้าต้องการไฟล์ hex ไปใช้งานกับโปรแกรม AVRProg ต้องมีวิธีการพิเศษดังนี้
1. เปิดหน้าต่าง Preferences โดยไปที่  File > Preferences

เปิดหน้าต่าง Preferences เพื่อปรับเปลี่ยนการตั้งค่า

2.  เลือก ติ๊กที่ compilation เพื่อให้โปรแกรมแสดงขั้นตอนการคอมไพล์ เพราะเราจะใช้ขั้นตอนนี้ระบุตำแหน่งไฟล์ .hex ที่ใช้กับเครื่องโปรแกรม PX-4000

เปลี่ยนให้โปรแกรมแสดงขั้นตอนการคอมไพล์


3. ทดสอบเขียนโปรแกรมไฟกะพริบที่พอร์ต RB4

#include <ipst.h> // include file for IPST-SE
void setup(){
}
void loop()
{
  out_b(4,1);
  sleep(300);
  out_b(4,0);
  sleep(300);
}

4. กดปุ่ม Verify (Ctrl + R ) เพื่อคอมไพล์โค้ดให้ได้เป็น Hex โค้ดออกมา
5. หน้าต่างด้านล่างจะแสดงขั้นตอนการคอมไพล์โค้ด ถ้าไม่มีอะไรผิดพลาด จะขึ้นข้อความ Done Compliling และบรรทัดก่อนบรรทัดล่างสุดจะระบุตำแหน่งของไฟล์ hex ที่ได้จากการคอมไพล์เอาไว้  ให้ทำแถบแล้วใช้คีย์ลัด CTRL+C คัดลอกเอาไว้

เมื่อคอมไพล์เรียบร้อย โปรแกรมจะแสดงชื่อไฟล์ .hex ออกมา


5. เชื่อมต่อบอร์ด PX-4000 เข้ากับ IPST-MicroBOX

เสียบเครื่องโปรแกรม PX-4000 เข้ากับ IPST++


6. จากนั้นเปิดโปรแกรม AVRProg ขึ้นมา ให้กดปุ่ม  Browse

เลือกไฟล์ที่ต้องการโปรแกรมจากตำแหน่งที่ระบุใน Arduino 1.05

7. ที่หน้าต่างสำหรับกำหนดตำแหน่งไฟล์ ให้กด CTRL+V เพื่อ วางตำแหน่งของ File ที่คัดลอกไว้

วางตำแหน่งของไฟล์ Hex ให้กับโปรแกรม AVRProg



8. กด Program ที่ AVRProg  ดูผลเลยว่าโปรแกรมทำงานถูกต้องหรือเปล่า

โปรแกรมไฟล์ Hex ไปยัง IPST++


ขั้นตอนอาจจะดูยุ่งยากเล็กน้อยสำหรับการใช้งานซอฟต์แวร์ Arduino  หวังว่าคงสามารถเอาบอร์ด IPST-MicroBOX ไปใช้งานได้หลากหลายมากขึ้นนะครับ






วันศุกร์ที่ 1 พฤศจิกายน พ.ศ. 2556

การสลับแป้นคีย์บอร์ด บนเครื่อง Mac OSX ให้เหมือน Windows (~)

20 กว่าปีที่ใช้ windows แล้วใช้คีย์ ~ ในการเปลี่ยนภาษา เมื่อมาถึงยุค Mac ไม่ง่ายเลยที่จะปรับเปลี่ยนตัวเองไปใช้รูปแบบอื่น ต้องขอบคุณซอฟต์แวร์ KeyRemap4Macbook ครับ โดยขั้นตอนมีดังนี้ 




1. ดาวน์โหลดโปรแกรม KeyRemap4Macbook โดยเข้าไปที่ https://pqrs.org/macosx/keyremap4macbook/ 


 2. ติดตั้งโปรแกรมจากนั้น โปรแกรมจะให้รีสตาร์ตเครื่อง 1 ครั้ง 




3. เข้าไปใน Application เลือกเปิดโปรแกรม KeyRemap4Macbook 




 4. ที่หัวข้อ Change Backquote ( ' ) Key เลือกติ๊กเครื่องหมายถูกที่ หน้า BackQuote ( ' ) to Cmd+Space 

 เท่านี้นักเลงคีย์บอร์ดอย่างเรา ก็ซ่าได้บนเครื่อง Mac โดยไม่รู้สึกรำคาญใจอีกต่อไป