บทที่ 7/31-2 : การตรวจจับสนามแม่เหล็กโดยใช้สวิตช์กก | ชุด SunFounder
การตรวจจับสนามแม่เหล็กเป็นวิธีที่ง่ายที่สุดและน่าพึงพอใจที่สุดวิธีหนึ่งในการเริ่มต้นใช้งานอินพุตดิจิทัลบน Arduino ในโปรเจกต์นี้คุณจะสร้างเครื่องตรวจจับสนามแม่เหล็กโดยใช้สวิตช์กก — สวิตช์ขนาดเล็กที่ห่อหุ้มด้วยแก้วซึ่งจะปิดหน้าสัมผัสเมื่อมีแม่เหล็กเข้ามาใกล้ เนื่องจากสวิตช์กกทำงานเหมือนปุ่มกดทุกประการ (ไม่เปิดก็ปิด) จึงเป็นบทนำที่สมบูรณ์แบบสำหรับฟังก์ชัน digitalRead() และยังสอนให้คุณรู้ว่าทำไมตัวต้านทานแบบ pull-down จึงสำคัญ และวิธีที่ pull-up ภายในของ Arduino สามารถแทนที่มันได้ทั้งหมด
เมื่อคุณทำให้มันทำงานได้แล้ว วงจรเดียวกันนี้จะกลายเป็นหัวใจของสิ่งประดิษฐ์ในโลกจริงมากมาย นี่คือไอเดียปฏิบัติบางส่วนที่คุณสามารถลองได้:
- สัญญาณเตือนประตูและหน้าต่าง — ติดตั้งสวิตช์กกบนกรอบและแม่เหล็กเล็กๆ บนประตู; Arduino จะรายงานว่า "เปิด" ทันทีที่แม่เหล็กเคลื่อนออกไป
- เครื่องวัดรอบแบบไม่สัมผัส — ติดแม่เหล็กกับล้อที่หมุนและนับพัลส์เพื่อวัด RPM
- เครื่องอ่านมิเตอร์น้ำหรือแก๊ส — มิเตอร์สาธารณูปโภคหลายชนิดมีเอาต์พุตพัลส์แม่เหล็กที่สวิตช์กกสามารถตรวจจับและบันทึกได้
- เซ็นเซอร์ฝาปิดแล็ปท็อป / กล่องอุปกรณ์ — ตรวจจับเมื่อฝาปิดถูกปิดเพื่อกระตุ้นการพักเครื่องหรือ LED สถานะ
- มาตรวัดความเร็วจักรยาน — แม่เหล็กบนซี่ล้อและสวิตช์กกบนตะเกียบให้พัลส์หนึ่งครั้งต่อการหมุนล้อหนึ่งรอบ
- การตรวจจับการงัดแงะ — ซ่อนแม่เหล็กและสวิตช์กกไว้ในกล่องอุปกรณ์เพื่อให้คุณรู้ว่ามันถูกเปิดหรือไม่
สวิตช์กกทำงานอย่างไร
สวิตช์กกคือแคปซูลแก้วขนาดเล็กที่บรรจุใบมีดเฟอร์โรแมกเนติกบางๆ สองใบ (ในวิดีโอที่ 12:38) เมื่ออยู่ในสนามแม่เหล็ก ใบมีดจะถูกดึงดูดเข้าหากันและสัมผัสกัน ปิดวงจร เมื่อเอาแม่เหล็กออก ใบมีดจะดีดออกจากกัน เปิดวงจรอีกครั้ง นั่นคือหลักการทั้งหมด — มันคือสวิตช์ที่ไม่มีปุ่มกด ไม่มีการสึกหรอจากการกดนิ้ว และไม่จำเป็นต้องสัมผัสทางกายภาพกับวัตถุที่คุณตรวจจับ
คุณสามารถตรวจสอบพฤติกรรมนี้ได้ด้วยมัลติมิเตอร์ในโหมดความต่อเนื่อง (ในวิดีโอที่ 13:59): เมื่อไม่มีแม่เหล็กอยู่ใกล้ มิเตอร์จะแสดงวงจรเปิด และทันทีที่แม่เหล็กเข้ามาใกล้ เสียงบัซเซอร์จะดังและมิเตอร์จะอ่านค่าวงจรปิด เนื่องจากสวิตช์นี้เหมือนกับปุ่มกดทุกประการทางไฟฟ้า โค้ด Arduino และการเดินสายจึงเหมือนกับอินพุตดิจิทัลอื่นๆ
อธิบายอินพุตดิจิทัลและตัวต้านทาน Pull
Arduino อ่านพินดิจิทัลเป็น HIGH หรือ LOW บนบอร์ด 5 V สิ่งใดก็ตามที่สูงกว่าประมาณ 2.2 V จะถือเป็น HIGH และสิ่งใดก็ตามที่ต่ำกว่าประมาณ 1.5 V จะถือเป็น LOW (ในวิดีโอที่ 01:49) ปัญหาคือสวิตช์ที่เชื่อมต่อโดยตรงระหว่างพินกับ 5 V จะทำให้พิน ลอย เมื่อสวิตช์เปิด — มันไม่ได้เชื่อมต่อกับสิ่งใด จึงรับสัญญาณรบกวนและรายงานค่าแบบสุ่ม
นั่นคือเหตุผลที่ต้องใช้ตัวต้านทาน มีการจัดวางสองแบบที่ได้ผลเท่าเทียมกัน:
- Pull-down: ตัวต้านทาน 10 kΩ จากขาไปยังกราวด์ ขาจะอ่านค่า LOW เมื่อสวิตช์เปิด และ HIGH เมื่อสวิตช์เชื่อมต่อขากับ 5 V
- Pull-up: ตัวต้านทาน 10 kΩ จากขาไปยัง 5 V ขาจะอ่านค่า HIGH เมื่อสวิตช์เปิด และ LOW เมื่อสวิตช์เชื่อมต่อขากับกราวด์
Arduino ยังมีตัวต้านทาน pull-up ภายในที่สามารถเปิดใช้งานได้ในซอฟต์แวร์ด้วย INPUT_PULLUP (ในวิดีโอที่ 19:52) ซึ่งช่วยลดความจำเป็นในการใช้ตัวต้านทานภายนอกได้ทั้งหมด — ขาจะอยู่ในสถานะ HIGH เมื่อไม่มีสัญญาณ และเมื่อปิดสวิตช์ไปยังกราวด์จะดึงให้เป็น LOW ข้อเสียคือลอจิกจะกลับกัน: เมื่อกด (หรือมีแม่เหล็ก) จะอ่านค่าได้ 0 แทนที่จะเป็น 1
ฮาร์ดแวร์และส่วนประกอบ
- Arduino Uno (หรือบอร์ดที่เข้ากันได้)
- โมดูล reed switch หรือ reed switch เปล่า
- ตัวต้านทาน 10 kΩ (จำเป็นเฉพาะเวอร์ชัน pull-down)
- เบรดบอร์ดและสายจัมเปอร์
- แม่เหล็กขนาดเล็กสำหรับทดสอบ
- สาย USB สำหรับโปรแกรมและจ่ายไฟ
คู่มือการต่อสาย
reed switch ต่อสายเหมือนกับปุ่มกดทั่วไป ขาข้างหนึ่งของ reed switch ต่อไปยัง 5 V ขาอีกข้างต่อไปยังขา 2 ของ Arduino และ ต่อกับปลายข้างหนึ่งของตัวต้านทาน 10 kΩ ปลายอีกข้างของตัวต้านทานต่อลงกราวด์ (ในวิดีโอที่ 14:40) นี่คือการตั้งค่าแบบ pull-down ดังนั้นขาจะอ่านค่า LOW เมื่อไม่มีแม่เหล็ก และ HIGH เมื่อแม่เหล็กปิดสวิตช์
บนเบรดบอร์ด วาง reed switch ให้ขาทั้งสองอยู่ในแถวที่ต่างกัน ต่อตัวต้านทานจากแถวเดียวกับขาข้างหนึ่งลงไปยังรางกราวด์ เดินสายสีแดงจากขาอีกข้างไปยังราง 5 V และสายสีเขียวจากจุดเชื่อมต่อของ reed switch และตัวต้านทานไปยังขา 2 (ในวิดีโอที่ 15:53) สีดำไปกราวด์ สีแดงไป 5 V สีเขียวไปขา 2 — ใช้รูปแบบสีเดียวกันตลอดทั้งชุด SunFounder
หากคุณต้องการข้ามตัวต้านทาน ให้ต่อขาข้างหนึ่งของ reed switch ไปยังขา 2 และขาอีกข้างต่อตรงไปยังกราวด์ จากนั้นเปิดใช้งาน INPUT_PULLUP ในโค้ดตามที่อธิบายด้านล่าง
คำอธิบายโค้ด
สเก็ตช์นี้ตั้งใจให้เล็กมาก ทุกสิ่งที่คุณต้องการเปลี่ยนแปลงอยู่ในสองตำแหน่งที่ด้านบนของไฟล์
int reedPin = 2;//the pin reed switch is connected to
void setup() {
Serial.begin(9600);
pinMode(reedPin, INPUT);
}
reedPin — เปลี่ยนตัวเลขนี้หากคุณต่อ reed switch ไปยังขาดิจิทัลอื่น ขาดิจิทัลใดก็ได้บน Uno ใช้งานได้ ขา 2 ถูกใช้ที่นี่เพียงเพราะสะดวกบนเบรดบอร์ด
Serial.begin(9600) — กำหนดความเร็วของ serial monitor หากคุณเปลี่ยนค่านี้ คุณต้องเปลี่ยน baud rate ในหน้าต่าง Serial Monitor ด้วย มิฉะนั้นคุณจะเห็นตัวอักษรแปลก ๆ (ในวิดีโอที่ 11:25)
pinMode(reedPin, INPUT) — กำหนดค่าขาเป็นอินพุตความต้านทานสูงเพื่อให้สามารถตรวจจับแรงดันที่กำหนดโดย reed switch และตัวต้านทาน หากคุณใช้ pull-up ภายในแทน ให้เปลี่ยนบรรทัดนี้เป็น pinMode(reedPin, INPUT_PULLUP); และจำไว้ว่าค่าที่อ่านได้จะกลับกัน
ลูปเพียงแค่อ่านขาและพิมพ์ผลลัพธ์:
void loop() {
Serial.println(digitalRead(reedPin));
delay(10);
}
digitalRead(reedPin) คืนค่า 1 เมื่อขาเป็น HIGH และ 0 เมื่อเป็น LOW เนื่องจากค่าถูกส่งตรงไปยัง Serial.println() จึงไม่จำเป็นต้องใช้ตัวแปรกลาง — ค่าที่อ่านได้จะถูกพิมพ์โดยตรง ด้วยการต่อแบบ pull-down 0 หมายถึง "ไม่มีสนามแม่เหล็ก" และ 1 หมายถึง "ตรวจพบแม่เหล็ก" (ในวิดีโอที่ 18:31)
delay(10) ควบคุมความถี่ในการพิมพ์ค่าที่อ่านได้ สิบมิลลิวินาทีนั้นเร็วพอที่คุณจะเห็นค่าเปลี่ยนทันทีที่แม่เหล็กเข้าใกล้ หากคุณต้องการการแสดงผลที่ช้ากว่านี้ คุณสามารถเพิ่มเป็น 200 ms แต่โปรดทราบว่าจะทำให้การตรวจจับช้าลงด้วย (ในวิดีโอที่ 12:01)
การสาธิตโปรเจกต์แบบสด
หลังจากอัปโหลดสเก็ตช์แล้ว ให้เปิด Serial Monitor และตั้งค่า baud rate เป็น 9600 เมื่อไม่มีแม่เหล็กอยู่ใกล้ หน้าต่างจะเต็มไปด้วยศูนย์ นำแม่เหล็กขนาดเล็กเข้าใกล้แคปซูลแก้ว แล้วเอาต์พุตจะเปลี่ยนเป็นหนึ่งทันที ดึงแม่เหล็กออกแล้วจะกลับเป็นศูนย์ (ในวิดีโอที่ 17:04) การตอบสนองเป็นแบบทันทีและทำงานได้แม้ถือแม่เหล็กห่างจากสวิตช์หนึ่งหรือสองเซนติเมตร
หากคุณสร้างเวอร์ชัน pull-up แทน ลอจิกจะกลับกัน: มอนิเตอร์จะแสดง 1 เมื่อพัก และ 0 เมื่อมีแม่เหล็ก (ในวิดีโอที่ 22:13) ไม่ว่าจะแบบไหน ตอนนี้คุณมีเครื่องตรวจจับสนามแม่เหล็กแบบไม่สัมผัสที่เชื่อถือได้ ซึ่งมีต้นทุนเกือบเป็นศูนย์และสามารถนำไปใช้ในไอเดียโปรเจกต์ใดก็ได้ที่ระบุไว้ด้านบนของบทความนี้
เวอร์ชันปุ่มกดของบทเรียนการอ่านค่าดิจิทัลเดียวกันนี้จะกล่าวถึงแยกต่างหากใน บทเรียน 7/31: การอ่านค่าดิจิทัลด้วยปุ่มกด ตรวจจับสนามแม่เหล็ก ชุด SunFounder | Robojax
โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้
บทต่างๆ
- [00:00] บทนำ: ตัวอย่างการอ่านค่าดิจิทัลสองแบบ
- [01:33] ความหมายของการอ่านค่าดิจิทัลและ HIGH/LOW
- [02:46] การทำงานของสวิตช์ปุ่มกด
- [03:25] ทฤษฎีตัวต้านทานแบบ pull-up และ pull-down
- [05:18] การต่อสายปุ่มกดบนเบรดบอร์ด
- [08:21] การเปิดและอธิบายโค้ดตัวอย่างปุ่มกด
- [10:55] การอัปโหลดและทดสอบตัวอย่างปุ่มกด
- [12:38] แนะนำสวิตช์กกและการทดสอบด้วยมัลติมิเตอร์
- [14:40] การต่อสายสวิตช์กกเข้ากับขา 2
- [16:46] การทดสอบสวิตช์กกด้วยแม่เหล็ก
- [17:19] การอธิบายโค้ดตัวอย่างสวิตช์กก
- [19:45] การใช้ INPUT_PULLUP โดยไม่ต้องใช้ตัวต้านทานภายนอก
ภาพ
/*
* Lesson 7/31-2: Digital read, working with reed switch
Download and resource page https://robojax.com/RJT590
watch video tutorial https://www.youtube.com/watch?v=yyJrqFKn-X4
* written/updated by Ahmad Shamshiri www.Robojax.com
* Dec 12, 2022
*
*/
int reedPin = 2;//the pin reed switch is connected to
void setup() {
Serial.begin(9600);
pinMode(reedPin, INPUT);
}
void loop() {
Serial.println(digitalRead(reedPin));
delay(10);
}
Common Course Links
Common Course Files
สิ่งที่คุณอาจต้องการ
-
อเมซอนBuy reed switch from Amazonamzn.to
-
อเมซอน
-
อเมซอนSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
อเมซอน
-
อเมซอน
-
อเมซอน
-
อเมซอน
-
อีเบย์Buy reed switch from eBayebay.us
-
อาลีเอ็กซ์เพรสBuy reed switch from AliExpresss.click.aliexpress.com
แหล่งข้อมูลและเอกสารอ้างอิง
-
เอกสารDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ภายนอกPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
ไฟล์📁
ไลบรารี Arduino (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB
คู่มือผู้ใช้
-
คู่มือการประกอบรถอัจฉริยะ SunFounder 3-in-1 Arduino Smart Carเอกสารนี้แสดงการประกอบ SunFounder 3-in-1 Arduino Smart Car ทีละขั้นตอน
SunFounder_car_assembly_manual.pdf1.20 MB