- Kennismaken met de nRF24L01 RF-module
- Koppeling nRF24L01 met Arduino
- Ontvangerzijde: Arduino Uno nRF24L01 module-aansluitingen
- Zenderzijde: Arduino Nano nRF24L01 module Verbindingen
- Werken met nRF24L01 + draadloze zendontvangermodule
- Programmering nRF24L01 voor Arduino
- Servomotor besturen met nRF24L01 draadloos
Terwijl Internet of Things (IoT), Industry 4.0, Machine to Machine-communicatie, enz. Steeds populairder worden, is de behoefte aan draadloze communicatie steeds belangrijker geworden, met meer machines / apparaten die met elkaar in de cloud kunnen spreken. Ontwerpers gebruiken veel draadloze communicatiesystemen zoals Bluetooth Low Energy (BLE 4.0), Zigbee, ESP43 Wi-Fi-modules, 433 MHz RF-modules, Lora, nRF enz., En de keuze van het medium hangt af van het type toepassing waarin het wordt gebruikt.
Een populair draadloos medium voor lokale netwerkcommunicatie is onder meer de nRF24L01. Deze modules werken op 2,4 GHz (ISM-band) met een baudrate van 250 Kbps tot 2 Mbps, wat in veel landen legaal is en kan worden gebruikt in industriële en medische toepassingen. Er wordt ook beweerd dat deze modules met de juiste antennes kunnen zenden en ontvangen tot een afstand van 100 meter tussen hen in. Interessant toch !!? Dus in deze tutorial zullen we meer leren over deze nRF24l01-modules en hoe deze te koppelen aan een microcontrollerplatform zoals Arduino. We zullen ook enkele oplossingen delen voor de meest voorkomende problemen tijdens het gebruik van deze module.
Kennismaken met de nRF24L01 RF-module
De nRF24L01-modules zijn transceivermodules, wat betekent dat elke module zowel gegevens kan verzenden als ontvangen, maar omdat ze half-duplex zijn, kunnen ze gegevens tegelijk verzenden of ontvangen. De module heeft de generieke nRF24L01 IC van Noordse halfgeleiders die verantwoordelijk is voor de verzending en ontvangst van gegevens. De IC communiceert met behulp van het SPI-protocol en kan daarom gemakkelijk worden gekoppeld aan microcontrollers. Het wordt een stuk eenvoudiger met Arduino, omdat de bibliotheken direct beschikbaar zijn. De pinouts van een standaard nRF24L01-module worden hieronder weergegeven
De module heeft een bedrijfsspanning van 1,9 V tot 3,6 V (typisch 3,3 V) en verbruikt heel weinig stroom van slechts 12 mA tijdens normaal gebruik, waardoor hij batterij-efficiënt is en dus zelfs op knoopcellen kan werken. Hoewel de bedrijfsspanning 3,3V is, zijn de meeste pinnen 5V-tolerant en kunnen ze daarom rechtstreeks worden gekoppeld aan 5V-microcontrollers zoals Arduino. Een ander voordeel van het gebruik van deze modules is dat elke module 6 Pipelines heeft. Dit betekent dat elke module kan communiceren met 6 andere modules om gegevens te verzenden of te ontvangen. Dit maakt de module geschikt voor het creëren van ster- of mesh-netwerken in IoT-toepassingen. Ze hebben ook een breed adresbereik van 125 unieke ID's, dus in een afgesloten gebied kunnen we 125 van deze modules gebruiken zonder elkaar te storen.
Koppeling nRF24L01 met Arduino
In deze tutorial zullen we leren hoe we de nRF24L01 met Arduino kunnen verbinden door de servomotor die op de ene Arduino is aangesloten te besturen door de potentiometer op de andere Arduino te variëren. Voor de eenvoud hebben we één nRF24L01-module als zender gebruikt en de andere als ontvanger, maar elke module kan worden geprogrammeerd om afzonderlijk gegevens te verzenden en te ontvangen.
Het schakelschema om de nRF24L01-module met Arduino te verbinden, wordt hieronder weergegeven. Voor variatie heb ik de UNO gebruikt voor de ontvangerzijde en Nano voor de zenderzijde. Maar de logica voor verbinding blijft hetzelfde voor andere Arduino-boards zoals mini, mega.
Ontvangerzijde: Arduino Uno nRF24L01 module-aansluitingen
Zoals eerder gezegd communiceert de nRF24L01 met behulp van het SPI-protocol. Op Arduino Nano en UNO worden de pinnen 11, 12 en 13 gebruikt voor SPI-communicatie. Daarom verbinden we de MOSI-, MISO- en SCK-pinnen van nRF met respectievelijk de pinnen 11, 12 en 13. De pinnen CE en CS kunnen door de gebruiker worden geconfigureerd, ik heb hier pin 7 en 8 gebruikt, maar je kunt elke pin gebruiken door het programma te wijzigen. De nRF-module wordt gevoed door de 3.3V-pin op Arduino, die in de meeste gevallen zal werken. Als dit niet het geval is, kan een aparte voeding worden geprobeerd. Afgezien van de interface met de nRF heb ik ook een servomotor op pin 7 aangesloten en deze via de 5V-pin op Arduino gevoed. Evenzo wordt het zendercircuit hieronder getoond.
Zenderzijde: Arduino Nano nRF24L01 module Verbindingen
De aansluitingen voor de zender zijn ook hetzelfde, daarnaast heb ik een potmeter gebruikt die over de 5V ad Ground pin van Arduino is aangesloten. De analoge uitgangsspanning die varieert van 0-5V is verbonden met de A7-pin van de Nano. Beide kaarten worden gevoed via de USB-poort.
Werken met nRF24L01 + draadloze zendontvangermodule
Om ervoor te zorgen dat onze nRF24L01 ruisvrij werkt, willen we misschien de volgende dingen overwegen. Ik heb lang aan deze nRF24L01 + gewerkt en heb de volgende punten geleerd die je kunnen helpen om tegen een muur te worden geslagen. U kunt deze proberen als de modules niet op de normale manier werkten.
1. De meeste nRF24L01 + -modules op de markt zijn nep. De goedkope die we kunnen vinden op Ebay en Amazon zijn de ergste (maak je geen zorgen, met enkele aanpassingen kunnen we ze laten werken)
2. Het grootste probleem is de stroomvoorziening, niet uw code. De meeste codes online zullen naar behoren werken, ik heb zelf een werkende code die ik persoonlijk heb getest, laat me weten of je ze nodig hebt.
3. Let op want de modules die geprint zijn als NRF24L01 + zijn eigenlijk Si24Ri (ja een Chinees product).
4. De kloon- en nepmodules zullen meer stroom verbruiken, dus ontwikkel uw stroomcircuit niet op basis van de nRF24L01 + datasheet, omdat Si24Ri een hoog stroomverbruik zal hebben van ongeveer 250mA.
5. Pas op voor spanningsrimpelingen en stroompieken, deze modules zijn erg gevoelig en kunnen gemakkelijk verbranden. (;-(tot nu toe 2 modules gefrituurd)
6. Het toevoegen van een paar condensatoren (10uF en 0.1uF) over Vcc en Gnd van de module helpt om uw toevoer zuiver te maken en dit werkt voor de meeste modules.
Als je nog steeds problemen hebt, meld je dan in het commentaargedeelte of lees dit door, of stel je vragen op ons forum.
Bekijk ook ons vorige project over het maken van een chatroom met nRF24L01.
Programmering nRF24L01 voor Arduino
Het was heel gemakkelijk om deze modules met Arduino te gebruiken, dankzij de direct beschikbare bibliotheek die door maniacbug op GitHub is gemaakt. Klik op de link om de bibliotheek als ZIP-map te downloaden en voeg deze toe aan uw Arduino IDE met de optie Sketch -> Inclusief bibliotheek -> Add.ZIP-bibliotheek . Na het toevoegen van de bibliotheek kunnen we beginnen met programmeren voor het project. We moeten twee programma's schrijven, de ene is voor de zenderzijde en de andere voor de ontvangerzijde. Zoals ik echter eerder vertelde, kan elke module zowel als zender als ontvanger werken. Beide programma's staan aan het einde van deze pagina, in de zendercode wordt de ontvangeroptie becommentarieerd en in het ontvangerprogramma wordt de zendercode becommentarieerd. U kunt het gebruiken als u een project probeert waarin de module als beide moet werken. De werking van het programma wordt hieronder uitgelegd.
Zoals alle programma's beginnen we met het opnemen van de header-bestanden. Omdat de nRF het SPI-protocol gebruikt, hebben we de SPI-header toegevoegd en ook de bibliotheek die we zojuist hebben gedownload. De servobibliotheek wordt gebruikt om de servomotor aan te sturen.
# omvatten
De volgende regel is de belangrijke regel waarin we de bibliotheek instrueren over de CE- en CS-pinnen. In ons schakelschema hebben we CE aangesloten op pin 7 en CS op pin 8, dus stellen we de lijn in als
RF24 myRadio (7, 8);
Alle variabelen die aan de RF-bibliotheek zijn gekoppeld, moeten worden gedeclareerd als een samengestelde variabelenstructuur. In dit programma wordt de variabele msg gebruikt om gegevens van de RF-module te verzenden en te ontvangen.
struct pakket { int msg; }; typedef struct pakket Pakket; Pakketgegevens;
Elke RF-module heeft een uniek adres waarmee het gegevens naar het betreffende apparaat kan verzenden. Omdat we hier maar één paar hebben, stellen we het adres in op nul in zowel de zender als de ontvanger, maar als je meerdere modules hebt, kun je de ID instellen op een unieke 6-cijferige reeks.
byte-adressen = {"0"};
Vervolgens initialiseren we in de leegte-instelfunctie de RF-module en gaan we aan de slag met 115-band die vrij is van ruis en stellen we de module ook in om te werken in de modus voor minimaal stroomverbruik met een minimale snelheid van 250 Kbps.
ongeldige setup () { Serial.begin (9600); myRadio.begin (); myRadio.setChannel (115); // 115 band boven WIFI-signalen myRadio.setPALevel (RF24_PA_MIN); // MIN vermogen lage woede myRadio.setDataRate (RF24_250KBPS); // Minimumsnelheid myservo.attach (6); Serial.print ("Setup geïnitialiseerd"); vertraging (500); }
void WriteData () functie schrijft de gegevens die eraan zijn doorgegeven. Zoals eerder verteld heeft de nRF 6 verschillende leidingen waar we data naar kunnen lezen of schrijven, hier hebben we 0xF0F0F0F066 als adres gebruikt om data te schrijven. Aan de ontvangerzijde moeten we hetzelfde adres gebruiken op de ReadData () -functie om de gegevens te ontvangen die zijn geschreven.
void WriteData () { myRadio.stopListening (); // Stop met ontvangen en start met het verzenden van myRadio.openWritingPipe (0xF0F0F0F066); // Verzendt gegevens op dit 40-bits adres myRadio.write (& data, sizeof (data)); vertraging (300); }
void WriteData () functie leest de gegevens en plaatst deze in een variabele. Opnieuw uit 6 verschillende leidingen waarmee we hier gegevens kunnen lezen of schrijven, hebben we 0xF0F0F0F0AA als adres gebruikt om gegevens te lezen. Dit betekent dat de zender van de andere module iets op dit adres heeft geschreven en daarom lezen we het vanaf hetzelfde adres.
leegte ReadData () { myRadio.openReadingPipe (1, 0xF0F0F0F0AA); // Welke pijp te lezen, 40 bit adres myRadio.startListening (); // Stop met verzenden en start Reveicing if (myRadio.available ()) { while (myRadio.available ()) { myRadio.read (& data, sizeof (data)); } Serial.println (data.text); } }
Afgezien van deze regels worden de andere regels in het programma gebruikt om de POT te lezen en om te zetten naar 0 tot 180 met behulp van de kaartfunctie en deze naar de ontvangermodule te sturen waar we de servo dienovereenkomstig besturen. Ik heb ze niet regel voor regel uitgelegd, omdat we dat al hebben geleerd in onze Servo Interfacing-tutorial.
Servomotor besturen met nRF24L01 draadloos
Zodra u klaar bent met het programma, uploadt u de zender- en ontvangercode (hieronder weergegeven) op de respectieve Arduino-kaarten en schakelt u ze in via de USB-poort. U kunt ook de seriële monitor van beide kaarten starten om te controleren welke waarde wordt verzonden en wat wordt ontvangen. Als alles werkt zoals verwacht wanneer u aan de POT-knop aan de zenderzijde draait, moet de servo aan de andere kant ook overeenkomstig draaien.
De volledige werking van het project wordt gedemonstreerd in de onderstaande video. Het is heel normaal dat deze modules bij de eerste poging niet werken. Als u een probleem hebt ondervonden, controleer dan de code en bedrading opnieuw en probeer de bovenstaande richtlijnen voor probleemoplossing. Als niets werkt, plaats uw probleem dan op de forums of in de commentaarsectie en ik zal proberen ze op te lossen.