สารบัญ:

Arduino RF Sensor Decoder: 5 ขั้นตอน
Arduino RF Sensor Decoder: 5 ขั้นตอน

วีดีโอ: Arduino RF Sensor Decoder: 5 ขั้นตอน

วีดีโอ: Arduino RF Sensor Decoder: 5 ขั้นตอน
วีดีโอ: How to decode any RF signal remote in Arduino | Arduino Project| ALPHA Lab 2024, กรกฎาคม
Anonim
ตัวถอดรหัสเซ็นเซอร์ RF Arduino
ตัวถอดรหัสเซ็นเซอร์ RF Arduino

บ้านหลังก่อนของฉันมาพร้อมกับระบบรักษาความปลอดภัยที่ติดตั้งไว้ล่วงหน้าซึ่งมีเซ็นเซอร์ประตู เซ็นเซอร์ตรวจจับความเคลื่อนไหว และแผงควบคุม ทุกอย่างเชื่อมต่อกับกล่องอิเล็กทรอนิกส์ขนาดใหญ่ในตู้เสื้อผ้าอย่างแน่นหนา และมีคำแนะนำในการเดินสายโทรศัพท์พื้นฐานเพื่อโทรออกโดยอัตโนมัติในกรณีที่มีสัญญาณเตือน เมื่อฉันพยายามเล่นกับมัน ฉันพบว่าเซ็นเซอร์ประตูตัวหนึ่งได้รับการติดตั้งไม่สมบูรณ์ และอีกตัวหนึ่งทำงานไม่ต่อเนื่องเนื่องจากการจัดตำแหน่งที่ไม่เหมาะสม มากสำหรับการติดตั้งแบบมืออาชีพโน้มน้าวใจในนามบัตรของ บริษัท รักษาความปลอดภัย วิธีแก้ปัญหาของฉันในตอนนั้นคือซื้อกล้องรักษาความปลอดภัยทางอินเทอร์เน็ตสองสามตัวและสัญญาณเตือนภัยไร้สายราคาถูก

กรอไปข้างหน้าอย่างรวดเร็วในวันนี้และสัญญาณเตือนภัยแบบไร้สายนั้นอยู่ในกล่องในห้องใต้ดินของฉัน หลังจากที่ฉันได้เครื่องรับ RF ราคาถูกมา ฉันตัดสินใจดูว่าฉันสามารถถอดรหัสข้อความที่ส่งโดยเซ็นเซอร์เตือนภัยและรีโมตต่างๆ ที่ฉันมีได้หรือไม่ ฉันคิดว่าเนื่องจากพวกเขาทั้งหมดทำงานกับกล่องสัญญาณเตือนภัยราคาถูก พวกเขาทั้งหมดจึงต้องใช้รูปแบบข้อความเดียวกันโดยใช้ ID อื่น ไม่นานฉันก็พบว่ามีความคล้ายคลึงกันเฉพาะในโครงสร้างทั่วไปของข้อความเท่านั้น ดังนั้นโครงการจึงเปลี่ยนจากเล็กน้อยเป็นน่าสนใจมากอย่างรวดเร็ว

ขั้นตอนที่ 1: โมดูลเซนเซอร์

โมดูลเซนเซอร์
โมดูลเซนเซอร์
โมดูลเซนเซอร์
โมดูลเซนเซอร์
โมดูลเซนเซอร์
โมดูลเซนเซอร์
โมดูลเซนเซอร์
โมดูลเซนเซอร์

ดังที่คุณเห็นในภาพด้านบน เครื่องส่งสัญญาณประกอบด้วยเซ็นเซอร์เปิดประตู เครื่องตรวจจับการเคลื่อนไหว รีโมทติดอาวุธ และแป้นพิมพ์ไร้สายที่ใช้สำหรับตั้งโปรแกรมกล่องสัญญาณเตือนภัย ปรากฏว่าไม่มีอุปกรณ์สองเครื่องนี้ใช้ความยาวการซิงค์หรือระยะเวลาบิตเท่ากัน ความธรรมดาสามัญเพียงอย่างเดียวนอกเหนือจากความยาวของข้อความคือรูปแบบพื้นฐานของบิต แต่ละบิตใช้ระยะเวลาคงที่โดยมีความแตกต่างระหว่างศูนย์และหนึ่งเป็นรอบการทำงานของส่วนสูง/ต่ำ

รูปคลื่นสวยที่แสดงด้านบนไม่ใช่สิ่งที่ฉันได้รับครั้งแรก เนื่องจากย่านความถี่ 433 เมกะเฮิรตซ์มีการจราจรหนาแน่นมาก ฉันจึงต้องเปิดใช้งานเซ็นเซอร์ก่อนที่จะตั้งค่าขอบเขตให้ทริกเกอร์ตัวเดียว โชคดีที่เซ็นเซอร์ได้คัดลอกข้อความข้อมูลออกมาหลายชุดเมื่อเปิดใช้งาน และรีโมทและแป้นกดจะส่งข้อความต่อไปตราบเท่าที่มีการกดปุ่ม ด้วยการใช้ขอบเขต ฉันสามารถกำหนดความยาวการซิงค์และระยะเวลาบิตข้อมูลสำหรับแต่ละรายการ ดังที่กล่าวไว้ก่อนหน้านี้ เวลาซิงค์จะแตกต่างกัน และเวลาบิตจะแตกต่างกัน แต่รูปแบบข้อความทั้งหมดมีการซิงค์ระดับต่ำ ตามด้วยบิตข้อมูล 24 บิตและบิตหยุดเดียว นั่นก็เพียงพอแล้วสำหรับฉันที่จะสร้างตัวถอดรหัสทั่วไปในซอฟต์แวร์โดยไม่ต้องฮาร์ดโค้ดในรายละเอียดที่แตกต่างกันทั้งหมดสำหรับแต่ละอุปกรณ์

ขั้นตอนที่ 2: ฮาร์ดแวร์

ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์

เดิมทีฉันสร้างตัวถอดรหัสเซ็นเซอร์โดยใช้ไมโครคอนโทรลเลอร์ PIC และภาษาแอสเซมบลี เมื่อเร็ว ๆ นี้ฉันได้เล่นกับ Arduino หลากหลายรูปแบบ ดังนั้นฉันคิดว่าฉันจะดูว่าฉันสามารถทำซ้ำได้หรือไม่ แผนผังอย่างง่ายแสดงไว้ด้านบน และยังมีรูปภาพต้นแบบของฉันด้วย ทั้งหมดที่ฉันทำคือใช้สายจัมเปอร์ทั่วไปสามเส้นเพื่อเปลี่ยนจาก Arduino Nano ไปยังบอร์ดรับสัญญาณ RF พลังงานและสายข้อมูลเพียงเส้นเดียวเป็นสิ่งที่จำเป็น

หากคุณอ่านคำแนะนำของฉันใน "การแสดงเวลาและสภาพอากาศแบบ 3-in-1" คุณจะเห็นว่าฉันใช้เครื่องรับ RXB6, 433-MHz ทั่วไป คุณอาจได้ตัวรับราคาถูกจริงๆ มาทำงานในช่วงสั้นๆ ที่จำเป็นสำหรับโครงการนี้ แต่ฉันยังคงแนะนำให้ใช้ตัวรับ super-heterodyne

ขั้นตอนที่ 3: ซอฟต์แวร์

ซอฟต์แวร์แปลงบิตที่ได้รับเป็นอักขระ ASCII ที่แสดงผลได้ มันส่งออกค่าของความยาวซิงค์ และความยาวของบิต 1 และ 0 เนื่องจากฉันรู้ความยาวการซิงค์และรูปแบบบิตอยู่แล้ว ฉันจึงสามารถเขียนซอฟต์แวร์สำหรับพวกเขาโดยเฉพาะได้ แต่ฉันตัดสินใจดูว่าฉันสามารถเขียนมันเพื่อจัดเรียงความยาวการซิงค์และหาบิตข้อมูลโดยอัตโนมัติได้หรือไม่ ซึ่งจะทำให้ง่ายต่อการแก้ไขในกรณีที่ฉันต้องการลองตรวจหารูปแบบอื่นในบางครั้ง สิ่งสำคัญคือต้องทราบว่าซอฟต์แวร์ไม่ทราบว่าบิตแรกของข้อความเป็น 1 หรือ 0 โดยถือว่ามันเป็น 1 แต่ถ้าพบว่าควรเป็นศูนย์ มันจะกลับ บิตในข้อความที่เสร็จสมบูรณ์ก่อนส่งออกพอร์ตอนุกรม

เวลาของพัลส์การซิงค์และบิตข้อมูลถูกกำหนดโดยใช้อินพุตอินเตอร์รัปต์ภายนอก INT0 เพื่อทริกเกอร์ตัวจัดการการขัดจังหวะ INT0 สามารถทริกเกอร์ได้เมื่อขึ้น ลง หรือทั้งสองข้าง หรือในระดับต่ำคงที่ ซอฟต์แวร์ถูกขัดจังหวะที่ขอบทั้งสองข้างและวัดระยะเวลาที่ชีพจรยังคงต่ำ นั่นทำให้สิ่งต่าง ๆ ง่ายขึ้นเพราะการเริ่ม/ซิงค์ข้อความเป็นพัลส์ระดับต่ำและสามารถกำหนดบิตตามเวลาระดับต่ำได้

ตัวจัดการการขัดจังหวะในขั้นแรกจะกำหนดว่าจำนวนที่จับได้นั้นยาวพอที่จะเป็นพัลส์เริ่มต้น/ซิงค์หรือไม่ อุปกรณ์ต่างๆ ที่ฉันใช้พัลส์การซิงค์ 4, 9, 10 และ 14 มิลลิวินาที คำสั่งกำหนดสำหรับค่าการซิงค์ต่ำสุด/สูงสุดที่อนุญาตจะอยู่ด้านหน้าในซอฟต์แวร์ และปัจจุบันตั้งค่าไว้ที่ 3 และ 16 มิลลิวินาที เวลาบิตยังแตกต่างกันไประหว่างเซ็นเซอร์ดังนั้นอัลกอริทึมสำหรับการถอดรหัสบิตจำเป็นต้องคำนึงถึงสิ่งนั้นด้วย เวลาบิตของบิตแรกจะถูกบันทึกเช่นเดียวกับเวลาของบิตถัดไปซึ่งมีความแตกต่างอย่างมีนัยสำคัญจากบิตแรก การเปรียบเทียบโดยตรงของบิตไทม์ที่ตามมานั้นเป็นไปไม่ได้ ดังนั้นจึงใช้ "fudge factor" กำหนด ("รูปแบบ") การถอดรหัสบิตเริ่มต้นโดยสมมติว่าบิตข้อมูลแรกถูกบันทึกเป็นลอจิก 1 เสมอ ค่านั้นจะถูกบันทึกและใช้เพื่อทดสอบบิตถัดไป หากจำนวนบิตข้อมูลที่ตามมาอยู่ภายในหน้าต่างความแปรปรวนของค่าที่บันทึกไว้ ก็จะถูกบันทึกเป็นลอจิก 1 ด้วย หากอยู่นอกหน้าต่างความแปรปรวนของค่าที่บันทึกไว้ จะถูกบันทึกเป็นลอจิก 0 หากลอจิก 0 เวลาบิตสั้นกว่าเวลาบิตแรก จากนั้นตั้งค่าสถานะเพื่อบอกซอฟต์แวร์ว่าจำเป็นต้องกลับด้านไบต์ก่อนที่จะแสดง กรณีเดียวที่อัลกอริธึมนี้ล้มเหลวคือเมื่อบิตในข้อความเป็น 0 ทั้งหมด เราสามารถยอมรับข้อจำกัดนั้นได้เพราะข้อความประเภทนั้นไม่มีความหมาย

เซ็นเซอร์ที่ฉันสนใจทั้งหมดมีความยาวข้อความ 24 บิตข้อมูล แต่ซอฟต์แวร์ไม่ได้จำกัดความยาวนั้น มีบัฟเฟอร์สูงสุดเจ็ดไบต์ (สามารถเพิ่มได้อีก) และกำหนดความยาวข้อความต่ำสุดและสูงสุดเป็นไบต์ ซอฟต์แวร์ได้รับการตั้งค่าให้รวบรวมบิต แปลงเป็นไบต์ จัดเก็บชั่วคราว แล้วส่งออกในรูปแบบ ASCII ผ่านพอร์ตอนุกรม เหตุการณ์ที่ทริกเกอร์เอาต์พุตของข้อความคือการรับพัลส์เริ่มต้น/ซิงค์ใหม่

ขั้นตอนที่ 4: การบันทึกข้อมูล

การบันทึกข้อมูล
การบันทึกข้อมูล

ซอฟต์แวร์ได้รับการตั้งค่าให้ส่งออกข้อมูลที่แปลงเป็นอักขระ ASCII ผ่านเอาต์พุตอนุกรม (TX) ของ Arduino เมื่อฉันสร้างเวอร์ชัน PIC ฉันต้องเชื่อมต่อกับโปรแกรมเทอร์มินัลบนพีซีเพื่อแสดงข้อมูล ข้อดีอย่างหนึ่งของ Arduino IDE คือมีฟังก์ชัน Serial Monitor ในตัว ฉันตั้งค่าอัตราพอร์ตอนุกรมเป็น 115.2k แล้วตั้งค่าหน้าต่าง Serial Monitor เป็นอัตราเดียวกัน ภาพหน้าจอที่นี่แสดงหน้าจอทั่วไปพร้อมเอาต์พุตจากเซ็นเซอร์ต่างๆ ที่ฉันมี อย่างที่คุณเห็น บางครั้งข้อมูลอาจไม่สมบูรณ์แบบ แต่คุณสามารถระบุได้อย่างง่ายดายว่ามูลค่าที่แท้จริงของเซ็นเซอร์แต่ละตัวควรเป็นเท่าใด

ขั้นตอนที่ 5: ซอฟต์แวร์ตัวรับตัวอย่าง

ซอฟต์แวร์ตัวรับตัวอย่าง
ซอฟต์แวร์ตัวรับตัวอย่าง

ฉันได้รวมรายการซอฟต์แวร์ตัวอย่างที่แสดงวิธีที่คุณสามารถใช้ข้อมูลที่รวบรวมเพื่อรับชุดรหัสเฉพาะสำหรับแอปพลิเคชันของคุณ ตัวอย่างนี้ถูกตั้งค่าให้เลียนแบบหนึ่งในเต้าเสียบระยะไกล Etekcity ของฉัน คำสั่งหนึ่งเปิดไฟ LED ในตัวนาโน (D13) และคำสั่งอื่นจะปิดไฟ LED หากคุณไม่มี LED ในตัว Arduino ให้เพิ่มตัวต้านทานและ LED ตามที่แสดงในแผนภาพ ในการใช้งานจริง ฟังก์ชันนี้จะเปิด/ปิดไฟสำหรับเต้ารับไฟฟ้า (โดยใช้รีเลย์หรือไตรแอค) เวลาซิงค์ เวลาบิต และไบต์ข้อมูลที่คาดไว้ทั้งหมดถูกกำหนดไว้ล่วงหน้าเพื่อความสะดวกในการแก้ไข คุณสามารถใช้สายข้อมูลที่เหลือเพื่อเปิด/ปิดสิ่งต่าง ๆ ฯลฯ สำหรับแอปพลิเคชันเฉพาะของคุณ เพียงเพิ่มรหัสคำสั่งที่เกี่ยวข้องที่กำหนดและแทนที่ตรรกะการเปิด/ปิด LED ใน "ลูป" เพื่อให้เหมาะกับความต้องการของคุณ

แนะนำ: