- ภาพรวม STM32F103C8 I2C
- หมุด I2C ใน STM32F103C8
- หมุด I2C ใน Arduino
- ส่วนประกอบที่จำเป็น
- แผนภาพวงจรและการเชื่อมต่อ
- การเขียนโปรแกรม I2C ใน STM32
- คำอธิบายการเขียนโปรแกรม Master STM32
- คำอธิบายการเขียนโปรแกรม Slave Arduino
ในบทช่วยสอนก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับการสื่อสาร SPI และ I2C ระหว่างบอร์ด Arduino สองตัว ในบทช่วยสอนนี้เราจะแทนที่บอร์ด Arduino หนึ่งบอร์ดด้วยบอร์ด Blue Pill ซึ่งเป็นSTM32F103C8และจะสื่อสารกับบอร์ด Arduino โดยใช้บัส I2C
STM32 มีคุณสมบัติมากกว่าบอร์ด Arduino ดังนั้นจึงเป็นการดีที่จะเรียนรู้เกี่ยวกับการสื่อสารระหว่าง STM32 และ Arduinoโดยใช้ SPI & I2C bus ในบทช่วยสอนนี้เราจะใช้บัส I2C สำหรับการสื่อสารระหว่าง Arduino และ STM32F103C8และจะเรียนรู้เกี่ยวกับบัส SPI ในบทช่วยสอนถัดไป หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับบอร์ด STM32 โปรดตรวจสอบโครงการ STM32 อื่น ๆ
ภาพรวม STM32F103C8 I2C
เมื่อเปรียบเทียบ I2C (Inter Integrated Circuits) ใน STM32F103C8 Blue Pill board กับ Arduino Uno แล้วเราจะเห็นว่า Arduino มีไมโครคอนโทรลเลอร์ ATMEGA328 อยู่ในนั้นและ STM32F103C8 มี ARM Cortex-M3 อยู่ในนั้น STM32 มีบัส I2C สองตัวในขณะที่ Arduino Uno มีบัส I2Cเพียงตัวเดียวและ STM32 เร็วกว่า Arduino
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการสื่อสาร I2C โปรดดูบทความก่อนหน้าของเรา
- วิธีใช้ I2C ใน Arduino: การสื่อสารระหว่างบอร์ด Arduino สองตัว
- การสื่อสาร I2C กับไมโครคอนโทรลเลอร์ PIC PIC16F877
- การเชื่อมต่อ LCD 16X2 กับ ESP32 โดยใช้ I2C
- การสื่อสาร I2C กับ MSP430 Launchpad
- การเชื่อมต่อ LCD กับ NodeMCU โดยไม่ต้องใช้ I2C
- วิธีจัดการการสื่อสารหลายอย่าง (I2C SPI UART) ในโปรแกรมเดียวของ arduino
หมุด I2C ใน STM32F103C8
SDA: PB7 หรือ PB9, PB11
SCL: PB6 หรือ PB8, PB10
หมุด I2C ใน Arduino
SDA:พิน A4
SCL:ขา A5
ส่วนประกอบที่จำเป็น
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- ปุ่มกด (2-Nos)
- ตัวต้านทาน (4-Nos)
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภาพวงจรและการเชื่อมต่อ
ตารางต่อไปนี้แสดงให้เห็นถึงการเชื่อมต่อระหว่าง STM32 สีฟ้ายาและ Arduino Uno สำหรับการใช้บัส ต้องใช้เพียงสองสาย
STM32F103C8 |
Arduino |
คำอธิบายพิน |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
พื้น |
สำคัญ
- อย่าลืมเชื่อมต่อ Arduino GND และ STM32F103C8 GND เข้าด้วยกัน
- จากนั้นเชื่อมต่อตัวต้านทานแบบดึงลง 10k เข้ากับหมุดปุ่มกดของทั้งสองบอร์ดแยกกัน
ในบทช่วยสอน STM32 I2Cนี้เราจะกำหนดค่า STM32F103C8 เป็น Master และ Arduino เป็น Slave บอร์ดทั้งสองติดตั้ง LED และปุ่มกดแยกกัน
เพื่อแสดงให้เห็นถึงการสื่อสาร I2C ใน STM32 เราควบคุม LED STM32 หลักโดยใช้ค่าปุ่มกด Arduino ทาสและควบคุม Arduino LED แบบทาสโดยใช้ค่าปุ่มกด STM32F103C8 หลัก ค่าเหล่านี้ถูกส่งผ่านบัสสื่อสาร I2C
การเขียนโปรแกรม I2C ใน STM32
การเขียนโปรแกรมคล้ายกับรหัส Arduino เหมือน
บทช่วยสอนนี้มีสองโปรแกรมหนึ่งสำหรับ Master STM32 และอื่น ๆ สำหรับ Arduino Slave โปรแกรมที่สมบูรณ์แบบ สำหรับทั้งสองฝ่ายจะได้รับในตอนท้ายของโครงการนี้กับที่ วิดีโอสาธิต
คำอธิบายการเขียนโปรแกรม Master STM32
ใน Master STM32 มาดูกันว่าเกิดอะไรขึ้น:
1. ก่อนอื่นเราต้องรวมไลบรารี Wire และไลบรารี softwire สำหรับการใช้ฟังก์ชันการสื่อสาร I2C ใน STM32F103C8
# รวม
2. ในการตั้งค่าเป็นโมฆะ ()
- เราเริ่มการสื่อสารแบบอนุกรมที่ Baud Rate 9600
Serial.begin (9600);
- ต่อไปเราจะเริ่มการสื่อสาร I2C ที่พิน (B6, B7)
Wire.begin ();
3. ใน Void loop ()
- อันดับแรกเราได้รับข้อมูลจาก Slave Arduino ดังนั้นเราจึงใช้ requestFrom () กับที่อยู่ทาส 8 และเราขอหนึ่งไบต์
Wire.requestFrom (8,1);
ค่าที่ได้รับจะอ่านโดยใช้ Wire.read ()
ไบต์ a = Wire.read ();
- ขึ้นอยู่กับค่าที่ได้รับจากทาส LED Master จะเปิดหรือปิดโดยใช้ digitalwrite ที่ขา PA1 และยังใช้การพิมพ์แบบอนุกรมเพื่อพิมพ์ค่าในจอภาพแบบอนุกรม
ถ้า (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- ต่อไปเราต้องอ่านสถานะของพิน PA0 ซึ่งเป็นปุ่มกด STM32 หลัก
int pinvalue = digitalRead (buttonpin);
- จากนั้นส่งค่าพินตามตรรกะดังนั้นเราจึงใช้ if condition จากนั้นเริ่มการส่งด้วย slave arduino โดยมี 8 เป็นแอดเดรสจากนั้นเขียนค่าตามค่าอินพุตปุ่มกด
ถ้า (pinvalue == สูง) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
คำอธิบายการเขียนโปรแกรม Slave Arduino
1. ก่อนอื่นเราต้องรวมไลบรารี Wire เพื่อใช้ฟังก์ชั่นการสื่อสาร I2C
# รวม
2. ในการตั้งค่าเป็นโมฆะ ()
- เราเริ่มการสื่อสารแบบอนุกรมที่ Baud Rate 9600
Serial.begin (9600);
- จากนั้นเริ่มต้นการสื่อสาร I2C ที่พิน (A4, A5) ด้วยที่อยู่สเลฟเป็น 8 ที่นี่เป็นสิ่งสำคัญที่จะต้องระบุที่อยู่ทาส
Wire.begin (8);
ต่อไปเราต้องเรียกใช้ฟังก์ชัน Wire.onReceive เมื่อ Slave ได้รับค่าจากการเรียกใช้ฟังก์ชันmaster และ Wire.onRequest เมื่อ Master request value จาก Slave
Wire.onReceive (รับเหตุการณ์); Wire.onRequest (requestEvent);
3. ต่อไปเรามีสองฟังก์ชั่นหนึ่งสำหรับการร้องขอเหตุการณ์และอีกหนึ่งฟังก์ชันสำหรับรับเหตุการณ์
สำหรับการร้องขอกิจกรรม
เมื่อ Master STM32 ร้องขอค่าจากทาสฟังก์ชันนี้จะดำเนินการ ฟังก์ชันนี้รับค่าอินพุตจากปุ่มกด Slave Arduino และส่งไบต์ (1 หรือ 0) ไปยัง Master STM32 ตามค่าปุ่มกดโดยใช้ Wire.write ()
โมฆะ requestEvent () { int value = digitalRead (buttonpin); ถ้า (ค่า == สูง) { x = 1; } else { x = 0; } Wire.write (x); }
สำหรับกิจกรรมรับ
เมื่อ Master ส่งข้อมูลไปยัง Slave ด้วยที่อยู่ของ Slave (8) ฟังก์ชันนี้จะดำเนินการ ฟังก์ชั่นนี้จะอ่านค่าที่ได้รับจากต้นแบบและเก็บในตัวแปรประเภทไบต์และจากนั้นใช้ ถ้า ตรรกะที่จะหันทาส LED เปิดหรือปิดขึ้นอยู่กับความคุ้มค่าที่ได้รับ หากค่าที่ได้รับคือ 1 LED จะเปิดและสำหรับ 0 LED จะดับลง
โมฆะ getEvent (int howMany) { byte a = Wire.read (); ถ้า (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Slave LED OFF"); } ล่าช้า (500); }
เอาต์พุต
1.เมื่อเรากดปุ่มกดที่ Master STM32 ไฟ LED ที่เชื่อมต่อกับ Slave Ardiono จะเปิด (สีขาว)
2.ตอนนี้เมื่อเรากดปุ่มที่ด้าน Slave ไฟ LED ที่เชื่อมต่อกับ Master จะเปิด (สีแดง) และเมื่อปล่อยปุ่ม LED จะดับลง
3.เมื่อปุ่มกดทั้งสองกดพร้อมกันแล้วไฟ LED ทั้งสองดวงจะติดสว่างพร้อมกันและยังคงเปิดอยู่จนกว่าจะกดปุ่ม
ดังนั้นนี้เป็น วิธีการสื่อสาร I2C จะเกิดขึ้นใน STM32 ตอนนี้คุณสามารถเชื่อมต่อเซ็นเซอร์ I2C กับบอร์ด STM32 ได้แล้ว
การเข้ารหัสที่สมบูรณ์สำหรับ Master STM32 และ Slave Arduino มีให้ด้านล่างพร้อมวิดีโอสาธิต