สวัสดีครับ ช่วงนี้กำลังบ้างาน กับไปออกกำลังกายครับ สุขภาพไม่ดี ทำอะไร ก้อไม่ดีนะครับ มือยังคัน หาโครงการใหม่ๆมาลองทำ ตอนนี้ผมมีโครงการจะทำอุปกรณ์ควบคุมภายในบ้าน ยังไม่ได้ตั้งชื่อนะครับ ตอนนี้เรียกว่า Smart Home ไปก่อน

โดยโปรเจคนี้ ผมจะได้ทดลองการสื่อสารหลายๆ อย่าง อย่างระยะใกล้ก้อจะใช้สัญญาณวิทยุ RF หรือ อุปกรณ์ไร้สาย เพื่อเอามาสร้าง เซ็นเซอร์ ไร้สาย กับ ทำรีโมตไร้สาย กับระยะไกลขึ้นมาอีกนิด ก้อว่าจะใช้ internet กับ twitter ก้อทดลองไปแล้วคร่าวๆ

วันนี้เลยมาเล่าเรื่องทดลองอุปกรณ์สื่อสาร กับ arduino กันก่อนครับ โดยตอนนี้ ผมจะรวบรวมโมดูลไร้สาย ที่มาในไทยและราคาไม่สูงมากมาทดลองก่อน

หลังจากที่ดูใน Playground ของ Arduino.cc จะพบว่าในข้อหัว wireless จะมีอุปกรณ์รับส่งไร้สาย อยู่ หลายตัวมาก ถ้าเอาตัวที่หาได้ในไทยก้อจะมี  Bluetooth, Zigbee, โมดุล RF433, โมดุล NRF24L01

ซึ่งราคามีตั้งแต่ สองพัน ถึง ร้อยกว่าบาท ความสามารถแตกต่างกันแน่ๆ ซึ่งผมก้อขอรวบรวมกับสรุปสั้นๆ ดังต่อไปนี้

สำหรับโมดุลสื่อสารที่่เรารู้จักกันในปัจจุบัน

Bluetooth เป็นระบบเครือข่ายอุปกรณ์ระยะใกล้ รองรับ Full duplex รับส่งพร้อมกันได้เลย ประมาณ 5-10 เมตร ซึ่งออกแบบให้เป็นเครื่อข่ายอุปกรณ์ สำหรับเครื่องคอมพิวเตอร์ จะมีทั้ง  Handfree ,Fax ,Send file ,Serial profile ซึ่งเขาตั้งใจจะออกแบบให้เป็นเครือข่ายไร้สายส่วนบุคคลความเร็วสูง ดังตัวอย่างจะเห็นว่า ความเร็วในการส่งข้อมูลจะเร็วมาก สามารถส่งเสียงดิจิตอล โดยมีสัญญาณมีการดีเลย์เพียงเล็กน้อย (ขึ้นอยู่กับสภาพช่องสัญญาณ มีการใช้หนาแน่น ก้อคงจะเชื่อมต่อลำบาก) แต่อย่างไร bluetooh เหมาะกับงานที่มีการถ่ายโอนข้อมูลแบบเป็นสตรีมและการทำงานร่วมกับโหนดอื่นๆ เป็นเน็ตเวิร์ค อย่างเช่นในอุปกรณ์คอมพิวเตอร์ หรือ โทรศัพท์มือถือ มากกว่าครับ

ZigBee / XBee รองรับ Full duplex เป็นโมดุลไร้สายอีกตัวที่กำลังมีความนิยมสูงขึ้นเรื่อยๆ ซึ่งในอนาคตราคาอาจจะถูกลง ตอนนี้เห็นถูกราคาประมาณ 950 บาท จาก 2000 บาทนะครับ  ทำให้นักพัฒนา มักจะมองมาที่ zigbee ก่อน xbee สามารถเชื่อมผ่านทาง UART(สัญญาณ TX ,RX) ได้ และการส่งสัญญาณระยะใกล้ๆ (ยิ่งไกล ยิ่งแพงมากขี้น) และข้อมูลที่ได้มีความถูกต้องมาก (มีไอชีช่วยเข้ารหัสภายใน) ข้อดีที่เห็นชัดเจนคือกินกำลังไฟฟ้าต่ำ ถึงแม้จะส่งได้ระยะไม่ไกลมาก แต่สามารถส่งข้อมูลจาก node ไปยังอีก node ได้ ซึ่งตาม concept นี้เหมาะกับ wireless sensor มาก ซึ่งการมา Xbee ดัน X11 ที่ว่าจะเป็น network ภายในบ้านตกเทรนไปเลยทันที

อันที่จริงๆแล้วโมดุล Zigbee ทำอะไรได้มากกว่า ตัวรับส่งนะครับ สามารถเขียนโปรแกรมเข้าไปแล้วทำเป็น wireless sensor ได้เลย ซึ่งเห็นว่ามันน่าสนใจมาก แต่ผมรอให้มัน ราคาถูกกว่านี้ก่อน :-D

เอาล่ะครับ สำหรับนักทดลองไส้แห้งแบบเรารอไปก่อนดีกว่า มองหาของถูกๆ มาทดลองก่อน

โมดุล RF433MHz, RF315MHz ,RF918MHz จะมีโมดุลเลือกหลายความถี่ และจะรองรับการส่งข้อมูลแบบทางเดียว ไม่รับก้อส่ง หรือจะรับส่ง ก้อต้องติดตั้ง สองโมดุลเข้าไป

ตัวรับ รูปภาพจาก electronic source (es บ้านหม้อ)

ตัวส่ง รูปภาพจาก electronic source (es บ้านหม้อ)

ความเร็วการส่งข้อมูลไม่สูงนัก แค่ 2400BPS จะช้ากว่าพวก zigbee bluetooth เป็นสิบๆๆเท่า แต่ราคามันถูกกว่า โมดุลนี้จะมีแค่อุปกรณ์ขยายสัญญาณ กับ วงจรจูนเนอ์วิทยุ ข้อดีอย่างแรกคือราคาถูก กับ เชื่อมต่อง่าย ใช้ Uart หรือจะเอา I/O มาต่อส่งข้อมูลก้อได้ แต่สิ่งที่เราต้องมาทำคือเราต้องทำส่วน เข้ารหัสข้อมูล และ ออกแบบวิธีการตรวจสอบข้อมูลเองนะครับ ซึ่งคุณ aday ให้ความคิดเห็นว่า อยากเข้าใจอย่างลึกซึ้งต้องไปอ่านเรื่อง data communication เพิ่มเติมครับ เดี่ยวเราจะมาเข้าใจ รู้จัก data comm ง่ายๆ กันในตอนต่อไป

ตัวอย่างการใช้งานกับ arduino Cheap Arduino Wireless Communications, Virtual wire

เริ่มสร้างกันเลยดีกว่า ทดลองโมดุล 433 รุ่นถูกๆ

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

ภาค hardware โดยตัวโมดุล จะหน้าตาแบบในภาพครับ

ตัวส่ง สัญญาณ

วิธีการต่อ จ่ายไฟเข้า VCC,GND และนำขา data in ออกมาใช้งาน

ตัวส่ง
1. GND
2. DATA in  ต่อเข้า D12
3. VCC  จ่ายไฟ 3-12 โวลต์
4. ANT ใช้สายไฟแข็งทำเสา ยาว 23 cm

ตัวรับสัญญาณ (ตัวใหญ่) ไอชีไม่ได้ใช้นะครับ

วิธีการต่อ จ่ายไฟเข้า VCC,GND ที่เห็นขาเยอะๆ จะเป็นขา vcc กับ gnd นะครับ  และนำข้อมูลจาก data out ออกมาใช้งาน

ตัวรับ
1. GND
2. ขา data out ต่อเข้า D11
3. not connect
4. +5v

5. +5v
6. GND
7. GND
8. ANT  ใช้สายไฟแข็งทำเสา ยาว 23 cm

ภาค software กันต่อ โดยตัว libary ที่ผมเอามาใช้ ชื่อ virtual wire

Virtual wire เป็น libary ที่ arduino แนะนำอย่างเป็นทางการ ให้เลือกใช้ playgroud ซึ่งในตัว libary ได้ออกแบบ protocol ที่จัดการ |header | id | data | checksum| เอาไว้แล้ว

หลังจากทดลองตามตัวอย่างที่ตัว libary ให้มาแล้ว ผมก้อแก้ไขโปรแกรมนิดหน่อยครับ เพื่อทดสอบความผิคพลาดของการรับส่งข้อมูล อันนี้เรียกว่า ping test ผมจะใส่หมายถึงเข้าไปด้วยในแต่ล่ะ packet เพื่อดูความต่อเนื่องของการส่งสัญญาณ และ ดูว่ามี packet lost หรือข้อมูลที่ไม่ได้ รับไปเท่าไรแล้ว

โปรแกรมในส่วน Arduino การทดสอบ
ภาคตัวส่ง ใช้ตามตัวอย่าง transmitter.pde เพียงเพิ่มหมายเลขของ packet เข้าไปด้วย

// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

#undef int
#undef abs
#undef double
#undef float
#undef round

int count;
char cc;
char buffer [8];

void setup()
{
count = 0;

Serial.begin(9600);      // Debugging only
Serial.println("setup");

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(1000);     // Bits per sec
}

void loop()
{   cc = sprintf (buffer , "ping %d", count);
digitalWrite(13, true); // Flash a light to show transmitting

vw_send((uint8_t *)buffer, strlen(buffer));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false);
delay(1000);

count++;
}

ภาครับ ใช้ตามตัวอย่างชื่อ receiver.pde ไม่ได้แก้ไข

// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>
#undef int
#undef abs
#undef double
#undef float
#undef round
void setup()
{
Serial.begin(9600);    // Debugging only
Serial.println("setup");

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(1000);     // Bits per sec

vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;

digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], BYTE);
//Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}

การทดสอบ

จากการทดสอบแบบ ping test นะครับ ผมจ่ายไฟให้ตัวส่ง 12v ทดลองในสภาพแวดล้อมที่ไม่มีอะไรกีดขวาง ทั้งกำแพง ประกฏว่าข้อมูลจะส่งได้ดี ไม่มีการผิคพลาดที่ระยะ 20-25 เมตร และยิ่งไกล ก้อ packet ยิ่ง lost มากขึ้น

อันที่จริงผมอยากได้โมดุลส่งข้อมูล ได้ระยะไกลๆ ตามสเปกมันว่าส่งไป 200ft หรือประมาณ 60 เมตร

บทวิเคราะห์
ที่เลือกโมดุลนี้ ตั้งใจจะทำ wireless sensor ง่ายๆ กระจายตามบ้าน ส่งข้อมูลไม่เกิน 20 m จากสเปกว่าจะได้ส่งได้ 60m (200ft ) แต่ปรากฏว่าเหมือนระยะทางเกิน 30 เมตร ยังไม่ถึงครึ่งเลย แล้วมันจะส่งข้อมูลได้ไม่ดีนะ

ผมก้อเลยกลับมาวิเคราะห์ว่า มีหลายปัจจัยที่มีผลนะคับ ทางสภาพแวดล้อมก้อจะมี
1. สิ่งกิ่ดขวาง จากการทดลอง มีคนเดินผ่านในระยะใกล้ๆ มันก้อส่งข้อมูลไม่ได้ครับ
2. สัญญาณรบกวน จากการสอบถามเพื่อนคลื่นคนล่ะย่าน ไม่รบกวนกัน
3. ระยะทาง ด้วยตัวโมดุล เป็นแบบ ASK หรือ ใช้ Amplitude-shift keying หรือใช้ความสูงของคลื่นสัญญาณในการตีความ ค่าทาง digital ครับ นั้นหมายความว่า ยิ่งไกล ความสูงของคลื่นยิ่งอ่อนลง จนตีความไม่ได้

นอกจากโปรแกรมจะมีส่วน ตรวจสอบ packet ความถูกต้อง ถ้าข้อมูลไม่ถูกต้อง 100% ,packet นั้นจะไม่ได้ยอมรับ (eject) การตรวจสอบของ libary virtual wire จะใช้ checksum error ค่าที่ได้มาคำนวนเป็นค่า checksum แล้วตรวจสอบข้อมูล

มาดูว่าภายในโปรแกรม software อะไรที่มีผลบ้าง
1. สัญญาณรบกวนในวงจร อย่างที่กล่าวไว้ ข้อมูลไม่ถูกต้อง 100% จะทำให้ไม่รับ packet
2. ความยาวของ packet ส่ง packet ข้อมูลยาว ก้อมีโอกาสที่จะมีผิคพลาดได้

สรุปดีกว่า
เอาล่ะครับเป็นอันว่า ตัวโมดุลเอง อาจจะอ้างว่าส่งข้อมูลได้ 200ft โดยการส่ง อาจจะไม่ได้ตรวจสอบว่า ระยะ 200ft นี้ packet lost ไปมากน้อยแค่ไหนครับ ซึ่งจิงผมก้อไม่ได้ใช้ขนาดนั้นหรอก คิดว่าถ้าจะให้ดี คงหาตัวส่งที่กำลังสูงๆกว่านี้ หรือ มีตัวช่วยกระจายเป็น node to node

เรือง packet ข้อมูล นอกจาก checksum ก้อยังมีวิธีอีกหลายวิธีที่ช่วยส่งข้อมูลแบบมี recovery data ได้ อย่างเช่นที่ใช้กันใน raid5 ที่ใช้ hdd 3 ตัว มีตัวไหนเสีย ก้อยังใช้งานได้ เราอาจจะประยุกต์แบบเดียวกันได้

แต่อย่างไงก้อตาม ผมก้อยังคิดว่าจะเลือกใช้ โมดุลนี้ เพราะว่างานที่จะใช้เป็นแค่ wireless sensor เล็กน้อยๆ เอาไปใส่ check การเปิด-ปิด ประตู, หน้าตา และระยะทางไม่เกิน 20 เมตร :-D คงยังโอเคอยู่ครับ

สุดท้าย หวังว่าจะได้เห็นเพื่อน จะติดตามอ่านกันจนจบนะครับ และเอาไปประยุกต์กันงานตัวเองต่อไปนะครับ เดี่ยวติดตามชมตอน 1.5 ต่อไป สวัสดี :-D


บทความที่เกี่ยวข้อง

  1. เบิร์น Bootloader ให้ Arduino ตัวใหม่ด้วย FTDI-Bitbang [ตอนที่ 2]จากตอนที่แล้ว เราก้อได้แปลงกายเจ้า UCON-UART [FT232RL] เป็นเครื่องเบิร์นได้แล้ว ในบทความตอนนี้ เราจะเอาเครื่องเบิร์น FTDI ฺBitbang กับ avrdude-gui ใช้งาน burn bootloader กันดีกว่าครับ...
  2. บันทึกนักทดลอง [ตอนที่ 1] ลองไปมั่วๆช่วงนี้ เข้ามาไม่ได้เห็นโปรเจคอะไร อย่าพึ่งตกใจ ว่าเวปผมเปลี่ยนไปสักแล้ว จิงๆ ตอนนี้ทางเราก้อยังทำการสร้าง ทดลองโปรเจคกันต่อไปเรื่อยครับ แต่ส่วนมากก้อยังไม่มีอะไร work มากครับ มันเน้นไปทดลองโหลต libary มาลองแล้ว สักมากกว่า พวกอยากรู้...
  3. ชมการผลิตบอร์ด Arduino(clone) เครื่องเบิร์นดัดแปลงที่ข้าพเจ้าใช้งานอยู่ตอนนี้เกือบปีแล้ว เร็วเหมือนโกหก เวปไอยาฟันส์ ก้อเดินทางไปเรื่อยๆ จิงอาจจะดูว่าช้าไปบ้างนะครับ ทางเราก้อกำลังปรับตัวให้เข้ากับโลกอินเตอร์เน็ทอยู่ สำหรับตอนนี้ทาง ไอยาฟันส์ใช้ ก้อทำบอร์ดสำหรับการ burn ทำมาพิเศษ นิดหน่อย เพราะว่า ทางเราก้อหารายได้เล็กน้อยจากการขายบอร์ด Arduino(clone)...
  4. arduino + twitter เสียงทวิตๆเล็ก ดังถึงดวงดาว ภาค Hardware – ตอน 2หลังจากบทความรอบที่แล้วออกไป ไม่คาดคิดเลยว่า กระแส twitter จะแรงแบบข้ามคืน จากข่าวทีวี และ หนังสือพิมพ์ เขียนถึงหมายเหตุการเมือง ที่มี soical network เทคโนโลยีเข้าไปเกียวข้อง ก้อเลยมาประจวบเหมาะกับบทความที่กำลังจะเสนอพอดี กลายเป็นกระแส...
  5. Arduino Hacking ตอน Burn Bootloader ง่ายนิดเดียว ?ตอนนี้ คนเริ่มใช้ Arduino กันเยอะมากขึ้นแล้ว หลังจากที่สำรวจ ตอนนี้ก้อมี บอร์ดที่เรียกว่า Arduino(clone) /Freeduino /m168 board อยู่หลายเจ้าเลย เดี่ยวคงจะมีปัญหา ตัว bootloader...