วิธีใช้การสื่อสาร SPI กับ Arduino และ Raspberry Pi

อินเทอร์เฟซอุปกรณ์ต่อพ่วงแบบอนุกรม (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:

  1. อัปโหลดภาพร่าง Arduino ไปยังบอร์ด Arduino
  2. เชื่อมต่อ Arduino กับ Raspberry Pi ผ่านสายไฟ SPI
  3. เรียกใช้สคริปต์ Python บน Raspberry Pi:
    python3 spi_master.py
  4. เปิดมอนิเตอร์อนุกรม 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

มีความสุขในการซ่อมแซม!

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

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.