Bài 10: Giao tiếp Arduino và Raspberry Pi (UART)

Raspberry Pi vốn dĩ là một chiếc máy tính, nó có hầu hết mọi tính năng như một chiếc máy nhưng nhỏ gọn và hạn chế hơn. Vậy thì có thể sử dụng Raspberry Pi để giao tiếp với các loại mạch khác như Arduino Uno? SIM800L?... Câu trả lời là có nhé. Hôm nay bài viết này sẽ hướng dẫn các bạn giao tiếp giữa Arduino và Raspberry Pi.


Kiến thức cần có

Vì sao cần phải giao tiếp giữa Raspberry Pi và Arduino?

Raspberry Pi là một dạng máy tính nhúng nên giá thành nó khá mắc so với các mạch khác. Ngoài ra, nó còn có một số hạn chế như không thể xuất và đọc Analog, việc đọc độ rộng xung cũng bị giới hạn, băm xung khó khăn,… Nhưng ngược lại, Raspberry Pi lại có khả năng như một chiếc máy tính, có wifi, bluetooth, có thể send và get mail… Vì chân GPIO của Raspberry Pi chỉ xuất nhận tối đa 3.3V nên khi dùng các cảm biến 5V trở lên sẽ dễ gây hư hỏng mạch.

Thế nên, để phát triển mạnh mẽ hơn về các dự án IOTs đồng thời tránh hư hỏng cho mạch Raspberry Pi, chúng ta cần phải kết hợp giữa Arduino và Raspberry Pi. Để có thể làm điều đó, chúng ta có rất nhiều cách như giao tiếp I2C, giao tiếp bằng UART, giao tiếp thông qua Bluetooth, thông qua Wifi… Đúng vậy, rất rất rất là nhiều cách luôn. Thế nên mình sẽ hướng các bạn cách giao tiếp đơn giản nhất là qua UART – Serial (cổng USB) nhé!

Ở bài viết này, chúng ta sẽ làm một bài thực hành nho nhỏ, dùng Raspberry Pi để gửi tín hiệu giao tiếp với Arduino. Chúng ta sẽ gửi nhận như sau:

  • Pi: Hello – Arduino: Hi
  • Pi: Name – Arduino: Arduino
  • Pi: Led On – Arduino: Bật HIGH chân 13
  • Pi: Led Off – Arduino: Bật LOW chân  13
  • Pi: Good Bye – Arduino: Không nhận tín hiệu nữa

Chuẩn bị

  • Arduino Uno
  • Raspberry Pi
  • Máy tính
  • 1 Led 5V
  • 1 Điện trở 220Ohm hoặc 1kOhm
  • Breadboard
  • Dây cắm Breadboard

Lắp mạch

Thư viện

Để giao tiếp với Arduino qua Serial, chúng ta cần cài thư viện pyserial cho Python3

  • pip install pyserial
  • pip3 install pyserial

Kiểm tra cổng USB

Không giống với Window, khi bạn gắn cổng USB vào thì Window sẽ báo. Ở Raspbian, các bạn vào Terminal gõ

  • ls /dev/tty*

Sau đó gắn cổng USB vào và gõ lại 1 lần nữa

  • ls /dev/tty*

Khi đó, các bạn sẽ thấy 1 file mới được tạo ra so với ban đầu, đó là đường dẫn đến cổng USB bạn mới gắn vào. Như trong hình sẽ là /dev/ttyACM0.

Lập trình

Arduino

*Lưu ý: Khi trả về Pi cần phải dùng println() không dùng print()

Raspberry Pi

Các bạn dùng IDE hoặc sudo nano tencode.py để nhập code này vào.

*Lưu ý: Tên code không được đặt serial.py vì sẽ bị trùng tên thư viện

Sau đó các bạn chỉnh ser = serial.Serial('/dev/ttyACM0',9600)  thành cổng của Arduino.

Hãy cùng chạy chương trình nào!

  • sudo python3 tencode.py

Kết quả

Giải thích

  • import serial
    Khai báo thư viện Serial
  • ser = serial.Serial(port,baudrate)
    Khai báo cổng Serial tại thư mục Port với tốc độ truyền baudrate
  • string.encode()
    Khi gửi Serial, chúng ta cần gửi theo từng byte chứ không thể gửi thẳng nên cần phải encode trước khi gửi

Chúc các bạn may mắn và thành công

- Đỗ Vương Phúc - FPO