Découverte du MKRFOX 1200

EDIT: DESOLE IL N'Y A PLUS LES COPIES D'ECRANS ET PHOTOS CAR J'AVAIS STOCKE CELA HORS DU FORUM CHEZ hostingpics ET ILS ONT ARRETE...

Bonjour à tous,

Histoire de jouer de manière un peu plus intégrée avec les réseaux bas débit longue portée, je me suis fait un cadeau la semaine dernière, le MKRFOX 1200 - 35 euros plus 8.13€ de taxes, plus frais 3.70€ de de ports par DHL Global Mail (livraison sous 3 à 6 jours) donc pour un total de 46.83 euros. Le câble micro-USB n'est pas fourni.

comme @artouste(2) voulait en savoir plus, j'ai pris un peu de temps pour noter mes premières experiences. Je vous livre cela.


1. SIGFOX - c'est quoi ce truc là
Si vous êtes resté dans votre cave :grinning: ces dernières années et n'avez pas entendu parlé du fleuron techno Français qui fait la fierté de nos politiques, Sigfox est un opérateur télécom français de l’Internet des objets créé en 2010 et implanté en banlieue toulousaine, qui a fait de nombreuses levées de fonds et a le statut de "licorne" (valorisé plus d'un milliard de dollars) auprès des fonds d'investissements.

Sigfox propose un réseau cellulaire qui permet aux objets de communiquer sans-fil, entre eux ou avec un serveur. Leur business modèle propose aux fabricants d’objets connectés de doter leur produit d’un modem spécifique et de proposer un abonnement annuel fourni par SIGFOX. Grâce à une couverture du territoire par des antennes de communication bas-débit, Sigfox reçoit les informations communiquées par les objets sur ses serveurs propriétaires et les retransmet sur un serveur tiers géré par le client. En simplifiant ils agissent donc en passerelle et prestataire de service.

La technologie diffère du GPRS, 3G, 4G tels qu'on les utilise aujourd'hui. Ces réseaux utilisent des fréquences élevées et plus la fréquence porteuse est élevée, plus les débits d’information peuvent être importants mais moins le signal se propage aisément dans l’espace (donc il faut beaucoup d'antennes). En outre, plus le débit est élevé, plus l’émission et la réception de ce flux sera gourmand en énergie et donc moins vos objets auront d'autonomie.

La technologie radio de Sigfox se différencie sur la fréquence porteuse utilisée. Elle est dite UNB (« Ultra narrow band ») ce qui leur permet de bâtir un réseau cellulaire bas-débit et économe en énergie. Ce type de réseau est déployé dans les bandes de fréquences ISM, disponibles mondialement sans licence. En Europe, la bande de fréquence utilisée est de 868 MHz et 902Mhz aux US.

Le contrat d'abonnement est tel qu'un objet compatible SIGFOX peut envoyer jusqu'à 140 messages à 300bits/s par jour et le payload de chaque message ne peut pas dépasser 12 octets. Le protocole Sigfox est bidirectionnel sous condition : un objet Sigfox peut recevoir 4 messages par jour à des instants définis. Ceci a donc des conséquences importantes sur le design des applications.

Il est à noter que SIGFOX, bien qu'étant le premier entrant et bien déployé (bonne couverture, cf leur carte de couverture géographique) est sur un marché dynamique et il y a des technologies concurrentes notamment l'alliance LoRa avec LoRaWAN et les opérateurs télécom qui planchent sur le futur avec la 5G et le LTE (1,4Mhz), NB-LTE (200Khz).

Voilà vous avez les mots clés si vous voulez creuser le sujet, le net regorge d'articles détaillés.

2. le MKRFOX1200

Le MKRFOX 1200 est donc un objet connecté compatible réseau SIGFOX. il se constitue d'une carte utilisant la même technologie que l'Arduino Zero - un processeur Atmel SAMD21 Cortex-M0+, processeur 32bit ARM à basse consommation - tournant à 48 MHz (avec une RTC à 32,768 kHz) et comprend en outre donc le modem compatible SIGFOX (module SigFox ATA8520). La bande ISM utile dans ce produit correspond à la Zone 1 de la configuration Radio Sigfox, soit 868MHz, 14dBm donc utilisable en Europe mais pas aux USA.

Le colis comprend l'antenne GSM spécifiquement optimisée pour le 868 Mhz qui peut être directement attachée à la carte sur un connecteur micro UFL et qui a une bande auto-adhésive au dos pour la fixer à votre boîtier.

Voici donc ce que vous recevrez:

Il est à noter que les Headers / pins sont déjà soudées et traversants (headers femelles au dessus pour brancher vos fils et pins en dessous bien longues pour mettre dans une breadboard). Bien que ce soit sans doute pratique pour explorer, ce n'est pas top si vous voulez l'intégrer - faudra couper/dessouder. Qui plus est que la carte est quand même assez large et donc une fois enfoncée sur une breadboard standard, il ne vous reste qu'une seule ligne de pins accessibles sur les côtés...


(le Genuino MKR1000 par exemple a le bon goût d'être vendu avec ou sans headers ce qui donne un peu plus de flexibilité.).

(soit dit en passant, si vous voulez vous limiter au wifi parce que le produit sera dans votre jardin à portée de votre routeur WiFi, dans la même famille de produit vous trouverez l'Arduino MKR1000)

La carte fonctionne en 3.3V et est vraiment conçue pour être économe en énergie et peut être alimentée par deux piles de 1.5V AA ou AAA si l'on en croit les spec. Elle est alimentable en 5V par le port USB (micro) intégré ou la pin Vin

Attention: ce serait dommage de la griller avant de commencer à jouer : c'est une carte 3.3V, il faudra donc être très prudent à ce que vous connectez sur les pins de votre MKRFOX1200 pour interagir avec d'autres éléments externes. En OUTPUT, généralement un HIGH en 3.3V est vu comme un HIGH sur un appareil 5V mais il ne faudra pas envoyer sans "level shifting" un HIGH depuis un composant 5V vers cette carte sous peine de griller la pin ou la carte.

Comme d'habitude, "toute" la documentation est dispo sur le site Arduino, je ne vais donc pas dupliquer toutes ces informations.

3.Commencer à jouer

Si l'on en croit le département marketing de Sigfox, ils aiment les bidouilleurs :slight_smile: et donc veulent nous simplifier la vie.

La carte MKRFOX 1200 est donc fournie avec un abonnement Platinum de 2 ans au réseau Sigfox, limité à 140 messages émis par jour et 4 en réception - ça laisse du temps pour jouer - et une librairie / du code / de la documentation pour découvrir le produit.

Il vous donneront aussi accès à leur service de géolocalisation Spot-it qui propose une position (assez approximative mais parfois suffisante) de là où se trouvera votre émetteur. La précision sera de l'ordre du kilomètre (ce n'est pas un GPS) et dépend de la densité d'antennes visibles autour de votre carte. A ce jour ce service n'est pas encore actif.

Ils vous faudra créer un compte chez Sigfox et activer votre objet. Quand vous vous connectez pour l'activation, le portail va vous demander 2 codes: un Device ID et un PAC. Moment de panique - où sont donc ces informations... je vais vite voir dans la cheminée (ouf, pas fait de feu) et je récupère le bordereau de livraison mais bien qu'il y ait un Product ID et SigFox Antenna ID, ça n'a pas l'air d'être l'ID and PAC demandé par l'interface utilisateur de SIGFOX.

Pour trouver ces information, lisez ce tuto

il s'agit donc d'exécuter un bout de code directement sur votre carte pour lui demander ces informations. Pour ce faire vous connectez votre carte par USB à votre ordinateur favori (donc installer les outils pour la carte, choisir cette carte et le bon port USB), et il faut installer quelques librairies supplémentaires

  • La librairie RTCZero si vous ne l'avez pas déjà (ouvrir le gestionnaire de librairies, tapez RTCZero, elle est dispo)

  • d'installer si vous ne l'avez pas la librairie ArduinoLowPower pour les cartes SAMD (non dispo dans le gestionnaire)

  • La librairie SigFox (ouvrir le gestionnaire de librairies, tapez Sigfox, vous verrez celle pour le MKRFOX 1200)

  • Dans l'IDE, allez dans les Exemples, sous "Arduino_SigFox_for_MKRFox1200" et chargez le code de FirstConfiguration

(personnellement j'aime avoir la console à 115200 bauds, donc j'ai changé la ligne Serial.begin(9600); par Serial.begin(115200);

Une fois le code chargé et exécuté la console vous dira quelque chose du genre:

```
MKRFox1200 Sigfox first configuration
SigFox FW version 2.3
ID  = 001XXXXX
PAC = AEFXXXXXXXXXXXXX

Module temperature: 26.00
Register your board on Activate | Sigfox Buy with provided ID and PAC
Type the message to be sent
```

voilà j'ai mon ID et mon PAC et l'URL nécessaire à l'activation.

Je me connecte donc sur le site d'activation, je clique sur l'icon Arduino puisque c'est là que j'ai acheté mon module, je clique sur la France puisque c'est là que je vais le tester, et j'arrive sur une page qui me demande effectivement l'ID et le PAC, puis une page de création de compte si vous n'en avez pas déjà un chez Sigfox.

Une fois toutes les info rentrées vous recevez un eMail de la part de Sigfox confirmant votre inscription et vous indiquant comment créer votre mot de passe. cliquez sur le lien dans le mail, choisissez un mot de passe très compliqué par sécurité et voilà - you are in business !

4.premiers pas avec du code

Tout est documenté et accessible (en anglais) depuis cette page et plus particulièrement la page réservée aux développeurs. Ils vous y expliquent comment envoyer un message, créer un callback et pointent sur des projets d'apprentissage.

J'aime bien me débrouiller donc je me lance en me disant que je vais utiliser la librairie fournie pour exporter la T° du capteur embarqué directement dans la carte en m'appuyant sur un des exemples.

Le code du WeatherMonitor se lit assez simplement, donc je le transforme pour me servir de base à ma première communication et je ponds ce petit bout de code:

#include <SigFox.h>
typedef struct __attribute__ ((packed)) sigfox_message { // see http://www.catb.org/esr/structure-packing/#_structure_alignment_and_padding
  int16_t moduleTemperature;
} SigfoxMessage;

// stub for message which will be sent
SigfoxMessage msg;

// =================== UTILITIES ===================
void reboot() {
  NVIC_SystemReset();
  while (1);
}
// =================================================


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

  if (!SigFox.begin()) {
    Serial.println("SigFox error, rebooting");
    reboot();
  }

  delay(100); // Wait at least 30ms after first configuration

  // Enable debug prints and LED indication
  SigFox.debug();

  // Read and convert the module temperature
  msg.moduleTemperature = (int32_t) (SigFox.internalTemperature() * 100.0); // température 1/100th of degrees

  Serial.print("Internal temp: ");
  Serial.print(msg.moduleTemperature, HEX); // display what we will send in Hexadecimal
  Serial.print(" (");
  Serial.print(msg.moduleTemperature); // display what we will send in Decimal
  Serial.println(" x100 deg C)");

  // Clears all pending interrupts
  SigFox.status();
  delay(1);

  // Send the data
  SigFox.beginPacket();
  SigFox.write((uint8_t*)&msg, sizeof(SigfoxMessage));

  Serial.print("Status: ");
  Serial.println(SigFox.endPacket());

  SigFox.end();
}

void loop() {}

En gros

je déclare une structure - pour le moment avec une seule data sur 2 octets - qui sera le modèle de message émis depuis mon application. il y a une petite subtilité pour cette déclaration, l'attribut packed (__attribute__ ((packed))) qui permet de gérer les problèmes potentiels d'alignement et de padding (si j'avais plusieurs membres dans ma structure puisqu'on peut envoyer jusqu'à 12 octets, ici ce n'est pas nécessaire dans l'absolu).

  • je définis une fonction utilitaires qui reboot au cas où
  • j'ouvre le port Série, je démarre le modem SIGFOX
  • Si tout se passe bien j'attends un petit peu (100ms pour la première config dit la spec, ensuite 30)
  • j'active le mode debug (la LED verte qui montre l'activité - enfin je crois que c'est ça :slight_smile: )
  • je vais lire la T° du module, un float, que je multiplie par 100 pour avoir 2 chiffres après la virgules et je convertis en entier sur 2 octets (ça devrait rentrer pour les T° courantes) et je mets dans cela ma structure
  • J'affiche sur la console série ce que je vais envoyer
  • j'effectue l'envoi et affiche le code retourné par la fin de paquet (0 = tout va bien)
  • je clos la connexion au module sigfox, ma transaction est terminée

Voilà... allez on se lance. J'ouvre la console à 115200 bauds, j'upload mon code.
La console m'affiche la température, puis Status et je dois patienter un petit moment avant de voir le 0 s'afficher (ne pas oublier qu'on est en "bas débit !")

</sub> <sub>[color=blue]Internal temp: B54 (2900 x100 deg C) Status: 0 [/color]</sub> <sub>

Je me connecte donc sur le site de Sigfox, pour le moment je n'ai pas défini de Callback donc je choisis d'afficher ma liste d'appareils et je choisis mon MKRFOX1200

et je dans la nouvelle fenêtre je choisis dans le menu à Gauche d'afficher les messages reçus par Sigfox


(dans cette image j'ai lancé mon programme 3 fois, donc on voit 3 messages)

et la magique je retrouve ma valeur

B54

(correspondant à 29°)... bon ce n'est pas tout à fait B54 que l'on voit. la raison est simple 0x0B54 qui était mon nombre sur 2 octets était représenté en mémoire avec d'abord l'octet de poids faible, 0x54 puis l'octet de poids fort 0x0B. c'est ce qui a été envoyé. Comme je n'ai pas appris à Sigfox le format des données qu'il allait recevoir il m'affiche l'hexadécimal brut tel qu'il l'a reçu.

Si vous allez dans l'onglet DEVICE TYPE et éditez votre device vous pouvez fournir une "grammaire de décodage" adaptée à votre objet connecté.

Custom message type decoding grammar

The "custom format" grammar is as follows :
format = field_def [" " field_def]* ;
field_def = field_name ":" byte_index ":" type_def ;
field_name = (alpha | digit | "#" | "_")* ;
byte_index = [digit*] ;
type_def = bool_def | char_def | float_def | uint_def ;
bool_def = "bool:" ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7") ;
char_def = "char:" length ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7");
float_def = "float:" ("32" | "64") [ ":little-endian" | ":big-endian" ] ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7");
uint_def = "uint:" ["1" - "64"] [ ":little-endian" | ":big-endian" ] ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7");
int_def = "int:" ["1" - "64"] [ ":little-endian" | ":big-endian" ] ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7");
length = number* ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

A field is defined by its name, its position in the message bytes, its length and its type :
the field name is an identifier including letters, digits and the '-' and '_' characters.
the byte index is the offset in the message buffer where the field is to be read from, starting at zero. If omitted, the position used is the current byte for boolean fields, the next byte for all other types if the previous element has no bit offset and the last byte used if the previous element has a bit offset. For the first field, an omitted position means zero (start of the message buffer)
Next comes the type name and parameters, which varies depending on the type :
boolean : parameter is the bit position in the target byte
char : parameter is the number of bytes to gather in a string, and optionally the bit offset where to start the reading of the first byte, Default value is 7 for the offset
float : parameters are the length in bits of the value, which can be either 32 or 64 bits, optionally the endianness for multi-bytes floats, and optionally the bit offset where to start the reading of the first byte. Default is big endian and 7 for the offset. Decoding is done according to the IEEE 754 standard.
uint (unsigned integer) : parameters are the number of bits to include in the value, optionally the endianness for multi-bytes integers, and optionally the bit offset where to start the reading of the first byte. Default is big endian and 7 for the offset.
int (signed integer) : parameters are the number of bits to include in the value, optionally the endianness for multi-bytes integers, and optionally the bit offset where to start the reading of the first byte.

Par exemple si vous donnez comme grammaire

int1::uint:8 int2::uint:8

et que vous avez reçu

1234

alors l'affichage sera

{ int1: 0x12, int2: 0x34 }

Je m'empresse donc de faire cette modification en déclare comme grammaire

temp::int:16:little-endian

je retourne sur ma page des message et là magie, je vois bien[color=blue] temp: 2900[/color]

EDIT:

Dans un autre post sur le forum principal une question se posait sur comment aller lire précisément des valeurs dans le cadre d'une grammaire un peu compliquée.

--> j'ai apporté quelques explications supplémentaires là bas

d37c073b0d53e079fb16b775dc44b4211f27335a.png

et notez que la grammaire sur le site de SIGFOX a un bug, il faut mettre un : avant le bit offset si vous l'utilisez

5. Pour aller plus loin

Voilà donc comme promis un petit état des lieux de la découverte du MKRFOX 1200 - ça donne des idées pour de nouveaux gadgets et travailler plus avant les problématiques de gestion de l'énergie pour voir combien de temps il pourrait fonctionner en envoyant un message toutes les 15 minutes par exemple (96 messages par jours donc dans le forfait).

On a les bases et ça à l'air de bien fonctionner.

Ensuite il suffit de jouer avec l'EVENT CALLBACK API pour faire suivre automatiquement depuis les serveurs de SIGFOX le message vers votre propre serveur. Cela se fait en configurant le service de la façon qui vous convient (http ou mail), je vous laisse lire la doc

Si vous êtes curieux et ouvrez le code source de la librairie Sigfox, vous verrez que l'on parle au modem par le biais du protocole "Serial Peripheral Interface" (SPI) qui est synchrone (et donc utilise les pins CLK, MISO, MOSI et SS). Le code est plein de Strings - beurk :slight_smile: - mais bon avec 32k de SRAM on est un peu moins à l'étroit que sur un UNO et on va supposer qu'ils ont écrit cela correctement, à l'occasion je me pencherai sur le code.

Bons bricolages à tous.

Jean-Marc

Bonjour J-M-L,
Merci pour le partage.
Il faut que je fasse un essai.

de rien !

Merci J-M-L pour le retour
Pour les 140 msg/jour, tu es limité à ~1msg/10mn ou tu peux "cuire" ton quota journalier par 140 msg envoyé en rafale ?

En rafale sans pb - c'est un nombre max en 24h apparement ( j'en aii balancé une dizaine de 2 octets en 5 minutes)

J-M-L:
En rafale sans pb - c'est un nombre max en 24h apparement ( j'en ai mi balancé une dizaine en 5 minutes)

ok
intuitivement c'est ce que je pensais

Bonsoir,
Avez vous tester l’alimention par le bornier avec 2 piles AA ?
Perso j'ai tester un powerbank basique 5v avec arrivée sur le 5v sans passer par la prise micro usb et la carte arduino reste alimentée meme avec la fonction sleep.
J'ai tester avec 2 autres POWERBANK sans succes

à l'occasion oui

Super clair (comme d'habitude)
Merci

Avec plaisir

fabricecarrique:
Bonsoir,
Avez vous tester l’alimention par le bornier avec 2 piles AA ?
Perso j'ai tester un powerbank basique 5v avec arrivée sur le 5v sans passer par la prise micro usb et la carte arduino reste alimentée meme avec la fonction sleep.
J'ai tester avec 2 autres POWERBANK sans succes

Oui j'ai testé de mon coté avec 2 piles AA sur un scénario un peu identique avec capteur DHT22. Cela fonctionne sans problème. Par contre je suis dans une zone limite en réception, donc je me demandait si l'on pouvait remplacer l'antenne de la carte par une autre antenne avec un câble de 5 m ....

blugand:
Par contre je suis dans une zone limite en réception, donc je me demandait si l'on pouvait remplacer l'antenne de la carte par une autre antenne avec un câble de 5 m ....

il y a beaucoup de choix - jetez un oeil ici par exemple - et téléchargez leur catalogue Lora/Sigfox

Bonjour
Merci J.M.L pour cette excellente "Prise en mains" détaillée !!

Si vous êtes resté dans votre cave :grinning: ces dernières années et n'avez pas entendu parlé du fleuron techno Français qui fait la fierté de nos politiques

Quand j'étais sorti de ma grotte Sigfox était , contrairement à ses concurrents, unidirectionnel
Content d'apprendre que le système est maintenant bidirectionnel.

Connaissez-vous un moyen d'avoir une meilleure récpetion SIGFOX qu'avec l'antenne proposée par défaut avec l'arduino mkrf1200 ? j'ai quelques soucis sur une zone ou SIGFOX ne passe pas, j'aimerai tester une antenne plus puissante.
Merci de vos propositions.

1 Like

Merci pour le tuto clair!

Pour les limites de couvertures:
Je ne sais pas si la MKRFOX laisse la possibilité d'augmenter la puissance RF. Pas plus de quelques dB de toute façon. Utiliser une autre antenne plus performante ne donnera que 1 ou 2 dB de plus, et encore..C'est quasi négligeable sur le bilan de liaison.
Ce qui n'est pas négligeable : déplacer le système vers une ouverture de bâtiment, être a l’extérieur : 10, 15 voir 20dB de gain par rapport à l’intérieur.
La mauvaise idée : rajouter un câble coaxial vers une antenne ext et jouer avec les connecteur RF quand on ne sait pas. C'est faisable mais... un cable de 5m de mauvaise qualité = 3dB de pertes environ.
le connecteur de la carte est un U.FL. Celui des antennes classique : SMA ou RP SMA. Le cout des connecteurs est pas négligeable.

Donc mieux vaut déplacer l'ensemble et rallonger la prise du capteur.

Est ce quelqu'un a créer un serveur en node.js ou autre, pour recevoir chez lui les datas du backend sigfox?
Merci

Bonjour à toutes et tous,

tout d'abord merci pour le tuto.

Autant en électronique, je me débrouille et je débute sur l'arduino, autant sur la partie "web" je suis nul....

Le "callback" est un mystère pour moi :stuck_out_tongue:

Je souhaiterai envoyé, sur un serveur web gratuit les données sigfox dans un fichier texte (ou alors un .html), mais au format basique. Juste les caractères reçus de l'arduino, et écraser par le message suivant. (c'est pour être lu par un autre système).

dans le genre : http://heortological-liter.000webhostapp.com/marcel.txt

Pouvez-vous m'aider à trouver une solution ? Je crois comprendre que je doit utiliser la fonction "PUT", mais je ne sais pas quoi remplir dans les champs plus bas ...

un grand merci