Raspberry Pi และ Arduino สามารถสื่อสารกันได้โดยใช้โปรโตคอลที่แตกต่างกันรวมถึง อนุกรม (uart), i2c และ spi- คู่มือนี้จะแสดงวิธีการตั้งค่าการสื่อสารระหว่าง Raspberry Pi และ Arduino โดยใช้ไฟล์ อินเทอร์เฟซอนุกรม (UART)ซึ่งเป็นวิธีที่พบได้บ่อยที่สุดและตรงไปตรงมา
สิ่งที่คุณต้องการ
- Raspberry Pi (รุ่นใด ๆ ที่มีการสนับสนุน GPIO เช่น PI 3, PI 4)
- Arduino (เช่น uno, mega, nano)
- สาย USB (สำหรับการเชื่อมต่อ Arduino กับ Raspberry Pi)
- สายจัมเปอร์ (หากใช้การสื่อสารแบบอนุกรม GPIO)
- ติดตั้ง Python บนราสเบอร์รี่ pi
- Arduino ide ติดตั้งบน Raspberry Pi หรือคอมพิวเตอร์แยกต่างหาก
ขั้นตอนที่ 1: การเชื่อมต่อ Arduino กับ Raspberry Pi
คุณสามารถเชื่อมต่อ Raspberry Pi กับ Arduino โดยใช้ USB หรือ หมุด GPIO.
วิธีที่ 1: การเชื่อมต่อ USB (แนะนำ)
- เชื่อมต่อ Arduino ถึง Raspberry Pi ใช้สาย USB
- Raspberry Pi จะตรวจจับ Arduino เป็นอุปกรณ์อนุกรม (เช่น
/dev/ttyUSB0
หรือ/dev/ttyACM0
).
วิธีที่ 2: การใช้พิน GPIO (อนุกรมฮาร์ดแวร์)
- เชื่อมต่อ Arduino TX (PIN 1) ถึง Raspberry Pi RX (GPIO 15, PIN 10).
- เชื่อมต่อ Arduino RX (PIN 0) ถึง Raspberry Pi TX (GPIO 14, PIN 8).
- เชื่อมต่อ gnd ถึง gnd.
- ปิดการใช้งานคอนโซลอนุกรมในตัวของ 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
วิธีการสื่อสารทางเลือก
-
การสื่อสาร i2c (สำหรับหลาย Arduinos)
- Raspberry Pi ทำหน้าที่เป็น ผู้เชี่ยวชาญArduino ทำหน้าที่เป็น ทาส.
- เปิดใช้งาน I2C:
sudo raspi-config
- ติดตั้งไลบรารีที่ต้องการ:
sudo apt install python3-smbus i2c-tools
- ใช้
Wire.h
ทางด้าน Arduino สำหรับการสื่อสาร I2C
-
การสื่อสาร SPI (สำหรับการถ่ายโอนข้อมูลความเร็วสูง)
- กำหนดให้มี Arduino ที่เปิดใช้งาน Spi และ
SPI.h
ห้องสมุด. - เร็วกว่า UART และ I2C แต่ต้องการ เดินสายเพิ่มเติม.
- กำหนดให้มี Arduino ที่เปิดใช้งาน Spi และ
การแก้ไขปัญหา
-
Arduino ไม่พบใน Raspberry Pi
- วิ่ง
ls /dev/tty*
เพื่อตรวจสอบอุปกรณ์อนุกรมที่มีอยู่ - ตรวจสอบให้แน่ใจว่ามีการระบุพอร์ตอนุกรมที่ถูกต้องในสคริปต์ Python
- วิ่ง
-
การอนุญาตถูกปฏิเสธข้อผิดพลาด
- เพิ่มผู้ใช้ของคุณในไฟล์
dialout
กลุ่ม:sudo usermod -aG dialout $USER sudo reboot
- เพิ่มผู้ใช้ของคุณในไฟล์
-
อักขระขยะในเอาต์พุต
- ทำให้มั่นใจ อุปกรณ์ทั้งสองใช้อัตราการรับส่งข้อมูลเดียวกัน (เช่น
9600
). - เพิ่มความล่าช้าเล็กน้อย (
time.sleep(2)
) ก่อนอ่านข้อมูลใน Python
- ทำให้มั่นใจ อุปกรณ์ทั้งสองใช้อัตราการรับส่งข้อมูลเดียวกัน (เช่น
บทสรุป
โดยทำตามคำแนะนำนี้คุณสามารถสร้างได้ การสื่อสารแบบอนุกรม ระหว่าง Arduino และ Raspberry Pi ช่วยให้พวกเขาแลกเปลี่ยนข้อมูลสำหรับ โครงการ IoT การรวมเซ็นเซอร์และระบบอัตโนมัติ- ทดลอง I2C และ SPI สำหรับแอปพลิเคชันขั้นสูงเพิ่มเติม!