1

Topic: Make communication between Arduino Nano 33 BLE and RemoteXY

Hello everybody,

I am coming to you because I am trying to run RemoteXY between my iOS phone and my Arduino 33 BLE board. The goal is to control the position of servomotor with my phone.

I tried a code gave me on the Arduino's forum, to make the communication by UART. That works (the board is recognize by RemoteXY app).
So I implement the source code getting after the edition of the RemoteXY interface. But the IDE tell me "Error compiling for board Arduino 33 BLE"


Could you please help me to make those devices communicate ?
I hope it is possible...?

Here is the code I now have:


#include <ArduinoBLE.h>

const unsigned int tamponBluetooth = 244;
char receiveBluetooth[tamponBluetooth + 1] = {0,};


///////////////////////////////////////////CONFIG CONNEXION BLE - DEBUT//////////////////////////////////////

//Ne pas changer (tampon max de 20 octets pour une notification, restriction du bluetooth 4.0 et 4.1, 4.2 permettrait 244 octets normalement)
// pour les tests avec appli android, conserver la valeur de 20 ne donnera pas de surprise quand au résultat
const unsigned int tamponPortSerie = 20;
char receptionPortSerie[tamponPortSerie + 1] = {0,}; // + 1 pour le '\0' de fin de chaine

BLEService UARTService("0000ffe0-0000-1000-8000-00805f9b34fb");
BLECharacteristic TX_RX("0000ffe1-0000-1000-8000-00805f9b34fb", BLEWriteWithoutResponse | BLENotify, tamponBluetooth);

BLEDevice central;


//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

// RemoteXY select connection mode and include library 
#define REMOTEXY_MODE__SOFTSERIAL
//#include <SoftwareSerial.h>

#include <RemoteXY.h>

// RemoteXY connection settings 
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600


// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,1,0,0,0,11,0,11,13,0,
  4,128,15,14,66,17,2,26 };
  
// this structure defines all the variables and events of your control interface 
struct {

    // input variables
  int8_t slider_1; // =0..100 slider position 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


#include <Servo.h>  

Servo myservo; 

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
    
      RemoteXY_Init (); 
  
  // TODO you setup code
   myservo.attach(9); 
  RemoteXY.slider_1 = 50; 
  
  }

  // Nom lié au service GENERIC ACCESS 0x1800 (c'est un service obligatoire)
  BLE.setDeviceName("UART Service");

  // Nom qui apparait lors d'un scan
  BLE.setLocalName("UART BLE");

  // Déclaration du service que l'on veut offrir
  //BLE.setAdvertisedServiceUuid(UARTService.uuid());
  BLE.setAdvertisedService(UARTService);

  UARTService.addCharacteristic(TX_RX);

  BLE.addService(UARTService);

  // Démarrer la publication du service
  BLE.advertise();

  Serial.println("UART Service");
  ///////////////////////////////////////////CONFIG CONNEXION BLE - END//////////////////////////////////////
}

 void loop() {
  int ret = 0;
  static int etat = 0, souscrit = 0;

  // Nous sommes un périphérique esclave (serveur)
  // et nous attendons une connexion centrale maitre (client)

  // En attente de connexion d'un client
  central = BLE.central();

  // etat est utilisé pour éviter la répétition de l'information
  if (etat == 0) {
    etat = 1;
    Serial.println("périphérique esclave (serveur), en attente de connexion d'un client maitre");
    Serial.println("");
  }

  // Test si un appareil s'est connecté
  if (central) {
    delay(500);
    Serial.print("Connecté à l'appareil suivant: ");
    Serial.println(central.address());
    Serial.println("");

    while (central.connected()) {
      if (TX_RX.subscribed()) {
        if (souscrit != 1) {
          souscrit = 1;
          Serial.println("Notification activée!");
        }
      } else {
        if (souscrit != 0) {
          souscrit = 0;
          Serial.println("Notification désactivée!");
        }
      }
      // ***********************************************************************
      // **** Lecture des données reçues du port série *************************
      if (Serial.available() > 0) {
        memset(receptionPortSerie, 0, tamponPortSerie);
        for (unsigned int i = 0; i < tamponPortSerie; ++i) { // lecture par bloc de 20 max
          receptionPortSerie[i] = Serial.read();
          if (receptionPortSerie[i] == '\r' || receptionPortSerie[i] == '\n' ) {
            break;
          }
        }
        // *********************************************************************
        // **** Envoie des données du port Série sur le module Bluetooth **
        if (writeBleUART(receptionPortSerie))
        {
          Serial.print("Longueur envoyées: ");
          Serial.println(strlen(receptionPortSerie));
          Serial.print("Données envoyées: ");
          Serial.println(receptionPortSerie);
        } else {
          Serial.print("Une erreur s'est produite pour l'envoie des données");
        }
        // *********************************************************************
      }

      //***********************************************************************
      //**** Lecture des données du module Bluetooth **************************
      ret = readBleUART();
      if (ret == -1) {                     // si retour = 0
        Serial.println("Une erreur s'est produite!");
      }
      //*************************************************
      // ******* Votre code personnel ici ***************
      //*************************************************

 RemoteXY_Handler (); 

  // TODO you loop code 
  // use the RemoteXY structure for data transfer 

  int ms = RemoteXY.slider_1*20+500; 
  myservo.writeMicroseconds(ms);
      
    }

    Serial.print("Déconnecté du central: ");
    Serial.println(central.address());
    Serial.println("");
    etat = 0;
  }
}


int writeBleUART(char text[]) {
  if (TX_RX.writeValue(text, strlen(text))) {
    Serial.print("Size: ");
    Serial.println(strlen(text));
    Serial.print("  Données envoyées: ");
    Serial.println(text);
    return 1;
  }
  return 0;
}

int readBleUART(void) {
  int ret = 0, lenData = 0;

  if (TX_RX.written()) {
    lenData = TX_RX.valueLength();
    if (lenData) {
      memset(receiveBluetooth, 0, tamponBluetooth);
      ret = TX_RX.readValue(receiveBluetooth, lenData);
      if (ret != lenData) {
        return -1;
      }
    }
  }
  return ret;
}

Lot of thanks !

2

Re: Make communication between Arduino Nano 33 BLE and RemoteXY

Hi!

did you get it?
thanks!


Mdawaite wrote:

Hello everybody,

I am coming to you because I am trying to run RemoteXY between my iOS phone and my Arduino 33 BLE board. The goal is to control the position of servomotor with my phone.

I tried a code gave me on the Arduino's forum, to make the communication by UART. That works (the board is recognize by RemoteXY app).
So I implement the source code getting after the edition of the RemoteXY interface. But the IDE tell me "Error compiling for board Arduino 33 BLE"


Could you please help me to make those devices communicate ?
I hope it is possible...?

Here is the code I now have:


#include <ArduinoBLE.h>

const unsigned int tamponBluetooth = 244;
char receiveBluetooth[tamponBluetooth + 1] = {0,};


///////////////////////////////////////////CONFIG CONNEXION BLE - DEBUT//////////////////////////////////////

//Ne pas changer (tampon max de 20 octets pour une notification, restriction du bluetooth 4.0 et 4.1, 4.2 permettrait 244 octets normalement)
// pour les tests avec appli android, conserver la valeur de 20 ne donnera pas de surprise quand au résultat
const unsigned int tamponPortSerie = 20;
char receptionPortSerie[tamponPortSerie + 1] = {0,}; // + 1 pour le '\0' de fin de chaine

BLEService UARTService("0000ffe0-0000-1000-8000-00805f9b34fb");
BLECharacteristic TX_RX("0000ffe1-0000-1000-8000-00805f9b34fb", BLEWriteWithoutResponse | BLENotify, tamponBluetooth);

BLEDevice central;


//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

// RemoteXY select connection mode and include library 
#define REMOTEXY_MODE__SOFTSERIAL
//#include <SoftwareSerial.h>

#include <RemoteXY.h>

// RemoteXY connection settings 
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600


// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,1,0,0,0,11,0,11,13,0,
  4,128,15,14,66,17,2,26 };
  
// this structure defines all the variables and events of your control interface 
struct {

    // input variables
  int8_t slider_1; // =0..100 slider position 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


#include <Servo.h>  

Servo myservo; 

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
    
      RemoteXY_Init (); 
  
  // TODO you setup code
   myservo.attach(9); 
  RemoteXY.slider_1 = 50; 
  
  }

  // Nom lié au service GENERIC ACCESS 0x1800 (c'est un service obligatoire)
  BLE.setDeviceName("UART Service");

  // Nom qui apparait lors d'un scan
  BLE.setLocalName("UART BLE");

  // Déclaration du service que l'on veut offrir
  //BLE.setAdvertisedServiceUuid(UARTService.uuid());
  BLE.setAdvertisedService(UARTService);

  UARTService.addCharacteristic(TX_RX);

  BLE.addService(UARTService);

  // Démarrer la publication du service
  BLE.advertise();

  Serial.println("UART Service");
  ///////////////////////////////////////////CONFIG CONNEXION BLE - END//////////////////////////////////////
}

 void loop() {
  int ret = 0;
  static int etat = 0, souscrit = 0;

  // Nous sommes un périphérique esclave (serveur)
  // et nous attendons une connexion centrale maitre (client)

  // En attente de connexion d'un client
  central = BLE.central();

  // etat est utilisé pour éviter la répétition de l'information
  if (etat == 0) {
    etat = 1;
    Serial.println("périphérique esclave (serveur), en attente de connexion d'un client maitre");
    Serial.println("");
  }

  // Test si un appareil s'est connecté
  if (central) {
    delay(500);
    Serial.print("Connecté à l'appareil suivant: ");
    Serial.println(central.address());
    Serial.println("");

    while (central.connected()) {
      if (TX_RX.subscribed()) {
        if (souscrit != 1) {
          souscrit = 1;
          Serial.println("Notification activée!");
        }
      } else {
        if (souscrit != 0) {
          souscrit = 0;
          Serial.println("Notification désactivée!");
        }
      }
      // ***********************************************************************
      // **** Lecture des données reçues du port série *************************
      if (Serial.available() > 0) {
        memset(receptionPortSerie, 0, tamponPortSerie);
        for (unsigned int i = 0; i < tamponPortSerie; ++i) { // lecture par bloc de 20 max
          receptionPortSerie[i] = Serial.read();
          if (receptionPortSerie[i] == '\r' || receptionPortSerie[i] == '\n' ) {
            break;
          }
        }
        // *********************************************************************
        // **** Envoie des données du port Série sur le module Bluetooth **
        if (writeBleUART(receptionPortSerie))
        {
          Serial.print("Longueur envoyées: ");
          Serial.println(strlen(receptionPortSerie));
          Serial.print("Données envoyées: ");
          Serial.println(receptionPortSerie);
        } else {
          Serial.print("Une erreur s'est produite pour l'envoie des données");
        }
        // *********************************************************************
      }

      //***********************************************************************
      //**** Lecture des données du module Bluetooth **************************
      ret = readBleUART();
      if (ret == -1) {                     // si retour = 0
        Serial.println("Une erreur s'est produite!");
      }
      //*************************************************
      // ******* Votre code personnel ici ***************
      //*************************************************

 RemoteXY_Handler (); 

  // TODO you loop code 
  // use the RemoteXY structure for data transfer 

  int ms = RemoteXY.slider_1*20+500; 
  myservo.writeMicroseconds(ms);
      
    }

    Serial.print("Déconnecté du central: ");
    Serial.println(central.address());
    Serial.println("");
    etat = 0;
  }
}


int writeBleUART(char text[]) {
  if (TX_RX.writeValue(text, strlen(text))) {
    Serial.print("Size: ");
    Serial.println(strlen(text));
    Serial.print("  Données envoyées: ");
    Serial.println(text);
    return 1;
  }
  return 0;
}

int readBleUART(void) {
  int ret = 0, lenData = 0;

  if (TX_RX.written()) {
    lenData = TX_RX.valueLength();
    if (lenData) {
      memset(receiveBluetooth, 0, tamponBluetooth);
      ret = TX_RX.readValue(receiveBluetooth, lenData);
      if (ret != lenData) {
        return -1;
      }
    }
  }
  return ret;
}

Lot of thanks !

3

Re: Make communication between Arduino Nano 33 BLE and RemoteXY

Hello !

Badly no.
I didn’t have the time to finish the project, but hope I can get on it soon !

If you have any clue, let’s talk about it wink