วันพฤหัสบดีที่ 29 พฤษภาคม พ.ศ. 2557

ทำ Prototype ชุดการแสดงกันต่อคะ Part5

หลังจากนี้ขอเล่าเป็นภาพรวมๆที่ทำกันต่อละกันนะคะ เพราะมาทำงานกันเกือบทุกวัน ดังนั้นฝ่าย software อย่างเรา ก็  coding กันต่อไป

จากครั้งที่แล้วที่เราสามารถส่งข้อมูลอย่างไร้สายได้แล้ว ตอนนี้ก็ถึงคร่าวที่จะต้องส่งข้อมูลเพื่อควบคุมไฟจริงๆกัน ซักที ตอนนี้ก็เริ่มออกแบบ function การทำงานจริงๆ กะพี่นุก เพราะที่ผ่านมา เหมือนแค่ลองให้ทำงานได้ แต่ยังใช้งานจริงๆกับงานของเราไม่ได้ ยังต้องปรับๆอยู่ เนื่องด้วย scope งานยังไม่ค่อยชัดเจนเท่าไหร่

ตอนนี้ สิ่งที่จะทำต่อ คือ การ ตัวส่ง และ ตัวรับ เพื่อควบคุมไฟบนชุดการแสดงการจริงๆซักที

โดยตัวส่ง เราจะ ติด rf24 ไว้ที่ Arduino Mega 1280 เนื่องจาก เป็นฝั่ง Server เลยไม่จำเป็นต้องใช้ lilypad ในขณะที่ฝั่งรับ เราจะใช้ lilypad เป็นตัวติดต่อ เพราะ มันต้องติดอยู่ที่ชุดการแสดงจริงๆ มันเลยจำเป็นต้องเล็กๆ เพื่อจะไม่สร้างความลำบากในการเต้นของนักแสดง

เราเลยเริ่มออกแบบ format สำหรับการรับส่งข้อมูล
เนื่องจากตอนนี้ เหลือ เพียงแค่ไฟติดและไฟดับ เนื่องจาก ด้วยจำนวนpin ของ lilypad ไม่พอ เพราะ การจะ fade ไฟได้ ต้อง ใช้ช่องpin pwm ซึ่งมีอยู่ 4 ช่อง

เพื่อให้ตัดปัญหา และ ยังไม่รู้ว่า ไฟประเภทไหนจะ fade บ้าง ไม่ fade บ้าง เลยปรับให้เหลือเพียงติดดับไปก่อน

format สำหรับการรับส่งข้อมูล คือ
Id,count,led1,led2,led3,led4,led5,led6,led7

โดยที่....
Id คือ idของผู้รับหรือผู้ส่ง
Count คือ ครั้งที่กำลังส่งมา เช่น 1,2,3,4,..
led1,led2,… คือ จะใส่ logic เป็น 1หรือ 0 เพื่อบอกให้รู้ว่าให้ไฟติดหรือดับ

ตัวอย่างเช่น
73,001,0,0,1,1,1,1,1

ความหมายคือ รับข้อมูลจาก id 73, ครั้งที่1 โดยที่ led ชุดที่ 1 กับ 2 ไฟดับ และ ชุดที่ 3-7 ไฟติด


ตอนนี้ชุดเต้นของเราเริ่มเป็นรูปเป็นร่างมากขึ้นแล้ว งั้นเดี๋ยวของโชว์รูปตอนวันเราไป fitting ให้ดู กันนะคะ

Fitting Cloth











ทำ Prototype ชุดการแสดงกันต่อคะ Part4

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

ภาพบรรยากาศการทำงาน









วันพฤหัสบดีที่ 22 พฤษภาคม พ.ศ. 2557

ทำ Prototype ชุดการแสดงกันต่อคะ Part3


วันนี้ ตั้งใจจะมาทำเเต่เช้า แต่พอมาถึง ก็ต้องแอบเสียใจ
เมื่อเดินมาถึงหน้าประตูแล้วเข้าห้องesic ไม่ได้ เพราะวันนี้มี Workshop Hardward
ซึ่งพี่ esic ไปสอนน้องๆกันหมด เลยไปหาอย่างอื่นทำพลางๆฆ่าเวลา
และในที่สุดตอนพอเย็นๆ พี่ๆก็กลับเข้ามาา ทำให้ได้เข้ามาทำงานกันซักที

วันนี้งานหลักๆที่ทำก็คือ มาศึกษาเจ้าตัว rf24กันคะ หลังจากที่ก่อนหน้านี้ เรางมกับ x-bee มาเกือบห้าวัน ก็ยังไม่สามารถส่งข้อมูลข้ามได้สำเร็จซักที

งั้นขอกลับมาเล่าก่อนว่าทำไมเราต้องใช้ เจ้า rf24 นี้ และ rf24 มันคืออะไร ?
เนื่องจาก project ที่เราทำกับโรงละครช้าง คือ ชุดสำหรับนักเต้น นั้นแปลว่า เราจะมีสายระโยงระใย ไม่ได้
ดังนั้นเราต้องเก็บสายให้หมด เเละ control ไฟ ทุกอย่าง อย่างไร้สาย
อย่างตอนเเรกที่คิดกัน คือ เอา xbee มาใช้ เป็นอุปกรณ์ติดต่อสื่อสารแบบไร้สาย
แต่ปรากฏว่า มีปัญหาการใช้เยอะ อย่างแรกเลย เราไม่รุ้เลย ว่า xbee  เสียรึป่าวว ? 
เพราะตัวที่ได้มาเป็นตัวเก่าซึ่งใช้มานานเเล้วหลายปี
อย่างที่สอง การที่ xbee จะส่งข้อมูลได้ เราต้องทำการ จับคู่ ด้วยโปรแกรมเฉพาะของมันก่อน แต่ด้วย interface ของโปรแกรมเปลี่ยนใหม่ทั้งหมด แทบไม่เหลือเค้าเดิมเลย เเล้ว program version ใหม่นี้ ก็แทบไม่มีข้อมูลใน internet จึงทำให้เราต้องลองผิดลองถูกอยู่นานพอสมควร

และสุดท้ายเรา ก็เปลี่ยนมาใช้ rf24 แทน ด้วยคำแนะนำของอินดี้

วันนี้มาทำงานกันสองคนคือ ดาว กับ ยู
เรานั่งงมกันนานพอสมควร
เเต่ต้องขอบคุณ อินดี้ที่มาชี้ทางสว่าง ทำให้พวกเราใช้กันเป็น
และสุดท้ายก็ใช้ได้สำเร็จ เย้ๆ

งั้นขออธิบาย code ส่วนนี้ละกันนะคะ
หลักๆ คือ เราต้องติดตั้ง rf24 ไว้ที่ arduino สองตัว โดยตัวหนึ่งเป็นตัวรับ และ อีกตัวเป็นตัวส่ง
โดยที่ ตัวรับเเละตัวส่งจะรู้จักกันได้ ก็คือ ต้องกำหนด ชื่อ id ทั้งสองตัว  โดยตัวส่งจะส่งข้อมูลไปตาม id ผู้รับที่กำหนด
ในขณะที่ตัวรับ จะวนรอรับเรื่อยๆ ว่า มีข้อมูลอะไรส่งหามันหรือ ไม่ ?

การต่อ วงจรHardware ก็ตามเว็บไซด์นี้เลยคะ
http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

ตัว Sender

// Set up nRF24L01 radio on SPI pin for CE, CSN
RF24 radio(9,53);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0x7365727631LL };

char receivePayload[32];
uint8_t counter=0;

void setup(void)
{
  radio.begin();

  // Enable this seems to work better
  radio.enableDynamicPayloads();

  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(76);
  radio.setRetries(15,15);

  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1,pipes[1]);
  //radio.startListening();

  // Dump the configuration of the rf unit for debugging
  radio.printDetails();
  delay(1000);
}

void loop(void)
{
  // Get the last two Bytes as node-id
  uint16_t nodeID = pipes[0] & 0xff;

  // Use the last 2 pipes address as nodeID
   sprintf(nodeID,"%X",pipes[0]);
    sprintf(outBuffer,"%2X",nodeID);  
    strcat(outBuffer,",");
    strcat(outBuffer,data);

   // Stop listening and write to radio
    radio.stopListening();

    // Send to hub
    if ( radio.write( outBuffer, strlen(outBuffer)) ) {
       printf("Send successful\n\r");
    }
}


ตัว receiver

RF24 radio(8,9);
const uint64_t pipes[6] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL, 0xF0F0F0F0E4LL, 0xF0F0F0F0E5LL };

void setup(void)
 {
 radio.begin();

  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(76);
  radio.enableDynamicPayloads();
  radio.setRetries(15,15);
  radio.setCRCLength(RF24_CRC_16);
  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1,pipes[1]);
  radio.openReadingPipe(2,pipes[2]);
  radio.openReadingPipe(3,pipes[3]);
  radio.openReadingPipe(4,pipes[4]);
  radio.openReadingPipe(5,pipes[5]);

  radio.startListening();
  radio.printDetails();

  delay(1000);
}
void loop(void)
{
     while (!done)
      {
        len = radio.getDynamicPayloadSize();
        done = radio.read( &receivePayload,len );
       
        radio.stopListening();
        radio.write(receivePayload,len);
        receivePayload[len] = 0;
        printf("Got payload: %s len:%i pipe:%i\n\r",receivePayload,len,pipe);
      }
}

แต่ขณะที่เราทำงานกันอยู่นั้น ก็ประกาศรัฐประหารในระเทศไทยขึ้น เเต่เราก็ยังทำงานกันต่อไม่หยุดหย่อน
เพราะประเทศบางมดอยู่ไกลจากเมืองหลวง เลยไม่ค่อยตื่นเต้นเท่าไหร่
เเต่เพิ่งรุ้ว่าา ซึ้ง ว่ามันสร้างความลำบาก ก็ตอนหารถกลับบ้านไม่ได้นี่แหละคะ
เพราะไม่มีรถคันไหนผ่านไปทางพระราม2เลย และรอคอยนานจนผิดสังเกตุ เเล้วก็มีคนยืนรอรถนับร้อย เเล้วก็มีคนลือว่าๆ พระราม2 ปิดถนน ก็ลองเลยเปลี่ยนแผนการเดินทาง
เเละสุดท้ายก็ถึงบ้านซะที ใช้เวลาเกือบสามชม เเถมยัง ต้อง เดิน ด้วยสองขา เข้าซอยบ้านด้วยย เพราะรถติดมากก ไม่ขยับเลย

วันพุธที่ 21 พฤษภาคม พ.ศ. 2557

ทำ Prototype ชุดการแสดงกันต่อคะ Part2

การทำงานวันนี้ คือ เขียน code ควบคุม LED ต่อให้เสร็จ
เนื่องจากใช้ LED หลายแบบมากๆ เเละแต่ละแบบต่างมี library เฉพาะของมัน
เเละ มีขา pin ที่แตกต่างกันออกไป และ ไม่มีเท่ากัน

จากนั้นก็ทำการรวม code หลอดไฟทุกแบบ ให้มาอยู่ code ชุดเดียวกัน
แต่จะแบ่งด้วยการเขียนเป็น function เพื่อสะดวกต่อการใช้งาน








วันศุกร์ที่ 9 พฤษภาคม พ.ศ. 2557

มาเริ่มทำ Prototype ชุดการแสดงกัน :)

วันนี้ เรามีนัดการทำ Prototype ในพืชมงคลกันคะ  55555
ตอนนี้แบ่งงานออกเป็น 2 ฝ่ายใหญ่ๆ ก็คือ Hardware และ Software คะ โดยแบ่งกันตามความสนใจ
และ ด้วยปริมาณผู้ทำ Hardware จำนวนมาก ดาวก็เลยเลือกที่จะอยู่ทีม Software ที่น่าจะช่วยอะไรมากกว่า

งั้นมาเล่าถึงงานที่รับผิดชอบของแต่ละฝ่ายกันคะ

ฝ่าย Hardware งานหลักๆก็คือ ทำการเปลี่ยนสายไฟสีๆ ให้เป็นสายไฟใสทั้งหมด เพราะ ชุดการแสดงทำจากพลาสติกใส่ทั้งหมด

ฝ่าย Software คือ ทำการเขียนโปรแกรม Control ไฟ LED ซึ่ง ตอนนี้ LED  Strip ที่ใช้ติดชุด ก็มีหลายแบบอยู่ด้วยกัน 

เพราะบางชนิดเป็น LED แบบ หลอด RGB ซึ่งมีขา R G B 12V 
บางชนิด ก็เป็น LED ที่มีขา  5v  data  ground  
บางชนิด ก็เป็น LED ฟลูออเรสเซน ที่มีแค่ขา ไฟ กับ ground   แต่รับด้วยไฟกระแสสลับ
จึงทำให้ Code ที่ใช้แตกต่างกันออกไป และมีการนำ Hardware มาช่วย เพื่อปรับแรงดันไฟ ให้เหมาะสม 
โดยตัว Prototype นี้จะลองคุมไฟ เปิด-ปิด , กระพริบ , และ fade ให้ได้ทั้งหมดคะ เพื่อว่าจะได้มาเปลี่ยนแปลงเข้ากับการแสดงของ อ.พิเชษฐ กลั่นชื่น กันได้ง่าย


งั้นของเล่าถึง Step การทำงานของ การ Control  LED คะ
คือ เผื่อเพื่อนๆที่ไม่ได้มาทำงานส่วนนี้อาจจะไม่เข้าใจการทำงาน
ตามปกติแล้ว การที่หลอดไฟดวงหนึ่งจะติดได้ คือ เราต้องต่อให้ขาหนึ่งของหลอดไฟต่อที่ เข้าไฟ และ อีกขาหนึ่งต่อเข้าGND ก็จะทำให้ครบวงจร และ ไฟติดถูกไหมคะ แต่ต้องระวังว่า ต่อสลับข้างกัน ก็ทำให้ไฟไม่ติดได้นะคะ อิอิ โดยสามารถสังเกตว่าขาไหนบวก ขาไหนลบของหลอด LED ไดด้วยการ ดูความยาวขา ไม่ก็ดูที่ บักที่หลอดไฟ คุ้นๆเหมือนที่อาจารย์เคยสอนตอนวิชา CPE111 รึป่าวคะ อิอิ
ที่นี่เราเวลาจะควบคุมไฟ ด้วย arduino เราต้องทำกันยังไง ?
อย่างง่ายสุด เริ่มที่ LED ธรรมดาๆ
ทำได้สองแบบ ที่เค้าเรียกกันว่า Active Low และ Active High


อย่างแรก Active  High

digitalWrite(2, High); 5v => 0v แล้วไฟจะติด
เพราะ ไฟจาก Pin2(5V) ไหลลง ground ไฟเลยติด

digitalWrite(2, Low); ไฟไม่ติด
เพราะ ไฟจาก Pin2(0V) ไหลลง ground (0v => 0v  ไม่มีความต่างศักย์

ถัดมาคือ Active Low


digitalWrite(2, Low); (5V =>5V) แล้วไฟจะติด
เพราะ ไฟจาก Vsource(5V) ไหลลง จาก Pin2(ground)  ไฟเลยติด

digitalWrite(2,High); ไฟไม่ติด
เพราะ ไฟจาก Vsource(5V) ไหลลง จาก Pin2(5V =>5V ไม่มีความต่างศักย์)   


แล้วพอที่นี่เราอยากทำให้ไฟกระพริบ (Blink)
ก็ทำได้โดย

digitalWrite(2, Low);
delay(1000); //wait 1 sec
digitalWrite(2,High);
delay(1000); //wait 1 sec


จาก code นี้ก็คือ ให้ไฟติด 1 sec แล้ว ดับ 1 sec
เพียงแค่นี้เพื่อนๆก็ได้ไฟกระพริบแล้ว


แล้วถ้าอยากให้ fade ได้ต้องทำยังไง ?
การที่ไฟสว่างมากหรือสว่างน้อย ขึ้นอยู่กับ Volt (V)
ดังนั้น ถ้าเราอยากให้ ปรับความสว่างได้ ต้องไปเขียน code คุมที่ volt กัน
ซึ่ง board arduino มีความสามารถในปล่อยค่า Volt ได้ แต่ต้องเสียบช่องที่เป็น PWM นะคะ เพราะปกติช่อง digital จะปล่อยมาไฟออกมาสองค่าเท่านั้น
คือ 5V = logic1 และ 0v = logic 0

Code หลักๆ ก็อยู่ที่
analogWrite(led, brightness);  

เราก็อาจใช้วิธีวนloopในการเพิ่มค่าไปเรื่อยก็ได้คะ
For(brightness=0; brightness<255; brightness++)
{
       analogWrite(pinled, brightness);  
} 

แต่ถ้าเราไม่ใช่ช่อง PWM ละ ก็ยังทำได้อีกวิธีนึง
ก็คือ ใช้การกระพริบไฟในการหลอกตาคะ
เช่น ไฟติด 10ms ไฟดับ 100ms ก็จะให้ความรู้สึกว่าไฟสว่างน้อย

ในทางกลับกันไฟติด 100ms ไฟดับ 10ms ก็จะให้ความรู้สึกว่าไฟสว่างมาก

digitalWrite(2, Low);
delay(10); //wait 10 ms
digitalWrite(2,High);
delay(100); //wait 100 ms
จะให้ผลลัพธ์ไฟสว่างมาก
====================================================
digitalWrite(2, Low);
delay(100); //wait 100 ms
digitalWrite(2,High);
delay(10); //wait 10 ms
จะให้ผลลัพธ์ไฟสว่างน้อย

ภาพบรรยายกาศที่เราทำงานกัน ^^