Comment faire communiquer deux systèmes en BlueTooth par l’intermédiaire d’un module RN 42 ?

NIVEAU 4

Les modules RN41/42 permettent d’établir une communication BlueTooth entre deux systèmes. Ces modules gèrent la connexion et la communication RF entre deux nœuds du réseau. La communication entre le système hôte (microcontroleur par exemple) et le module RN41/42 se fait par une liaison RS232.

Objectifs

  • Etablir un protocole de communication de haut niveau pour échanger des données numériques entre deux noeuds par l’intermédiaire d’une liaison BlueTooth (module RN42)

Pré-requis

Module RN42

Nous utilisons des modules RN-42-XV ou RN-42-EK (evaluation board avec USB)

Adresse MAC des modules

Un esclave et un maitre pour une communication point à point

Connexion avec le RN42

La broche GPIO2 donne une indication sur l’établissement d’une connexion du module RN42. D’après la documentation du module, cette broche vaut ‘1’ lorsque le module est connecé, ‘0’ sinon. Cette broche est reliée sur certaines de nos maquettes à une broche de la carte Nucleo nommée GPIO_STATUS.

Protocole pour établir une connexion entre deux systèmes

Préparation des modules

Par défaut, la communication RS232 entre le système hôte et le module RN42 se fait à une vitesse de 115200 bauds.

Même mode d’authenfication (SA,4 et SP,pincode ). Un module en master mode Pairing (SM,6) l’autre en mode esclave (SM,0). Le maitre doit connaître l’adresse MAC de l’esclave (SR,<macadress>).

Reboot des deux systèmes. Auto-appareillement au redémarrage.

GPIO2 pour connaitre le statut de la connexion.

Protocole à établir

Passer en mode commande $$$ (pour en sortie —\n)

Autres instructions

  • GPIO2 Status Description
    • High The module is connected to another device over Bluetooth.
    • Low The module is not connected over Bluetooth.
  • Authentification
    • SA,nb : Set Authentification Mode
      • nb = 0 : Open mode. With this mode, the module uses Bluetooth version 2.0 with NO encryption (open mode). This mode is useful for legacy devices that do not need security. This mode is the same as in firmware version 4.77.
      • nb = 1 : SSP keyboard I/O mode (default). If this option is set, the remote host receives a prompt; reply yes to pair. For Android devices, the user is prompted with a 6-digit code and is asked to verify that the code matches on the module. The module always responds yes. Because the module cannot display a code, simply press OK or Yes on the remote device to authenticate.
      • nb = 2 : SSP “just works” mode. This mode works with iOS device and newer PCs. You can use this mode with Droid devices if the application connects using unsecure mode (which was the default on Droid version 3.3). This mode also works with new PC stacks.
      • nb = 4 : Pin code. Forces pin code mode authentication (Bluetooth version 2.0), which requires the host device to enter a pin code that matches the stored pin code. The functionality is similar to firmware version 4.77
  • Name
    • GN : Get Name
    • SN,DeviceName : Set Name DeviceName
  • Mode
    • SM,nb : Set Mode
      • nb = 0 : Slave Mode. —Default mode, in which other Bluetooth devices can discover and connect to the module.
      • nb = 1 : Master Mode.
      • nb = 2 : Trigger Mode.
      • nb = 3 : Auto-Connect Master Mode, nb = 4 : Auto-Connect DTR Mode, nb = 5 : Auto-Connect Any Mode.
      • nb = 6 : Pairing Mode.
    • GM : Get Mode
  • Pin Setup
    • SP,value : Set the pin value with 4 integers from 0 to 9. Default is 1234.
  • Get Status
    • D or E : D for standard informations, E for extended informations
  • Mac Adress :
    • GB : own Mac address
    • GF : connected device Mac address
  • Connection
    • C : connect to the remote address device (if specified) – command SR,<macaddress> to specify a remote address
    • C,<macaddress> : connect to a specific module with its MAC address

Exemple de code

Côté Maitre

/****************************************************************************/
/*  Echange entre deux systemes en BT - RN42 - Nucleo                       */
/****************************************************************************/
/*  LEnsE / Julien VILLEMEJANE       /   Institut d'Optique Graduate School */
/****************************************************************************/
/*  Brochage                                                                */
/*      USBTX, USBRX - connection to the computer @ 115200bauds             */
/*      PC_10, PC_11 - connection to the other system @ 115200bauds         */
/*      D10          - status input from RN42 module                        */
/*      LED1/D13 - LED de test                                              */
/****************************************************************************/
/*  Test réalisé sur Nucléo-L476RG                                          */
/****************************************************************************/

#include "mbed.h"
#define     TIMEOUT     10      // in seconds

// inputs and outputs configuration
Serial          debug_pc(USBTX, USBRX);
Serial          device_rs(A0, A1);
InterruptIn     status_rs(D10);
DigitalOut      debug_led(D13);

// System functions
void ISR_get_data_pc(void);
void ISR_get_data_device(void);

// Variables
char data_received = 0;
int timeout_cpt = 0;

/* Main program */
int main()
{
    debug_pc.baud(115200);
    debug_pc.attach(&ISR_get_data_pc, Serial::RxIrq);
    device_rs.baud(115200);
    device_rs.attach(&ISR_get_data_device, Serial::RxIrq);
    
    debug_pc.printf("I'm Here\r\n");
    // Connection settings
    device_rs.printf("$$$");
    wait_ms(100);
    device_rs.printf("SA,4\n");     // Authentification par PIN
    wait_ms(100);
    device_rs.printf("SP,1234\n");  // Set PIN Code
    wait_ms(100);
    device_rs.printf("SR,0006667D5ED2\n");  // Set Remote Address
    wait_ms(100);
    device_rs.printf("SM,3\n");     // Set Operating Mode - Auto-Connect
    wait_ms(100);
    device_rs.printf("C\n");      // Connect to device
    wait_ms(100);
    
    // Timeout to do to test status_rs pin
    timeout_cpt = 0;
    while(status_rs == 0){
        debug_pc.printf("NOT YET...\r\n");
        wait_ms(100);
        timeout_cpt++;
        if(timeout_cpt == TIMEOUT*10){
            device_rs.printf("C\n");      // Connect to device
        }
    }
    debug_pc.printf("CONNECTED\r\n");
    
    
    while (true) {
        if(device_rs.readable()){
            debug_led = !debug_led;
        }   
    }
}

/* Interrupt routine when pc send data */
void ISR_get_data_pc(void){
    // Simple echo of datas
    data_received = debug_pc.getc();    
    device_rs.putc(data_received);
    switch(data_received){
        case 'a':
            debug_led = 1;
            break;
        case 'e':
            debug_led = 0;
            break;
        default:
            debug_led = debug_led;           
    }
}

/* Interrupt routine when device send data */
void ISR_get_data_device(void){
    // Simple echo of datas
    data_received = device_rs.getc();    
    debug_pc.putc(data_received);
    
}
Nucléo – Faire communiquer deux systèmes en BlueTooth (RN 42 module)