หน้าเว็บ

วันจันทร์ที่ 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 โดยไม่รู้สึกรำคาญใจอีกต่อไป

วันพุธที่ 16 ตุลาคม พ.ศ. 2556

การดาวน์โหลด IPST-MicroBOX ฉบับ IPST++ (wiring) ด้วย PX-4000

บอร์ด IPST-MicroBOX


สำหรับผู้ที่มีบอร์ด IPST-MicroBOX ลักษณะที่เห็นในรูป ถ้าต้องการอัพเกรดการเขียนโปรแกรม ไปใช้ซอฟต์แวร์ wiring ซึ่งมีขั้นตอนให้ทำตามดังนี้ 

เครื่องโปรแกรม PX-4000
 
ทุกอย่างก็ดูน่าจะ OK แต่สำหรับผู้ที่มีเครื่องโปรแกรมรุ่น PX-4000 การอัพเกรดวิธีนี้จะต้องใช้การดาวน์โหลดผ่านการสื่อสารอนุกรม  ต้องหาสายดาวน์โหลด เช่น
ตัวแปลง USB เป็น Serial รุ่น UCON-232
สาย UCON-4 ปลายเสียบเข้าโดยตรงกับบอร์ด Display IO หรือ Display Motor

UCON-232+ สาย CX-4  หรือสาย UCON-4 สำหรับการดาวน์โหลด พร้อมกันนี้ยังต้องมีบอร์ด
บอร์ด Display IO

Display IO หรือ Display Motor เสียบไว้กับบอร์ด IPST ของเราอีกด้วย

    แต่ถ้ามีเฉพาะบอร์ด IPST-MicroBOX และเครื่องโปรแกรม PX-4000 เท่านั้น จะทำอย่างไรดี

แนวคิดก็คือ เขียนโปรแกรมด้วย wiring แล้วคอมไพล์ให้เป็น hex โค้ด ก่อนดาวน์โหลดโปรแกรมด้วยเครื่องโปรแกรม PX-4000 ครับ

ติดตั้งโปรแกรม
1. โปรแกรม AVR Studio เพื่อเอาเฉพาะโปรแกรม AVRPROG มาใช้งาน  เพื่อให้ใช้งานได้สะดวกหลังจากติดตั้งแล้ว ให้เข้าไปที่ C:\Program Files (x86)\Atmel\AVR Tools\AvrProg แล้วคัดลอกลิงก์ ของ AVRProg มาไว้ที่ Desktop หรือ Start Menu เพื่อเรียกใช้งานได้ง่าย ๆ แบบนี้ครับ
การลาก ShortCut มาวางที่ Desktop
2. โปรแกรม Wiring 0100 โดยโหลดจากลิงก์นี้ครับ http://www.ipst-microbox.com/se/?page_id=45


3. ติดตั้งโปรแกรม Wiring 0100 ได้หน้าจอของโปรแกรมตามนี้ครับ
หน้าตาของโปรแกรม wiring 0100 เวอร์ชั่นเฉพาะสำหรับบอร์ด IPST และ IPST-SE
ทดสอบเขียนโปรแกรมง่ายๆ

1.  โปรแกรมไฟกะพริบที่พอร์ต 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);
}

2. บันทึกไฟล์ไปยังตำแหน่งที่ต้องการ หรือกด Ctrl+Shift+S

เลือก Save As

3. เลือกบอร์ดให้เป็น IPST++
เลือกบอร์ดที่ใช้งานเป็น IPST-PlusPlus

4. ทำการคอมไพล์โปรแกรมโดยลักษณะการสร้าง Hex โค้ด โดยเลือกคำสั่ง Build หรือ Ctrl+B
เลือกคอมไพล์ให้เกิดเป็น hex code
5. เปิดตำแหน่งโฟลเดอร์ที่เก็บไฟล์ Sketch ของเราเอาไว้ โดยเลือกคำสั่ง Show Sketch Folder หรือ Ctrl+K

6. จะพบโฟลเดอร์ Build ซึ่งจะเก็บไฟล์ .hex งานของเราเอาไว้


7.เชื่อมต่อสายเครื่องโปรแกรม PX-4000 เข้ากับบอร์ด IPST ให้เรียบร้อยเปิดโปรแกรม AVRProg   Browse โปรแกรมไปที่ ตำแหน่งที่เก็บไฟล์ Hex เอาไว้ จากนั้นกดโปรแกรม เพื่อดูผลการทำงานได้เลยครับ



วันพฤหัสบดีที่ 19 กันยายน พ.ศ. 2556

Picking Robot EP.06 Black or White Object Testing

ตอนที่ 6 ฟังก์ชั่นตรวจสอบสีของกระป๋อง

การติดตั้งเซนเซอร์เช็คสีกระป๋อง

นอกจาก 4 ตัวที่ใช้เคลื่อนที่ตามเส้นแล้ว ยังมีตัวที่ 5 สำหรับเช็คกระป๋องอีกด้วย โดยติดตั้งเซนเซอร์ ZX-03 ไว้ที่ช่อง 22/A4 การอ่านค่าใช้คำสั่ง analog(4)

ทดสอบอ่านค่าสีของกระป๋อง แสดงผล GLCD

ก่อนอื่นต้องทดสอบอ่านค่ากระป๋องกันก่อนว่า ถ้าเอากระป๋องสีดำหรือสีขาวมาวางแล้ว ให้ผลที่แตกต่างกันอย่างไร โดยเขียนโปรแกรมตามนี้


การทดสอบอ่านสีกระป๋อง



ทดลองนำกระป๋องสีขาวมาเสียบเข้าที่ด้านหน้าของ Gripper ทดลองเลื่อนไปเลื่อนมาแล้วดูค่าน้อยที่สุดที่เป็นไปได้ที่จะเกิดขึ้นกับกระป๋องสีขาว บันทึกค่าเอาไว้ จากการทดลองอ่านค่าได้ 160




ทดลองนำกระป๋องสีดำมาเสียบเข้าที่ Gripper บ้าง แล้วอ่านค่ามากที่สุดที่เกิดขึ้นได้กับกระป๋องสีดำ จากการทดลองอ่านค่าได้ 40
นำทั้งสองค่ามาบวกกันหารสอง ก็ได้เป็นค่ากลางสำหรับแยกแยกกระป๋องสีขาวและกระป๋องสีดำ  ดังนั้นค่ากลางที่เกิดขึ้นนี้คือ (160+40 ) /2 = 100 

ลำดับเหตุการณ์กันก่อน

ก่อนจะเขียนฟังก์ชั่นอ่านค่าสี ลองมาลำดับเหตุการณ์การทำงานของหุ่นยนต์กันก่อน
1. หุ่นยนต์เดินออกจากจุดเริ่มต้น 
2. หุ่นยนต์เดินตามเส้น เจอเส้นตัด 3 แยกหรือ 4 แยก ให้เลี้ยวซ้ายหรือขวา หรือตรงไป (ฟังก์ชั่น LLL() RRR() FFF()
3. หุ่นยนต์เจอเส้นตัดทางแยก ตำแหน่งยกกระป๋อง (ฟังก์ชั่น PICK() )
4. หุ่นยนต์เดินตามเส้น เจอเส้นตัด 3 แยกหรือ 4 แยก ให้เลี้ยวซ้ายหรือขวา หรือตรงไป (ฟังก์ชั่น LLL() RRR() FFF()
5. หุ่นยนต์เจอเส้นตัดทางแยก ตำแหน่งวางกระป๋อง (ฟังก์ชั่น PUSH() )

ฟังก์ชั่นอ่านค่าสีจากกระป๋อง

จากลำดับเหตุการณ์ ส่วนที่จะแทรกเพิ่มเข้าไปสำหรับเช็คกระป๋องก็คือหัวข้อที่ 3 หลังจากยกกระป๋องเรียบร้อยแล้ว โดยอ้างอิงจากฟังก์ชั่น PICK() เดิมคือ

ตำแหน่งที่จะวางฟังก์ชั่นเช็คกระป๋อง จะต้องอยู่ก่อนกรอบเส้นประ "ถอยหลังหมุนตัวจนเจอเส้นตัด" ดังนั้นฟังก์ชั่น PICK() จะกลายเป็น

สำหรับฟังก์ชั่น BLACK() และฟังก์ชั่น WHITE()  ก็คือรูปแบบการทำงานตามข้อที่ 4 นั่นเอง โดยจะเดินไปเส้นทางไหน ก็วาดแผนที่เอาได้เลยครับ


ตัวอย่างฟังก์ชั่น WHITE()   







ตัวอย่างฟังก์ชั่น BLACK()


สังเกตุว่า ชุดคำสั่งถอยหลังหมุนตัวจนเจอเส้นตัดจากเดิมที่อยู่ในฟังก์ชั่น PICK() ถูกย้ายมาไว้ที่ฟังก์ชั่น WHITE() กับ BLACK()  เรียบร้อยแล้วครับ 




วันพุธที่ 18 กันยายน พ.ศ. 2556

Picking Robot EP.05 SERVO Gripper Control

ตอนที่ 5 ฟังก์ชั่นยกกระป๋อง และวางกระป๋อง

หลักการทำงานของเซอร์โวมอเตอร์

  เซอร์โวมอเตอร์ มีสายต่อใช้งาน 3 เส้นดังรูป มีวงจรขับมอเตอร์พร้อมทั้งวงจรป้อนกลับเพื่อให้รับรู้ตำแหน่งของตัวเองอยู่ภายใน การใช้งานถ้าเป็น Arduino และ POP-XT จะสั่งงานผ่านฟังก์ชั่น Servo( CH,POS)
โดย   CH    คือ ช่องของเซอร์โว POP-XT มีช่องขับ 3 ช่อง
          POS คือ ตำแหน่งของเซอร์โวอยู่ระหว่าง 0 ถึง 180 แต่ถ้าเรากำหนดเป็น -1 จะเป็นการยกเลิกการใช้เซอร์โวตัวนั้น

ตัวอย่าง
      servo(1,100); 
เป็นการสั่งให้เซอร์โวเคลื่อนที่ไปที่ตำแหน่ง 100 องศา



ทดสอบยกกระป๋อง

        จากสรีระของหุ่นยนต์ที่ใช้เซอร์โวเพียงตัวเดียวในการยกกระป๋อง  จึงเป็นเรื่องง่ายที่จะควบคุมเซอร์โวให้ทำงานทั้งคีบ ยก และวาง ก่อนอื่นต้องทดสอบหาตำแหน่งของเซอร์โว สำหรับการยกและการวางก่อน ด้วยโปรแกรมทดสอบการทำงานของเซอร์โว
จากโปรแกรมตัวอย่าง มีคำสั่งพิเศษที่เพิ่มเติมคือคำสั่ง map ใช้สำหรรับการแปลงค่าตำแหน่งของ knob ให้เป็นองศาของเซอร์โว ซึ่งสะดวกมาก ไม่ต้องเขียนสมการให้วุ่นวาย หลังจากแปลงค่าแล้วก็นำค่าที่ได้แสดงที่หน้าจอ GLCD และส่งค่าไปยังเซอร์โวมอเตอร์ด้วย

ทดลองหมุน knob จน Gripper กางออกเยอะที่สุด บันทึกค่าที่แสดงที่หน้าจอเอาไว้

ทดลองหมุน knob จน Gripper หนีบกระป๋องแล้วยก บันทึกค่าที่แสดงที่หน้าจอเอาไว้

นำค่าที่ได้มาสร้างเป็นฟังก์ชั่น ยกกระป๋อง (PICK)

จากตัวอย่างก่อนหน้านี้ถ้าทำความเข้าใจเรื่องฟังก์ชั่น LLL() หรือฟังก์ชั่น RRR() จะเข้าใจว่า โปรแกรมจะหลุดออกจากลูปคำสั่งการเดินตามเส้นปกติเข้าสู่การทำภารกิจตรวจจับทางแยกได้ ก็ต่อเมื่อ เซนเซอร์ด้านนอกซ้ายหรือขวา เจอสีดำ ทำนองเดียวกันกับฟังก์ชั่นยกกระป๋อง ในช่วงปกติเมื่อไหร่ก็เดินตามเส้นไปเรื่อยๆ เมื่อเจอเส้นตัดเมื่อไหร่ก็หยุดหุ่นยนต์แล้วยกกระป๋องทันที จากนั้นหมุนตัว แล้วจบฟังก์ชั่น นำมาเขียนเป็นโปรแกรมในชื่อฟังก์ชั่น PICK()


ข้อสังเกตเพิ่มเติมของฟังก์ชั่นนี้ก็คือ โปรแกรมจะหลุดจากลูปเดินตามเส้นโดยเงื่อนไขว่า analog(2) หรือ analog(3) เจอสีดำ แต่ในการเขียนโปรแกรมแทนที่เราจะใช้เครื่องหมาย OR || เรากลับใช้เป็นเครื่องหมาย AND && แทน ลองไปทบทวนวิชาตรรกศาสตร์หรือการทำงานของลอจิกดูนะครับ

ต่อด้วยฟังก์ชั่น วางกระป๋อง (PUSH)

พอเป็น Idea สำหรับไปพัฒนาต่อได้นะครับ ตอนหน้า มาว่ากันถึงวิธีการแยกสีขาวและสีดำของกระป๋องกันบ้างครับ




วันศุกร์ที่ 13 กันยายน พ.ศ. 2556

Picking Robot EP.04 Turn 90 degree

ตอนที่  4  ฟังก์ชั่นเลี้ยว  90  องศาเมื่อเจอทางแยก

สำหรับทางแยกที่เป็นลักษณะ 3 แยก การเลี้ยว 90 องศาก็ใช้หลักการเหมือนการเดินตรงข้ามทางแยก 

การเลี้ยวขวา 90 องศา


จากรูปมองเหตุการณ์เป็น 4 ขั้นตอนดังนี้
1. เมื่อหุ่นยนต์เดินตามเส้นไปเรื่อยๆ แล้วเซนเซอร์ A3 เจอทางแยก
2. ให้หุ่นยนต์เดินตรงไปข้างหน้าจนตัวหุ่นยนต์อยู่คร่อมจุดตัดทางแยกพอดี
3. หมุนตัวไปทางขวา โดยถ้าเซนเซอร์ A1 ยังเจอสีขาวอยู่ให้หมุนทางขวาไปเรื่อยๆ 
4. เมื่อเซนเซอร์ A1 เจอสีดำก็ให้หมุนตัวทางขวาต่อไปอีกจนกว่า เซนเซอร์ A1 จะเจอสีขาวอีกครั้ง ซึ่งก็จะเป็นการไปคร่อมเส้นด้านขวาพอดี
จากรูปนำมาเขียนเป็นฟังก์ชั่นสำหรับการเลี้ยวขวา 90 องศาได้ดังนี้





ถ้าดูการทำงานของฟังก์ชั่น เมื่อเทียบกับฟังก์ชั่น FFF() สำหรับการเดินหน้าก่อนหน้านี้จะเห็นว่ามีส่วนที่คล้ายคลึงกันมาก โดยส่วนหลัก ๆ คือการที่หุ่นยนต์เคลื่อนที่ตามเส้นไปเรื่อยๆ จะหลุดจากลูปของการเคลื่อนที่ตามเส้นก็ต่อเมื่อ เซนเซอร์ A3 เจอสีดำเท่านั้นและเมื่อหลุดจากลูปมาแล้ว ก็ทำงานตาม 4 ขั้นตอนที่บอกไป จนจบฟังก์ชั่น หุ่นยนต์ก็จะเลี้ยวขวา 90 องศาได้อย่างสมบูรณ์

การเลี้ยวซ้าย 90 องศา

การเลี้ยวซ้ายก็จะมีลักษณะเดียวกันกับการเลี้ยวขวา แต่เปลี่ยนการตรวจจับเซนเซอร์เป็นคนละรูปแบบดังนี้




















นำมาเขียนเป็นฟังก์ชั่นสำหรับเดินตามเส้นเจอแยกแล้วเลี้ยวซ้ายได้ดังนี้







ตัวอย่างให้หุ่นยนต์เคลื่อนที่ตามเส้นทางที่กำหนด 

สามารถเรียกฟังก์ชั่นเลี้ยวซ้าย เลี้ยวขวา เดินตรงของหุ่นยนต์มาใช้ได้ ยกตัวอย่างสนามง่ายๆ ดังรูป










































การเรียกใช้งานฟังก์ชั่นทั้งหมด กำหนดไว้ที่ void setup() เนื่องจาก ไม่ต้องการให้โปรแกรมทำงานอย่างต่อเนื่อง หลังจากที่ทำขั้นตอนการเดินต่าง ๆ เสร็จแล้วก็ปิดท้ายด้วยคำสั่ง ao() เพื่อหยุดการทำงานของมอเตอร์นั่นเอง