อินเทอร์เฟซอุปกรณ์ต่อพ่วงแบบอนุกรม (SPI) เป็นโปรโตคอลการสื่อสารอนุกรมแบบซิงโครนัสที่ใช้กันอย่างแพร่หลายสำหรับการสื่อสารระยะสั้นส่วนใหญ่ในระบบฝังตัว การรวมความสามารถรอบตัวของ Arduino เข้ากับพลังการคำนวณของ Raspberry Pi ผ่าน SPI สามารถเปิดความเป็นไปได้ของโครงการมากมาย ในโพสต์บล็อกนี้เราจะสำรวจวิธีการตั้งค่าและใช้การสื่อสาร SPI ระหว่าง Arduino และ Raspberry Pi
ทำความเข้าใจกับ SPI
SPI เป็นโปรโตคอลการสื่อสารแบบฟูลเพล็กซ์ที่ทำงานในโหมดสลาฟมาสเตอร์ ใช้สี่บรรทัดหลัก:
- Mosi (Master Out Slave In): ถ่ายโอนข้อมูลจากต้นแบบไปยังทาส
- MISO (Master in Slave Out): ถ่ายโอนข้อมูลจากทาสเป็นหลัก
- SCLK (นาฬิกาอนุกรม): ซิงโครไนซ์การส่งข้อมูลที่สร้างโดยต้นแบบ
- SS/CS (Slave Select/Chip เลือก): เลือกอุปกรณ์ทาส
SPI ได้รับการสนับสนุนสำหรับความเรียบง่ายและความเร็วทำให้เหมาะสำหรับแอปพลิเคชันที่ต้องการการแลกเปลี่ยนข้อมูลอย่างรวดเร็วระหว่างอุปกรณ์
ทำไมต้องใช้ SPI กับ Arduino และ Raspberry Pi?
การรวม Arduino กับ Raspberry Pi ใช้ประโยชน์จากจุดแข็งของทั้งสองแพลตฟอร์ม Arduino เก่งในการควบคุมฮาร์ดแวร์ระดับต่ำแบบเรียลไทม์ในขณะที่ Raspberry Pi มีความสามารถในการประมวลผลระดับสูงการเชื่อมต่อเครือข่ายและสภาพแวดล้อมระบบปฏิบัติการที่หลากหลาย การใช้ SPI ช่วยให้อุปกรณ์ทั้งสองนี้สามารถสื่อสารได้อย่างมีประสิทธิภาพทำให้โครงการที่ซับซ้อนเช่นระบบอัตโนมัติในบ้านหุ่นยนต์และแอปพลิเคชันการบันทึกข้อมูล
การตั้งค่าฮาร์ดแวร์
ในการสร้างการสื่อสาร SPI ระหว่าง Arduino และ Raspberry Pi คุณจะต้องมีส่วนประกอบต่อไปนี้:
- Arduino Uno (หรือคณะกรรมการ Arduino ที่เข้ากันได้)
- Raspberry Pi (ทุกรุ่นที่มีหมุด GPIO)
- สายจัมเปอร์
- กระดานข่าว (ไม่บังคับ)
สายไฟ Arduino และ Raspberry Pi สำหรับ SPI
การเดินสายอย่างระมัดระวังเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าการสื่อสารที่เหมาะสม นี่คือวิธีเชื่อมต่อ Arduino และ Raspberry Pi โดยใช้ SPI:
Raspberry Pi GPIO PIN | พิน Arduino | คำอธิบาย |
---|---|---|
GPIO10 (MOSI) | พิน 11 (Mosi) | ปรมาจารย์ออกทาสใน |
GPIO9 (มิโซะ) | พิน 12 (มิโซะ) | อาจารย์ใน Slave Out |
GPIO11 (SCLK) | PIN 13 (SCLK) | นาฬิกาอนุกรม |
GPIO8 (CE0) | PIN 10 (SS) | Slave Select |
gnd | gnd | พื้นดิน |
3.3V | 5V | แหล่งจ่ายไฟ (การใช้ระดับการใช้งานหากจำเป็น) |
บันทึก: Raspberry Pi ทำงานที่ระดับลอจิก 3.3V ในขณะที่ Arduino UNO ใช้ 5V ขอแนะนำให้ใช้ตัวแปลงระดับตรรกะเพื่อป้องกันความเสียหายที่อาจเกิดขึ้นกับราสเบอร์รี่ PI
การกำหนดค่า Arduino
Arduino จะทำหน้าที่เป็นอุปกรณ์ SPI Slave ด้านล่างนี้เป็นตัวอย่าง Arduino Sketch ที่จะตั้งค่า:
// Arduino as SPI Slave
#include
volatile byte receivedData = 0;
void setup() {
// Initialize serial communication for debugging
Serial.begin(9600);
// Set MISO as output
pinMode(MISO, OUTPUT);
// Enable SPI in Slave Mode
SPCR |= _BV(SPE);
SPI.attachInterrupt();
}
ISR(SPI_STC_vect) {
receivedData = SPDR;
}
void loop() {
if (receivedData) {
Serial.print("Received: ");
Serial.println(receivedData);
receivedData = 0;
}
}
คำอธิบาย:
- spi.attachinterrupt (); ช่วยให้การขัดจังหวะ SPI ช่วยให้ Arduino จัดการข้อมูลขาเข้าได้
- ในกิจวัตรการบริการขัดจังหวะ
ISR(SPI_STC_vect)
ข้อมูลที่ได้รับจะถูกเก็บไว้สำหรับการประมวลผล - ที่
loop()
การตรวจสอบฟังก์ชั่นสำหรับข้อมูลที่ได้รับและพิมพ์ลงในจอภาพอนุกรม
การกำหนดค่า Raspberry Pi
Raspberry Pi จะทำหน้าที่เป็นอุปกรณ์ SPI Master เราจะใช้ Python กับไฟล์ spidev
ห้องสมุดเพื่อจัดการการสื่อสาร SPI ก่อนอื่นให้แน่ใจว่าเปิดใช้งาน SPI:
- เปิดเครื่องมือกำหนดค่า Raspberry Pi:
sudo raspi-config
- นำทางไปยัง ตัวเลือกอินเตอร์เฟส > SPI > เปิดใช้งาน
- รีบูตราสเบอร์รี่ Pi หากได้รับแจ้ง
ติดตั้ง spidev
ห้องสมุดหากยังไม่ได้ติดตั้ง:
sudo apt-get install python3-spidev
นี่คือสคริปต์ตัวอย่าง Python สำหรับ Raspberry Pi:
# Raspberry Pi as SPI Master
import spidev
import time
# Open SPI bus 0, device (CS) 0
spi = spidev.SpiDev()
spi.open(0, 0)
# Set SPI speed and mode
spi.max_speed_hz = 50000
spi.mode = 0
def send_data(data):
"""Send a single byte to the SPI slave"""
response = spi.xfer2([data])
return response
try:
while True:
data = 42 # Example data byte
print(f"Sending: {data}")
resp = send_data(data)
print(f"Received: {resp[0]}")
time.sleep(1)
except KeyboardInterrupt:
spi.close()
คำอธิบาย:
- spi.open (0, 0) เปิดรถบัส SPI 0, อุปกรณ์ 0 (CE0)
- spi.xfer2 ([ข้อมูล]) ส่งข้อมูลไบต์และได้รับข้อมูลจากทาสพร้อมกัน
- สคริปต์ส่งไบต์ (เช่น 42) ทุกวินาทีและพิมพ์การตอบสนองจาก Arduino
ทดสอบการสื่อสาร
หลังจากตั้งค่าทั้ง Arduino และ Raspberry Pi:
- อัปโหลดภาพร่าง Arduino ไปยังบอร์ด Arduino
- เชื่อมต่อ Arduino กับ Raspberry Pi ผ่านสายไฟ SPI
- เรียกใช้สคริปต์ Python บน Raspberry Pi:
python3 spi_master.py
- เปิดมอนิเตอร์อนุกรม Arduino เพื่อดูข้อมูลที่ได้รับ:
Tools > Serial Monitor
คุณควรเห็น Arduino ที่ได้รับข้อมูลที่ส่งโดย Raspberry Pi และแสดงในจอภาพอนุกรม ในทำนองเดียวกัน Raspberry Pi จะแสดงข้อมูลที่ส่งและการตอบกลับที่ได้รับ
เคล็ดลับการแก้ไขปัญหา
- ตรวจสอบสายไฟ: ตรวจสอบให้แน่ใจว่าการเชื่อมต่อทั้งหมดระหว่าง Arduino และ Raspberry Pi นั้นปลอดภัยและแมปอย่างถูกต้อง
- ระดับแรงดันไฟฟ้า: ใช้ตัวแปลงระดับตรรกะเพื่อให้ตรงกับ 3.3V ของราสเบอร์รี่ PI กับ 5V ของ Arduino
-
เปิดใช้งาน SPI: ตรวจสอบว่า SPI เปิดใช้งานบน Raspberry Pi โดยใช้
raspi-config
. -
การอนุญาต: ตรวจสอบให้แน่ใจว่าผู้ใช้ของคุณมีสิทธิ์ที่จำเป็นในการเข้าถึงอุปกรณ์ SPI คุณอาจต้องเรียกใช้สคริปต์ Python ด้วย
sudo
. - อัตราการรับส่งข้อมูล: ตรวจสอบให้แน่ใจว่าการตรวจสอบแบบอนุกรมและภาพร่าง Arduino ใช้อัตราการรับส่งข้อมูลเดียวกัน
- การตั้งค่า SPI: ตรวจสอบให้แน่ใจว่าทั้งต้นแบบและทาสได้รับการกำหนดค่าด้วยโหมด SPI และความเร็วเดียวกัน
บทสรุป
การใช้การสื่อสาร SPI ระหว่าง Arduino และ Raspberry Pi ช่วยให้คุณสามารถควบคุมจุดแข็งของทั้งสองแพลตฟอร์มได้อย่างมีประสิทธิภาพ ไม่ว่าคุณจะสร้างระบบหุ่นยนต์ที่ซับซ้อนการพัฒนาเครือข่ายเซ็นเซอร์หรือการทดลองกับการบันทึกข้อมูลการทำความเข้าใจ SPI นั้นมีค่า โดยทำตามขั้นตอนที่ระบุไว้ในคู่มือนี้คุณสามารถตั้งค่าการสื่อสาร SPI ที่เชื่อถือได้และเริ่มต้นโครงการฝังตัวที่น่าตื่นเต้นซึ่งใช้ประโยชน์จากพลังของทั้ง Arduino และ Raspberry Piมีความสุขในการซ่อมแซม!