- SPI คืออะไร?
- การทำงานของ SPI
- SPI Pins ใน Arduino UNO
- ใช้ SPI ใน Arduino
- ส่วนประกอบที่จำเป็นสำหรับการสื่อสาร Arduino SPI
- แผนภาพวงจรสื่อสาร Arduino SPI
- วิธีการเขียนโปรแกรม Arduino สำหรับการสื่อสาร SPI:
- คำอธิบายการเขียนโปรแกรม Arduino SPI Master
- คำอธิบายการเขียนโปรแกรม Arduino SPI Slave
- SPI ทำงานบน Arduino อย่างไร - มาทดสอบกัน!
ไมโครคอนโทรลเลอร์ใช้โปรโตคอลต่างๆมากมายเพื่อสื่อสารกับเซ็นเซอร์และโมดูลต่างๆ มีโปรโตคอลการสื่อสารหลายประเภทสำหรับการสื่อสารแบบไร้สายและแบบใช้สายและเทคนิคการสื่อสารที่ใช้กันมากที่สุดคือการสื่อสารแบบอนุกรม การสื่อสารแบบอนุกรมคือกระบวนการส่งข้อมูลทีละบิตตามลำดับผ่านช่องทางการสื่อสารหรือบัส การสื่อสารแบบอนุกรมมีหลายประเภทเช่นการสื่อสาร UART, CAN, USB, I2C และ SPI
ในการกวดวิชานี้เราเรียนรู้เกี่ยวกับ โปรโตคอล SPI และวิธีการที่จะใช้ใน Arduino เราจะใช้SPI Protocol สำหรับการสื่อสารระหว่างสอง Arduinos ที่นี่ Arduino หนึ่งตัวจะทำหน้าที่เป็น Master และอีกอันจะทำหน้าที่เป็น Slave ไฟ LED สองดวงและปุ่มกดจะเชื่อมต่อกับทั้ง Arduino แสดงให้เห็นถึงการสื่อสาร SPI เราจะควบคุมด้านหลักนำโดยปุ่มกดด้านข้างทาสและในทางกลับกันโดยใช้โปรโตคอลการสื่อสารแบบอนุกรม SPI
SPI คืออะไร?
SPI (Serial Peripheral Interface)คือโปรโตคอลการสื่อสารแบบอนุกรม โมโตโรล่าพบอินเทอร์เฟซ SPI ในปี 1970 SPI มีการเชื่อมต่อแบบฟูลดูเพล็กซ์ซึ่งหมายความว่าข้อมูลจะถูกส่งและรับพร้อมกัน นั่นคือมาสเตอร์สามารถส่งข้อมูลไปยังทาสและทาสสามารถส่งข้อมูลไปยังมาสเตอร์ได้พร้อมกัน SPI เป็นการสื่อสารแบบอนุกรมแบบซิงโครนัสหมายความว่าต้องใช้นาฬิกาเพื่อวัตถุประสงค์ในการสื่อสาร
ก่อนหน้านี้มีการอธิบายการสื่อสาร SPI ในไมโครคอนโทรลเลอร์อื่น ๆ:
- การสื่อสาร SPI กับไมโครคอนโทรลเลอร์ PIC PIC16F877A
- การเชื่อมต่อหน้าจอสัมผัสขนาด 3.5 นิ้ว TFT LCD กับ Raspberry Pi
- การเขียนโปรแกรมไมโครคอนโทรลเลอร์ AVR ด้วยหมุด SPI
- การเชื่อมต่อจอ LCD กราฟิก Nokia 5110 กับ Arduino
การทำงานของ SPI
SPI มีการสื่อสารแบบ Master / Slave โดยใช้สี่บรรทัด SPI สามารถมีมาสเตอร์ได้เพียงคนเดียวและสามารถมีทาสได้หลายคน เจ้านายมักจะเป็นไมโครคอนโทรลเลอร์และทาสสามารถเป็นไมโครคอนโทรลเลอร์เซ็นเซอร์ ADC DAC LCD เป็นต้น
ด้านล่างนี้คือการแสดงแผนภาพบล็อกของ SPI มาสเตอร์เดี่ยวทาส
SPI มีสี่บรรทัดต่อไปนี้ MISO, MOSI, SS และ CLK
- MISO (Master in Slave Out) - สายทาสสำหรับส่งข้อมูลไปยังต้นแบบ
- MOSI (Master Out Slave In) - สายหลักสำหรับส่งข้อมูลไปยังอุปกรณ์ต่อพ่วง
- SCK (Serial Clock) - พัลส์นาฬิกาที่ซิงโครไนซ์การส่งข้อมูลที่สร้างโดยต้นแบบ
- SS (Slave Select) - Master สามารถใช้พินนี้เพื่อเปิดและปิดอุปกรณ์บางอย่าง
SPI Master พร้อมทาสหลายคน
ในการเริ่มต้นการสื่อสารระหว่างมาสเตอร์และสเลฟเราต้องตั้งค่าพิน Slave Select (SS) ของอุปกรณ์ที่ต้องการเป็น LOW เพื่อให้สามารถสื่อสารกับมาสเตอร์ได้ เมื่อมันสูงก็ไม่สนใจหลัก สิ่งนี้ช่วยให้คุณมีอุปกรณ์ SPI หลายเครื่องที่ใช้สายหลัก MISO, MOSI และ CLK เดียวกัน ดังที่คุณเห็นในภาพด้านบนมีทาสสี่ตัวที่ SCLK, MISO, MOSI เชื่อมต่อกับมาสเตอร์และ SS ของทาสแต่ละตัวเชื่อมต่อแยกกันกับหมุด SS แต่ละตัว (SS1, SS2, SS3) ของมาสเตอร์ โดยการตั้งค่า PIN SS ที่ต้องการ LOW มาสเตอร์สามารถสื่อสารกับทาสนั้นได้
SPI Pins ใน Arduino UNO
ภาพด้านล่างแสดงหมุด SPI แสดง Arduino UNO (ในกล่องสีแดง)
สาย SPI |
ปักหมุดใน Arduino |
MOSI |
11 หรือ ICSP-4 |
มิโซะ |
12 หรือ ICSP-1 |
SCK |
13 หรือ ICSP-3 |
SS |
10 |
ใช้ SPI ใน Arduino
ก่อนเริ่มการเขียนโปรแกรมสำหรับการสื่อสาร SPI ระหว่าง Arduinos สองตัว เราจำเป็นต้องเรียนรู้เกี่ยวกับไลบรารี Arduino SPI ที่ใช้ใน Arduino IDE
ห้องสมุด
1. SPI.begin ()
ใช้:เพื่อเริ่มต้นบัส SPI โดยตั้งค่า SCK, MOSI และ SS เป็นเอาต์พุตดึง SCK และ MOSI ให้ต่ำและ SS สูง
2. SPI.setClockDivider (ตัวแบ่ง)
ใช้:เพื่อตั้งค่าตัวแบ่งนาฬิกา SPI ที่สัมพันธ์กับนาฬิการะบบ วงเวียนที่มีคือ 2, 4, 8, 16, 32, 64 หรือ 128
วงเวียน:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (ตัวจัดการ)
ใช้:ฟังก์ชันนี้ถูกเรียกใช้เมื่ออุปกรณ์ทาสรับข้อมูลจากต้นแบบ
4. SPI.transfer (Val)
ใช้:ฟังก์ชั่นนี้ใช้ในการส่งและรับข้อมูลระหว่าง master และ slave พร้อมกัน
ตอนนี้เรามาเริ่มต้นด้วยการสาธิตโปรโตคอล SPI ใน Arduino ในบทช่วยสอนนี้เราจะใช้ arduino สองตัวเป็น master และอีกตัวเป็น slave Arduino ทั้งสองตัวมีไฟ LED และปุ่มกดแยกกัน Master LED สามารถควบคุมได้โดยใช้ปุ่มกดของ Arduino ทาสและ LED ของ Arduino ที่เป็นทาสสามารถควบคุมได้โดยปุ่มกดของ Arduino หลักโดยใช้โปรโตคอลการสื่อสาร SPI ที่มีอยู่ใน arduino
ส่วนประกอบที่จำเป็นสำหรับการสื่อสาร Arduino SPI
- Arduino UNO (2)
- ไฟ LED (2)
- ปุ่มกด (2)
- ตัวต้านทาน 10k (2)
- ตัวต้านทาน 2.2k (2)
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภาพวงจรสื่อสาร Arduino SPI
แผนภาพวงจรด้านล่างแสดงวิธีใช้ SPI บน Arduino UNO แต่คุณสามารถทำตามขั้นตอนเดียวกันสำหรับการสื่อสาร Arduino Mega SPI หรือการสื่อสาร Arduino nano SPI เกือบทุกอย่างจะยังคงเหมือนเดิมยกเว้นหมายเลขพิน คุณต้องตรวจสอบ pinout ของ Arduino nano หรือ mega เพื่อค้นหาพิน Arduino nano SPI และหมุด Arduino Mega เมื่อคุณทำเสร็จแล้วทุกอย่างจะเหมือนกัน
ฉันได้สร้างวงจรที่แสดงด้านบนบนเขียงหั่นขนมคุณสามารถดูการตั้งค่าวงจรที่ฉันใช้สำหรับการทดสอบด้านล่าง
วิธีการเขียนโปรแกรม Arduino สำหรับการสื่อสาร SPI:
บทช่วยสอนนี้มีสองโปรแกรมหนึ่งสำหรับ Arduino หลักและอื่น ๆ สำหรับ Arduino ทาส โปรแกรมที่สมบูรณ์สำหรับทั้งสองฝ่ายจะได้รับในตอนท้ายของโครงการนี้
คำอธิบายการเขียนโปรแกรม Arduino SPI Master
1. ก่อนอื่นเราต้องรวมไลบรารี SPI เพื่อใช้ฟังก์ชันการสื่อสาร SPI
# รวม
2. ในการตั้งค่าเป็นโมฆะ ()
- เราเริ่มการสื่อสารแบบอนุกรมที่อัตราบอด 115200
Serial.begin (115200);
- ติด LED เข้ากับพิน 7 และปุ่มกดเพื่อพิน 2 และตั้งค่าพิน OUTPUT และ INPUT ตามลำดับ
pinMode (ipbutton, INPUT); PinMode (LED, เอาท์พุท);
- ต่อไปเราจะเริ่มการสื่อสาร SPI
SPI.begin ();
- ต่อไปเราจะตั้งค่า Clockdivider สำหรับการสื่อสาร SPI ที่นี่เราได้ตั้งค่าตัวแบ่ง 8
SPI.setClockDivider (SPI_CLOCK_DIV8);
- จากนั้นตั้งค่า SS pin HIGH เนื่องจากเราไม่ได้เริ่มการถ่ายโอนไปยังทาส arduino
digitalWrite (SS, สูง);
3. ใน void loop ():
- เราอ่านสถานะของพินปุ่มกดที่เชื่อมต่อกับพิน 2 (Master Arduino) เพื่อส่งค่าเหล่านั้นไปยังทาส Arduino
buttonvalue = digitalRead (ipbutton);
- ตั้งค่าลอจิกสำหรับการตั้งค่า x ค่า (เพื่อส่งไปยังทาส) ขึ้นอยู่กับอินพุตจากพิน 2
ถ้า (buttonvalue == สูง) { x = 1; } else { x = 0; }
- ก่อนที่จะส่งค่าเราจำเป็นต้อง LOW ค่าเลือกทาสเพื่อเริ่มการถ่ายโอนไปยังทาสจากต้นแบบ
digitalWrite (SS, LOW);
- มาถึงขั้นตอนสำคัญในคำสั่งต่อไปนี้เราจะส่งค่าปุ่มกดที่เก็บไว้ในตัวแปร Mastersend ไปยังทาส arduino และรับค่าจากทาสที่จะเก็บไว้ในตัวแปร Mastereceive
Mastereceive = SPI.transfer (Mastersend);
- หลังจากนั้นขึ้นอยู่กับค่า Mastereceive เราจะเปิดหรือปิด Master Arduino LED
ถ้า (Mastereceive == 1) { digitalWrite (LED, HIGH); // ตั้งค่าพิน 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // ตั้งค่าพิน 7 LOW Serial.println ("Master LED OFF"); }
หมายเหตุ:เราใช้ serial.println () เพื่อดูผลลัพธ์ใน Serial Motor ของ Arduino IDE ตรวจสอบวิดีโอในตอนท้าย
คำอธิบายการเขียนโปรแกรม Arduino SPI Slave
1. ก่อนอื่นเราต้องรวมไลบรารี SPI เพื่อใช้ฟังก์ชันการสื่อสาร SPI
# รวม
2. ในการตั้งค่าเป็นโมฆะ ()
- เราเริ่มการสื่อสารแบบอนุกรมที่อัตราบอด 115200
Serial.begin (115200);
- ติด LED เข้ากับพิน 7 และปุ่มกดไปที่พิน 2 และตั้งค่าเอาท์พุทและอินพุตพินตามลำดับ
pinMode (ipbutton, INPUT); PinMode (LED, เอาท์พุท);
- ขั้นตอนที่สำคัญคือข้อความต่อไปนี้
pinMode (MISO, เอาท์พุท);
ข้อความข้างต้นกำหนด MISO เป็น OUTPUT (ต้องส่งข้อมูลไปยัง Master IN) ดังนั้นข้อมูลจึงถูกส่งผ่าน MISO ของ Slave Arduino
- ตอนนี้เปิด SPI ในโหมด Slave โดยใช้ SPI Control Register
SPCR - = _BV (SPE);
- จากนั้นเปิดการขัดจังหวะสำหรับการสื่อสาร SPI หากได้รับข้อมูลจากต้นแบบ Interrupt Routine จะถูกเรียกและค่าที่ได้รับจะถูกนำมาจาก SPDR (SPI data Register)
SPI.attachInterrupt ();
- ค่าจากต้นแบบถูกนำมาจาก SPDR และเก็บไว้ในตัวแปร Slavereceived สิ่งนี้เกิดขึ้นในฟังก์ชัน Interrupt Routine ต่อไปนี้
ISR (SPI_STC_vect) { Slavereceived = SPDR; ได้รับ = จริง; }
3. ถัดไปใน void loop () เราตั้งค่า Slave arduino LED ให้เปิดหรือปิดขึ้นอยู่กับค่า Slavereceived
ถ้า (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // ตั้งค่าพิน 7 เป็น LED สูงบน Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // ตั้งค่าขา 7 เป็น LOW LED OFF Serial.println ("Slave LED OFF"); }
- ต่อไปเราจะอ่านสถานะของปุ่ม Slave Arduino Push และเก็บค่าใน Slavesend เพื่อส่งค่าไปยัง Master Arduino โดยให้ค่าลงทะเบียน SPDR
buttonvalue = digitalRead (buttonpin); ถ้า (buttonvalue == สูง) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
หมายเหตุ:เราใช้ serial.println () เพื่อดูผลลัพธ์ใน Serial Motor ของ Arduino IDE ตรวจสอบวิดีโอในตอนท้าย
SPI ทำงานบน Arduino อย่างไร - มาทดสอบกัน!
ด้านล่างนี้คือภาพของการตั้งค่าขั้นสุดท้ายสำหรับการสื่อสาร SPI ระหว่างบอร์ด Arduino สองตัว
เมื่อกดปุ่มที่ด้าน Master ไฟ LED สีขาวที่ด้านทาสจะเปิด
และเมื่อกดปุ่มที่ด้าน Slave ไฟ LED สีแดงที่ด้าน Master จะเปิดขึ้น
คุณสามารถดูวิดีโอด้านล่างเพื่อดูการสาธิตการสื่อสาร Arduino SPI หากคุณมีคำถามใด ๆ โปรดทิ้งไว้ในส่วนความคิดเห็นโดยใช้ฟอรัมของเรา