Linh Kiện 69_Module nRF24L01 2.4Ghz – Cách Giao Tiếp Với VĐK ARM Cortex-M3

Chào các bạn!
Hôm nay Linh kiện 69 xin chia sẻ với các bạn cách thức sử dụng module nRF24L01 2.4Ghz

Ảnh mặt trước của Module nRF24L01 2.4Ghz

Ảnh chụp nghiêng Module nRF24L01 2.4Ghz

Sơ đồ phần cứng của Module nRF24L01 2.4Ghz:

Thông số kĩ thuật của Module nRF24L01 2.4Ghz:

– 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.

+ Khuế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 1 khung truyền nhận.
Chú ý: Tốc độ truyền càng nhanh khoảng cách truyền càng gần, ngược lại tốc độ truyền càng chậm thì khoảng cách thu được tín hiệu càng xa. Tùy theo mục đích sử dụng các bạn cấu hình cho phù hợp

Module thu phát không dây nRF24L01 hoạt động theo giao thức SPI, SPI là chuẩn truyền thông nối tiếp tốc độ cao. Đây là  kiểu truyền thông Master-Slave, trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và Slave. SPI là một cách truyền song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select).
Sơ đồ kết nối vi điều khiển:

Nguyên lí hoạt động:

1. Cấu hình địa chỉ truyền nhận

Đầu tiên ta cấu hình địa chỉ truyền nhận dữ liệu, từ 3 – 5 bytes tùy ý,  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  TX_ADDRESS[TX_ADR_WIDTH]={0x68,0x31,0x08,0x10,0x01}; 
    unsigned char RX_ADDRESS[RX_ADR_WIDTH]={0x68,0x31,0x08,0x10,0x01};
    Hàm cấu hình địa chỉ truyền nhận
    SPI_Write_Buf(WRITE_RE + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    
    SPI_Write_Buf(WRITE_RE+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

2. Khung truyền 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 ở đây mình truyền 32 bytes.

    #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 mảng tx_buf
    SPI_Write_Buf(WR_TX_PLOAD, tx_buf,TX_PLOAD_WIDTH);//gửi dữ liệu 1 bytes

Hàm cấu hình số bytes nhận trong void init_NRF24L01(void)

     SPI_Write_Buf(WRITE_RE+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
     Độ rộng bytes nhận 32 bytes (Nhận tối đa 32bytes).

3. Kênh truyề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_RE + RF_CH, 0);

– 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_RE + 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

4. Cấu hình tốc độ truyền công suất phát

– Hàm cấu hình công suất phát.

     SPI_RW_Reg(WRITE_RE + RF_SETUP, 0x07);

Cấu hình tốc độ truyền 1Mpbs, công suất phát 0dmb

Để cấu hình tốc độ truyền theo công suất phát theo riêng mình các bạn chỉ cần sửa giá trị 0x07 thành giá trị khác dựa theo bảng sau

5. Mã CRC, truyền nhận

– Truyền:

     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E);    // Enable CRC, 2 byte CRC

– Nhận:

    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);   // Enable CRC, 2 byte CRC

Các bạn nhìn theo bảng CONFIG Bit thứ 0 để cấu hình mode truyền hoặc nhận. Bằng “1” ứng với PRX cấu hình nhận, bằng “0” ứng với PTX cấu hình truyền.
Bit thứ 1: “0” chế độ tiết kiệm năng lượng hay trạng thái nghỉ, bằng “1” cho phép NRF24L01 hoạt động.
6. 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

7.  Cách nhận dữ liệu của Module nRF24L01 2.4Ghz:

– 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);

* Kết luận:

Mình sẽ nói một cách đơn giản để bạn có định hướng:

Khi giao tiếp với nRF, các bước bạn phải làm như sau:

+ Chân CSN phải đang ở trạng thái cao, sau đó kéo về 0 để nRF đang hiểu là ta đang giao tiếp với nó.

+ Gửi byte cho nRF, byte đầu tiên bạn gửi phải là 1 byte lệnh (command byte) (các loại byte lệnh bạn đọc trong datasheet nhé), cùng lúc đó, nRL sẽ gửi về cho bạn giá trị của thanh ghi status (luôn luôn là như vậy), các byte sau đó thì tùy loại cmd thì nRF sẽ phản hồi lại tùy vào cmd bạn sử dụng.

+ Kéo chân CSN lên mức cao để kết thúc việc giao tiếp.

Xem thêm tại: http://linhkien69.vn/module-nrf24l01-24ghz-cach-giao-tiep-voi-vdk-arm-cortexm3_n57981_g723.aspx#sthash.Ib7zZkdI.dpuf

Linh Kiện 69 chúc các bạn học tập và làm việc thành công!

Advertisements

Cách giao tiếp với Module cảm biến góc gia tốc MPU6050 GY-521

Cách giao tiếp với Module cảm biến góc gia tốc MPU6050 GY-521

Chào các bạn!

Hôm nay LinhKien69 xin chia sẻ với các bạn cách thức giao tiếp giữa vi điều khiển với cảm biến góc gia tốc MPU6050 GY-521
MPU-6050 tích hợp 6 trục cảm biến bao gồm:

     + con quay hồi chuyển 3 trục (3-axis MEMS gyroscope)

     + cảm biến gia tốc 3 chiều (3-axis MEMS accelerometer)

Ngoài ra, MPU-6050 còn có 1 đơn vị tăng tốc phần cứng chuyên xử lý tín hiệu (Digital Motion Processor – DSP) do cảm biến thu thập và thực hiện các tính toán cần thiết. Điều này giúp giảm bớt đáng kể phần xử lý tính toán của vi điều khiển, cải thiện tốc độ xử lý và cho ra phản hồi nhanh hơn. Đây chính là 1 điểm khác biệt đáng kể của MPU-6050 so với các cảm biến gia tốc và gyro khác.
MPU-6050 có thể kết hợp với cảm biến từ trường (bên ngoài) để tạo thành bộ cảm biến 9 góc đầy đủ thông qua giao tiếp I2C.
Các cảm biến bên trong MPU-6050 sử dụng bộ chuyển đổi tương tự – số (Anolog to Digital Converter – ADC) 16-bit cho ra kết quả chi tiết về góc quay, tọa độ… Với 16-bit bạn sẽ có 2^16 = 65536 giá trị cho 1 cảm biến.
Tùy thuộc vào yêu cầu của bạn, cảm biến MPU-6050 có thể hoạt động ở chế độ tốc độ xử lý cao hoặc chế độ đo góc quay chính xác (chậm hơn). MPU-6050 có khả năng đo ở phạm vi:
    + con quay hồi chuyển: ± 250 500 1000 2000 dps

      + gia tốc: ± 2 ± 4 ± 8 ± 16g

Hơn nữa, MPU-6050 có sẵn bộ đệm dữ liệu 1024 byte cho phép vi điều khiển phát lệnh cho cảm biến, và nhận về dữ liệu sau khi MPU-6050 tính toán xong.

– Cách lấy dữ liệu từ cảm biến.

MPU6050 chỉ hỗ trợ chuẩn giao tiếp I2C để xuất giá trị đo sang thiết bị khác (Master) hoặc chính nó lại là nơi xử lý, lưu trữ tín hiệu từ các thiết bị khác kết nối vào.
Đầu tiên ta cần nắm được Protocol của chuẩn I2C

        Slaver Address của MPU6050 mặc định là 0x68 = 0b1101000
Quá trình truyền hoặc nhận dữ liệu được bắt đầu khi có tín hiệu “Start” và kết thúc bởi tín hiệu “Stop

i2c_start();

i2c_stop();
Một khi đã có điều kiện “start” thì Master phải truyền địa chỉ của thanh ghi cần tác động và hành động tương ứng(read/write )
Đối với MPU6050 quy luật truyền do nhà sản xuất đưa ra:
Quá trình đưa dữ liệu từ vi điều khiển xuống cảm biến (chính là việc cài đặt cấu hình cho cảm biến) Write:

Hàm ghi dữ liệu đến một thanh ghi của MPU6050.

void MPU6050_I2C_ByteWrite(u8* pBuffer, u8 writeAddr)
{
    //Gửi bit start
    I2C_GenerateSTART(MPU6050_I2C, ENABLE);         
    while(!I2C_CheckEvent(MPU6050_I2C,I2C_EVENT_MASTER_MODE_SELECT));
    //Gửi địa chỉ của MPU6050
    I2C_Send7bitAddress(MPU6050_I2C, MPU6050_ADDR,I2C_Direction_Transmitter);
    while(!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    //Truy cập đến  1 thanh ghi MPU6050
    I2C_SendData(MPU6050_I2C, writeAddr);
    while(!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    //Gửi dữ liệu đến thanh ghi vừa truy cập
    I2C_SendData(MPU6050_I2C, *pBuffer);
    /* Test on EV8 and clear it */
    while(!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    //Gửi bit STOP
    I2C_GenerateSTOP(MPU6050_I2C, ENABLE);
 }

Hàm đọc dữ liệu từ một thanh ghi của MPU6050 rồi ghi vào mảng pBuffer

void MPU6050_I2C_BufferRead(uint8_t* pBuffer, u8 readAddr, u16 NumByteToRead)

Hàm cấu hình cho MPU6050.

void MPU6050_init()
{
    w_data[0]=0x80;
    MPU6050_I2C_ByteWrite(w_data, PWR_MGMT_1); //Reset Cam Bien
    delay_us(5);
    w_data[0]=0x00;
    MPU6050_I2C_ByteWrite(w_data, PWR_MGMT_1);// Cam bien hoat dong
    delay_us(5);
    w_data[0]=0x00;
    MPU6050_I2C_ByteWrite(w_data, SMPLRT_DIV);
    delay_us(5);
    w_data[0]=0x07;
    MPU6050_I2C_ByteWrite(w_data, CONFIG_MPU);
    delay_us(5);
    w_data[0]=0x18;
    MPU6050_I2C_ByteWrite(w_data, GYRO_CONFIG);  // Do phan giai GYRO la +-2000 do/s
    delay_us(5);
    w_data[0]=0x10;
    MPU6050_I2C_ByteWrite(w_data, ACCEL_CONFIG);
    delay_us(5);
}

Hàm void MPU6050_get_gyro_acc(int16_t* AccelGyro) lưu lại dữ liệu vào mảng mới theo đúng giá trị bank cao, bank thấp

Hàm void MPU6050_get_value() lấy mẫu cho các giá trị góc đọc được

Xem thêm tại: http://linhkien69.vn/cach-giao-tiep-voi-module-cam-bien-goc-gia-toc-mpu6050-gy521_n57980_g723.aspx#sthash.FuZzN45B.dpuf