lnwshop logo
  • ตอบกระทู้
  • ตั้งกระทู้ใหม่
QUOTE 

NRF24L01 ปรับความเร็วการส่งข้อมูลอย่างไรครับ

Keem Coe 2 ปีที่ผ่านมา

ผมสั่ง NRF24L01 PA LNA  มาคู่นึง และ arduino atmega8 ทดสอบตามโค้ดที่ได้แนะนำในบทความแล้วทำงานได้ดีครับ (ขอบคุณสำหรับโค้ดตัวอย่างด้วยครับ) ผมอยากถามเพิ่มเติมดังนี้ครับ
- ไลบรารี่ที่ให้มาสามารถกำหนดความเร็วในการส่งได้มั้ยครับ เพราะจากข้อมูลในดาต้าชีตถ้าส่งที่ความเร็วตำสุดสามารถส่งได้ไกลสุดใช่มั้ยครับ

- สามารถรับและส่งข้อมูลพร้อมๆกันเลยได้มั้ยครับ เช่น A ส่งข้อมูลไป B ได้รับก็ตอบ ACK กลับมาเพื่อยืนยันข้อมูลและไม่ทราบว่ามันรับส่งกันแบบ half duplex หรือ full duplex ครับ พอจะมีข้อมูลมั้ยครับ

....ตัวนี้ผมจะทำเป็นตัวแปลงข้อมูล serial (uart) แล้วส่งแบบไร้สายไป อีกฝั่งก็รับแล้วส่งต่อออกไปเป็น serial uart อ่ะครับ

ขอบคุณครับ

QUOTE 
ความคิดเห็นที่ #1
เจ้าของร้าน
เจ้าของร้าน
2 ปีที่ผ่านมา

สวัสดีครับคุณ Keem COE
ขอให้ข้อมูลเป็นข้อ ๆ ตามนี้ครับ มีอะไรเพิ่มเติมก็แนะนำผมด้วยนะครับ Laughing

ผมสั่ง NRF24L01 PA LNA  มาคู่นึง และ arduino atmega8 ทดสอบตามโค้ดที่ได้แนะนำในบทความแล้วทำงานได้ดีครับ (ขอบคุณสำหรับโค้ดตัวอย่างด้วยครับ)
- ได้ยินว่าทดลอง nRF24L01 ตามบทความผม แล้วใช้งานได้ดี ผมก็รู้สึกดีใจครับ : ) มีอะไรก็ช่วยแนะนำผมด้วยนะครับ ยินดีที่ได้แลกเปลี่ยนความรู้ครับ

ไลบรารี่ที่ให้มาสามารถกำหนดความเร็วในการส่งได้มั้ยครับ เพราะจากข้อมูลในดาต้าชีตถ้าส่งที่ความเร็วตำสุดสามารถส่งได้ไกลสุดใช่มั้ย ครับ
- จากข้อมูลจาก DataSheet nRF24L01 สามารถตั้งความเร็วได้ 250Kbps, 1Mbps and 2Mbps. ถ้าความเร็วต่ำสุดจะส่งได้ไกลสุดครับ อ้างอิงข้อมูลจากใน datasheet ผมไปลองแกะไลบารีและ ข้อมูลจาก datasheet มาให้แล้ว พบว่าในไฟล์ nRF24L01p.cpp ที่บรรทัดที่ 142 จะมีฟังก์ชัน dataRate(byte _RFdr) สามารถตั้งค่าความเร็วได้ 1M , 2M , 250k โดยตั้งค่า dataRate() ให้ตรงกันทั้งตัวรับและตัวส่ง เช่น

  • transmitter.dataRate(1); // 1M
  • transmitter.dataRate(2); // 2M
  • transmitter.dataRate(250); // 250k

ตัวอย่างการใช้งาน nRF24L01
  transmitter.channel(90);
  transmitter.TXaddress("Artur");
  transmitter.dataRate(250);
  transmitter.init();

สามารถรับและส่งข้อมูลพร้อมๆกันเลยได้มั้ยครับ เช่น A ส่งข้อมูลไป B ได้รับก็ตอบ ACK กลับมาเพื่อยืนยันข้อมูลและไม่ทราบว่ามันรับส่งกันแบบ half duplex หรือ full duplex ครับ พอจะมีข้อมูลมั้ยครับ

- ไม่ได้ครับ ตัวนี้เป็นแบบ half duplex รับและส่งทีละฝั่ง ถ้าต้องการรับและส่งในตัวแบบทีละฝั่งต้องลองดัดแปลงโคดเพิ่มเติมน่าจะครับ สำหรับโคดที่มี ACK ตอบกลับความถูกต้องของข้อมูล มีตัวอย่างโคดในหน้าอุปกรณ์แล้วครับ nRF24L01 with Arduinio's SPI Library. หวังว่าโคดนี้น่าจะช่วยได้

ตัวนี้ผมจะทำเป็นตัวแปลงข้อมูล serial (uart) แล้วส่งแบบไร้สายไป อีกฝั่งก็รับแล้วส่งต่อออกไปเป็น serial uart อ่ะครับ

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

QUOTE 
ความคิดเห็นที่ #2
Keem Coe 2 ปีที่ผ่านมา

ขอบคุณอีกครั้งสำหรับคำแนะนำครับ ผมนำไปทดสอบแล้วได้ผลดังนี้ครับ

--- การกำหนดความเร็วทำได้แล้วแต่ยังไม่ได้ลองเทสระยะทางว่าได้ต่างกันแค่ไหน ตามโค้ด transmitter.dataRate(250); 

--- ส่งไปกลับผมลองโค้ดดังต่อไปนี้ใช้ได้ผลครับ รับ สลับกับส่งได้แล้ว

///////----- ตัวส่ง (ที่เป็นตัวรับด้วย)

#include <SPI.h>

#include <nRF24L01p.h>

nRF24L01p transmitter(7,8);//CSN,CE

void setup(){

  delay(150);

  Serial.begin(115200);

  SPI.begin();

  SPI.setBitOrder(MSBFIRST);

  transmitter.channel(90); // ตั้งช่องความถี่ให้ตรงกัน

  transmitter.TXaddress("MRK1"); // ตั้งชื่อตำแหน่งให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร

  transmitter.RXaddress("MRK2"); //address สำหรับรับข้อมูลกลับ

  //transmitter.dataRate(250);

  transmitter.init();

}

char  message[32];

String data_receiv;

int len;

void loop(){

  if(len=Serial.available()>0)

   {

     Serial.readBytes(message,len);

     String str(message);

     transmitter.txPL(str);  // ค่าที่ต้องการส่ง

     transmitter.send(FAST); // สั่งให้ส่งออกไป

   }

   if(transmitter.available())

  {

    transmitter.read(); // สั่งให้เริ่มอ่าน

    transmitter.rxPL(data_receiv); // สั่งใหอ่านเก็บไว้ที่ตัวแปร

    Serial.print(data_receiv);

    data_receiv="";

  }

  }

 

/////------------- โค้ดตัวรับที่เป็นตัวส่งด้วย

#include <SPI.h>

#include <nRF24L01p.h>

nRF24L01p receiver(7,8);//CSN,CE

void setup(){

  delay(150);

  Serial.begin(115200);

  SPI.begin();

  SPI.setBitOrder(MSBFIRST);

  receiver.channel(90);  // ตั้งช่องความถี่ให้ตรงกัน

  receiver.RXaddress("MRK1");  // ตั้งชื่อตำแห่นงให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร

  receiver.TXaddress("MRK2");  // address สำหรับส่งข้อมูลกลับ

  //receiver.dataRate(250);

  receiver.init();

 }

 

char  message[32];

String data_receiv;

int len;

void loop(){ 

  if(len=Serial.available()>0)

   {

     Serial.readBytes(message,len);

     String str(message);

     receiver.txPL(str);  // ค่าที่ต้องการส่ง

     receiver.send(FAST); // สั่งให้ส่งออกไป

   }

  if(receiver.available()){

    receiver.read(); // สั่งให้เริ่มอ่าน

    receiver.rxPL(data_receiv); // สั่งใหอ่านเก็บไว้ที่ตัวแปร

    Serial.print(data_receiv);

    data_receiv="";

      }

}

 

//////--------------------- ทดสอบนำมาต่อคอมสองเครื่องผ่าน uart serial  มัทำงานได้แล้วเย้ๆ-----------------------

nrf24l01_uart

QUOTE 
ความคิดเห็นที่ #3
Keem Coe 2 ปีที่ผ่านมา

จริงๆโคดทั้งสองเหมือนกันต่างกันแค่ตรงที่

 receiver.RXaddress("MRK1");  // ตั้งชื่อตำแห่นงให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร

  receiver.TXaddress("MRK2");  // address สำหรับส่งข้อมูลกลับ

-------------------------------

  transmitter.TXaddress("MRK1"); // ตั้งชื่อตำแหน่งให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร

  transmitter.RXaddress("MRK2"); //address สำหรับรับข้อมูลกลับ

****address มันไขว้กัน เหมือนต่อ  TX <--> RX 

QUOTE 
ความคิดเห็นที่ #4
เจ้าของร้าน
เจ้าของร้าน
2 ปีที่ผ่านมา

WOW ขอบคุณมาก ๆ ครับ Smile
โคดสวยงาม เพิ่ม Address ให้ไขว้กัน  เหมือนต่อ  TX <--> RX ก็ทำงานรับส่งได้แล้ว เป็น trick ที่มีดีมากเลยครับ

ผมขอปักหมุดไว้เป็นความรู้แชร์คนอื่น ที่กำลังเล่นเหมือนกันนะครับ

QUOTE 
ความคิดเห็นที่ #5
(Guest)
chi (Guest)
IP: 202.176.91.x
2 ปีที่ผ่านมา

็สมารถนำมาต่อกันเป็น Network หลายๆตัวไดเปล่าครับ

QUOTE 
ความคิดเห็นที่ #6
เจ้าของร้าน
เจ้าของร้าน
2 ปีที่ผ่านมา

ทำได้ครับ สามารถทำเป็นตัวรับ 1 ตัว ตัวส่งหลาย ๆ ตัว โดยส่งมาที่ address และ channal เดียวกันครับ

QUOTE 
ความคิดเห็นที่ #7
(Guest)
chi (Guest)
IP: 171.99.44.x
2 ปีที่ผ่านมา

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

code คำสั่งยังไม่เข้าใจว่าจะลำดับการอ่านเครื่องลูกข่ายเข้ามายังไง พอมีคำแนะนำเปล่าครับ

 

QUOTE 
ความคิดเห็นที่ #8
(Guest)
na (Guest)
IP: 124.121.153.x
2 ปีที่ผ่านมา

สามารถทำเป็นตัวส่ง1 ตัว ตัวรับหลาย ๆ ตัว ได้ไหมครับ (ไม่ได้กวนนะครับอยากรู้จริงๆ)

QUOTE 
ความคิดเห็นที่ #9
เจ้าของร้าน
เจ้าของร้าน
2 ปีที่ผ่านมา

ตัวรับ 1 ตัว สามาระรับได้หลาย ๆ ตัวพร้อมกันครับ ตัวอย่างที่นำไปใช้งาน เช่น เอาไปใช้งานเป็นระบบ RFID แบบ Active Tag โดยจะใช้ NRF24L01 เป็นตัวรับ และใช้ NRF24L01 ทำเป็นแท็กตัวส่งซึ่งจะมีหลาย ๆ ตัวส่งมาพร้อมกันที่เครื่องรับ

ตัวอย่างหลักการครับ เช่น

ตัวรับ 1 ตัว มี channal 90

ตัวส่งตัวที่ 1 ส่งข้อมูลไปหาตัวรับที่ channal90 โดยส่งคำว่า "ID1-001";
ตัวส่งตัวที่ 2 ส่งข้อมูลไปหาตัวรับที่ channal90 โดยส่งคำว่า "ID2-002";

ที่ตัวรับจะได้รับข้อมูลเป็น
"ID1-001"
"ID2-002"

ทีนี้เราก็จะเขียนโปรแกรมแยกข้อความออกมาจากข้อมูลที่ได้รับ
"ID1-001" แยกได้เป็น ID1 และ 001
"ID2-002" แยกได้เป็น ID2 และ 002

จะสังเกตว่าเราจะได้ ID1 มีค่า 001 และ ID2 มีค่า 002 ซึ่งทำให้เรารู้ว่า ที่อุปกรณ์ ID1 เซนเซอร์อ่านคามาได้เป็น 001 และที่อุปกรณ์ ID2 เซนเซอร์อ่านค่ามาได้เป็น 002 ครับ

QUOTE 
ความคิดเห็นที่ #10
เจ้าของร้าน
เจ้าของร้าน
2 ปีที่ผ่านมา

สามารถทำเป็นตัวส่ง1 ตัว ตัวรับหลาย ๆ ตัว ได้ไหมครับ (ไม่ได้กวนนะครับอยากรู้จริงๆ)

- ใช้ตัวรับหลายตัว ตัวส่ง 1 ทำได้แน่นอนครับ ผมต่อลองให้เรียบร้อยแล้วครับ Laughing

 

1
2
3
4
ถัดไป ›
แสดงความคิดเห็นที่ 1-10 จากทั้งหมด 90 ความคิดเห็น
ชื่อ
อีเมล
ข้อความ
  • ตอบกระทู้

หมวดหมู่สินค้า

สมาชิก Arduino All

เข้าสู่ระบบด้วย
เข้าสู่ระบบ
สมัครสมาชิก

ยังไม่มีบัญชีเทพ สร้างบัญชีใหม่ ไม่เกิน 5 นาที
สมัครสมาชิก (ฟรี)

Arduino All ขายดี

รหัสสินค้า A015
300.00 บาท
  • สั่งซื้อ
รหัสสินค้า A233
5.00 บาท
  • สั่งซื้อ
รหัสสินค้า A115
10.00 บาท
  • สั่งซื้อ
รหัสสินค้า A238
4.00 บาท
  • สั่งซื้อ
รหัสสินค้า A237
4.00 บาท
  • สั่งซื้อ
รหัสสินค้า A014
90.00 บาท
  • สั่งซื้อ
รหัสสินค้า A225
5.00 บาท
  • สั่งซื้อ
รหัสสินค้า A474
7.00 บาท
  • สั่งซื้อ
รหัสสินค้า A097
4.00 บาท
  • สั่งซื้อ
Go to Top