Giao Tiếp Nối Tiếp Orange Pi và Arduino qua USB với Python

Giao Tiếp Nối Tiếp Orange Pi và Arduino qua USB với Python

Mở rộng khả năng của Orange Pi bằng cách thiết lập giao tiếp hiệu quả với Arduino là một bước quan trọng trong nhiều dự án điện tử và IoT. Bài viết này sẽ hướng dẫn bạn cách thực hiện giao tiếp nối tiếp giữa Orange Pi và Arduino thông qua cổng USB, sử dụng ngôn ngữ lập trình Python. Phương pháp này không chỉ đơn giản mà còn cực kỳ linh hoạt, cho phép bạn điều khiển các thiết bị ngoại vi hoặc thu thập dữ liệu từ cảm biến một cách dễ dàng.

Tổng quan về Giao tiếp Nối tiếp

Giao tiếp nối tiếp là một phương pháp truyền dữ liệu từng bit một qua một kênh truyền thông. Trong trường hợp này, chúng ta sẽ sử dụng giao diện USB, mà hệ thống Linux sẽ nhận diện như một thiết bị nối tiếp ảo (ví dụ: /dev/ttyUSBX). Mặc dù hướng dẫn này tập trung vào USB, bạn hoàn toàn có thể áp dụng nguyên lý tương tự cho giao tiếp qua các chân GPIO UART của Orange Pi (thường là /dev/ttySX) nếu muốn tiết kiệm cổng USB hoặc cần hiệu suất cao hơn.

Chuẩn bị cần thiết

Để bắt đầu, bạn cần đảm bảo các điều kiện sau:

  • Kết nối vật lý: Arduino của bạn cần được kết nối với Orange Pi thông qua cáp USB.
  • Mã Arduino: Mã chương trình (sketch) cần được nạp vào bo mạch Arduino trước khi kết nối với Orange Pi.
  • Thư viện Python: Cài đặt các gói Python cần thiết trên Orange Pi để xử lý giao tiếp nối tiếp.

Các bước thực hiện

Hãy cùng đi vào chi tiết từng bước để thiết lập giao tiếp nối tiếp giữa hai thiết bị.

1. Tạo mã Arduino

Đầu tiên, bạn cần viết một chương trình đơn giản cho Arduino để gửi dữ liệu qua cổng nối tiếp. Mã ví dụ dưới đây sẽ gửi lần lượt các ký tự ‘z’, ‘y’, ‘n’ mỗi 5 giây. Ký tự ‘z’ sẽ là ký tự không được Orange Pi nhận diện, trong khi ‘y’ và ‘n’ sẽ được xử lý.

void setup() {
  Serial.begin(9600); // Khởi tạo cổng Serial với tốc độ 9600 baud
}

void loop() {
  Serial.write('z'); // Gửi ký tự 'z' (không được nhận diện)
  delay(5000);       // Chờ 5 giây

  Serial.write('y'); // Gửi ký tự 'y' (được nhận diện)
  delay(5000);       // Chờ 5 giây

  Serial.write('n'); // Gửi ký tự 'n' (được nhận diện)
  delay(5000);       // Chờ 5 giây
}

2. Nạp mã vào Arduino

Sử dụng phần mềm Arduino IDE, kết nối Arduino với máy tính của bạn và nạp đoạn mã trên vào bo mạch. Đảm bảo mã được nạp thành công trước khi chuyển sang bước tiếp theo.

3. Kết nối Arduino với Orange Pi

Sau khi nạp mã, ngắt kết nối Arduino khỏi máy tính và cắm nó vào một cổng USB trống trên Orange Pi của bạn.

4. Xác định cổng Serial

Trên Orange Pi, bạn cần xác định tên thiết bị nối tiếp mà Arduino được gán. Mở terminal và chạy lệnh sau:

ls /dev/tty*

Bạn sẽ thấy một danh sách các thiết bị. Tìm kiếm thiết bị có dạng /dev/ttyUSBX (ví dụ: /dev/ttyUSB0) – đây chính là cổng nối tiếp của Arduino. Ghi nhớ tên này để sử dụng trong script Python.

5. Cài đặt các gói Python cần thiết

Trước khi viết script, hãy đảm bảo Orange Pi đã cài đặt Python và thư viện pySerial để xử lý giao tiếp nối tiếp. Chạy các lệnh sau trong terminal:

sudo apt-get update
sudo apt-get install python3 python3-dev python3-serial

Lưu ý: Chúng ta sử dụng python3 và các gói liên quan để đảm bảo tương thích với phiên bản Python hiện đại.

6. Tạo và chỉnh sửa Script Python

Bây giờ, hãy tạo một tệp script Python mới trên Orange Pi. Sử dụng trình soạn thảo văn bản như nano:

sudo nano testSerial.py

Dán đoạn mã Python dưới đây vào tệp. Đảm bảo thay thế /dev/ttyUSB0 bằng tên cổng nối tiếp thực tế mà bạn đã xác định ở Bước 4 nếu nó khác.

# -*- coding: utf-8 -*-

# Import các thư viện cần thiết
import serial
import time

# Mở cổng nối tiếp
# Thay '/dev/ttyUSB0' bằng cổng của bạn nếu khác
try:
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) 
    # Thêm timeout để tránh chặn vô thời hạn khi đọc
    print("nCổng Serial đã được mở thành công!n")
    ser.write(b'OPI: Cong da morn') # Gửi chuỗi byte (Python 3 yêu cầu byte)
except serial.SerialException as e:
    print(f"Lỗi khi mở cổng Serial: {e}")
    exit()

while True:
    try:
        # Đọc một ký tự từ cổng nối tiếp
        caracter = ser.read(1) # Đọc 1 byte

        if caracter: # Chỉ xử lý nếu có ký tự nhận được
            # Chuyển đổi byte sang string để so sánh
            caracter_str = caracter.decode('utf-8')

            # Xử lý ký tự nhận được
            if caracter_str == 'y':
                print("Nhận được ký tự 'y'")
                ser.write(b'OPI: Ky tu [y] da nhanrn')
            elif caracter_str == 'n':
                print("Nhận được ký tự 'n'")
                ser.write(b'OPI: Ky tu [n] da nhanrn')
            else:
                print(f"Nhận được ký tự không mong đợi: '{caracter_str}'")
                ser.write(b'OPI: Ky tu khong mong doi, hay gui [y] hoac [n]rn')

        # Tạm dừng một chút để tránh tiêu tốn CPU quá mức
        time.sleep(0.1)

    except KeyboardInterrupt:
        print("nChương trình dừng bởi người dùng.")
        break
    except serial.SerialException as e:
        print(f"Lỗi giao tiếp Serial: {e}")
        break
    except Exception as e:
        print(f"Đã xảy ra lỗi: {e}")
        break

# Đóng cổng nối tiếp khi kết thúc chương trình
if ser.is_open:
    ser.close()
    print("Cổng Serial đã đóng.")

Lưu ý quan trọng khi sửa đổi mã Python:

  • Trong Python 3, hàm print yêu cầu dấu ngoặc đơn (ví dụ: print("...")).
  • Hàm ser.write() yêu cầu một chuỗi byte, vì vậy hãy sử dụng b'your stringrn' thay vì chỉ 'your stringrn'.
  • Hàm ser.read() sẽ trả về một chuỗi byte, bạn cần giải mã nó thành chuỗi (ví dụ: caracter.decode('utf-8')) để so sánh với các ký tự chuỗi Python thông thường.
  • Thêm timeout=1 vào serial.Serial() để ser.read() không bị chặn vô thời hạn, giúp chương trình phản hồi tốt hơn và tránh tình trạng treo.
  • Thêm xử lý lỗi try-except để chương trình ổn định hơn trong quá trình chạy.

7. Lưu Script

Sau khi dán mã, nhấn Ctrl + X, sau đó Y (Yes) và Enter để lưu tệp và thoát trình soạn thảo nano.

8. Chạy chương trình

Trong terminal, thực thi script Python của bạn bằng lệnh:

sudo python3 testSerial.py

9. Kiểm tra và dừng chương trình

Quan sát đầu ra trong terminal. Bạn sẽ thấy các thông báo hiển thị khi Orange Pi nhận được các ký tự ‘y’, ‘n’ hoặc một ký tự không mong đợi từ Arduino. Điều này xác nhận rằng giao tiếp nối tiếp đã được thiết lập thành công.

Để dừng chương trình, nhấn Ctrl + C trong terminal.

Với các bước trên, bạn đã thành công thiết lập giao tiếp nối tiếp hai chiều giữa Orange Pi và Arduino. Đây là nền tảng vững chắc để phát triển các dự án phức tạp hơn, từ điều khiển robot đến thu thập dữ liệu môi trường, mở ra vô vàn khả năng sáng tạo trong thế giới IoT và hệ thống nhúng.

Leave a Comment

👈 Vuốt để chuyển bài 👉

KIỂM TRA PORT

IPv6 của bạn: Đang lấy...