ผมสั่ง NRF24L01 PA LNA มาคู่นึง และ arduino atmega8 ทดสอบตามโค้ดที่ได้แนะนำในบทความแล้วทำงานได้ดีครับ (ขอบคุณสำหรับโค้ดตัวอย่างด้วยครับ) ผมอยากถามเพิ่มเติมดังนี้ครับ
- ไลบรารี่ที่ให้มาสามารถกำหนดความเร็วในการส่งได้มั้ยครับ เพราะจากข้อมูลในดาต้าชีตถ้าส่งที่ความเร็วตำสุดสามารถส่งได้ไกลสุดใช่มั้ยครับ
- สามารถรับและส่งข้อมูลพร้อมๆกันเลยได้มั้ยครับ เช่น A ส่งข้อมูลไป B ได้รับก็ตอบ ACK กลับมาเพื่อยืนยันข้อมูลและไม่ทราบว่ามันรับส่งกันแบบ half duplex หรือ full duplex ครับ พอจะมีข้อมูลมั้ยครับ
....ตัวนี้ผมจะทำเป็นตัวแปลงข้อมูล serial (uart) แล้วส่งแบบไร้สายไป อีกฝั่งก็รับแล้วส่งต่อออกไปเป็น serial uart อ่ะครับ
ขอบคุณครับ
สวัสดีครับคุณ Keem COE
ขอให้ข้อมูลเป็นข้อ ๆ ตามนี้ครับ มีอะไรเพิ่มเติมก็แนะนำผมด้วยนะครับ
ผมสั่ง NRF24L01 PA LNA มาคู่นึง และ arduino atmega8 ทดสอบตามโค้ดที่ได้แนะนำในบทความแล้วทำงานได้ดีครับ (ขอบคุณสำหรับโค้ดตัวอย่างด้วยครับ)
- ได้ยินว่าทดลอง nRF24L01 ตามบทความผม แล้วใช้งานได้ดี ผมก็รู้สึกดีใจครับ : ) มีอะไรก็ช่วยแนะนำผมด้วยนะครับ ยินดีที่ได้แลกเปลี่ยนความรู้ครับ
ไลบรารี่ที่ให้มาสามารถกำหนดความเร็วในการส่งได้มั้ยครับ เพราะจากข้อมูลในดาต้าชีตถ้าส่งที่ความเร็วตำสุดสามารถส่งได้ไกลสุดใช่มั้ย ครับ
- จากข้อมูลจาก DataSheet nRF24L01 สามารถตั้งความเร็วได้ 250Kbps, 1Mbps and 2Mbps. ถ้าความเร็วต่ำสุดจะส่งได้ไกลสุดครับ อ้างอิงข้อมูลจากใน datasheet ผมไปลองแกะไลบารีและ ข้อมูลจาก datasheet มาให้แล้ว พบว่าในไฟล์ nRF24L01p.cpp ที่บรรทัดที่ 142 จะมีฟังก์ชัน dataRate(byte _RFdr) สามารถตั้งค่าความเร็วได้ 1M , 2M , 250k โดยตั้งค่า dataRate() ให้ตรงกันทั้งตัวรับและตัวส่ง เช่น
ตัวอย่างการใช้งาน 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 อ่ะครับ
- ผมเชื่อว่าทำได้อยู่แล้วครับ อุปกรณ์พร้อม + ข้อมูลพร้อม ไม่เกินความสามารถ ทำเสร็จแล้วถ่ายรูปเอามาโชว์ในเว็บบอร์ดมั่งนะครับ อยากเห็นด้วยคนครับ
ขอบคุณอีกครั้งสำหรับคำแนะนำครับ ผมนำไปทดสอบแล้วได้ผลดังนี้ครับ
--- การกำหนดความเร็วทำได้แล้วแต่ยังไม่ได้ลองเทสระยะทางว่าได้ต่างกันแค่ไหน ตามโค้ด 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 มัทำงานได้แล้วเย้ๆ-----------------------
จริงๆโคดทั้งสองเหมือนกันต่างกันแค่ตรงที่
receiver.RXaddress("MRK1"); // ตั้งชื่อตำแห่นงให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร
receiver.TXaddress("MRK2"); // address สำหรับส่งข้อมูลกลับ
-------------------------------
transmitter.TXaddress("MRK1"); // ตั้งชื่อตำแหน่งให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร
transmitter.RXaddress("MRK2"); //address สำหรับรับข้อมูลกลับ
****address มันไขว้กัน เหมือนต่อ TX <--> RX
WOW ขอบคุณมาก ๆ ครับ
โคดสวยงาม เพิ่ม Address ให้ไขว้กัน เหมือนต่อ TX <--> RX ก็ทำงานรับส่งได้แล้ว เป็น trick ที่มีดีมากเลยครับ
ผมขอปักหมุดไว้เป็นความรู้แชร์คนอื่น ที่กำลังเล่นเหมือนกันนะครับ
็สมารถนำมาต่อกันเป็น Network หลายๆตัวไดเปล่าครับ
ทำได้ครับ สามารถทำเป็นตัวรับ 1 ตัว ตัวส่งหลาย ๆ ตัว โดยส่งมาที่ address และ channal เดียวกันครับ
ขอบคุณครับ พอดีจะสั่งซื้อมาใช้ในบริษัท ใช้บอกสถานะของเครื่องจักรแต่ล่ะเครื่องว่าอยูในสถานะอะไรอยู่ แต่เรื่อง
code คำสั่งยังไม่เข้าใจว่าจะลำดับการอ่านเครื่องลูกข่ายเข้ามายังไง พอมีคำแนะนำเปล่าครับ
สามารถทำเป็นตัวส่ง1 ตัว ตัวรับหลาย ๆ ตัว ได้ไหมครับ (ไม่ได้กวนนะครับอยากรู้จริงๆ)
ตัวรับ 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 ครับ
สามารถทำเป็นตัวส่ง1 ตัว ตัวรับหลาย ๆ ตัว ได้ไหมครับ (ไม่ได้กวนนะครับอยากรู้จริงๆ)
- ใช้ตัวรับหลายตัว ตัวส่ง 1 ทำได้แน่นอนครับ ผมต่อลองให้เรียบร้อยแล้วครับ