- ส่วนประกอบที่จำเป็น
- โมดูลตัวส่งและตัวรับ RF 433Mhz)
- แผนภาพวงจรของเครื่องส่งสัญญาณ RF พร้อม STM32F103C8
- แผนภาพวงจรของตัวรับสัญญาณ RF พร้อม Arduino Uno
- การเขียนโปรแกรม STM32F103C8 สำหรับการส่ง RF แบบไร้สาย
- การเขียนโปรแกรม Arduino UNO เป็นตัวรับ RF
- การทดสอบเครื่องส่งและตัวรับ RF ที่ใช้ STM 32
การทำโปรเจ็กต์ไร้สายในอุปกรณ์อิเล็กทรอนิกส์แบบฝังกลายเป็นสิ่งสำคัญและเป็นประโยชน์อย่างมากเนื่องจากไม่มีสายไฟที่ติดขัดซึ่งทำให้อุปกรณ์พกพาสะดวก มีเทคโนโลยีไร้สายต่างๆเช่น Bluetooth, WiFi, RF 433 MHz (Radio Frequency) เป็นต้นเทคโนโลยีทุกอย่างมีข้อดีและข้อเสียในตัวเองเช่นค่าใช้จ่ายระยะทางหรือช่วงการถ่ายโอนความเร็วหรือปริมาณงานเป็นต้นวันนี้เราจะใช้โมดูล RF กับ STM32 การส่งและรับข้อมูลแบบไร้สาย หากคุณยังใหม่กับไมโครคอนโทรลเลอร์ STM32 ให้เริ่มด้วยไฟ LED กะพริบพร้อม STM32 โดยใช้ Arduino IDE และตรวจสอบโครงการ STM32 อื่น ๆ ทั้งหมดที่นี่
นอกเหนือจากนี้เรายังใช้โมดูลไร้สาย RF 433Mhz กับไมโครคอนโทรลเลอร์อื่น ๆ เพื่อสร้างโครงการที่ควบคุมแบบไร้สายเช่น:
- เครื่องใช้ในบ้านที่ควบคุมด้วย RF
- ไฟ LED ควบคุมระยะไกล RF โดยใช้ Raspberry Pi
- หุ่นยนต์ควบคุม RF
- การเชื่อมต่อโมดูล RF กับ Arduino
- PIC เป็น PIC Communication โดยใช้โมดูล RF
ที่นี่เราจะเชื่อมต่อโมดูลไร้สาย RF 433MHz กับไมโครคอนโทรลเลอร์ STM32F103C8 โครงการแบ่งออกเป็นสองส่วน ส่งสัญญาณจะมีการเชื่อมต่อกับ STM32และรับจะได้รับการเชื่อมต่อกับ Arduino UNO จะมีแผนภาพวงจรและภาพร่างที่แตกต่างกันสำหรับทั้งส่วนส่งและส่วนรับ
ในบทช่วยสอนนี้RF Transmitterจะส่งค่าสองค่าไปยังฝั่งผู้รับ: ระยะทางที่วัดโดยใช้เซ็นเซอร์อัลตราโซนิกและค่า ADC ของโพเทนชิออมิเตอร์ (0 ถึง 4096) ซึ่งแมปเป็นตัวเลขตั้งแต่ (0 ถึง 100) รับสัญญาณ RFของ Arduino ได้รับทั้งค่านิยมและพิมพ์ระยะทางและจำนวนผู้ที่ค่าใน 16x2 จอแสดงผล LCD แบบไร้สาย
ส่วนประกอบที่จำเป็น
- STM32F103C8 ไมโครคอนโทรลเลอร์
- Arduino UNO
- เครื่องส่งและตัวรับ RF 433Mhz
- อัลตราโซนิกเซนเซอร์ (HC-SR04)
- จอ LCD 16x2
- โพเทนชิออมิเตอร์ 10k
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
โมดูลตัวส่งและตัวรับ RF 433Mhz)
Pinout เครื่องส่งสัญญาณ RF:
เครื่องส่ง RF 433Mhz |
คำอธิบายพิน |
มด |
สำหรับเชื่อมต่อเสาอากาศ |
GND |
GND |
VDD |
3.3 ถึง 5V |
ข้อมูล |
ข้อมูลที่จะส่งไปยังผู้รับจะได้รับที่นี่ |
Pinout ตัวรับ RF:
ตัวรับ RF 433Mhz |
ใช้ |
มด |
สำหรับเชื่อมต่อเสาอากาศ |
GND |
GND |
VDD |
3.3 ถึง 5V |
ข้อมูล |
ข้อมูลที่จะรับจาก Transmitter |
CE / DO |
นอกจากนี้ยังเป็นหมุดข้อมูล |
ข้อมูลจำเพาะของโมดูล 433 MHz:
- ตัวรับแรงดันไฟฟ้าที่ใช้งาน: 3V ถึง 5V
- แรงดันไฟฟ้าในการทำงานของเครื่องส่งสัญญาณ: 3V ถึง 5V
- ความถี่ในการทำงาน: 433 MHz
- ระยะการส่ง: 3 เมตร (ไม่มีเสาอากาศ) ถึง 100 เมตร (สูงสุด)
- เทคนิคการมอดูเลต: ASK (การคีย์การปรับขนาดแอมพลิจูด)
- ความเร็วในการรับส่งข้อมูล: 10Kbps
แผนภาพวงจรของเครื่องส่งสัญญาณ RF พร้อม STM32F103C8
การเชื่อมต่อวงจรระหว่างเครื่องส่งสัญญาณ RF และ STM32F103C8:
STM32F103C8 |
เครื่องส่ง RF |
5V |
VDD |
GND |
GND |
PA10 |
ข้อมูล |
NC |
มด |
การเชื่อมต่อวงจรระหว่างอัลตราโซนิกเซนเซอร์และ STM32F103C8:
STM32F103C8 |
อัลตราโซนิกเซนเซอร์ (HC-SR04) |
5V |
VCC |
PB1 |
หนุน |
PB0 |
เสียงสะท้อน |
GND |
GND |
มิเตอร์ 10kจะเชื่อมต่อกับ STM32F103C8 เพื่อให้การป้อนข้อมูลค่าอนาล็อก (0 ถึง 3.3V) เพื่อ PA0 ADC ขา STM32
แผนภาพวงจรของตัวรับสัญญาณ RF พร้อม Arduino Uno
การเชื่อมต่อวงจรระหว่างตัวรับ RF และ Arduino UNO:
Arduino UNO |
ตัวรับ RF |
5V |
VDD |
GND |
GND |
11 |
ข้อมูล |
NC |
มด |
การเชื่อมต่อวงจรระหว่าง 16x2 LCD และ Arduino UNO:
ชื่อพิน LCD |
ชื่อพิน Arduino UNO |
พื้นดิน (Gnd) |
พื้นดิน (G) |
VCC |
5V |
วี |
Pin จาก Center of Potentiometer สำหรับ Contrast |
ลงทะเบียนเลือก (RS) |
2 |
อ่าน / เขียน (RW) |
พื้นดิน (G) |
เปิดใช้งาน (EN) |
3 |
บิตข้อมูล 4 (DB4) |
4 |
บิตข้อมูล 5 (DB5) |
5 |
บิตข้อมูล 6 (DB6) |
6 |
บิตข้อมูล 7 (DB7) |
7 |
LED เป็นบวก |
5V |
LED เชิงลบ |
พื้นดิน (G) |
การเข้ารหัสจะอธิบายโดยสังเขปด้านล่าง จะมีสองส่วนของภาพร่างโดยส่วนแรกจะเป็นส่วนของเครื่องส่งและอีกส่วนหนึ่งจะเป็นส่วนรับ ไฟล์ร่างและวิดีโอการทำงานทั้งหมดจะได้รับในตอนท้ายของบทช่วยสอนนี้ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเชื่อมต่อโมดูล RF กับ Arduino Uno ให้ไปที่ลิงค์
การเขียนโปรแกรม STM32F103C8 สำหรับการส่ง RF แบบไร้สาย
STM32F103C8 สามารถตั้งโปรแกรมได้โดยใช้ Arduino IDE FTDI โปรแกรมเมอร์หรือ ST-Linkไม่จำเป็นที่จะอัปโหลดรหัสเพื่อ STM32F103C8 เพียงแค่เชื่อมต่อกับเครื่องคอมพิวเตอร์ผ่านทางพอร์ต USB ของ STM32 และเริ่มต้นการเขียนโปรแกรมด้วยARDUINO IDE คุณสามารถเรียนรู้การเขียนโปรแกรม STM32 ของคุณใน Arduino IDE ได้ตามลิงค์
ในส่วนเครื่องส่งสัญญาณระยะห่างของวัตถุในหน่วย 'ซม.' ถูกวัดโดยใช้เซ็นเซอร์อัลตราโซนิกและค่าตัวเลขจาก (0 ถึง 100) ที่ตั้งค่าโดยใช้โพเทนชิออมิเตอร์ซึ่งส่งผ่านเครื่องส่งสัญญาณ RF ที่เชื่อมต่อกับ STM32
ก่อนอื่นให้รวมไลบรารี Radiohead ซึ่งสามารถดาวน์โหลดได้จากที่นี่ เนื่องจากไลบรารีนี้ใช้ ASK (Amplitude Shift Keying Technique) ในการส่งและรับข้อมูล ทำให้การเขียนโปรแกรมทำได้ง่ายมาก คุณสามารถรวมไลบรารีในแบบร่างได้โดยไปที่ Sketch-> include library-> Add.zip library
# รวม
เช่นเดียวกับในบทช่วยสอนนี้ในด้านเครื่องส่งสัญญาณจะใช้เซ็นเซอร์อัลตราโซนิกในการวัดระยะทางดังนั้นจึงกำหนดทริกเกอร์และหมุดสะท้อน
#define trigPin PB1 # กำหนด echoPin PB0
ถัดไปชื่ออ็อบเจ็กต์สำหรับไลบรารี RH_ASK ถูกตั้งค่าเป็น rf_driver โดยมีพารามิเตอร์เช่น speed (2000), RX pin (PA9) และ TX pin (PA10)
RH_ASK rf_driver (2000, PA9, PA10);
ถัดไปจะประกาศตัวแปร Strings ที่จำเป็นในโปรแกรมนี้
สตริง transmit_number; String transmit_distance; ส่งสตริง;
ถัดไปในการตั้งค่า void () อ็อบเจ็กต์สำหรับ RH_ASK rf_driver ถูกเตรียมใช้งาน
rf_driver.init ();
หลังจากนั้นขาทริกเกอร์จะถูกตั้งค่าเป็นขาเอาท์พุทและ PA0 (เชื่อมต่อกับโพเทนชิออมิเตอร์) และตั้งค่าขาสะท้อนเป็นขาอินพุต การสื่อสารแบบอนุกรมเริ่มต้นที่อัตราการส่งข้อมูลที่ 9600
Serial.begin (9600); pinMode (PA0, อินพุต); pinMode (echoPin, INPUT); pinMode (trigPin, เอาท์พุท);
ถัดไปใน void loop () ต่อจากค่าโพเทนชิออมิเตอร์ที่เป็นอินพุตแรงดันอนาล็อกจะถูกแปลงเป็นค่าดิจิตอล (พบค่า ADC) เนื่องจาก ADC ของ STM32 มีความละเอียด 12 บิต ดังนั้นค่าดิจิทัลจึงแตกต่างกันไปตั้งแต่ (0 ถึง 4096) ซึ่งแมปเป็น (0 ถึง 100)
int analoginput = analogRead (PA0); int pwmvalue = แผนที่ (analoginput, 0,4095,0,100);
ถัดไปจะวัดระยะทางโดยใช้เซ็นเซอร์อัลตราโซนิกโดยตั้งไกปืนให้สูงและต่ำโดยมีความล่าช้า 2 ไมโครวินาที
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, สูง); delayMicroseconds (10); digitalWrite (trigPin, LOW);
ขาสะท้อนจะตรวจจับคลื่นสะท้อนกลับนั่นคือระยะเวลาที่คลื่นที่เรียกใช้สะท้อนกลับมาใช้ในการคำนวณระยะห่างของวัตถุโดยใช้สูตร เรียนรู้เพิ่มเติมว่าเซ็นเซอร์อัลตราโซนิกคำนวณระยะทางอย่างไรโดยไปที่ลิงค์
ระยะเวลานาน = pulseIn (echoPin, HIGH); ระยะลอย = ระยะเวลา * 0.034 / 2;
ตอนนี้ทั้งหมายเลขข้อมูลและระยะทางที่วัดได้จะถูกแปลงเป็นข้อมูลสตริงและจัดเก็บไว้ในตัวแปรสตริงตามลำดับ
transmit_number = สตริง (pwmvalue); transmit_distance = สตริง (ระยะทาง);
ทั้งสองสตริงจะถูกเพิ่มเป็นหนึ่งบรรทัดและเก็บไว้ในสตริงที่เรียกว่าการส่งและลูกน้ำ "," ใช้เพื่อแยกสองสตริง
ส่ง = transmit_pwm + "," + transmit_distance;
สตริงการส่งจะถูกแปลงเป็นอาร์เรย์อักขระ
const ถ่าน * msg = transmit.c_str ();
ข้อมูลจะถูกส่งและรอจนกว่าจะถูกส่ง
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
ข้อมูลสตริงที่ส่งจะแสดงใน Serial Monitor ด้วย
Serial.println (ผงชูรส);
การเขียนโปรแกรม Arduino UNO เป็นตัวรับ RF
Arduino UNO ถูกตั้งโปรแกรมโดยใช้ Arduino IDE ในส่วนเครื่องรับข้อมูลที่ส่งจากส่วนเครื่องส่งและรับโดยโมดูลตัวรับ RF และข้อมูลสตริงที่ได้รับจะแบ่งออกเป็นข้อมูลตามลำดับ (ระยะทางและตัวเลข) และแสดงในจอ LCD 16x2
มาดูการเข้ารหัสตัวรับโดยสังเขป:
เช่นเดียวกับในส่วนเครื่องส่งสัญญาณก่อนอื่นไลบรารี RadiohHead จะรวมอยู่ด้วย เนื่องจากไลบรารีนี้ใช้ ASK (Amplitude Shift Keying Technique) ในการส่งและรับข้อมูล ทำให้การเขียนโปรแกรมทำได้ง่ายมาก
# รวม
เนื่องจากมีการใช้จอ LCD ที่นี่จึงรวมไลบรารี liquidcrystal ด้วย
# รวม
และขาแสดงผล LCD 16x2 ที่เชื่อมต่อกับ Arduino UNO จะถูกระบุและประกาศโดยใช้ LCD เป็นวัตถุ
LiquidCrystal lcd (2,3,4,5,6,7);
ถัดไปจะประกาศตัวแปรข้อมูล String เพื่อจัดเก็บข้อมูลสตริง
สตริง str_receive; สตริง str_number; สตริง str_distance;
มีการประกาศอ็อบเจ็กต์สำหรับไลบรารี Radiohead
RH_ASK rf;
ขณะนี้อยู่ในการ ตั้งค่าโมฆะ () จอ LCD ถูกตั้งค่าในโหมด 16x2 และข้อความต้อนรับจะปรากฏขึ้นและล้าง
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF พร้อม STM32"); ล่าช้า (5000); lcd.clear ();
หลังจากนั้น RF วัตถุจะเริ่มต้นได้
rf.init ();
ตอนนี้อยู่ใน void loop () Array buf ถูกประกาศด้วยขนาดเป็น 7 เนื่องจากข้อมูลที่ส่งจากเครื่องส่งมี 7 รวมถึง "," ดังนั้นเปลี่ยนสิ่งนี้ตามข้อมูลที่จะส่ง
uint8_t buf; uint8_t buflen = sizeof (buf);
หากสตริงมีอยู่ที่โมดูลตัวรับ rf ฟังก์ชัน if จะตรวจสอบขนาดและดำเนินการ rf.recv () จะใช้ในการรับข้อมูล
ถ้า (rf.recv (buf & buflen))
buf ได้สตริงที่ได้รับเป็นอย่างนั้นได้รับสตริงถูกเก็บไว้ใน str_receive ตัวแปรสตริง
str_receive = สตริง ((ถ่าน *) buf);
สิ่งนี้ สำหรับการ วนซ้ำใช้เพื่อแบ่งสตริงที่ได้รับออกเป็นสองสตริงหากตรวจพบ "," ระหว่างสองสตริง
สำหรับ (int i = 0; i <str_receive.length (); i ++) { if (str_receive.substring (i, i + 1) == ",") { str_number = str_receive.substring (0, i); str_distance = str_receive.substring (i + 1); หยุดพัก; }
มีการประกาศอาร์เรย์ถ่านสองค่าสำหรับสองค่าและสตริงที่แบ่งออกเป็นสองค่าจะถูกเก็บไว้ในอาร์เรย์ที่เคารพโดยการแปลงสตริงเป็นอาร์เรย์อักขระ
หมายเลขถ่าน ระยะห่างของถ่าน str_distance.toCharArray (ระยะห่าง 3); str_number.toCharArray (numberstring, 3);
หลังจากนั้นแปลงอาร์เรย์อักขระเป็นจำนวนเต็มโดยใช้ atoi ()
int ระยะทาง = atoi (ระยะทาง); หมายเลข int = atoi (numberstring);
หลังจากแปลงเป็นค่าจำนวนเต็มแล้วระยะทางและตัวเลขของค่าจะแสดงในจอ LCD 16x2
lcd.setCursor (0,0); lcd.print ("หมายเลข:"); lcd.print (หมายเลข); lcd.setCursor (0,1); lcd.print ("ระยะทาง:"); lcd.print (ระยะทาง); lcd.print ("ซม.");
หลังจากอัปโหลดทั้งรหัส ได้แก่ ตัวส่งและตัวรับใน STM32 และ Arduino UNO ตามลำดับข้อมูลเช่นจำนวนและระยะวัตถุที่วัดโดยใช้ STM32 จะถูกส่งไปยังตัวรับ RF ผ่าน RF Transmitter และค่าที่ได้รับจะแสดงบนจอ LCD แบบไร้สาย
การทดสอบเครื่องส่งและตัวรับ RF ที่ใช้ STM 32
1. เมื่อตัวเลขที่ 0 และระยะห่างของวัตถุอยู่ที่ 6 ซม.
2. เมื่อหมายเลข 47 และระยะห่างของวัตถุอยู่ที่ 3 ซม.