I. GIỚI THIỆU NRF24L01
1.Thông số kỹ thuật
- Radio
- Hoạt động ở giải tần 2.4G
- Có 126 kênh
- Truyền và nhận dữ liệu
- Truyền tốc độ cao 1Mbps hoặc 2Mbps.
- Công suất phát:
- Có thể cài đặt được 4 công suất nguồn phát: 0,-6,-12,-18dBm.
- Thu:
- Có bộ lọc nhiễu tại đầu thu
- Kếch đại bị ảnh hưởng bởi nhiễu thấp (LNA)
- Nguồn cấp:
- Hoạt động từ 1.9-3.6V.
- Các chân IO chạy được cả 3.3 lẫn 5V.
- Giao tiếp:
- 4 pin SPI
- Tốc độ tối đa 8Mbps
- 3-32 bytes trên
2.Phân tích
- Modul nRF24L01 hoạt động ở tần số sóng ngắn 2.4G nên Modul này khả năng truyền dữ liệu tốc độ cao và truyền nhận dữ liệu trong điều kiện môi trường có vật cản
- Modul nRF24L01 có 126 kênh truyền. Điều này giúp ta có thể truyền nhận dữ liệu trên nhiều kênh khác nhau.
- Modul khả năng thay đổi công suất phát bằng chương trình, điều này giúp nó có thể hoạt động trong chế độ tiết kiệm năng lượng.
- Chú ý: Điện áp cung cấp cho là 1.9à3.6V. Điện áp thường cung cấp là 3.3V. Nhưng các chân IO tương thích với chuẩn 5V. Điều này giúp nó giao tiếp rộng dãi với các dòng vi điều khiển.
II. Sơ đồ phần cứng
Sơ đồ kết nối vi điều khiển:
Khi kết nối tới vi điều khiển bạn nhớ cấu hình chân đó là output hay input (AVR, PIC)
III.Phần mềm
Bạn có thể tham khảo trong code của mình update theo Product. Mình sẽ giải thích cách cài đặt để hoạt động trong các chế độ.
1.Khung truyền
2.Địa chỉ truyền nhận
Khung truyền của nRF24L01 từ 3-5 bytes dùng làm địa chỉ. Bạn có thể cấu hình, nhưng địa chỉ truyền như thế nào thì địa chỉ nhận của chip tương ứng phải giống như thế để có thể thu được tín hiệu. Trong chương trình mình dùng 5 byte cho địa chỉ truyền nhận.
#define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width unsigned char const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; unsigned char const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};
Hàm void init_NRF24L01(void)cấu hình truyền nhận :
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
3.Khung dữ liệu
Khung dữ liệu từ 0-32 byte, hiện tại mình dùng 32 byte. Nếu bạn dùng số lượng byte khác thì có thể cấu hình trong biến.
#define TX_PLOAD_WIDTH 32 // 32 uints TX payload #define RX_PLOAD_WIDTH 32 // 32 uints TX payload
Hàm nRF24L01_TxPacket(unsigned char * tx_buf) gửi dữ liệu trong tx_buf
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // gửi dữ liệu 32 byte
Trong hàmvoid init_NRF24L01(void)cấu hình số byte nhận.
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // Do rong data nhận 32 byte
4.Kênh truyền nhận và địa chỉ nhận.
- nRF24L01 có 126 kênh truyền. Ban có thể lựa chọn kênh truyền nào bạn muốn bằng hàm.
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // kênh 0, tần số RF = 2400 + RF_CH* (1or 2 M)
- Trong 1 kênh truyền, nRF24L01 có thể nhận được 6 luồng dữ liệu. Do đó bạn phải lựa chọn 1 trong 6 luồng đó.
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 0x01 Luồng P0 // 0x02 Luồng P1 // 0x03 Luồng P2 // 0x04 Luồng P3 // 0x05 Luồng P4 // 0x06 Luồng P5 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 0x01 Enable Luồng P0 // 0x02 Enable Luồng P1 // 0x03 Enable Luồng P2 // 0x04 Enable Luồng P3 // 0x05 Enable Luồng P4 // 0x06 Enable Luồng P5
5.Tốc độ đường truyền và công suất nguồn phát
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 1M, 0dbm
6.Mã CRC, truyền nhận
- Truyền:
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // Enable CRC, 2 byte CRC, Send
- Nhận:
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F); // Enable CRC, 2 byte CRC, Recive
7.Cách gửi dữ liệu:
Sau khi cấu hình các trạng thái hoạt động của nRF24L01 thông qua hàm:
void init_NRF24L01(void)
Để gửi dữ liệu đi bạn làm theo các bước sau.
- Cho dữ liệu vào buffer, biến TxBuf[32]
- Chọn nRF24L01 ở chế độ phát, gọi hàm void SetTX_Mode(void);
- Gọi hàm void nRF24L01_TxPacket(unsigned char * tx_buf); để truyền dữ liệu trong TxBuf[32] đi
8.Cách nhận dữ liệu
- Chọn nRF24L01 ở chế độ thu, gọi hàm void SetRX_Mode(void);
- Độ dữ liệu trong bộ đệm sau khi gọi hàm unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
IV. Chương trình
- Sử dụng 2 board 89S52
Mình up lên Video 89S52 trước, mình sẽ up code và video của PIC và AVR sau: - Download
Code giao tiếp trên PIC877A
Code giao tiếp với AT89S52
Code giao tiếp với ATMEGA8