- ทำความรู้จักกับโมดูล RF nRF24L01
- การเชื่อมต่อ nRF24L01 กับ Arduino
- ด้านตัวรับ: การเชื่อมต่อโมดูล Arduino Uno nRF24L01
- ด้านเครื่องส่งสัญญาณ: การเชื่อมต่อโมดูล Arduino Nano nRF24L01
- การทำงานกับโมดูลตัวรับส่งสัญญาณไร้สาย nRF24L01 +
- การเขียนโปรแกรม nRF24L01 สำหรับ Arduino
- การควบคุมเซอร์โวมอเตอร์โดยใช้ nRF24L01 แบบไร้สาย
ในขณะที่ Internet of Things (IoT), Industry 4.0, Machine to Machine และอื่น ๆ กำลังได้รับความนิยมมากขึ้นเรื่อย ๆ ความต้องการในการสื่อสารแบบไร้สายได้กลายเป็นหน้าที่โดยมีเครื่องจักร / อุปกรณ์ที่จะพูดคุยกันบนคลาวด์มากขึ้น นักออกแบบใช้ระบบสื่อสารไร้สายจำนวนมากเช่น Bluetooth Low Energy (BLE 4.0), Zigbee, โมดูล Wi-Fi ESP43, โมดูล RF 433MHz, Lora, nRF เป็นต้นและการเลือกสื่อขึ้นอยู่กับประเภทของแอปพลิเคชันที่ใช้
ในทุกหนึ่งสื่อไร้สายที่เป็นที่นิยมสำหรับการสื่อสารเครือข่ายท้องถิ่นเป็นnRF24L01โมดูลเหล่านี้ทำงานบน 2.4GHz (วง ISM) โดยมีอัตราการส่งข้อมูลตั้งแต่ 250Kbps ถึง 2Mbps ซึ่งถูกกฎหมายในหลายประเทศและสามารถใช้ในงานอุตสาหกรรมและการแพทย์ นอกจากนี้ยังอ้างว่าด้วยเสาอากาศที่เหมาะสมโมดูลเหล่านี้สามารถส่งและรับได้ในระยะไม่เกิน 100 เมตรระหว่างกัน น่าสนใจใช่ไหม !!? ดังนั้นในการกวดวิชานี้เราจะเรียนรู้เพิ่มเติมเกี่ยวกับเหล่านี้โมดูล nRF24l01 และวิธีการติดต่อกับแพลตฟอร์มไมโครคอนโทรลเลอร์เช่น Arduino นอกจากนี้เราจะแบ่งปันวิธีแก้ปัญหาบางอย่างสำหรับปัญหาที่พบบ่อยขณะใช้โมดูลนี้
ทำความรู้จักกับโมดูล RF nRF24L01
โมดูล nRF24L01มีโมดูลรับส่งสัญญาณความหมายแต่ละโมดูลทั้งสามารถส่งและรับข้อมูล แต่เนื่องจากพวกเขามี half-duplex พวกเขาทั้งสองสามารถส่งหรือรับข้อมูลได้ตลอดเวลา โมดูลนี้มี IC nRF24L01 ทั่วไปจากสารกึ่งตัวนำนอร์ดิกซึ่งมีหน้าที่ในการส่งและรับข้อมูล IC สื่อสารโดยใช้โปรโตคอล SPI และด้วยเหตุนี้จึงสามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์ใด ๆ ได้อย่างง่ายดาย Arduino ง่ายขึ้นมากเนื่องจากมีไลบรารีพร้อมใช้งาน พินเอาต์ของโมดูล nRF24L01 มาตรฐานแสดงไว้ด้านล่าง
โมดูลมีแรงดันไฟฟ้าตั้งแต่1.9V ถึง 3.6V (โดยทั่วไปคือ 3.3V) และใช้กระแสไฟฟ้าน้อยกว่าเพียง12mAในระหว่างการทำงานปกติซึ่งทำให้แบตเตอรี่มีประสิทธิภาพและด้วยเหตุนี้จึงสามารถทำงานบนเซลล์เหรียญได้ แม้ว่าแรงดันไฟฟ้าที่ใช้งานคือ 3.3V หมุดส่วนใหญ่จะทนต่อ 5V ได้และด้วยเหตุนี้จึงสามารถเชื่อมต่อโดยตรงกับไมโครคอนโทรลเลอร์ 5V เช่น Arduino ข้อดีอีกอย่างของการใช้โมดูลเหล่านี้คือแต่ละโมดูลมี 6 Pipelines ความหมายแต่ละโมดูลสามารถสื่อสารกับโมดูลอื่น ๆ อีก 6 โมดูลเพื่อส่งหรือรับข้อมูล สิ่งนี้ทำให้โมดูลเหมาะสำหรับการสร้างเครือข่ายแบบดาวหรือแบบตาข่ายในแอปพลิเคชัน IoT นอกจากนี้ยังมีช่วงที่อยู่ที่กว้างถึง 125 ID ที่ไม่ซ้ำกันดังนั้นในพื้นที่ปิดเราสามารถใช้ 125 โมดูลเหล่านี้ได้โดยไม่รบกวนซึ่งกันและกัน
การเชื่อมต่อ nRF24L01 กับ Arduino
ในบทช่วยสอนนี้เราจะเรียนรู้วิธีการเชื่อมต่อ nRF24L01 กับ Arduinoโดยการควบคุมเซอร์โวมอเตอร์ที่เชื่อมต่อกับ Arduino หนึ่งตัวโดยการเปลี่ยนโพเทนชิออมิเตอร์บน Arduino อื่น ๆ เพื่อความเรียบง่ายเราได้ใช้โมดูล nRF24L01 หนึ่งโมดูลเป็นตัวส่งและอีกตัวคือตัวรับ แต่แต่ละโมดูลสามารถตั้งโปรแกรมให้ส่งและรับข้อมูลทีละโมดูลได้
แผนภาพวงจรเพื่อเชื่อมต่อโมดูล nRF24L01 กับ Arduino แสดงไว้ด้านล่าง สำหรับความหลากหลายฉันใช้UNOสำหรับด้านรับและนาโนสำหรับด้านเครื่องส่งสัญญาณ แต่ตรรกะสำหรับการเชื่อมต่อยังคงเหมือนเดิมสำหรับบอร์ด Arduino อื่น ๆ เช่น mini, mega เช่นกัน
ด้านตัวรับ: การเชื่อมต่อโมดูล Arduino Uno nRF24L01
ที่กล่าวก่อนหน้านี้สื่อสาร nRF24L01 ด้วยความช่วยเหลือของ SPI โปรโตคอล บน Arduino Nano และ UNO พิน 11, 12 และ 13 ใช้สำหรับการสื่อสาร SPI ดังนั้นเราจึงเชื่อมต่อหมุด MOSI, MISO และ SCK จาก nRF ไปยังพิน 11, 12 และ 13 ตามลำดับ หมุด CE และ CS สามารถกำหนดค่าได้โดยผู้ใช้ฉันใช้พิน 7 และ 8 ที่นี่ แต่คุณสามารถใช้พินใดก็ได้โดยการแก้ไขโปรแกรม โมดูล nRF ใช้พลังงานจากพิน 3.3V บน Arduino ซึ่งส่วนใหญ่จะใช้งานได้ หากไม่เป็นเช่นนั้นสามารถลองใช้แหล่งจ่ายไฟแยกต่างหากได้ นอกเหนือจากการเชื่อมต่อ nRF แล้วฉันยังเชื่อมต่อเซอร์โวมอเตอร์เข้ากับพิน 7 และขับเคลื่อนผ่านพิน 5V บน Arduino ในทำนองเดียวกันวงจรเครื่องส่งสัญญาณจะแสดงด้านล่าง
ด้านเครื่องส่งสัญญาณ: การเชื่อมต่อโมดูล Arduino Nano nRF24L01
การเชื่อมต่อสำหรับเครื่องส่งสัญญาณก็เหมือนกันนอกจากนี้ฉันยังใช้โพเทนชิออมิเตอร์ที่เชื่อมต่อผ่านขากราวด์โฆษณา 5V ของ Arduino แรงดันไฟฟ้าอะนาล็อกขาออกซึ่งจะแตกต่างกันไปตั้งแต่ 0-5V เชื่อมต่อกับขา A7 ของนาโน บอร์ดทั้งสองใช้พลังงานผ่านพอร์ต USB
การทำงานกับโมดูลตัวรับส่งสัญญาณไร้สาย nRF24L01 +
อย่างไรก็ตามเพื่อที่จะทำให้ nRF24L01 ของเราทำงานได้โดยปราศจากเสียงรบกวนเราอาจต้องพิจารณาสิ่งต่อไปนี้ ฉันทำงานกับ nRF24L01 + นี้มาเป็นเวลานานและได้เรียนรู้ ประเด็นต่อไปนี้ ซึ่งสามารถช่วยคุณจากการโดนกำแพง คุณสามารถลองสิ่งเหล่านี้ได้เมื่อโมดูลไม่ทำงานตามปกติ
1. โมดูล nRF24L01 + ส่วนใหญ่ในตลาดเป็นของปลอม ราคาถูกที่เราสามารถหาได้ใน Ebay และ Amazon นั้นแย่ที่สุด (ไม่ต้องกังวลด้วยการปรับแต่งเล็กน้อยเราสามารถทำให้มันใช้งานได้)
2. ปัญหาหลักคือแหล่งจ่ายไฟไม่ใช่รหัสของคุณ รหัสออนไลน์ส่วนใหญ่จะทำงานได้อย่างถูกต้องตัวฉันเองมีรหัสที่ใช้งานได้ซึ่งฉันทดสอบเป็นการส่วนตัวโปรดแจ้งให้เราทราบหากคุณต้องการ
3. ให้ความสนใจเนื่องจากโมดูลที่พิมพ์เป็น NRF24L01 + นั้นแท้จริงแล้วคือ Si24Ri (ใช่ผลิตภัณฑ์ของจีน)
4. โมดูลโคลนและของปลอมจะใช้พลังงานมากขึ้นดังนั้นอย่าพัฒนาวงจรไฟฟ้าของคุณตามแผ่นข้อมูล nRF24L01 + เนื่องจาก Si24Ri จะมีการใช้กระแสไฟฟ้าสูงประมาณ 250mA
5. ระวังการกระเพื่อมของแรงดันไฟฟ้าและไฟกระชากโมดูลเหล่านี้มีความอ่อนไหวมากและอาจไหม้ได้ง่าย (;-(ทอดไป 2 โมดูลแล้ว)
6. การเพิ่มตัวเก็บประจุสองตัว (10uF และ 0.1uF) ใน Vcc และ Gnd ของโมดูลจะช่วยในการทำให้แหล่งจ่ายของคุณบริสุทธิ์และใช้ได้กับโมดูลส่วนใหญ่
หากคุณมีปัญหาโปรดรายงานในส่วนความคิดเห็นหรืออ่านสิ่งนี้หรือถามคำถามของคุณในฟอรัมของเรา
ตรวจสอบโปรเจ็กต์ของเราเกี่ยวกับการสร้างห้องแชทโดยใช้ nRF24L01
การเขียนโปรแกรม nRF24L01 สำหรับ Arduino
การใช้โมดูลเหล่านี้กับ Arduino นั้นง่ายมากเนื่องจากมีไลบรารีที่พร้อมใช้งานซึ่งสร้างขึ้นโดย maniacbug บน GitHub คลิกที่ลิงค์เพื่อดาวน์โหลดห้องสมุดเป็นโฟลเดอร์ไปรษณีย์และเพิ่มเข้าไปใน Arduino IDE ของคุณโดยใช้ ร่าง -> รวม Library -> เพิ่มห้องสมุดซิป ตัวเลือก หลังจากเพิ่มไลบรารีแล้วเราสามารถเริ่มการเขียนโปรแกรมสำหรับโครงการได้ เราต้องเขียนโปรแกรมสองโปรแกรมโปรแกรมหนึ่งสำหรับฝั่งเครื่องส่งและอีกโปรแกรมสำหรับฝั่งรับ อย่างไรก็ตามอย่างที่บอกไปก่อนหน้านี้แต่ละโมดูลสามารถทำงานได้ทั้งเป็นตัวส่งและตัวรับ ทั้งสองโปรแกรมมีให้ที่ส่วนท้ายของหน้านี้ในรหัสเครื่องส่งสัญญาณตัวเลือกเครื่องรับจะแสดงความคิดเห็นและในโปรแกรมเครื่องรับรหัสเครื่องส่งจะแสดงความคิดเห็น คุณสามารถใช้ได้หากคุณกำลังลองทำโปรเจ็กต์ที่โมดูลต้องทำงานเป็นทั้งสองอย่าง การทำงานของโปรแกรมอธิบายไว้ด้านล่าง
เช่นโปรแกรมทั้งหมดที่เราเริ่มต้นด้วยการรวมทั้งไฟล์ส่วนหัวเนื่องจาก nRF ใช้โปรโตคอล SPI เราจึงรวมส่วนหัว SPI และไลบรารีที่เราเพิ่งดาวน์โหลด เซอร์โวไลบรารีใช้เพื่อควบคุมเซอร์โวมอเตอร์
# รวม
บรรทัดถัดไปเป็นสายสำคัญที่เราสั่งห้องสมุดเกี่ยวกับ CE และหมุด ในแผนภาพวงจรของเราเราได้เชื่อมต่อ CE กับพิน 7 และ CS ถึงพิน 8 ดังนั้นเราจึงตั้งค่าบรรทัดเป็น
RF24 myRadio (7, 8);
ตัวแปรทั้งหมดที่เชื่อมโยงกับไลบรารี RF ควรถูกประกาศเป็นโครงสร้างตัวแปรคอมโพสิต ในโปรแกรมนี้ตัวแปร msg ใช้ในการส่งและรับข้อมูลจากโมดูล RF
แพ็คเกจโครงสร้าง { int msg; }; แพ็คเกจ typedef struct package; ข้อมูลแพ็คเกจ;
โมดูล RF แต่ละโมดูลมีที่อยู่เฉพาะซึ่งใช้ส่งข้อมูลไปยังอุปกรณ์ที่เกี่ยวข้องได้ เนื่องจากเรามีคู่เพียงคู่เดียวที่นี่เราจึงตั้งค่าที่อยู่เป็นศูนย์ทั้งในเครื่องส่งและเครื่องรับแต่ถ้าคุณมีหลายโมดูลคุณสามารถตั้งค่า ID เป็นสตริง 6 หลักที่ไม่ซ้ำกันได้
ที่อยู่ไบต์ = {"0"};
ถัดไปในฟังก์ชั่น การตั้งค่าโมฆะ เราเริ่มต้นโมดูล RF และตั้งค่าให้ทำงานกับแถบความถี่ 115ซึ่งปราศจากเสียงรบกวนและยังตั้งค่าให้โมดูลทำงานในโหมดการใช้พลังงานขั้นต่ำด้วยความเร็วขั้นต่ำ 250Kbps
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); myRadio.begin (); myRadio.setChannel (115); // 115 แบนด์เหนือสัญญาณ WIFI myRadio.setPALevel (RF24_PA_MIN); // นาทีพลังงานต่ำ rage myRadio.setDataRate (RF24_250KBPS); // ความเร็วต่ำสุด myservo.attach (6); Serial.print ("Setup Initialized"); ล่าช้า (500); }
เป็นโมฆะ WriteData () ฟังก์ชั่นเขียนข้อมูลผ่านไป อย่างที่บอกไปก่อนหน้านี้ nRF มีท่อที่แตกต่างกัน 6 ท่อซึ่งเราสามารถอ่านหรือเขียนข้อมูลได้ที่นี่เราได้ใช้ 0xF0F0F0F066 เป็นที่อยู่ในการเขียนข้อมูล ในฝั่งผู้รับเราต้องใช้ที่อยู่เดียวกันบน ฟังก์ชัน ReadData () เพื่อรับข้อมูลที่เขียน
โมฆะ WriteData () { myRadio.stopListening (); // หยุดการรับและเริ่มการแปลง myRadio.openWritingPipe (0xF0F0F0F066); // ส่งข้อมูลบนที่อยู่ 40 บิต myRadio.write (& data, sizeof (data)); ล่าช้า (300); }
เป็นโมฆะ WriteData () ฟังก์ชั่นอ่านข้อมูลและทำให้มันในตัวแปร อีกครั้งจาก 6 ท่อที่แตกต่างกันซึ่งเราสามารถอ่านหรือเขียนข้อมูลที่นี่เราได้ใช้ 0xF0F0F0F0AA เป็นที่อยู่ในการอ่านข้อมูล ซึ่งหมายความว่าเครื่องส่งสัญญาณของโมดูลอื่นได้เขียนบางอย่างในที่อยู่นี้และด้วยเหตุนี้เราจึงอ่านมันจากสิ่งเดียวกัน
เป็นโมฆะ ReadData () { myRadio.openReadingPipe (1, 0xF0F0F0F0AA); // ท่อไหนอ่าน 40 bit Address myRadio.startListening (); // หยุดการส่งสัญญาณและเริ่มการเปิดเผย if (myRadio.available ()) { while (myRadio.available ()) { myRadio.read (& data, sizeof (data)); } Serial.println (data.text); } }
นอกเหนือจากบรรทัดเหล่านี้แล้วบรรทัดอื่น ๆ ในโปรแกรมยังใช้สำหรับอ่าน POT และแปลงเป็น 0 ถึง 180 โดยใช้ฟังก์ชันแผนที่และส่งไปยังโมดูลตัวรับซึ่งเราควบคุมเซอร์โวตามนั้น ฉันไม่ได้อธิบายทีละบรรทัดเนื่องจากเราได้เรียนรู้สิ่งนั้นในบทช่วยสอนการเชื่อมต่อ Servo ของเราแล้ว
การควบคุมเซอร์โวมอเตอร์โดยใช้ nRF24L01 แบบไร้สาย
เมื่อคุณพร้อมกับโปรแกรมแล้วให้อัปโหลดรหัสตัวส่งและตัวรับสัญญาณ (ระบุด้านล่าง) บนบอร์ด Arduino ตามลำดับและเปิดเครื่องด้วยพอร์ต USB คุณยังสามารถเปิดมอนิเตอร์แบบอนุกรมของทั้งสองบอร์ดเพื่อตรวจสอบว่ากำลังส่งค่าอะไรและกำลังรับอะไรอยู่ หากทุกอย่างทำงานตามที่คาดไว้เมื่อคุณหมุนปุ่ม POT ที่ด้านเครื่องส่งเซอร์โวอีกด้านก็ควรหมุนตามเช่นกัน
การทำงานที่สมบูรณ์แบบของโครงการจะแสดงให้เห็นในวิดีโอด้านล่างเป็นเรื่องปกติที่จะไม่ให้โมดูลเหล่านี้ทำงานในการลองครั้งแรกหากคุณประสบปัญหาใด ๆ ให้ตรวจสอบรหัสและเดินสายอีกครั้งและลองใช้แนวทางแก้ไขปัญหาที่ระบุข้างต้น หากไม่มีอะไรเกิดขึ้นให้โพสต์ปัญหาของคุณในฟอรัมหรือในส่วนความคิดเห็นเราจะพยายามแก้ไข