Tôi tự làm Robot với Raspberry Pi và Arduino như thế nào? - Phần 6: Sử dụng NRF24L01 với Raspberry Pi

Mô tả dự án: 

Hú Hú, Chúng ta cùng tiếp tục với bài 6 trong tutorial của mình laughHôm nay mình sẽ hướng dẫn cách bạn giao tiếp Raspberry và Arduino thông qua module NRF24L01 nhé.

CHUẨN BỊ

TIẾN HÀNH

I. Lắp mạch

Raspberry Pi + NRF24L01

Arduino + NRF24L01

NRF24 Arduino
1 GND
2 3.3V
3 D9
4 D10
5 D13
6 D11
7 D12  

II. Lập trình 

1. Raspberry Pi

Mở cổng SPI

sudo raspi-config

Chọn Advanced Options

Chọn SPI => YES

Khởi tạo thư viện

sudo apt-get update
wget https://github.com/Gadgetoid/py-spidev/archive/master.zip
unzip master.zip
cd py-spidev-master
sudo python setup.py install
cd
mkdir NRF24L01
cd NRF24L01
git clone https://github.com/Blavery/lib_nrf24
cd lib_nrf24
cp lib_nrf24.py /home/pi/NRF24L01
Oke vậy là xong thư viện trên Raspberry. Các bạn lưu ý là phải đặt file nrf của mình trong thư mục NRF24L01, để cùng với thư viện vừa tạo nhé.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Example program to receive packets from the radio link
#
import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BCM) 
from lib_nrf24 import NRF24 
import time 
import spidev 


pipes = [[0xE8, 0xE8, 0xF0, 0xF0, 0xE1], [0xF0, 0xF0, 0xF0, 0xF0, 0xE1]]   
 
radio = NRF24(GPIO, spidev.SpiDev()) 
radio.begin(0, 17) 

radio.setPayloadSize(32) 
radio.setChannel(0x76)    #thiết lập kênh 
radio.setDataRate(NRF24.BR_1MBPS)  #Tốc độ truyền
radio.setPALevel(NRF24.PA_MIN)   # Dung lượng truyền MIn
 
radio.setAutoAck(True) 
radio.enableDynamicPayloads() 
radio.enableAckPayload()
 
radio.openWritingPipe(pipes[0])     # Mở kênh phát
radio.openReadingPipe(1, pipes[1])  # Mở  kênh thu
radio.printDetails()   # In ra thông số Thu phát
 
radio.startListening()   #Bắt đầu thu  
while True:
    tinnhan = list("Chao Arduino")
    while len(tinnhan) <32:
        tinnhan.append(0)
    radio.stopListening()    # Dừng thu để Phát
    radio.write(tinnhan)
    radio.startListening()   #Bắt đầu thu  
    if radio.available(0):   # Nếu có Tín hiệu  tới
    receive = []           
    radio.read(receive, radio.getDynamicPayloadSize())
    print ("Chao Tu: {}".format(receive))       # In thông số nhận
    string = ""
    for n in receive:
        if (n>=32 and n<=126):
        string+= chr(n)
    print("Tin nhan: {}".format(string))    # In tin nhận được từ arduino

2. Arduino

#include <SPI.h>
#include <RF24.h>

const uint64_t pipe = 0xE8E8F0F0E1LL; // địa chỉ thu phải giống với địa chỉ phát của Raspi
RF24 radio(9,10); //thay 10 thành 53 với mega

int val;
const char mess[] = "Chao Raspberry Pi"
void setup(){ 
  while (!Serial);
  Serial.begin(9600);
  //===========================Module NRF24============================
  radio.begin();                                 
  radio.setPALevel(RF24_PA_MAX);      // Dung lượng tối đa
  radio.setChannel(0x76);    
  radio.enableDynamicPayloads(); 
  radio.powerUp(); 
  radio.openWritingPipe(0xF0F0F0F0E1LL);      // Địa chỉ phát phải giống với địa chỉ thu của Raspberry
  radio.openReadingPipe(1, pipe); 
  radio.startListening();      // Bắt đầu thu
}
 
void loop(){
  char receivedMessage[32] = {0};
  if (radio.available()){
    radio.read(receivedMessage, sizeof(receivedMessage));
    Serial.println(receivedMessage);
    radio.stopListening();
    radio.write(mess, sizeof(mess));
    radio.startListening();
    delay(1000);
}

3. Giải thích

Bản chất của module NRF24L01 thì chỉ hoạt động được một chiều ở một thời điểm, và có thể nhận thấy rằng thời gian phát rất ngắn nên ý tưởng để chúng ta có thể giao tiếp 2 chiều trên module này là sẽ cho nó luôn ở trạng thái thu, khi mình muốn phát thì chỉ cần dừng (radio.stopListening()) và write xong thì chỉ cần radio.startListening(). Như vậy là có thể giao tiếp giữa arduino và raspberry pi 2 chiều rồi. 

KẾT LUẬN

Sau bài này mọi người có thể dễ dàng giao tiếp Raspberry Pi và Arduino qua sóng RF sử dụng module NRF24L01 được rôi. Và từ đó chúng ta hãy phát triển thêm, vận dụng những phần trước để dễ dàng điều khiển các thiết bị điện qua Internet trên một giao diện Web (Bài sau mình sẽ hướng dẫn kĩ hơn). 

Chúc các bạn thành công hahacheeky

lên
14 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

NRA - Phần 1: Bật tắt led đơn giản trên Web

Lâu rồi mới có thời gian nghịch với Raspi và Arduino. Hôm nay mình sẽ giới thiệu các bạn những sức mạnh của sự kết hợp giữa Nodejs (N), Raspberry Pi (R), Arduino (A). Ở đây các bạn sẽ điều khiển, thu thập dữ liệu, làm được rất nhiều thứ với arduino và raspberry pi trên website một cách đơn giản và chuyên nghiệp. Đã có nhiều bài viết trên Arduino.vn nói về việc điều khiển bằng Nodejs nhưng hôm nay tôi sẽ giới thiệu các bạn thư viện khác để sử dụng đa dạng hơn.

Bài đầu tiên này, mình sẽ hướng dẫn các bạn một số cơ bản, và một ví dụ bài điều khiển led cổ điển. Tiếp tục xem nhé!!! devil

lên
25 thành viên đã đánh giá bài viết này hữu ích.

Raspberry Pi Kết Hợp Arduino

Như các bạn đã biết Raspberry pi là một máy tính mini nên nó rất mạnh về có thể kết nối internet, lậpj trình nhúng trang web một cách dễ dàng, nhưng nó lại không an toàn cho các dự án phần cứng. Còn Arduino thì rất bền kết hợp tốt nhiều phần cứng nhưng về mảng IoT thì cũng hạn chế hơn raspberry pi. Mỗi cái riêng lẻ là một hạn chế, nhưng tại sao chúng ta không kết hợp chúng lại để dự án của mình tối ưu hóa hơn. Vâng, hôm nay mình xin hướng dẫn các bạn một cách để giao tiếp PI với Arduino.coolangelenlightenedheartyes

lên
12 thành viên đã đánh giá bài viết này hữu ích.