Création d'une nouvelle Série "Serial2" pour module bluetooth

Bonjour,

J'ai acheté deux modules Grove bluetooth dont Serial Bluetooth v3.0 et BLE.

Lien vers les modules : Grove - Serial Bluetooth v3.0 | Seeed Studio Wiki
Grove BLE v1 | Seeed Studio Wiki

J'ai télécharger la bibliothèque indiqué dans la doc : GitHub - Seeed-Studio/Bluetooth_Shield_V2_Demo_Code: Demo code for the new version 2 bluetooth shield

J'ai voulu installé la bibliothèque : Croquis ->Inclure une bibliothèque -> ajouter a la bibliothèque .zip

J'ai comme message d'erreur : Le dossier spécifié ne contiens pas de bibliothèque valide.

J'ai beau cherché d'autres bibliothèque, j'en trouves pas. Je me retrouves à ne pas pouvoir utiliser mes modules Bluetooth.

Mon projet :

Carte : MKR FOX 1200
Pièce : - Relay

  • Module bluetooth

J'ai créer une APK sur MIT APP INVENTOR

Avec deux boutons ON et OFF. Quand il faut allumer le relay j'appuie sur ON et pour l'éteindre OFF.

C'est simple, et je me trouves coincé à cause de cette bibliothèque. Je commences à plus en pouvoir de SEEED.

Pourriez-vous m'aidez ? :slight_smile:

PS : Désolé pour le double TOPIC.

Cordialement,

voir réponse ici : Problème Grove - Serial Bluetooth v3.0 - Français - Arduino Forum

Merci pour la réponse, j'avais remarqué ceci. Mais c'est que je ne trouves pas de bibliothèque adéquate.

De ce fait où est ce que je peux trouver la library " # include < SoftwareSerial.h > " donnée dans les exemples ?

J'ai lu : Cette bibliothèque fait donc partie intégrante d’Arduino, elle est installée de base. Il suffit juste de l’importer dans le programme que l’on écrit.

Alors que quand je veux vérifier mon code j'ai : SoftwareSerial.h : No such file or directory

Si tu ne trouves pas de librairie adéquate c'est qu'il n'y en a pas besoin.

D'après ce que vois ici :

https://forum.arduino.cc/index.php?topic=341054.15

Il est possible de créer un deuxième port série sur les cartes à base de SAMD21.
Pas besoin de SoftwareSerial, donc. Et je ne pense pas que cette librairie existe pour ces cartes.

J'ai lu les topics, essayé de comprendre mais pour être honnête avec vous je n'ai rien compris.

Je sais que je dois utiliser cette doc : ArduinoCore-samd/variants/mkrfox1200 at master · arduino/ArduinoCore-samd · GitHub

Pourquoi créer un un deuxième port série ? ( c'est pour la réception/envoie de données par bluetooth ?)

Je vais vous mettre en détails mon projet :


Mon GROVE - Serial bluetooth v3.0 est branché en D5 D6
Mon relay en D4.

J'avais trouvé cette bibliothèque -> GitHub - PaulStoffregen/SoftwareSerial: SoftwareSerial library used on Teensy

Code qui fonctionne pas : Erreur compilation pour la carte Arduino MKR FOX 1200.

#include <Arduino.h>
#include <SoftwareSerial.h>

int relay = 4;
int state = 0;

#define RxD 6
#define TxD 7

SoftwareSerial blueToothSerial(RxD,TxD);

void setup() {
  
  Serial.begin(9600);
  pinMode(RxD, INPUT);
  pinMode(TxD, OUTPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);
  setupBlueToothConnection();
  
}

void loop() {

    
      if(blueToothSerial.available() > 0) 
      {
          state = blueToothSerial.read();
          Serial.print(state);
      }
      
        if(state == '0') 
        {
          digitalWrite(relay, LOW);
          Serial.println("RELAY: OFF");
          state = 0;
        }
        else if(state == '1')
        {
          digitalWrite(relay, HIGH);
          Serial.println("RELAY: ON");
          state = 0;
        }
}


void setupBlueToothConnection()
{          
  blueToothSerial.begin(9600);  
  
  blueToothSerial.print("AT");
  delay(400); 

  blueToothSerial.print("AT+DEFAULT");             // Restore all setup value to factory setup
  delay(2000); 
  
  blueToothSerial.print("AT+NAMESeeedBTSlave");    // set the bluetooth name as "SeeedBTSlave" ,the length of bluetooth name must less than 12 characters.
  delay(400);
  
  blueToothSerial.print("AT+PIN0000");             // set the pair code to connect 
  delay(400);
  
  blueToothSerial.print("AT+AUTH1");             //
  delay(400);    

  blueToothSerial.flush();
}

J'ai essayé celui-là :

#include <Arduino.h>   // required before wiring_private.h
#include "wiring_private.h" // pinPeripheral() function

int relay = 4;
int state = 0;

Uart Serial2 (&sercom2, 5, 6, SERCOM_RX_PAD_1, UART_TX_PAD_0);
void SERCOM2_Handler()
{
  Serial2.IrqHandler();
}
 
void setup() {
  Serial.begin(115200);
 
  Serial2.begin(115200);
  
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);
  
  // Assign pins 5 & 6 SERCOM functionality
  pinPeripheral(5, PIO_SERCOM_ALT);
  pinPeripheral(6, PIO_SERCOM_ALT);
}
 
void loop() {
  
    if (Serial2.available() > 0) 
    {
      state = Serial2.read();
    }
  
    if (state == '0') 
    {
    digitalWrite(relay, LOW); // Turn LED OFF
    Serial2.println("RELAY: OFF"); // Send back, to the phone, the String "LED: ON"
    state = 0;
    }
    else if (state == '1') 
    {
    digitalWrite(relay, HIGH);
    Serial2.println("RELAY: ON");;
    state = 0;
    } 
}

Sachant que j'ai rien compris à comment ça marche (donc ça ne marche pas xD )

Pourquoi créer un un deuxième port série ? ( c'est pour la réception/envoie de données par bluetooth ?)

Oui, bien entendu.
C'est soit SoftwareSerial soit HardwareSerial.

J'avais trouvé cette bibliothèque -> GitHub - PaulStoffregen/SoftwareSerial: SoftwareSerial library used on Teensy

Code qui fonctionne pas : Erreur compilation pour la carte Arduino MKR FOX 1200.

Cette librairie n'est pas OK pour MKR.

J'ai essayé celui-là :

Ça a l'air pas mal sauf que : apparemment le module BT communique en 9600 baud, pas en 115200.

Pourquoi une MKR pour ce genre d'appli ?

hbachetti:
Pourquoi une MKR pour ce genre d'appli ?

Je suis stagiaire dans une entreprise qui aimerais développer une branche dans l'IOT industriel.

A la base, le projet est un POC pour envoyer et recevoir des données (température/humidité/Son etc ) via SigFox branché sur un tour à bois pour faire une démonstration.
Et par la suite, ça à évolué qu'il fallait plus de blind blind :slight_smile:

Pouvoir allumer la machine en bluetooth avec un relay, utilisé un Infrared Proximity Sensor relié à un relay qui permet de si la machine est allumer via bluetooth et que une personne ce trouve devant à 20-30cm celle-ci ce met en route. A ce moment là, on récupère nos données.
Donc on a beau avoir appuyé sur le bouton ON de la machine, si on a pas mis ON via bluetooth et si on est pas devant celle-ci elle reste éteinte.

A la base je voulais utilisé une mkr wifi 1010 pour le bluetooth mais pas assez de place sur la machine pour y cacher deux cartes + les branchements ...

hbachetti:
Ça a l'air pas mal sauf que : apparemment le module BT communique en 9600 baud, pas en 115200.

J'ai bien changé en 9600baud. Quand je connectes mon appli au module bt j'ai bien "Connected". Et rien ne ce passe quand j'appuie sur ON et OFF :confused:

if (Serial2.available()) 
    {
      state = Serial2.read();
      Serial.println(state);
    }

ça ne me retourne rien donc le Serial2 ne fonctionne pas.

ça ne me retourne rien donc le Serial2 ne fonctionne pas.

Ou l'APK.

Imagine que ton APK envoie 1 ou 0 et non pas '1' ou '0' ...

C'est un bon réflexe d'afficher state mais ceci serait mieux :

      Serial.print("state: ");
      Serial.println(state);
// ou
      Serial.println(state, HEX);

Sur mon APK, j'ai mis en fonction du tableau ASCII pour le bouton ON : 49 = 1 et bouton OFF : 48 = 0.
Dois-je modifier cette valeur dans mon APK ?

J'ai modifié :

 if (Serial2.available()) 
    {
      state = Serial2.read();
      Serial.print("state: ");
      Serial.println(state);
    }

Rien dans le monitor ...

Donc quand j'appuie sur mes boutons ça ne me renvoie aucune donnée.

Le soucis doit venir d'ici :

Uart Serial2 (&sercom2, 5, 6, SERCOM_RX_PAD_1, UART_TX_PAD_0);

void SERCOM2_Handler()
{
  Serial2.IrqHandler();
}
 
void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  
  pinMode(relay, OUTPUT);
  
  // Assign pins 5 & 6 SERCOM functionality
  pinPeripheral(6, PIO_SERCOM_ALT);
  pinPeripheral(5, PIO_SERCOM_ALT);

}

Par rapport au TX et RX ?

J'ai essayé de modifier de toute les façons. 5, 6 et 6, 5 avec

pinPeripheral(6, PIO_SERCOM_ALT);
pinPeripheral(5, PIO_SERCOM_ALT);

et

pinPeripheral(5, PIO_SERCOM_ALT);
pinPeripheral(6, PIO_SERCOM_ALT);

Pas eu d'effet ...

Mon module ble est sur le D5/D6 et le relay sur D4 voir image :

Je viens de faire des tests !

J'ai branché mon module ble directement sur les pin TX et RX avec des cables pin male to male...

J'ai utilisé Serial1 du coup !

J'ai bien dans mon moniteur série : 1 = ON et 0 = OFF.

Le relay s'allume, s'éteins correctement. Sur l'apk aucun problème d'affichage.
Le problème viens donc de la création du Serial2.

Le code :

char state;
int relay = 4;

void setup()
{
  Serial.begin(9600);   // open serial over USB
  //while(!Serial.available())
  Serial1.begin(9600); // TX + RX

  pinMode(relay, OUTPUT);
}

void loop()
{
  if (Serial1.available()) {
    state = Serial1.read();
    Serial.print(state);
  }
  
  if (state == '0') 
    {
    digitalWrite(relay, LOW); // Turn RELAY OFF
    Serial1.println("RELAY : OFF"); // Send back, to the phone, the String "RELAY : OFF"
    state = 0;
    }
    else if (state == '1') 
    {
    digitalWrite(relay, HIGH);
    Serial1.println("RELAY : ON");;
    state = 0;
    } 
}

ça m'embête vraiment de ne pas réussir à créer ce Serial2 ...

ça m'embête vraiment de ne pas réussir à créer ce Serial2 ...

Plutôt dommage en effet.

Salut MaxenceO
Je suis aller voir ta carte (MKRFOX1200) car je ne la connais pas et je vois qu'elle a une seule serial hardware.
Il faut donc que tu crée un SoftwareSerial.
Si tu crée une SoftwareSerial ne la nommes pas "Serial*" sa apporte de la confusion.

Comme on le disait plus haut, il est possible de créer un HardwareSerial supplémentaire sur la MKRFOX. La librairie SoftwareSerial n'est pas compatible.

savoriano:
Salut MaxenceO
Je suis aller voir ta carte (MKRFOX1200) car je ne la connais pas et je vois qu'elle a une seule serial hardware.
Il faut donc que tu crée un SoftwareSerial.
Si tu crée une SoftwareSerial ne la nommes pas "Serial*" sa apporte de la confusion.

La librairies SoftwareSerial ne fonctionne pas sur ma carte MKR FOX 1200. Mon soucis aurait été régler depuis longtemps si seulement ... :frowning:

Du coup, je veux créer un HardwareSerial supplémentaire comme dans ce tuto : Creating a new Serial | Using ATSAMD21 SERCOM for more SPI, I2C and Serial ports | Adafruit Learning System

Mais je n'arrives pas à faire fonctionner mon Uart Serial2 sur le sercom2 via mon mkr connector carrier en D5-D6 ou peu importe le port D ^^

Lien des variant.cpp et variant.h :

A défaut de ne pas réussir à créer un HardwareSerial, je vais utiliser le port Serial de la carte mkr connector carrier.

En espérant ne pas avoir besoin d'un autre Serial port durant mon projet ! :slight_smile:

Toute fois si quelqu'un à réussi et aurait l'astuce pour. Je suis toujours preneur pour le futur !!!

Merci, pour l'aide apporter :wink:

J'aurais bien essayé mais je n'ai pas de MKR sous la main.
Je ne vois pas d'ailleurs ce que je ferais d'une connectivité SigFox.
Désolé de ne pouvoir aider plus.

On conseil : tu devrais mettre en œuvre le tuto d'Adafruit sans chercher à l'intégrer dans ton propre code.
Tu pourrais raccorder le deuxième Serial au PC avec un simple convertisseur USB / série.

J'ai bien changé en 9600baud. Quand je connectes mon appli au module bt j'ai bien "Connected". Et rien ne ce passe quand j'appuie sur ON et OFF :confused:

Pourtant, si le module BT envoie "Connected", c'est que la liaison marche, non ?

J'ai branché mon module ble directement sur les pin TX et RX avec des cables pin male to male...

J'ai utilisé Serial1 du coup !

Le port USB (sercom5), contrairement aux cartes UNO ou NANO est connecté sur PA24 PA25. C'est un port USB natif du SAMD21.
Serial1 (sercom0) est connecté sur PB22 et PB23 (broches 13 et 14 de la carte).

Serial et Serial1 sont bien deux ports distincts !
Donc, c'est OK pour cette solution qui te permet d'utiliser Serial pour le chargement + terminal et Serial1 pour le BT.

En espérant ne pas avoir besoin d'un autre Serial port durant mon projet ! :slight_smile:

A mon avis, comme sur un STM32, chaque pin est multifonction, mais pas à l'infini.
D3 et D4 sont réservés à sercom2 et non pas D5 D6.