Que pensez-vous de cet article ? Aidez-nous à vous fournir un meilleur contenu.
Merci! Vos commentaires ont été reçus.
There was a problem submitting your feedback, please try again later.
Que pensez-vous de cet article ?
Prototypage rapide d'un système de capteurs sans fil longue portée avec la plate-forme électronique modulaire.
Dans la première partie, nous avons présenté notre scénario d'utilisation et examiné la modulation sans fil LoRa. Nous avons indiqué les raisons de notre choix, puis nous avons exploré certaines des options matérielles XinaBox disponibles.
Dans cet article, nous abordons la programmation d'un module CR02 ou "☒CHIP" (qui intègre un microcontrôleur et une radio) puis l'envoi et la réception de données via une liaison dans fil LoRa.
Configuration
Tout d'abord, nous devons connecter le programmateur IP01 (174-3703) au CR02 (174-3699) agrave; l'aide d'un connecteur xBUS (174-4977) . Nous aurons également besoin d'une antenne adaptée reliée avant d'exécuter des exemples LoRa, par exemple une antenne fouet SMA réglée pour la bande 868 MHz (054-2563) .
Nous aurons évidemment besoin de deux jeux des pièces mentionnées ci-dessus si nous voulons tester à la fois l'envoi et la réception !
Il faudra également installer Arduino IDE ou tout autre moyen de programmer des cartes compatibles Arduino. Par exemple, PlatformIO IDE devrait tout aussi bien fonctionner sur le papier.
Nous utiliserons une bibliothèque appelée RadioHead qui offre la possibilité d'envoyer et de recevoir des messages en paquet via diverses radios de données courantes, notamment la RFM95W intégrée dans le CIRCUIT CR02 que nous utilisons. Dans l'état actuel des choses, il semble qu'il nous faille utiliser la Fourche RadioHead hébergée sous l'organisation GitHub de XinaBox.
Il existe plusieurs façons d'installer de nouvelles bibliothèques dans Arduino IDE, mais la plus facile consiste à télécharger une archive ZIP, puis de sélectionner Configuration → Ajouter bibliothèque → Ajouter bibliothèque .ZIP dans l'IDE.
Dans le menu Outils → Carte, nous devons sélectionner "Arduino Pro ou Pro Mini" et veiller à ce que le port adapté soit sélectionné via Outils → Port. Sous Linux, l'IP01 doit s'identifier par /dev/ttyUSB0 (ou éventuellement un nombre plus élevé si un autre circuit basé sur FTDI est connecté).
Bonjour !
Une fois la configuration terminée, passons à "Bonjour, monde matériel" — les LED clignotent !
Le CR02 dispose en fait d'une LED tricolore, l'exemple de clignotement présenté est donc un peu plus important que celui fourni avec Arduino IDE, mais identique pour l'essentiel avec des cycles où chaque couleur clignote à tour de rôle. Veuillez noter que lors du téléchargement de la configuration, la LED de l'IP01 doit clignoter rapidement pendant un court instant. Si ce n'est pas le cas, cela peut indiquer une erreur au niveau du matériel ou un problème d'autorisations de port.
Voyons maintenant comment recevoir et envoyer des données via la radio LoRa.
Serveur LoRa
Commençons donc avec l'exemple de configuration "serveur". Tout d'abord, cela inclut la bibliothèque RadioHead pour notre module sans fil. Nous poursuivrons ensuite avec la définition de certaines constantes, comme la fréquence d'utilisation, qui, pour le CRO2, sera dans la bande 868 MHz.
#include <RH_RF95.h>
#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0
uint8_t tempdata[30];
Puis, dans setup(), nous configurons une broche LED et un port série pour le débogage, avant de poursuivre avec l'initialisation du module radio et la configuration de sa fréquence et de sa puissance de transmission.
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
if (!CR02.init()) {
Serial.println("init failed");
}
// The default transmitter power is 13dBm, using PA_BOOST.
// If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then
// you can set transmitter powers from 5 to 23 dBm:
// Failure to do that will result in extremely low transmit powers.
//CR02.setModemConfig(CR02.Bw31_25Cr48Sf512);
CR02.setFrequency(CR02_FREQUENCY);
CR02.setTxPower(23, false);
}
Il existe également une ligne commentée qui permet le réglage de la largeur de bande de liaison et le facteur d'étalement (SF) LoRa sur des valeurs non définies par défaut. Pour faire court, un facteur d'étalement plus élevé signifie un budget de liaison plus conséquent et donc une plus grande portée, mais au prix d'une largeur de bande réduite et d'une durée de transmission hertzienne plus longue.
Le facteur d'étalement par défaut convient bien pour le développement, mais il peut être optimisé pour l'environnement donné, afin d'obtenir la meilleure combinaison portée-consommation d'énergie, plus l'utilisation du spectre. En règle générale, plus le temps de diffusion est réduit, mieux c'est. Toutefois, si vous voulez vraiment vous assurer que votre message passe, avec une largeur de bande et une autonomie de batterie moins préoccupantes, par exemple, pour un système d'alarme/d'alerte, vous pouvez toujours utiliser le SF le plus élevé.
Pour plus de détails sur la façon d'utiliser l'appel setModemConfig() pour configurer la radio LoRa CR02, consultez Documentation RadioHead.
Passons maintenant à la boucle principale. Nous attendons un message entrant. Une fois reçu, nous allumons la LED, puis écrivons le message sortant sur le port série, ainsi que l'indication de la force du signal reçu (RSSI), avant d'éteindre la LED et de transmettre enfin une réponse. C'est simple !
void loop()
{
if (CR02.available())
{
// Should be a message for us now
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (CR02.recv(buf, &len))
{
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("got request: ");
Serial.println((char*)buf);
Serial.print("RSSI: ");
Serial.println(CR02.lastRssi(), DEC);
// Send a reply
sprintf(tempdata, "%s", "Hello Client");
CR02.send(tempdata, sizeof(tempdata));
CR02.waitPacketSent();
Serial.println("Sent a reply");
digitalWrite(LED_BUILTIN, LOW);
}
else
{
Serial.println("recv failed");
}
}
}
LoRa Client
L'exemple CRO2 Client est très similaire comme vous pouvez vous en douter. Il transmet un message, puis attend une réponse. Si nous examinons sa boucle principale :
void loop()
{
Serial.println("Sending to CR02_server");
// Send a message to CR02_server
sprintf(tempdata, "%s", "Hello Server");
CR02.send(tempdata, sizeof(tempdata));
CR02.waitPacketSent();
// Now wait for a reply
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (CR02.waitAvailableTimeout(3000))
{
// Should be a reply message for us now
if (CR02.recv(buf, &len))
{
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("got reply: ");
Serial.println((char*)buf);
Serial.print("RSSI: ");
Serial.println(CR02.lastRssi(), DEC);
}
else
{
Serial.println("recv failed");
}
}
else
{
Serial.println("No reply, is CR02_server running?");
}
digitalWrite(LED_BUILTIN, LOW);
delay(400);
}
Là encore, nous constatons que c'est relativement simple et avec cela, nous obtenons un message de réponse imprimé avec le RSSI du signal de la part du serveur.
Options plus avancées
Les exemples simples présentés ci-dessus ne fournissent pas de codage/d'authentification de message ni aucun adressage. Cela peut convenir pour de nombreux systèmes, mais si des fonctionnalités beaucoup plus avancées sont requises, il existe également des exemples RadioHead qui utilisent le codage et qui fournissent un service datagramme fiable ainsi qu'une prise en charge d'adressage de nœuds simple. Cependant, ceux-ci n'ont pas été testés avec le CRO2 et il se peut que certaines modifications soient nécessaires.
À suivre
Dans le prochain article de cette série, nous ajouterons des périphériques, et notre système de surveillance sans fil commencera à prendre forme.