Tutorial

สื่อสารไร้สาย กับ Arduino : ตอนที่ 1 ทดลองโมดุล lowcost RF

By October 29, 2009 June 6th, 2012 22 Comments

สวัสดีครับ ช่วงนี้กำลังบ้างาน กับไปออกกำลังกายครับ สุขภาพไม่ดี ทำอะไร ก้อไม่ดีนะครับ มือยังคัน หาโครงการใหม่ๆมาลองทำ ตอนนี้ผมมีโครงการจะทำอุปกรณ์ควบคุมภายในบ้าน ยังไม่ได้ตั้งชื่อนะครับ ตอนนี้เรียกว่า 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 ได้เลย ซึ่งเห็นว่ามันน่าสนใจมาก แต่ผมรอให้มัน ราคาถูกกว่านี้ก่อน

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

โมดุล 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 ไม่ได้แก้ไข
[cpp] // 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, &amp;buflen)) {
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 &lt; buflen; i++) {
Serial.print(buf[i], BYTE);
//Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}[/cpp] การทดสอบ

จากการทดสอบแบบ 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 เมตร 😀 คงยังโอเคอยู่ครับ

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

22 Comments

  • soulx says:

    เพราะพี่ test ที่ตึกอธิการเป่ามันเลยไม่ค่อยได้อะ แถวนั้นมันโดนกวนเยอะอะ
    ตอนผมใช้ bim อะมันได้นิดเดียวเองอะ

  • chang says:

    อืม อันนี้ไม่รู้เหมือนกัน ว่าใต้ตึกลงอาคมอะไรไว้
    แต่เดี่ยวทำ PCB จะไปลองที่อื่นต่อครับ

    ว่าแต่ BIM ยังอยู่หรือป่าว เอาามาลองหน่อย

  • phatthai says:

    แถวหน้าม. มีอาคมทุกความถี่อ่ะพี่ ลองเอาเทคโนโลยีนาซาไปลองป่าว กะทะไก่ทอดอ่ะ เวิร์คมาก

    bim ไม่น่าจะอยู่แล้วพี่ เท่าที่จำได้เหลืออยู่ตัวเดียว แถมไม่รู้เสียยัง
    เอา Xbee ไปลองมะ

  • soulx says:

    xbee ก้อดับพี่ เคยลองแล้ว

  • สถานที่เทสคุ้นๆ นะครับ 😛 เห็นภาพแล้วนึกถึงภาพฝูงยุงเลยละ

    ผมเด็กบางมดเช่นกัน เข้ามาเยี่ยมเยียนครับ ชอบเรื่องไมโครฯเหมือนกัน กำลังหาเวลาศึกษาอยู่ครับ 🙂

  • ter says:

    พอมีตัวอย่างการเขียน ติดต่อกับ โมดุล NRF24L01 ไหมครับ ใช้ avr
    ขอหน่อยครับ

  • milipo says:

    ตอนนี้ใช้ AVR อยู่เหมือนกันค่ะ แต่ยังเขียนให้มันติดต่อกันไม่ได้เลย
    ใช้ DCBT-24AX เป็นโมดุล NRF24L01 เหมือนกันค่ะ อยากได้ตัวอย่างการเขียนติดกับโมดุลเหมือนกันค่ะ

    • chang says:

      สงสัยผมจะได้ทดลอง หลังปีใหม่ล่ะครับ ตอนนี้ซื้อมาแล้ว NRF24L01

  • milipo says:

    พี่ได้ทดลองรึยังค่ะ หนูมีเรื่องถามเยอะเลย มันยังติดต่อกันไม่ได้เลยค่ะ ไม่เข้าใจเหมือนกันว่าทำไม

  • milipo says:

    ใช้ Arm7 ค่ะ แต่สงสัยคงต้องเปลี่ยนมาใช้ X’bee แล้วมั๊งคะ

  • Siriwat R says:

    ผมกำลังทำโปรเจ็คที่ต้องใช้wireless sensor อ่ะคับ  แต่ตามท้องตลาดหายากมาก เพราะมีแต่แบบมีสายราคา 490 กับพวกที่เป็นระบบความปลอดภัย 20000กว่าบาท   อยากทราบวิธีการเชิงลึกกว่านี้  หรือถ้าพี่ทราบว่า wireless sensor ที่เอาไปเขียนโปรแกรมต่อได้ราคาไม่แพงนัก  รบกวนส่งเมล์มาหาผมหน่อยนะครับ ที่ siriwat.r@gmail.com ขอบคุณครับ

  • “โมดุล 433 รุ่นถูกๆ” รุ่นนี้ราคาเท่าไร ขายที่ไหนครับใครพอรู้บ้าง?

  • “โมดุล 433 รุ่นถูกๆ” แล้วรุ่นนี้ใช้ Arduino ส่งข้อมูลเป็น Digital ได้มั้ยครับบ?

    • ChANg says:

      รับเป็น digital ครับ แต่ต้องหาวิธีกรอง noise ออกก่อนนะครับ
      สัญญาณที่ส่งมา จะเต็มไปด้วย noise ครับ

  • Songkran Sawangwan says:

    ขอคำแนะนำหน่อยครับ ถ้าผมจะทำหุ่นยนต์ให้มันวิ่งเข้าไปหาตัวส่งสัญญาณคือเอาไปวางไว้สักที่หนึ่ง

    โดยตัวรับสัญญาณอยู่หุ่นจะทำได้ไหมครับ ขอคำแนะนำหน่อยครับ

    • เม้ง นักประดิษฐ์ says:

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

  • Thongchai Sone Buapeng says:

    สวัสดีครับ ยังมีคนตอบอยู่ไหมครับบ อยากถามมากมายเลยครับ

  • เม้ง นักประดิษฐ์ says:

    อันที่จริงผมสนใจอีกหนึ่งวิธีอ่าครับ
    คือการสร้างชุดเชื่อมต่อระหว่างไมโครคอนโทรลเลอร์ กับวิทยุสื่อสาร
    สมาชิกท่านใดพอจะพบหนทางมั้ยครับ

Leave a Reply