Communication wireless
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Communication wireless



  1. #1
    memo1402

    Communication wireless


    ------

    Bonjour,

    J'ai deux nrf24l01+ et je voudrais les faire communiquer entre eux. Je suis bloquer à la reception. Je n'arrive pas à récupérer la données envoyée. Je ne sais pas comment stocker les données ni où elles arrivent.

    Merci pour votre aide.

    PS: datasheet nrf24l01+ https://www.sparkfun.com/datasheets/...ation_v1_0.pdf

    -----

  2. #2
    Ridezebigone

    Re : Communication wireless

    Bonjour,

    il nous faut plus d'infos : avec micro controleur l'avez-vous interfacé ?
    comment savez-vous que c'est un pb à la réception et non pas à l'émission ?

    A+

  3. #3
    memo1402

    Re : Communication wireless

    Le µC est pret à l'emploie il me faut juste une fonction pour envoyer et pour recevoir des données. C'est un pic 18f2520 compilateur xc8

  4. #4
    Yoruk

    Re : Communication wireless

    Tu as utilisé un code tout prêt ? Il n'y avait pas d'exemple d'émission fourni avec les librairies ?
    La robotique, c'est fantastique !

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

    Re : Communication wireless

    voici le code main.c
    Code:
    // Les "includes"
    // ==============
    #include <pic18.h>
    #include <stdio.h>
    #include  "prog_principal.h"	// indiquer ici le même nom de fichier .h
    #include  "lcd.h"
    #include  "delay.h"
    
    // Définition des sorties
    // ======================
    #define LEDS 	PORTB   	// L'ensemble des 8 LEDS sur le port B
    
    #define LED1 	RB7		// LED par LED
    #define LED2 	RB6
    #define LED3 	RB5
    #define LED4 	RB4
    #define LED5 	RB3
    #define SPI_IRQ	RB2	 
    #define SPI_CE 	RB0
    #define SPI_CSN RB1 
    
    #define RF_DATA_RATE_250KBPS 
    
    // atenção: Aqui usando próximo canais WIFI 9-11
    #define RF_CHANNEL 0x04
    
    #define RF_PAYLOAD 0x10
    
    #define RADIO_ADDRESS_1 0x18
    #define RADIO_ADDRESS_2 0x00
    #define RADIO_ADDRESS_3 0x29
    #define RADIO_ADDRESS_4 0x35
    #define RADIO_ADDRESS_5 0x01
    
    // Définition des entrées
    // ======================
    #define BP1     RA0
    #define BP2     RA1
    #define BP3     RA2
    #define BP4     RA3  
    
    
    // Le programmme principal
    // =======================
    
    void main ()
    {			
    
    init(); 		//Initialisation
    
    
    while(1)
    	{
    
     
    				
    	}
    			
    
    }
    
    
    
    // INITIALISATION du PIC et de l'écran LCD
    // =======================================
    void init(void)
    {
      ADCON1=0x0f;	     // Pour travailler entièrement en numérique 	
      TRISA=0b11101111; // 
    
      TRISB=0b00000100;  
    
    
      TRISC=0b00010000;// TRISC<3> 1 = slave, 0 = master
     SSPSTAT=0b00000000;//master mode
     SSPCON1=0b00100010; //mastermode
      
    
      lcd_init();
      lcd_clear();
    
    }
    unsigned char SPI_Write(unsigned char data)
    {
      // Activate the SS SPI Select pin
      //PORTAbits.RA5 = 0;
      // Start Data transmission
      SSPBUF = data;
      // Wait for Data Transmit/Receipt complete
      while(!SSPSTATbits.BF);
      // CS pin is not active
      
    
    }
    // configure nRF24L01 for transmit only
    void configure_transmitter(void)
    {
    	int  i, j;
    
        SPI_CE = 0;
        SPI_CSN = 0;
    
    	// PTX, CRC enabled, mask a couple of ints    
     	SPI_Write(0x20);
      	SPI_Write(0x38);
    	SPI_CSN = 1; 
        SPI_CSN = 0;
        
    	//auto retransmit off
     	SPI_Write(0x24);    
       	SPI_Write(0x00);    
        SPI_CSN = 1;
        SPI_CSN = 0;
       
    	//address width = 5
       	SPI_Write(0x23);
     	SPI_Write(0x03);    
        SPI_CSN = 1;
        SPI_CSN = 0;
       
    	//data rate = 
       	SPI_Write(0x26);
    //#if defined ( RF_DATA_RATE_250KBPS ) 
    	SPI_Write(0x27);    		// 0x07 = 1MBPS - 0x27 = 250Kbps
    //#elif defined ( RF_DATA_RATE_1MBPS )
    //	SPI_Write(0x07);    		
    //#endif
        SPI_CSN = 1; 
        SPI_CSN = 0;
        
    	//set channel 
       	SPI_Write(0x25);
     	SPI_Write(RF_CHANNEL);
        SPI_CSN = 1;
        SPI_CSN = 0;
        
    	//set address
       	SPI_Write(0x30);    
    	SPI_Write(RADIO_ADDRESS_1);
    	SPI_Write(RADIO_ADDRESS_2);
    	SPI_Write(RADIO_ADDRESS_3);
    	SPI_Write(RADIO_ADDRESS_4);
    	SPI_Write(RADIO_ADDRESS_5);
    //    for (j = 0; j < 5; j++)
    // 		spi_Send_Read(0xE7); 
    
        SPI_CSN = 1;
        SPI_CSN = 0;
        
        //disable auto-ack, RX mode
        //shouldn't have to do this, but it won't TX if you don't
       	SPI_Write(0x21);
     	SPI_Write(0x00);
        SPI_CSN = 1;
    }//
    void transmit_data( unsigned char TX_Data )
    {
        unsigned char i;  
        SPI_CSN = 0;
        
    	//clear previous ints
      	SPI_Write(0x27);
     	SPI_Write(0x7E);
    	SPI_CSN = 1;
        SPI_CSN = 0;
        
    	//PWR_UP = 1
       	SPI_Write(0x20);
     	SPI_Write(0x3A);
        SPI_CSN = 1;
        SPI_CSN = 0;
        
        //clear TX fifo
        //the data sheet says that this is supposed to come up 0 after POR, but that doesn't seem to be the case
       	SPI_Write(0xE1);
        SPI_CSN = 1;
        SPI_CSN = 0;
        
    	//fill byte payload
       	SPI_Write(0xA0);
    	SPI_Write(TX_Data);
    
    
        SPI_CSN = 1;
        
        //Pulse CE to start transmission
        SPI_CE = 1;
        delay_ms(2);
        SPI_CE = 0;
    }//
    // configure nRF24L01 for receive only
    void configure_RX(void)
    {
        unsigned char i, j;
    
        SPI_CSN = 0;
        SPI_CE = 0;
        
    	//PRX, CRC enabled
    	SPI_Write(0x20);
    	SPI_Write(0x39); 
    	SPI_CSN = 1;   
    	SPI_CSN = 0;
        
    	//disable auto-ack for all channels      
    	SPI_Write(0x21);
    	SPI_Write(0x00);     
    	SPI_CSN = 1;    
    	SPI_CSN = 0;
        
    	//address width = 5 bytes  
      	SPI_Write(0x23);
    	SPI_Write(0x03);    
        SPI_CSN = 1;    
        SPI_CSN = 0;
        
    	//data rate =   
      	SPI_Write(0x26);
    //#if defined ( RF_DATA_RATE_250KBPS ) 
    	SPI_Write(0x27);    		// 0x07 = 1MBPS - 0x27 = 250Kbps
    //#elif defined ( RF_DATA_RATE_1MBPS )
    //	SPI_Write(0x07);    		
    //#else 
    //	#error "Definir RF_DATA_RATE"
    //#endif
    
        SPI_CSN = 1;
      	SPI_CSN = 0;
    
    	//4 byte payload  
     	SPI_Write(0x31);
    	SPI_Write(0x01);    
        SPI_CSN = 1;    
        SPI_CSN = 0;
    
        //set channel 
       	SPI_Write(0x25);
    	SPI_Write(RF_CHANNEL);    
        SPI_CSN = 1;     
        SPI_CSN = 0; 
    
        //set address 
        SPI_Write(0x30);
    	SPI_Write(RADIO_ADDRESS_1);
    	SPI_Write(RADIO_ADDRESS_2);
    	SPI_Write(RADIO_ADDRESS_3);
    	SPI_Write(RADIO_ADDRESS_4);
    	SPI_Write(RADIO_ADDRESS_5);
    
    //    for (j = 0; j < 5; j++)
    // 		spi_Send_Read(0xE7); 
        SPI_CSN = 1;  
        SPI_CSN = 0;
        
    	//PWR_UP = 1   
     	SPI_Write(0x20);
    	SPI_Write(0x3B);   
        SPI_CSN = 1;    
        SPI_CE = 1;     
    }//
    
    unsigned char Test_SPI (void)
    {
    	unsigned char data [] = {RADIO_ADDRESS_1, RADIO_ADDRESS_2, RADIO_ADDRESS_3, RADIO_ADDRESS_4, RADIO_ADDRESS_5};
    	unsigned char data_read = 0;
    	unsigned char status, i;
    
    	//write TX_ADDRESS register
    	SPI_CSN = 0;			//CSN low
    	status = SPI_Write(0x30);
    	SPI_Write(data[0]);
    	SPI_Write(data[1]);
    	SPI_Write(data[2]);
    	SPI_Write(data[3]);
    	SPI_Write(data[4]);
    	SPI_CSN = 1;			//CSN high
    
    	//read TX_ADDRESS register
    	//Check that values are correct using the MPLAB debugger
    	SPI_CSN = 0;			//CSN low
    	status = SPI_Write(0x10);
    	for (i = 0; i < 5; i++)
    	{
    		data_read = SPI_Write(0x00);
    		nop();
    		if (data_read != data[i])  	// se lido não for igual
    			return 1;				// retorna 0 = erro comunicação SPi PIC/nRF24L01
    	}
    
    	SPI_CSN = 1;					// CSN high
    
    	// retorna 0 = sucesso comunicação SPi PIC/nRF24L01
    	return 0;
    
    } //
     
    void read_RX(unsigned char *RX_Data)
    {
        unsigned char i, j;  
    
    	// flush data buffer
    	for (i = 0; i < RF_PAYLOAD; i++)
    		RX_Data[i] = 0;
    
    	// Read RX payload e coloca no buffer RX_Data 
        SPI_CSN = 0;    
       	SPI_Write(0x61);    
        for (j = 0; j < RF_PAYLOAD; j++)
        {        
           	RX_Data[j] = SPI_Write(0);        
        }    
    
        SPI_CSN = 1;    
        
    	//Flush RX FIFO    
        SPI_CSN = 0;    
     	SPI_Write(0xE2);    
        SPI_CSN = 1;
        SPI_CSN = 0;
     
    	//reset int    
      	SPI_Write(0x27);
    	SPI_Write(0x40);    
        SPI_CSN = 1;
    }//
    void Open_nRF24L01_SPI (void)
    {
    	unsigned char result;
    
    	
    	
    	SPI_CE = 1;
    	SPI_CSN = 1;
    
    	
    	
    	delay_ms(3);
    
    	result = Test_SPI();
    	if (result)
    	{
    		RB1=1;
    		while (1);				// se retornou 1 é porque tem falha comunicação c/ SPi
    	}
    
    	configure_Radio();
    
    }//
    // complete configure nRF24L01 for Rx/Tx
    void configure_Radio(void)
    {
    	
        SPI_CSN = 0;
        SPI_CE = 0;
        
    	//PRX, CRC enabled
    	SPI_Write(0x20);
    	SPI_Write(0x39); 
    	SPI_CSN = 1;   
    	SPI_CSN = 0;
        
    	//disable auto-ack for all channels      
    	SPI_Write(0x21);
    	SPI_Write(0x00);     
    	SPI_CSN = 1;    
    	SPI_CSN = 0;
        
    	//address width = 5 bytes  
      	SPI_Write(0x23);
    	SPI_Write(0x03);    
        SPI_CSN = 1;    
        SPI_CSN = 0;
        
    	//auto retransmit off
     	SPI_Write(0x24);    
       	SPI_Write(0x00);    
        SPI_CSN = 1;
        SPI_CSN = 0;
    
        //set channel 
       	SPI_Write(0x25);
    	SPI_Write(RF_CHANNEL);    
        SPI_CSN = 1;     
        SPI_CSN = 0; 
    
    	//data rate =   
      	SPI_Write(0x26);
    #if defined ( RF_DATA_RATE_250KBPS ) 
    	SPI_Write(0x27);    		// 0x07 = 1MBPS - 0x27 = 250Kbps
    #elif defined ( RF_DATA_RATE_1MBPS )
    	SPI_Write(0x07);    		
    #else 
    	#error "Definir RF_DATA_RATE"
    #endif
    
        SPI_CSN = 1;
      	SPI_CSN = 0;
    
    	//4 byte payload  
     	SPI_Write(0x31);
    	SPI_Write(RF_PAYLOAD);    
        SPI_CSN = 1;    
        SPI_CSN = 0;
    
        //set TX address 
        SPI_Write(0x30);
    	SPI_Write(RADIO_ADDRESS_1);
    	SPI_Write(RADIO_ADDRESS_2);
    	SPI_Write(RADIO_ADDRESS_3);
    	SPI_Write(RADIO_ADDRESS_4);
    	SPI_Write(RADIO_ADDRESS_5);
    
        SPI_CSN = 1;  
        SPI_CSN = 0;
    
        //set RX address 
        SPI_Write(0x2A);
    	SPI_Write(RADIO_ADDRESS_1);
    	SPI_Write(RADIO_ADDRESS_2);
    	SPI_Write(RADIO_ADDRESS_3);
    	SPI_Write(RADIO_ADDRESS_4);
    	SPI_Write(RADIO_ADDRESS_5);
    
        SPI_CSN = 1;  
        SPI_CSN = 0;
        
    	//PWR_UP = 1   
     	SPI_Write(0x20);
    	SPI_Write(0x3B);    // 3B
        SPI_CSN = 1;    
        SPI_CE = 1;  
    	
    }//
    void configure_transmitter_2(void)
    {
        unsigned int data, cmd;
            
        SPI_CSN = 0;   
        SPI_CE = 0;
    
        cmd = 0x20; //0b00100000. (CONFIG)
        data = 0x38; //0b00111000. PTX, CRC enabled, TX_DS on IRQ pin
        
        SPI_Write(cmd);
        SPI_Write(data);
        
        SPI_CSN = 1;//pulse csn    
        SPI_CSN = 0;
        
    }
    J'ai mis les fonctions avec . Je ne sais pas comment les utiliser plutot où ecrire les données et où les récupérer.

  7. #6
    Yoruk

    Re : Communication wireless

    Tu as essayé de faire :

    Code:
    transmit_data("données");
    pour l'émission ?

    Ce qui m'inquiète aussi c'est de voir ta fonction main() et surtout le while() qui est complètement vide... Tu es sensé mettre dans les init() toutes les fonctions de préparation, genre configure_transmitter(), configure_RX() et autres...

    Il provient d'où ce code ? Il n'y avait pas davantage d'explications ?
    La robotique, c'est fantastique !

  8. #7
    Ridezebigone

    Re : Communication wireless

    +1 avec Yoruk,
    si tu compiles ton programme en ne gardant que l'init et la main, ça ne doit faire à peu près pareil non?
    il doit te manquer des #include pour la lib lcd aussi (ou alors tu n'a pas copié-collé l'intégralité de ton code) non?

    des commentaires en portugais, en anglais et en français...

  9. #8
    memo1402

    Re : Communication wireless

    Ne vous inquietez pas pour le lcd et le delay, ils sont dans d'autre fichiers ceux la fonctionne bien. J'ai mis les fonctions a la fin mais j'ai rien mis dans le main car je sais pas ce qu'il faut mettre dans les fonctions voyez sa comme des outils qu'il faut placer aux bonnes endroits.

  10. #9
    Yoruk

    Re : Communication wireless

    Dans le main tu réalises les appels des fonctions préparatoires citées, et dans le while tu effectues les transmissions/réceptions de datas requises par l'application !
    La robotique, c'est fantastique !

  11. #10
    memo1402

    Re : Communication wireless

    Justement je ne sais pas quoi mettre dans les fonctions transmit_data et read_RX. transmit_data on peut encore deviner mais je ne vois pas pourquoi on devrait mettre quelque chose dans read_rx car ça devrait servir qu'a lire la donnée.

  12. #11
    Yoruk

    Re : Communication wireless

    Normalement la réception est gérée par une interruption. Une variable peut être passée en paramètre de la fonction de réception pour récupérer le résultat.

    Dans le transmit data, bin tu indiques les données à envoyer !

    Je réitère ma question, ce code il vient d'où ?
    La robotique, c'est fantastique !

  13. #12
    memo1402

    Re : Communication wireless

    c'est un melange d'exemple que j'ai trouvé et quelque changement que j ai apporté

  14. #13
    Yoruk

    Re : Communication wireless

    Et donc, quel est est le problème ? Il se passe quoi quand tu met les datas à envoyer en paramètres ?
    La robotique, c'est fantastique !

  15. #14
    memo1402

    Re : Communication wireless

    Le probleme etait que je n'arivais pas a recevoir les donnée mais la je suis dans l'incapacité de testé vu que j'ai pété un des module je vous tient au courant des que j'aurais testé a nouveau le code.

  16. #15
    Yoruk

    Re : Communication wireless

    Attention, je crois me souvenir que ces modules fonctionnent en niveaux logiques de 3v3 ! Ils ne sont pas tolérant au 5v !
    La robotique, c'est fantastique !

Discussions similaires

  1. Power Line communication sur une ligne DC. Communication CAN
    Par invitee2723b34 dans le forum Électronique
    Réponses: 3
    Dernier message: 21/02/2012, 12h28
  2. sur le wireless
    Par inviteec0c9d8b dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 02/09/2007, 19h33
  3. Bloquage jeu + wireless
    Par invitea54c200b dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 15/06/2006, 18h42
  4. wireless USB
    Par inviteacb3e291 dans le forum Électronique
    Réponses: 0
    Dernier message: 08/02/2006, 09h59
  5. Wireless
    Par invitead68473a dans le forum Électronique
    Réponses: 1
    Dernier message: 24/02/2004, 17h03
Découvrez nos comparatifs produits sur l'informatique et les technologies.