[Programmation] Configuration du module Nrf24l01+
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Configuration du module Nrf24l01+



  1. #1
    webscience

    Configuration du module Nrf24l01+


    ------

    Bonjour à tous et à toutes,

    ...---..., ...---..., ...---..., ...---...

    Voila mon problème, j'ai acheté 2 modules NRF24L01+, j'ai 2 microcontrôleur PIC16F883, je veux les programmer en ASM, qui est mon langage
    habituel.

    je sais ou connecter les broches du module sur mon microcontrôleur, avec l'alimentation prévu à cette effet.

    Le problème qui me bloque, c'est que la documentation est toute en anglais, et même traduit par Google, ça reste incompréhensible pour moi.

    Quelqu'un peut il m'aider, pour configurer se module, en m'expliquant le départ, pour la parti émetteur, et récepteur, à moins qu'une documentation française soit disponible, mais ça m'étonnerait, car j'ai fouillé partout, et j'ai rien trouvé.

    Je remercie toutes personne qui voudras consacrer du temps pour m'aider.

    Ou j'ai acheté le module : http://www.ebay.fr/itm/2Pcs-Wireless...EAAOSwZQxW3pJs

    -----

  2. #2
    invitee351bd95

    Re : Configuration du module Nrf24l01+

    Lire un MINIMUM d'anglais est essentiel dans le monde de l’électronique, les documentations en français sont TRES rares.

    N’étant pas très bon en anglais (impossible de tenir une discutions), je n'ai pas de problème a lire une doc. Insiste et tu va y arriver.

    Utilise google traduction seulement pour les mots que tu ne comprend pas. Lui balancer la doc en entier ne sert a rien, il traduira importe quoi.

  3. #3
    webscience

    Re : Configuration du module Nrf24l01+

    Bonjour à tous et à toutes,

    J'aurais pas trouvé tous seul, si je fais appelle au forum, c'est que je n'arriva pas à comprendre, donc, de l'aide me serait le bienvenue.

    Le monde ne sait pas fait tous seul.

    Utiliser Google traduction, j'ai déjà fait, mots par mots, ou paragraphe, par paragraphe, j'en comprends pas plus, c'est sur, utiliser les bibliothèques toutes faites, c'est facile, mais la, c'est de l'assembleur.


    Je te remercie pour ta participation

    A+

  4. #4
    antek

    Re : Configuration du module Nrf24l01+

    Citation Envoyé par webscience Voir le message
    On peut t'aider à comprendre une documentation technique, mais je n'en vois pas.

  5. A voir en vidéo sur Futura
  6. #5
    webscience

    Re : Configuration du module Nrf24l01+

    Bonjour

    Voici la documentation technique, je voulais la mettre, mais comme j'ai pas l'habitude, je savais pas comment faire, maintenant je sais.

    Merci à toi.
    Images attachées Images attachées

  7. #6
    antek

    Re : Configuration du module Nrf24l01+

    En attendant la validation, pour gagner du temps même si on n'est pas pressé, qu'est-ce que tu ne comprends pas plus précisemment ?

  8. #7
    sylvainmahe

    Re : Configuration du module Nrf24l01+

    Je peux éventuellement t'aider, même si je n'y connais pratiquement rien en asm et encore moins en pic, mais si ta question porte plus sur la "configuration" ça peut le faire.

    J'utilise des nrf24l01p en programmation pure C sans bibliothèque (même standard).

    Le nrf24l01p on peut l'utiliser avec les interruptions ou sans, pour ma part je préfère sans et avoir juste 4 fils de spi (ss mosi miso sclk).


    Une fois ça branché (ss sur ss, mosi sur mosi, etc...), et l'alimentation (attention ce composant fonctionne en 3.3v) je règle la puissance d'émission (mini ou au max) et le débit de données:
    Code:
    if (POWER == false)
    {
    	Core::writeSpi (0x06 | 0x20, 0b00100000, 8);
    }
    else
    {
    	Core::writeSpi (0x06 | 0x20, 0b00100110, 8);
    }
    Écrire 00100000 dans le registre 0x06 signifie -18dbm et 250kbps, écrire 00100110 signifie 0dbm et 250kbps, il y a plusieurs paliers possibles, voir datasheet page 24 et 25. Il est recommandé d'émettre à la vitesse la plus basse (250kbps) pour garantir un taux d'erreur le plus faible à la réception et une portée la plus grande. Pour écrire dans un registre du nrf24l01p, il faut utiliser l'adresse du registre et le masque 0x20, sauf dans des cas bien précis, voir datasheet page 47.


    Ensuite je défini la taille (en octet) de l'adresse (unique) qui servira à sécuriser la communication entre 2 (ou+) nrf24l01p:
    Code:
    Core::writeSpi (0x03 | 0x20, 0b00000010, 8);
    Écrire 00000010 dans le registre 0x03 signifie adresse de 4 octets (ou 4 bytes en anglais), voir datasheet page 55.


    Après quoi, je défini la taille toujours en octet du "tunnel de données numéro zéro" (data pipe 0), c'est le nombre d'octet utiles qui vont êtres transmis entre 2 nrf24l01p:
    Code:
    Core::writeSpi (0x11 | 0x20, 0b00000101, 8);
    Écrire 00000101 dans le registre 0x11 signifie 5 octets (le code binaire de 5 en décimal est 101), j'ai souhaité dans ma programmation transmettre 32 bits de données + 8 bits d'adresse (5 octets), voir datasheet page 57.
    Cette adresse la n'a rien à voir avec l'adresse cité plus haut (adresse unique, qui ressemble plus à une clé wifi réseau pour les nrf24l01p), ici, c'est une adresse perso qui me permettra de faire communiquer jusqu'à 256 variables sur le "réseau".


    Ensuite je défini l'adresse unique (celle qui par analogie est une clé réseau) pour que les nrf24l01p communiquent de façon sécurisée (plus haut on a configuré uniquement la taille de cette adresse):
    Code:
    Core::writeSpi (0x0a | 0x20, ID, 32);
    ID est une constante 32 bits non-signés que l'utilisateur choisi dans mon programme, tu peux écrire par exemple 820014503 dans le registre 0x0a que ce soit sur le montage émetteur que récepteur, c'est la valeur de la "clé réseau" sur le "tunnel de données numéro zéro" (data pipe 0), voir datasheet page 39 et 56.


    Comme pour le "data pipe 0", il faut faire de même pour l'adresse de transmission (qui doit être identique à l'adresse du "data pipe 0"):
    Code:
    Core::writeSpi (0x10 | 0x20, ID, 32);
    ID est toujours la constante 32 bits non-signés que l'utilisateur choisi dans mon programme, il faut l'écrire dans ce registre 0x10 au moins sur le montage émetteur (je ne fait pas de distinction dans mes projets entre émetteur ou récepteur puisque le nrf24l01p est tranceiver).
    Voir datasheet page 39 pour plus d'infos sur ce registre ("On the PTX the TX_ADDR must be the same as the RX_ADDR_P0").


    Après ça "j'active" (enable en anglais) le "tunnel de données numéro zéro" (data pipe 0):
    Code:
    Core::writeSpi (0x02 | 0x20, 0b00000001, 8);
    Écrire 00000001 dans le registre 0x02 active uniquement le 0, par défaut le 0 et le 1 sont activés, voir datasheet page 54.


    Pour finir, démarrage du merdier:
    Code:
    Core::writeSpi (0x00 | 0x20, 0b01111011, 8);
    Écrire 01111011 dans le registre 0x00 signifie: je "désactive" (disable en anglais) les interruptions, je laisse "activé" le code de correction d'erreurs (CRC), je "démarre" le circuit puissance du nrf24l01p (power up ou start en anglais), et je le défini en récepteur quand il sort de sa veille (car le nrf24l01p passe le plus clair de son temps en mode veille).
    Voir datasheet page 20 à 23 et 55 pour plus d'infos.


    C'est tout pour la configuration, voir (si ca peut t'aider) ma fonction en C++:
    Code:
    void Nrf24L01P::start (const unsigned char PIN_SS, const unsigned long ID, const bool POWER)
    {
    	_registerPin = Core::pinToRegisterPin (PIN_SS);
    	_bytePort = Core::pinToBytePort (PIN_SS);
    	
    	*Core::pinToRegisterDdr (PIN_SS) |= _bytePort;
    	*Core::pinToRegisterPort (PIN_SS) |= _bytePort;
    	
    	Core::startSpi (0);
    	
    	*_registerPin = _bytePort;
    	
    	if (POWER == false)
    	{
    		Core::writeSpi (0x06 | 0x20, 0b00100000, 8);
    	}
    	else
    	{
    		Core::writeSpi (0x06 | 0x20, 0b00100110, 8);
    	}
    	
    	*_registerPin = _bytePort;
    	
    	*_registerPin = _bytePort;
    	Core::writeSpi (0x03 | 0x20, 0b00000010, 8);
    	*_registerPin = _bytePort;
    	
    	*_registerPin = _bytePort;
    	Core::writeSpi (0x11 | 0x20, 0b00000101, 8);
    	*_registerPin = _bytePort;
    	
    	*_registerPin = _bytePort;
    	Core::writeSpi (0x0a | 0x20, ID, 32);
    	*_registerPin = _bytePort;
    	
    	*_registerPin = _bytePort;
    	Core::writeSpi (0x10 | 0x20, ID, 32);
    	*_registerPin = _bytePort;
    	
    	*_registerPin = _bytePort;
    	Core::writeSpi (0x02 | 0x20, 0b00000001, 8);
    	*_registerPin = _bytePort;
    	
    	*_registerPin = _bytePort;
    	Core::writeSpi (0x00 | 0x20, 0b01111011, 8);
    	*_registerPin = _bytePort;
    	
    	Core::prescalerTimer (0, 64);
    	Core::startInterruptTimer (0, 2);
    	Core::startGlobalInterrupt();
    }
    Datasheet: https://www.sparkfun.com/datasheets/...ation_v1_0.pdf
    Dernière modification par sylvainmahe ; 10/07/2016 à 13h41.

  9. #8
    webscience

    Re : Configuration du module Nrf24l01+

    Salut

    Merci de consacré du temps pour moi,

    Comment configurer le module pour la parti émetteur

    si je veux émettre une donnée

    1) vitesse de transmission, d'après ce que j'ai pu comprendre qui est de 2Mbps, 1Mbps, 250kbps

    2) sélection de la fréquence de transmission, qui commence à 2.400GHz et qui fini à 2.525GHz (126 canaux)

    3) adresse(pipe) comment sont elles définies, au hasard ?

    4) comment envoyer la donnée

    A+

  10. #9
    webscience

    Re : Configuration du module Nrf24l01+

    Bonjour sylvainmahe

    Merci pour la source en C, et le temps que tu as passé, mais j'ai téléchargé plein de source, que je sois en langage Arduino, C, basic, mais c'est toujours pareille, il se serve des bibliothèques, ça aide pas à comprendre utiliser du tous fait.


    A+

  11. #10
    sylvainmahe

    Re : Configuration du module Nrf24l01+

    Ok pas de soucis, moi j'ai décidé que les nrf24l01p passent leur temps en veille c'est à dire en mode standbye 2 (voir datasheet) en attendant de se réveiller et d'arriver en mode réception, ça va être peut être long à expliquer tout ça vue que j'ai passé déjà un certain temps à expliquer comment configurer ce composant.

    Peut être tu peux essayer dans un premier temps de comprendre ma classe C++, et si y a des trucs que tu ne comprend pas tu demandes:

    Nrf24L01P.h
     Cliquez pour afficher


    Nrf24L01P.cpp:
     Cliquez pour afficher

  12. #11
    sylvainmahe

    Re : Configuration du module Nrf24l01+

    Désolé nos messages se sont croisés

    C'est clair que ceux qui croient que la programmation c'est l'utilisation de libs, n'ont à mon avis pas compris grand chose et surtout n'ont pas la passion de l'électronique. Moi je ne suis qu'un simple amateur, mais j'ai décidé de commencer l'électronique en passant du temps (maintenant 2 ans) à créer ma propre bibliothèque et mes propres cartes (sauf quand il s'agit de composants cms) pour dans un premier temps ME faciliter la programmation et la conceptions de projets, et surtout comprendre comment ça fonctionne et essayer de transmettre ça à ceux qu'il veulent eux aussi démarrer.

    Je suis d'accord avec toi que tout ce qu'on voit massivement sur internet c'est de l'arduino et tout un fatras de code et de libs dont presque personne ne sait réellement comment programmer sans et comment ça fonctionne...


    Si tu veux Core.h et Core.cpp pour comprendre d'ou je sort ma fonction par exemple Core::writeSpi, c'est ici: http://sylvainmahe.xyz/data/module.zip

    Dans le répertoire /cpp/module/
    Dernière modification par sylvainmahe ; 10/07/2016 à 14h08.

  13. #12
    sylvainmahe

    Re : Configuration du module Nrf24l01+

    Normalement mes fonctions ne devraient pas être trop merdiques à comprendre (contrairement à toute la programmation qu'on voit sur le net pour reprendre mon coup de gueule), car je m'interdit qu'une fonction en appelle une autre dans le même fichier, et je m'interdit qu'elle en appelle plus d'une en cascade (quand je programme je suis une nomenclature bien précise).

    Donc si tu cherches comment fonctionne Core::writeSpi (pour reprendre l'exemple), une fois que tu arrives dans Core.cpp tu es arrivé au bout ! C'est pas plus compliqué que ça, et cette fameuse fonction writeSpi n'appellera jamais rien d'autre dans ce fichier Core.cpp.

    Comme je l'ai spécifié je m'interdit d'utiliser quoi que ce soit d'autre, même pas de bibliothèque standard pourtant communément admise en programmation C, donc y a pas à chercher dans tous les sens, tout est la.

    Le seul truc que j’inclus dans ce fichier Core.h, c'est Define.h, c'est les définitions que j'ai écrit pour l'atmega328p (l'uc que j'utilise):
     Cliquez pour afficher

    Mais la on s'éloigne un peu du sujet

  14. #13
    webscience

    Re : Configuration du module Nrf24l01+

    sylvainmahe,

    Tu penses exactement comme moi, je suis moi même un simple amateur, et j'aime pas les bibliothèques, ça aide sur le moment, après c'est la catastrophe.

    J'ai pas dit que les bibliothèques était mal, mais il faut les comprendre, sinon on va droit dans le mur.

    Et oui, maintenant, on voie beaucoup Arduino, c'est pas cher, mais t'apprends rien, tu charges la bibliothèques de ton voisin, et tu fais sans rien comprendre.

    Je suis heureux, de rentrée, quelqu'un qui a un esprit de compréhension, et de conception, je vais commencer par étudier ce que tu m'as donnée,

    C'est pas grave, même si on s'éloigne un peu du sujet, ça peut être que bénéfique.

    Je te tiens au courant et reste en contact avec toi .

    A+
    Dernière modification par webscience ; 10/07/2016 à 15h28.

  15. #14
    webscience

    Re : Configuration du module Nrf24l01+

    sylvainmahe,

    Tu penses exactement comme moi, je suis moi même un simple amateur, et j'aime pas les bibliothèques, ça aide sur le moment, après c'est la
    catastrophe.

    J'ai pas dit que les bibliothèques était mal, mais il faut les comprendre, sinon on va droit dans le mur.

    Et oui, maintenant, on voie beaucoup Arduino, c'est pas cher, mais t'apprends rien, tu charges la bibliothèques de ton voisin, et tu fais sans rien comprendre.

    Je suis heureux, de rentrée, quelqu'un qui a un esprit de compréhension, et de conception, je vais commencer par étudier ce que tu m'as donnée,

    je te tiens au courant et reste en contact avec toi .

    A+

  16. #15
    sylvainmahe

    Re : Configuration du module Nrf24l01+

    Pas de problème

    Je sait que ça ne va pas forcément être d'une grande facilité à transformer en asm, moi même j'aurais beaucoup de difficulté voir j'y arriverais pas étant donné que c'est du C objet, mais j'espère que tu va y arriver.

    Le truc qu'il faut c'est déjà remplacer par tes fonctions spi asm, et essayer d'écrire un truc dans un registre du nrf24l01p, et de lire ce que tu as écris, si c'est différent, alors y a un soucis.

    A oui y a un truc super important que j'ai oublié de spécifier sinon le nrf24l01p ne va pas fonctionner, la pin CE (je dis bien CE et non pas CS), du module, il faut la mettre à l'état haut tout le temps. Donc mettre un tirage vers le haut sur cette pin est une bonne idée. J'aurais à refaire le pcb c'est ce que je ferais.

    Ensuite mise à part ça, ma pin SS du spi c'est moi qui la défini, de sorte que je décide de brancher des périphériques en cascade ou pas (avec plusieurs SS différents ou pas). Mon spi est toujours configuré en MASTER, je reçois les données sur le miso en écrivant une trame de 11111111 sur le mosi après avoir "sélectionné" le registre voulu (un peu à l'image de l'i2c).


    Une particularité de la fonction transmit de ma classe Nrf24L01P, j’attends 1ms avant de mettre le nrf24l01p en émetteur SI aucune donnée n'est présente dans le fifo en réception. Ça permet de laisser le nrf24l01p un petit peu en réception si on fait que des transmissions comme un bourrin genre:
    Code:
    while (true)
    {
    	myVariable.transmit (blabla);
    }
    C'est indispensable en tranceiver, ton montage 1 est un tx/rx de même que ton montage 2, et encore plus indispensable quand le code source des 2 montages est parfaitement symétrique (ou quasiment) et que les 2 uc et les 2 nrf24l01p démarrent en même temps

    Voir un exemple de ce que j'ai testé:
    Code source du Montage 1:
    Code:
    #include "../module/GpioWrite.h"
    #include "../module/Max7219.h"
    #include "../module/Nrf24L01P.h"
    
    int main()
    {
    	GpioWrite ce = GpioWrite (3);
    	ce.on();
    	Max7219 display = Max7219 (1, 1);
    	unsigned long n = 0;
    	Nrf24L01P variable1 = Nrf24L01P (2);
    	Nrf24L01P variable2 = Nrf24L01P (1);
    	Nrf24L01P::start (2, 86400312, false);
    	
    	while (true)
    	{
    		variable1.send (n);
    		variable2.receive();
    		
    		display.integer (variable2.value, 1, 8, true);
    		
    		n++;
    	}
    	
    	return 0;
    }
    Code source du Montage 2:
    Code:
    #include "../module/GpioWrite.h"
    #include "../module/Max7219.h"
    #include "../module/Nrf24L01P.h"
    
    int main()
    {
    	GpioWrite ce = GpioWrite (3);
    	ce.on();
    	Max7219 display = Max7219 (1, 1);
    	unsigned long n = 0;
    	Nrf24L01P variable1 = Nrf24L01P (1);
    	Nrf24L01P variable2 = Nrf24L01P (2);
    	Nrf24L01P::start (2, 86400312, false);
    	
    	while (true)
    	{
    		variable1.send (n);
    		variable2.receive();
    		
    		display.integer (variable2.value, 1, 8, true);
    		
    		n++;
    	}
    	
    	return 0;
    }
    Ici c'est 2 montages sont tellement identiques que les 2 nrf24l01p se mettaient en tx exactement en même temps, du coup les données avaient du mal à circuler t'imagines bien. Avec 1ms d'attente (temps pas pris au hazard, c'est par rapport à l'Auto Retransmit Delay page 55 du datasheet), plus de soucis.

    Pour plus d'infos j'ai également posté ici pour aider bordeaux270993: http://forums.futura-sciences.com/el...frequence.html
    Dernière modification par sylvainmahe ; 10/07/2016 à 16h05.

  17. #16
    invitef2c81946

    Re : Configuration du module Nrf24l01+

    Bonjour sylvainmahe,

    Peux tu renvoyer ton code pour le SPI write et read stp? le lien ne fonctionne plus.

  18. #17
    gienas
    Modérateur

    Re : Configuration du module Nrf24l01+

    Bonsoir à tous

    Citation Envoyé par Electrotin Voir le message
    ... le lien ne fonctionne plus.
    C'est une des nombreuses raisons pour lesquelles nous demandons que les documents joints soient sur le serveur ... et pas ... ailleurs.

  19. #18
    invitef86a6203

    Re : Configuration du module Nrf24l01+

    Une application toute faite;
    https://github.com/ezequieldonhauser/NRF24L01P

    Il ne parle pas Français ...
    https://www.youtube.com/watch?v=Pj-enHa2wvU

Discussions similaires

  1. Probleme de configuration du module UART1 de ma carte maxi web
    Par invite00bd1e7d dans le forum Électronique
    Réponses: 6
    Dernier message: 10/10/2015, 18h43
  2. Configuration module bluetooth HCI commands
    Par invite7808af07 dans le forum Électronique
    Réponses: 3
    Dernier message: 29/04/2015, 12h14
  3. Code de réception pour module nrf24l01+
    Par invitea5db0ae5 dans le forum Électronique
    Réponses: 0
    Dernier message: 29/12/2014, 03h54
  4. [PIC24FJ] - Configuration du module ADC
    Par invite3c35244f dans le forum Électronique
    Réponses: 5
    Dernier message: 05/10/2011, 21h40
  5. PIC18F6722 - Configuration (INIBITION Module CCP)
    Par invite3c35244f dans le forum Électronique
    Réponses: 7
    Dernier message: 16/09/2008, 23h42
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...