การสื่อสารกับ Arduino โดยใช้ Raspberry Pi

Communicating with an Arduino Using a Raspberry Pi

Raspberry Pi และ Arduino สามารถสื่อสารกันได้โดยใช้โปรโตคอลที่แตกต่างกันรวมถึง อนุกรม (uart), i2c และ spi- คู่มือนี้จะแสดงวิธีการตั้งค่าการสื่อสารระหว่าง Raspberry Pi และ Arduino โดยใช้ไฟล์ อินเทอร์เฟซอนุกรม (UART)ซึ่งเป็นวิธีที่พบได้บ่อยที่สุดและตรงไปตรงมา


สิ่งที่คุณต้องการ

  1. Raspberry Pi (รุ่นใด ๆ ที่มีการสนับสนุน GPIO เช่น PI 3, PI 4)
  2. Arduino (เช่น uno, mega, nano)
  3. สาย USB (สำหรับการเชื่อมต่อ Arduino กับ Raspberry Pi)
  4. สายจัมเปอร์ (หากใช้การสื่อสารแบบอนุกรม GPIO)
  5. ติดตั้ง Python บนราสเบอร์รี่ pi
  6. Arduino ide ติดตั้งบน Raspberry Pi หรือคอมพิวเตอร์แยกต่างหาก

ขั้นตอนที่ 1: การเชื่อมต่อ Arduino กับ Raspberry Pi

คุณสามารถเชื่อมต่อ Raspberry Pi กับ Arduino โดยใช้ USB หรือ หมุด GPIO.

วิธีที่ 1: การเชื่อมต่อ USB (แนะนำ)

  1. เชื่อมต่อ Arduino ถึง Raspberry Pi ใช้สาย USB
  2. Raspberry Pi จะตรวจจับ Arduino เป็นอุปกรณ์อนุกรม (เช่น /dev/ttyUSB0 หรือ /dev/ttyACM0).

วิธีที่ 2: การใช้พิน GPIO (อนุกรมฮาร์ดแวร์)

  1. เชื่อมต่อ Arduino TX (PIN 1) ถึง Raspberry Pi RX (GPIO 15, PIN 10).
  2. เชื่อมต่อ Arduino RX (PIN 0) ถึง Raspberry Pi TX (GPIO 14, PIN 8).
  3. เชื่อมต่อ gnd ถึง gnd.
  4. ปิดการใช้งานคอนโซลอนุกรมในตัวของ Raspberry Pi:
    sudo raspi-config
    
    • นำทางไปยัง ตัวเลือกอินเตอร์เฟส> พอร์ตอนุกรม.
    • ปิดการใช้งานเชลล์เข้าสู่ระบบผ่านอนุกรม แต่เปิดใช้งานฮาร์ดแวร์พอร์ตอนุกรม
    • รีบูตราสเบอร์รี่ pi:
      sudo reboot
      

ขั้นตอนที่ 2: ติดตั้งไลบรารีที่ต้องการ

ตรวจสอบให้แน่ใจว่า Raspberry Pi ของคุณมีเครื่องมือสื่อสารแบบอนุกรมที่จำเป็น

sudo apt update
sudo apt install python3-serial

เพื่อตรวจสอบพอร์ตอนุกรมที่มีอยู่:

ls /dev/tty*

สำหรับการเชื่อมต่อ USB ให้มองหา /dev/ttyUSB0 หรือ /dev/ttyACM0.


ขั้นตอนที่ 3: อัปโหลดภาพร่าง Arduino

หากต้องการส่งข้อมูลจาก Arduino ไปยัง Raspberry Pi ให้อัปโหลดง่ายๆนี้ ภาพร่าง Arduino ใช้ Arduino ide.

void setup() {
  Serial.begin(9600); // Start serial communication
}

void loop() {
  Serial.println("Hello from Arduino!"); // Send message
  delay(1000);
}

ขั้นตอนที่ 4: อ่านข้อมูลอนุกรมเกี่ยวกับ Raspberry Pi

สร้างสคริปต์ Python บน Raspberry Pi เพื่ออ่านข้อมูลจาก Arduino

ตัวอย่างรหัส Python

import serial
import time

# Open the serial port (Change ttyUSB0 if necessary)
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
time.sleep(2)  # Wait for connection

try:
    while True:
        if ser.in_waiting > 0:
            data = ser.readline().decode('utf-8').strip()
            print(f"Received: {data}")
except KeyboardInterrupt:
    print("Exiting...")
    ser.close()
  • ตรวจสอบให้แน่ใจ /dev/ttyUSB0 ตรงกับพอร์ตอนุกรมที่ตรวจพบของคุณ
  • เรียกใช้สคริปต์:
    python3 serial_read.py
    
  • คุณควรเห็น "สวัสดีจาก Arduino!" พิมพ์ทุกวินาที

ขั้นตอนที่ 5: การส่งข้อมูลจาก Raspberry Pi ไปยัง Arduino

ปรับเปลี่ยนไฟล์ รหัส Arduino เพื่อรับข้อมูลจาก Raspberry Pi:

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    String received = Serial.readStringUntil('\\n');
    Serial.print("Raspberry Pi Sent: ");
    Serial.println(received);
  }
}

ปรับเปลี่ยนไฟล์ รหัส Python เพื่อส่งข้อมูลไปยัง Arduino:

ser.write(b"Hello from Raspberry Pi!\\n")
  • ตอนนี้ Arduino จะได้รับข้อความที่ส่งโดย Raspberry Pi

วิธีการสื่อสารทางเลือก

  1. การสื่อสาร i2c (สำหรับหลาย Arduinos)

    • Raspberry Pi ทำหน้าที่เป็น ผู้เชี่ยวชาญArduino ทำหน้าที่เป็น ทาส.
    • เปิดใช้งาน I2C:
      sudo raspi-config
      
    • ติดตั้งไลบรารีที่ต้องการ:
      sudo apt install python3-smbus i2c-tools
      
    • ใช้ Wire.h ทางด้าน Arduino สำหรับการสื่อสาร I2C
  2. การสื่อสาร SPI (สำหรับการถ่ายโอนข้อมูลความเร็วสูง)

    • กำหนดให้มี Arduino ที่เปิดใช้งาน Spi และ SPI.h ห้องสมุด.
    • เร็วกว่า UART และ I2C แต่ต้องการ เดินสายเพิ่มเติม.

การแก้ไขปัญหา

  1. Arduino ไม่พบใน Raspberry Pi

    • วิ่ง ls /dev/tty* เพื่อตรวจสอบอุปกรณ์อนุกรมที่มีอยู่
    • ตรวจสอบให้แน่ใจว่ามีการระบุพอร์ตอนุกรมที่ถูกต้องในสคริปต์ Python
  2. การอนุญาตถูกปฏิเสธข้อผิดพลาด

    • เพิ่มผู้ใช้ของคุณในไฟล์ dialout กลุ่ม:
      sudo usermod -aG dialout $USER
      sudo reboot
      
  3. อักขระขยะในเอาต์พุต

    • ทำให้มั่นใจ อุปกรณ์ทั้งสองใช้อัตราการรับส่งข้อมูลเดียวกัน (เช่น 9600).
    • เพิ่มความล่าช้าเล็กน้อย (time.sleep(2)) ก่อนอ่านข้อมูลใน Python

บทสรุป

โดยทำตามคำแนะนำนี้คุณสามารถสร้างได้ การสื่อสารแบบอนุกรม ระหว่าง Arduino และ Raspberry Pi ช่วยให้พวกเขาแลกเปลี่ยนข้อมูลสำหรับ โครงการ IoT การรวมเซ็นเซอร์และระบบอัตโนมัติ- ทดลอง I2C และ SPI สำหรับแอปพลิเคชันขั้นสูงเพิ่มเติม!

แสดงความคิดเห็น

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.